ERC-721
Overview
Max Total Supply
2,616,642.363732181311759388 veMULTI
Holders
271
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
0.000000000000000001 veMULTILoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ve
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-05-07 */ // SPDX-License-Identifier: MIT pragma solidity 0.8.11; /** @title Voting Escrow @author Curve Finance @license MIT @notice Votes have a weight depending on time, so that users are committed to the future of (whatever they are voting for) @dev Vote weight decays linearly over time. Lock time cannot be more than `MAXTIME` (4 years). # Voting escrow to have time-weighted votes # Votes have a weight depending on time, so that users are committed # to the future of (whatever they are voting for). # The weight in this implementation is linear, and lock cannot be more than maxtime: # w ^ # 1 + / # | / # | / # | / # |/ # 0 +--------+------> time # maxtime (4 years?) */ /// [MIT License] /// @title Base64 /// @notice Provides a function for encoding some bytes in base64 /// @author Brecht Devos <[email protected]> library Base64 { bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /// @notice Encodes some bytes to the base64 representation function encode(bytes memory data) internal pure returns (string memory) { uint len = data.length; if (len == 0) return ""; // multiply by 4/3 rounded up uint encodedLen = 4 * ((len + 2) / 3); // Add some extra buffer at the end bytes memory result = new bytes(encodedLen + 32); bytes memory table = TABLE; assembly { let tablePtr := add(table, 1) let resultPtr := add(result, 32) for { let i := 0 } lt(i, len) { } { i := add(i, 3) let input := and(mload(add(data, i)), 0xffffff) let out := mload(add(tablePtr, and(shr(18, input), 0x3F))) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF)) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF)) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF)) out := shl(224, out) mstore(resultPtr, out) resultPtr := add(resultPtr, 4) } switch mod(len, 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } mstore(result, encodedLen) } return string(result); } } /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint 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 (uint balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint 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, uint 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, uint tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint tokenId, bytes calldata data ) external; } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint tokenId) external view returns (string memory); } /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint amount ) external returns (bool); } struct Point { int128 bias; int128 slope; // # -dweight / dt uint ts; uint blk; // block } /* We cannot really do block numbers per se b/c slope is per time, not per block * and per block could be fairly bad b/c Ethereum changes blocktimes. * What we can do is to extrapolate ***At functions */ struct LockedBalance { int128 amount; uint end; } contract ve is IERC721, IERC721Metadata { enum DepositType { DEPOSIT_FOR_TYPE, CREATE_LOCK_TYPE, INCREASE_LOCK_AMOUNT, INCREASE_UNLOCK_TIME, MERGE_TYPE } event Deposit( address indexed provider, uint tokenId, uint value, uint indexed locktime, DepositType deposit_type, uint ts ); event Withdraw(address indexed provider, uint tokenId, uint value, uint ts); event Supply(uint prevSupply, uint supply); uint internal constant WEEK = 1 weeks; uint internal constant MAXTIME = 4 * 365 * 86400; int128 internal constant iMAXTIME = 4 * 365 * 86400; uint internal constant MULTIPLIER = 1 ether; address immutable public token; uint public supply; uint public nftSupply; mapping(uint => LockedBalance) public locked; mapping(uint => uint) public ownership_change; uint public epoch; mapping(uint => Point) public point_history; // epoch -> unsigned point mapping(uint => Point[1000000000]) public user_point_history; // user -> Point[user_epoch] mapping(uint => uint) public user_point_epoch; mapping(uint => int128) public slope_changes; // time -> signed slope change mapping(uint => uint) public attachments; mapping(uint => bool) public voted; address public voter; string constant public name = "veMULTI NFT"; string constant public symbol = "veMULTI"; string constant public version = "1.0.0"; uint8 constant public decimals = 18; /// @dev Current count of token uint internal tokenId; /// @dev Mapping from NFT ID to the address that owns it. mapping(uint => address) internal idToOwner; /// @dev Mapping from NFT ID to approved address. mapping(uint => address) internal idToApprovals; /// @dev Mapping from owner address to count of his tokens. mapping(address => uint) internal ownerToNFTokenCount; /// @dev Mapping from owner address to mapping of index to tokenIds mapping(address => mapping(uint => uint)) internal ownerToNFTokenIdList; /// @dev Mapping from NFT ID to index of owner mapping(uint => uint) internal tokenToOwnerIndex; /// @dev Mapping from owner address to mapping of operator addresses. mapping(address => mapping(address => bool)) internal ownerToOperators; /// @dev Mapping of interface id to bool about whether or not it's supported mapping(bytes4 => bool) internal supportedInterfaces; /// @dev ERC165 interface ID of ERC165 bytes4 internal constant ERC165_INTERFACE_ID = 0x01ffc9a7; /// @dev ERC165 interface ID of ERC721 bytes4 internal constant ERC721_INTERFACE_ID = 0x80ac58cd; /// @dev ERC165 interface ID of ERC721Metadata bytes4 internal constant ERC721_METADATA_INTERFACE_ID = 0x5b5e139f; /// @dev reentrancy guard uint8 internal constant _not_entered = 1; uint8 internal constant _entered = 2; uint8 internal _entered_state = 1; modifier nonreentrant() { require(_entered_state == _not_entered); _entered_state = _entered; _; _entered_state = _not_entered; } /// @notice Contract constructor /// @param token_addr `ERC20CRV` token address constructor( address token_addr ) { token = token_addr; voter = msg.sender; point_history[0].blk = block.number; point_history[0].ts = block.timestamp; supportedInterfaces[ERC165_INTERFACE_ID] = true; supportedInterfaces[ERC721_INTERFACE_ID] = true; supportedInterfaces[ERC721_METADATA_INTERFACE_ID] = true; // mint-ish emit Transfer(address(0), address(this), tokenId); // burn-ish emit Transfer(address(this), address(0), tokenId); } /// @dev Interface identification is specified in ERC-165. /// @param _interfaceID Id of the interface function supportsInterface(bytes4 _interfaceID) external view returns (bool) { return supportedInterfaces[_interfaceID]; } /// @notice Get the most recently recorded rate of voting power decrease for `_tokenId` /// @param _tokenId token of the NFT /// @return Value of the slope function get_last_user_slope(uint _tokenId) external view returns (int128) { uint uepoch = user_point_epoch[_tokenId]; return user_point_history[_tokenId][uepoch].slope; } /// @notice Get the timestamp for checkpoint `_idx` for `_tokenId` /// @param _tokenId token of the NFT /// @param _idx User epoch number /// @return Epoch time of the checkpoint function user_point_history__ts(uint _tokenId, uint _idx) external view returns (uint) { return user_point_history[_tokenId][_idx].ts; } /// @notice Get timestamp when `_tokenId`'s lock finishes /// @param _tokenId User NFT /// @return Epoch time of the lock end function locked__end(uint _tokenId) external view returns (uint) { return locked[_tokenId].end; } /// @dev Returns the number of NFTs owned by `_owner`. /// Throws if `_owner` is the zero address. NFTs assigned to the zero address are considered invalid. /// @param _owner Address for whom to query the balance. function _balance(address _owner) internal view returns (uint) { return ownerToNFTokenCount[_owner]; } /// @dev Returns the number of NFTs owned by `_owner`. /// Throws if `_owner` is the zero address. NFTs assigned to the zero address are considered invalid. /// @param _owner Address for whom to query the balance. function balanceOf(address _owner) external view returns (uint) { return _balance(_owner); } function totalNFTSupply() external view returns (uint) { return nftSupply; } /// @dev Returns the address of the owner of the NFT. /// @param _tokenId The identifier for an NFT. function ownerOf(uint _tokenId) public view returns (address) { address owner = idToOwner[_tokenId]; require(owner != address(0), "VE NFT: owner query for nonexistent token"); return owner; } /// @dev Get the approved address for a single NFT. /// @param _tokenId ID of the NFT to query the approval of. function getApproved(uint _tokenId) external view returns (address) { return idToApprovals[_tokenId]; } /// @dev Checks if `_operator` is an approved operator for `_owner`. /// @param _owner The address that owns the NFTs. /// @param _operator The address that acts on behalf of the owner. function isApprovedForAll(address _owner, address _operator) external view returns (bool) { return (ownerToOperators[_owner])[_operator]; } /// @dev Get token by index function tokenOfOwnerByIndex(address _owner, uint _tokenIndex) external view returns (uint) { return ownerToNFTokenIdList[_owner][_tokenIndex]; } /// @dev Returns whether the given spender can transfer a given token ID /// @param _spender address of the spender to query /// @param _tokenId uint ID of the token to be transferred /// @return bool whether the msg.sender is approved for the given token ID, is an operator of the owner, or is the owner of the token function _isApprovedOrOwner(address _spender, uint _tokenId) internal view returns (bool) { address owner = idToOwner[_tokenId]; bool spenderIsOwner = owner == _spender; bool spenderIsApproved = _spender == idToApprovals[_tokenId]; bool spenderIsApprovedForAll = (ownerToOperators[owner])[_spender]; return spenderIsOwner || spenderIsApproved || spenderIsApprovedForAll; } function isApprovedOrOwner(address _spender, uint _tokenId) external view returns (bool) { return _isApprovedOrOwner(_spender, _tokenId); } /// @dev Add a NFT to an index mapping to a given address /// @param _to address of the receiver /// @param _tokenId uint ID Of the token to be added function _addTokenToOwnerList(address _to, uint _tokenId) internal { uint current_count = _balance(_to); ownerToNFTokenIdList[_to][current_count] = _tokenId; tokenToOwnerIndex[_tokenId] = current_count; } /// @dev Remove a NFT from an index mapping to a given address /// @param _from address of the sender /// @param _tokenId uint ID Of the token to be removed function _removeTokenFromOwnerList(address _from, uint _tokenId) internal { // Delete uint current_count = _balance(_from)-1; uint current_index = tokenToOwnerIndex[_tokenId]; if (current_count == current_index) { // update ownerToNFTokenIdList ownerToNFTokenIdList[_from][current_count] = 0; // update tokenToOwnerIndex tokenToOwnerIndex[_tokenId] = 0; } else { uint lastTokenId = ownerToNFTokenIdList[_from][current_count]; // Add // update ownerToNFTokenIdList ownerToNFTokenIdList[_from][current_index] = lastTokenId; // update tokenToOwnerIndex tokenToOwnerIndex[lastTokenId] = current_index; // Delete // update ownerToNFTokenIdList ownerToNFTokenIdList[_from][current_count] = 0; // update tokenToOwnerIndex tokenToOwnerIndex[_tokenId] = 0; } } /// @dev Add a NFT to a given address /// Throws if `_tokenId` is owned by someone. function _addTokenTo(address _to, uint _tokenId) internal { // Throws if `_tokenId` is owned by someone assert(idToOwner[_tokenId] == address(0)); // Change the owner idToOwner[_tokenId] = _to; // Update owner token index tracking _addTokenToOwnerList(_to, _tokenId); // Change count tracking ownerToNFTokenCount[_to] += 1; } /// @dev Remove a NFT from a given address /// Throws if `_from` is not the current owner. function _removeTokenFrom(address _from, uint _tokenId) internal { // Throws if `_from` is not the current owner assert(idToOwner[_tokenId] == _from); // Change the owner idToOwner[_tokenId] = address(0); // Update owner token index tracking _removeTokenFromOwnerList(_from, _tokenId); // Change count tracking ownerToNFTokenCount[_from] -= 1; } /// @dev Clear an approval of a given address /// Throws if `_owner` is not the current owner. function _clearApproval(address _owner, uint _tokenId) internal { // Throws if `_owner` is not the current owner assert(idToOwner[_tokenId] == _owner); if (idToApprovals[_tokenId] != address(0)) { // Reset approvals idToApprovals[_tokenId] = address(0); } } /// @dev Exeute transfer of a NFT. /// Throws unless `msg.sender` is the current owner, an authorized operator, or the approved /// address for this NFT. (NOTE: `msg.sender` not allowed in internal function so pass `_sender`.) /// Throws if `_to` is the zero address. /// Throws if `_from` is not the current owner. /// Throws if `_tokenId` is not a valid NFT. function _transferFrom( address _from, address _to, uint _tokenId, address _sender ) internal { require(attachments[_tokenId] == 0 && !voted[_tokenId], "attached"); // Check requirements require(_isApprovedOrOwner(_sender, _tokenId)); // Clear approval. Throws if `_from` is not the current owner _clearApproval(_from, _tokenId); // Remove NFT. Throws if `_tokenId` is not a valid NFT _removeTokenFrom(_from, _tokenId); // Add NFT _addTokenTo(_to, _tokenId); // Set the block of ownership transfer (for Flash NFT protection) ownership_change[_tokenId] = block.number; // Log the transfer emit Transfer(_from, _to, _tokenId); } /* TRANSFER FUNCTIONS */ /// @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved address for this NFT. /// Throws if `_from` is not the current owner. /// Throws if `_to` is the zero address. /// Throws if `_tokenId` is not a valid NFT. /// @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else /// they maybe be permanently lost. /// @param _from The current owner of the NFT. /// @param _to The new owner. /// @param _tokenId The NFT to transfer. function transferFrom( address _from, address _to, uint _tokenId ) external { _transferFrom(_from, _to, _tokenId, msg.sender); } function _isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint size; assembly { size := extcodesize(account) } return size > 0; } /// @dev Transfers the ownership of an NFT from one address to another address. /// Throws unless `msg.sender` is the current owner, an authorized operator, or the /// approved address for this NFT. /// Throws if `_from` is not the current owner. /// Throws if `_to` is the zero address. /// Throws if `_tokenId` is not a valid NFT. /// If `_to` is a smart contract, it calls `onERC721Received` on `_to` and throws if /// the return value is not `bytes4(keccak256("onERC721Received(address,address,uint,bytes)"))`. /// @param _from The current owner of the NFT. /// @param _to The new owner. /// @param _tokenId The NFT to transfer. /// @param _data Additional data with no specified format, sent in call to `_to`. function safeTransferFrom( address _from, address _to, uint _tokenId, bytes memory _data ) public { _transferFrom(_from, _to, _tokenId, msg.sender); if (_isContract(_to)) { // Throws if transfer destination is a contract which does not implement 'onERC721Received' try IERC721Receiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data) returns (bytes4 retval) { require(retval == IERC721Receiver.onERC721Received.selector, "ERC721: transfer to non ERC721Receiver implementer"); } catch ( bytes memory reason ) { if (reason.length == 0) { revert('ERC721: transfer to non ERC721Receiver implementer'); } else { assembly { revert(add(32, reason), mload(reason)) } } } } } /// @dev Transfers the ownership of an NFT from one address to another address. /// Throws unless `msg.sender` is the current owner, an authorized operator, or the /// approved address for this NFT. /// Throws if `_from` is not the current owner. /// Throws if `_to` is the zero address. /// Throws if `_tokenId` is not a valid NFT. /// If `_to` is a smart contract, it calls `onERC721Received` on `_to` and throws if /// the return value is not `bytes4(keccak256("onERC721Received(address,address,uint,bytes)"))`. /// @param _from The current owner of the NFT. /// @param _to The new owner. /// @param _tokenId The NFT to transfer. function safeTransferFrom( address _from, address _to, uint _tokenId ) external { safeTransferFrom(_from, _to, _tokenId, ''); } /// @dev Set or reaffirm the approved address for an NFT. The zero address indicates there is no approved address. /// Throws unless `msg.sender` is the current NFT owner, or an authorized operator of the current owner. /// Throws if `_tokenId` is not a valid NFT. (NOTE: This is not written the EIP) /// Throws if `_approved` is the current owner. (NOTE: This is not written the EIP) /// @param _approved Address to be approved for the given NFT ID. /// @param _tokenId ID of the token to be approved. function approve(address _approved, uint _tokenId) public { address owner = idToOwner[_tokenId]; // Throws if `_tokenId` is not a valid NFT require(owner != address(0)); // Throws if `_approved` is the current owner require(_approved != owner); // Check requirements bool senderIsOwner = (idToOwner[_tokenId] == msg.sender); bool senderIsApprovedForAll = (ownerToOperators[owner])[msg.sender]; require(senderIsOwner || senderIsApprovedForAll); // Set the approval idToApprovals[_tokenId] = _approved; emit Approval(owner, _approved, _tokenId); } /// @dev Enables or disables approval for a third party ("operator") to manage all of /// `msg.sender`'s assets. It also emits the ApprovalForAll event. /// Throws if `_operator` is the `msg.sender`. (NOTE: This is not written the EIP) /// @notice This works even if sender doesn't own any tokens at the time. /// @param _operator Address to add to the set of authorized operators. /// @param _approved True if the operators is approved, false to revoke approval. function setApprovalForAll(address _operator, bool _approved) external { // Throws if `_operator` is the `msg.sender` assert(_operator != msg.sender); ownerToOperators[msg.sender][_operator] = _approved; emit ApprovalForAll(msg.sender, _operator, _approved); } /// @dev Function to mint tokens /// Throws if `_to` is zero address. /// Throws if `_tokenId` is owned by someone. /// @param _to The address that will receive the minted tokens. /// @param _tokenId The token id to mint. /// @return A boolean that indicates if the operation was successful. function _mint(address _to, uint _tokenId) internal returns (bool) { // Throws if `_to` is zero address assert(_to != address(0)); // Add NFT. Throws if `_tokenId` is owned by someone _addTokenTo(_to, _tokenId); nftSupply++; emit Transfer(address(0), _to, _tokenId); return true; } /// @notice Record global and per-user data to checkpoint /// @param _tokenId NFT token ID. No user checkpoint if 0 /// @param old_locked Pevious locked amount / end lock time for the user /// @param new_locked New locked amount / end lock time for the user function _checkpoint( uint _tokenId, LockedBalance memory old_locked, LockedBalance memory new_locked ) internal { Point memory u_old; Point memory u_new; int128 old_dslope = 0; int128 new_dslope = 0; uint _epoch = epoch; if (_tokenId != 0) { // Calculate slopes and biases // Kept at zero when they have to if (old_locked.end > block.timestamp && old_locked.amount > 0) { u_old.slope = old_locked.amount / iMAXTIME; u_old.bias = u_old.slope * int128(int256(old_locked.end - block.timestamp)); } if (new_locked.end > block.timestamp && new_locked.amount > 0) { u_new.slope = new_locked.amount / iMAXTIME; u_new.bias = u_new.slope * int128(int256(new_locked.end - block.timestamp)); } // Read values of scheduled changes in the slope // old_locked.end can be in the past and in the future // new_locked.end can ONLY by in the FUTURE unless everything expired: than zeros old_dslope = slope_changes[old_locked.end]; if (new_locked.end != 0) { if (new_locked.end == old_locked.end) { new_dslope = old_dslope; } else { new_dslope = slope_changes[new_locked.end]; } } } Point memory last_point = Point({bias: 0, slope: 0, ts: block.timestamp, blk: block.number}); if (_epoch > 0) { last_point = point_history[_epoch]; } uint last_checkpoint = last_point.ts; // initial_last_point is used for extrapolation to calculate block number // (approximately, for *At methods) and save them // as we cannot figure that out exactly from inside the contract Point memory initial_last_point = last_point; uint block_slope = 0; // dblock/dt if (block.timestamp > last_point.ts) { block_slope = (MULTIPLIER * (block.number - last_point.blk)) / (block.timestamp - last_point.ts); } // If last point is already recorded in this block, slope=0 // But that's ok b/c we know the block in such case // Go over weeks to fill history and calculate what the current point is { uint t_i = (last_checkpoint / WEEK) * WEEK; for (uint i = 0; i < 255; ++i) { // Hopefully it won't happen that this won't get used in 5 years! // If it does, users will be able to withdraw but vote weight will be broken t_i += WEEK; int128 d_slope = 0; if (t_i > block.timestamp) { t_i = block.timestamp; } else { d_slope = slope_changes[t_i]; } last_point.bias -= last_point.slope * int128(int256(t_i - last_checkpoint)); last_point.slope += d_slope; if (last_point.bias < 0) { // This can happen last_point.bias = 0; } if (last_point.slope < 0) { // This cannot happen - just in case last_point.slope = 0; } last_checkpoint = t_i; last_point.ts = t_i; last_point.blk = initial_last_point.blk + (block_slope * (t_i - initial_last_point.ts)) / MULTIPLIER; _epoch += 1; if (t_i == block.timestamp) { last_point.blk = block.number; break; } else { point_history[_epoch] = last_point; } } } epoch = _epoch; // Now point_history is filled until t=now if (_tokenId != 0) { // If last point was in this block, the slope change has been applied already // But in such case we have 0 slope(s) last_point.slope += (u_new.slope - u_old.slope); last_point.bias += (u_new.bias - u_old.bias); if (last_point.slope < 0) { last_point.slope = 0; } if (last_point.bias < 0) { last_point.bias = 0; } } // Record the changed point into history point_history[_epoch] = last_point; if (_tokenId != 0) { // Schedule the slope changes (slope is going down) // We subtract new_user_slope from [new_locked.end] // and add old_user_slope to [old_locked.end] if (old_locked.end > block.timestamp) { // old_dslope was <something> - u_old.slope, so we cancel that old_dslope += u_old.slope; if (new_locked.end == old_locked.end) { old_dslope -= u_new.slope; // It was a new deposit, not extension } slope_changes[old_locked.end] = old_dslope; } if (new_locked.end > block.timestamp) { if (new_locked.end > old_locked.end) { new_dslope -= u_new.slope; // old slope disappeared at this point slope_changes[new_locked.end] = new_dslope; } // else: we recorded it already in old_dslope } // Now handle user history uint user_epoch = user_point_epoch[_tokenId] + 1; user_point_epoch[_tokenId] = user_epoch; u_new.ts = block.timestamp; u_new.blk = block.number; user_point_history[_tokenId][user_epoch] = u_new; } } /// @notice Deposit and lock tokens for a user /// @param _tokenId NFT that holds lock /// @param _value Amount to deposit /// @param unlock_time New time when to unlock the tokens, or 0 if unchanged /// @param locked_balance Previous locked amount / timestamp /// @param deposit_type The type of deposit function _deposit_for( uint _tokenId, uint _value, uint unlock_time, LockedBalance memory locked_balance, DepositType deposit_type ) internal { LockedBalance memory _locked = locked_balance; uint supply_before = supply; supply = supply_before + _value; LockedBalance memory old_locked; (old_locked.amount, old_locked.end) = (_locked.amount, _locked.end); // Adding to existing lock, or if a lock is expired - creating a new one _locked.amount += int128(int256(_value)); if (unlock_time != 0) { _locked.end = unlock_time; } locked[_tokenId] = _locked; // Possibilities: // Both old_locked.end could be current or expired (>/< block.timestamp) // value == 0 (extend lock) or value > 0 (add to lock or extend lock) // _locked.end > block.timestamp (always) _checkpoint(_tokenId, old_locked, _locked); address from = msg.sender; if (_value != 0 && deposit_type != DepositType.MERGE_TYPE) { assert(IERC20(token).transferFrom(from, address(this), _value)); } emit Deposit(from, _tokenId, _value, _locked.end, deposit_type, block.timestamp); emit Supply(supply_before, supply_before + _value); } function setVoter(address _voter) external { require(msg.sender == voter); voter = _voter; } function voting(uint _tokenId) external { require(msg.sender == voter); voted[_tokenId] = true; } function abstain(uint _tokenId) external { require(msg.sender == voter); voted[_tokenId] = false; } function attach(uint _tokenId) external { require(msg.sender == voter); attachments[_tokenId] = attachments[_tokenId]+1; } function detach(uint _tokenId) external { require(msg.sender == voter); attachments[_tokenId] = attachments[_tokenId]-1; } function merge(uint _from, uint _to) external { require(attachments[_from] == 0 && !voted[_from], "attached"); require(_from != _to); require(_isApprovedOrOwner(msg.sender, _from)); require(_isApprovedOrOwner(msg.sender, _to)); LockedBalance memory _locked0 = locked[_from]; LockedBalance memory _locked1 = locked[_to]; uint value0 = uint(int256(_locked0.amount)); uint end = _locked0.end >= _locked1.end ? _locked0.end : _locked1.end; locked[_from] = LockedBalance(0, 0); _checkpoint(_from, _locked0, LockedBalance(0, 0)); _burn(_from); _deposit_for(_to, value0, end, _locked1, DepositType.MERGE_TYPE); } function block_number() external view returns (uint) { return block.number; } /// @notice Record global data to checkpoint function checkpoint() external { _checkpoint(0, LockedBalance(0, 0), LockedBalance(0, 0)); } /// @notice Deposit `_value` tokens for `_tokenId` and add to the lock /// @dev Anyone (even a smart contract) can deposit for someone else, but /// cannot extend their locktime and deposit for a brand new user /// @param _tokenId lock NFT /// @param _value Amount to add to user's lock function deposit_for(uint _tokenId, uint _value) external nonreentrant { LockedBalance memory _locked = locked[_tokenId]; require(_value > 0); // dev: need non-zero value require(_locked.amount > 0, 'No existing lock found'); require(_locked.end > block.timestamp, 'Cannot add to expired lock. Withdraw'); _deposit_for(_tokenId, _value, 0, _locked, DepositType.DEPOSIT_FOR_TYPE); } /// @notice Deposit `_value` tokens for `_to` and lock for `_lock_duration` /// @param _value Amount to deposit /// @param _lock_duration Number of seconds to lock tokens for (rounded down to nearest week) /// @param _to Address to deposit function _create_lock(uint _value, uint _lock_duration, address _to) internal returns (uint) { uint unlock_time = (block.timestamp + _lock_duration) / WEEK * WEEK; // Locktime is rounded down to weeks require(_value > 0); // dev: need non-zero value require(unlock_time > block.timestamp, 'Can only lock until time in the future'); require(unlock_time <= block.timestamp + MAXTIME, 'Voting lock can be 4 years max'); ++tokenId; uint _tokenId = tokenId; _mint(_to, _tokenId); _deposit_for(_tokenId, _value, unlock_time, locked[_tokenId], DepositType.CREATE_LOCK_TYPE); return _tokenId; } /// @notice Deposit `_value` tokens for `_to` and lock for `_lock_duration` /// @param _value Amount to deposit /// @param _lock_duration Number of seconds to lock tokens for (rounded down to nearest week) /// @param _to Address to deposit function create_lock_for(uint _value, uint _lock_duration, address _to) external nonreentrant returns (uint) { return _create_lock(_value, _lock_duration, _to); } /// @notice Deposit `_value` tokens for `msg.sender` and lock for `_lock_duration` /// @param _value Amount to deposit /// @param _lock_duration Number of seconds to lock tokens for (rounded down to nearest week) function create_lock(uint _value, uint _lock_duration) external nonreentrant returns (uint) { return _create_lock(_value, _lock_duration, msg.sender); } /// @notice Deposit `_value` additional tokens for `_tokenId` without modifying the unlock time /// @param _value Amount of tokens to deposit and add to the lock function increase_amount(uint _tokenId, uint _value) external nonreentrant { assert(_isApprovedOrOwner(msg.sender, _tokenId)); LockedBalance memory _locked = locked[_tokenId]; assert(_value > 0); // dev: need non-zero value require(_locked.amount > 0, 'No existing lock found'); require(_locked.end > block.timestamp, 'Cannot add to expired lock. Withdraw'); _deposit_for(_tokenId, _value, 0, _locked, DepositType.INCREASE_LOCK_AMOUNT); } /// @notice Extend the unlock time for `_tokenId` /// @param _lock_duration New number of seconds until tokens unlock function increase_unlock_time(uint _tokenId, uint _lock_duration) external nonreentrant { assert(_isApprovedOrOwner(msg.sender, _tokenId)); LockedBalance memory _locked = locked[_tokenId]; uint unlock_time = (block.timestamp + _lock_duration) / WEEK * WEEK; // Locktime is rounded down to weeks require(_locked.end > block.timestamp, 'Lock expired'); require(_locked.amount > 0, 'Nothing is locked'); require(unlock_time > _locked.end, 'Can only increase lock duration'); require(unlock_time <= block.timestamp + MAXTIME, 'Voting lock can be 4 years max'); _deposit_for(_tokenId, 0, unlock_time, _locked, DepositType.INCREASE_UNLOCK_TIME); } /// @notice Withdraw all tokens for `_tokenId` /// @dev Only possible if the lock has expired function withdraw(uint _tokenId) external nonreentrant { assert(_isApprovedOrOwner(msg.sender, _tokenId)); require(attachments[_tokenId] == 0 && !voted[_tokenId], "attached"); LockedBalance memory _locked = locked[_tokenId]; require(block.timestamp >= _locked.end, "The lock didn't expire"); uint value = uint(int256(_locked.amount)); locked[_tokenId] = LockedBalance(0,0); uint supply_before = supply; supply = supply_before - value; // old_locked can have either expired <= timestamp or zero end // _locked has only 0 end // Both can have >= 0 amount _checkpoint(_tokenId, _locked, LockedBalance(0,0)); address owner = ownerOf(_tokenId); // Burn the NFT _burn(_tokenId); assert(IERC20(token).transfer(owner, value)); emit Withdraw(msg.sender, _tokenId, value, block.timestamp); emit Supply(supply_before, supply_before - value); } // The following ERC20/minime-compatible methods are not real balanceOf and supply! // They measure the weights for the purpose of voting, so they don't represent // real coins. /// @notice Binary search to estimate timestamp for block number /// @param _block Block to find /// @param max_epoch Don't go beyond this epoch /// @return Approximate timestamp for block function _find_block_epoch(uint _block, uint max_epoch) internal view returns (uint) { // Binary search uint _min = 0; uint _max = max_epoch; for (uint i = 0; i < 128; ++i) { // Will be always enough for 128-bit numbers if (_min >= _max) { break; } uint _mid = (_min + _max + 1) / 2; if (point_history[_mid].blk <= _block) { _min = _mid; } else { _max = _mid - 1; } } return _min; } /// @notice Get the current voting power for `_tokenId` /// @dev Adheres to the ERC20 `balanceOf` interface for Aragon compatibility /// @param _tokenId NFT for lock /// @param _t Epoch time to return voting power at /// @return User voting power function _balanceOfNFT(uint _tokenId, uint _t) internal view returns (uint) { uint _epoch = user_point_epoch[_tokenId]; if (_epoch == 0) { return 0; } else { Point memory last_point = user_point_history[_tokenId][_epoch]; last_point.bias -= last_point.slope * int128(int256(_t) - int256(last_point.ts)); if (last_point.bias < 0) { last_point.bias = 0; } return uint(int256(last_point.bias)); } } /// @dev Returns current token URI metadata /// @param _tokenId Token ID to fetch URI for. function tokenURI(uint _tokenId) external view returns (string memory) { require(idToOwner[_tokenId] != address(0), "Query for nonexistent token"); LockedBalance memory _locked = locked[_tokenId]; return _tokenURI( _tokenId, _balanceOfNFT(_tokenId, block.timestamp), _locked.end, uint(int256(_locked.amount)) ); } function balanceOfNFT(uint _tokenId) external view returns (uint) { if (ownership_change[_tokenId] == block.number) return 0; return _balanceOfNFT(_tokenId, block.timestamp); } function balanceOfNFTAt(uint _tokenId, uint _t) external view returns (uint) { return _balanceOfNFT(_tokenId, _t); } /// @notice Measure voting power of `_tokenId` at block height `_block` /// @dev Adheres to MiniMe `balanceOfAt` interface: https://github.com/Giveth/minime /// @param _tokenId User's wallet NFT /// @param _block Block to calculate the voting power at /// @return Voting power function _balanceOfAtNFT(uint _tokenId, uint _block) internal view returns (uint) { // Copying and pasting totalSupply code because Vyper cannot pass by // reference yet assert(_block <= block.number); // Binary search uint _min = 0; uint _max = user_point_epoch[_tokenId]; for (uint i = 0; i < 128; ++i) { // Will be always enough for 128-bit numbers if (_min >= _max) { break; } uint _mid = (_min + _max + 1) / 2; if (user_point_history[_tokenId][_mid].blk <= _block) { _min = _mid; } else { _max = _mid - 1; } } Point memory upoint = user_point_history[_tokenId][_min]; uint max_epoch = epoch; uint _epoch = _find_block_epoch(_block, max_epoch); Point memory point_0 = point_history[_epoch]; uint d_block = 0; uint d_t = 0; if (_epoch < max_epoch) { Point memory point_1 = point_history[_epoch + 1]; d_block = point_1.blk - point_0.blk; d_t = point_1.ts - point_0.ts; } else { d_block = block.number - point_0.blk; d_t = block.timestamp - point_0.ts; } uint block_time = point_0.ts; if (d_block != 0) { block_time += (d_t * (_block - point_0.blk)) / d_block; } upoint.bias -= upoint.slope * int128(int256(block_time - upoint.ts)); if (upoint.bias >= 0) { return uint(uint128(upoint.bias)); } else { return 0; } } function balanceOfAtNFT(uint _tokenId, uint _block) external view returns (uint) { return _balanceOfAtNFT(_tokenId, _block); } /// @notice Calculate total voting power at some point in the past /// @param point The point (bias/slope) to start search from /// @param t Time to calculate the total voting power at /// @return Total voting power at that time function _supply_at(Point memory point, uint t) internal view returns (uint) { Point memory last_point = point; uint t_i = (last_point.ts / WEEK) * WEEK; for (uint i = 0; i < 255; ++i) { t_i += WEEK; int128 d_slope = 0; if (t_i > t) { t_i = t; } else { d_slope = slope_changes[t_i]; } last_point.bias -= last_point.slope * int128(int256(t_i - last_point.ts)); if (t_i == t) { break; } last_point.slope += d_slope; last_point.ts = t_i; } if (last_point.bias < 0) { last_point.bias = 0; } return uint(uint128(last_point.bias)); } /// @notice Calculate total voting power /// @dev Adheres to the ERC20 `totalSupply` interface for Aragon compatibility /// @return Total voting power function totalSupplyAtT(uint t) public view returns (uint) { uint _epoch = epoch; Point memory last_point = point_history[_epoch]; return _supply_at(last_point, t); } function totalSupply() external view returns (uint) { return totalSupplyAtT(block.timestamp); } /// @notice Calculate total voting power at some point in the past /// @param _block Block to calculate the total voting power at /// @return Total voting power at `_block` function totalSupplyAt(uint _block) external view returns (uint) { assert(_block <= block.number); uint _epoch = epoch; uint target_epoch = _find_block_epoch(_block, _epoch); Point memory point = point_history[target_epoch]; uint dt = 0; if (target_epoch < _epoch) { Point memory point_next = point_history[target_epoch + 1]; if (point.blk != point_next.blk) { dt = ((_block - point.blk) * (point_next.ts - point.ts)) / (point_next.blk - point.blk); } } else { if (point.blk != block.number) { dt = ((_block - point.blk) * (block.timestamp - point.ts)) / (block.number - point.blk); } } // Now dt contains info on how far are we beyond point return _supply_at(point, point.ts + dt); } function _tokenURI(uint _tokenId, uint _balanceOf, uint _locked_end, uint _value) internal pure returns (string memory output) { output = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 350"><style>.base { fill: white; font-family: serif; font-size: 14px; }</style><rect width="100%" height="100%" fill="black" /><text x="10" y="20" class="base">'; output = string(abi.encodePacked(output, "token ", toString(_tokenId), '</text><text x="10" y="40" class="base">')); output = string(abi.encodePacked(output, "balanceOf ", toString(_balanceOf), '</text><text x="10" y="60" class="base">')); output = string(abi.encodePacked(output, "locked_end ", toString(_locked_end), '</text><text x="10" y="80" class="base">')); output = string(abi.encodePacked(output, "value ", toString(_value), '</text></svg>')); string memory json = Base64.encode(bytes(string(abi.encodePacked('{"name": "lock #', toString(_tokenId), '", "description": "veMULTI NFT", "image": "data:image/svg+xml;base64,', Base64.encode(bytes(output)), '"}')))); output = string(abi.encodePacked('data:application/json;base64,', json)); } function toString(uint value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT license // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint temp = value; uint digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint(value % 10))); value /= 10; } return string(buffer); } function _burn(uint _tokenId) internal { require(_isApprovedOrOwner(msg.sender, _tokenId), "caller is not owner nor approved"); address owner = ownerOf(_tokenId); // Clear approval _clearApproval(owner, _tokenId); // Remove token _removeTokenFrom(owner, _tokenId); nftSupply--; emit Transfer(owner, address(0), _tokenId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"token_addr","type":"address"}],"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":"provider","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"locktime","type":"uint256"},{"indexed":false,"internalType":"enum ve.DepositType","name":"deposit_type","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"ts","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"prevSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"supply","type":"uint256"}],"name":"Supply","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ts","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"abstain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_approved","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"attach","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"attachments","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_block","type":"uint256"}],"name":"balanceOfAtNFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"balanceOfNFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_t","type":"uint256"}],"name":"balanceOfNFTAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"block_number","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkpoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_lock_duration","type":"uint256"}],"name":"create_lock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_lock_duration","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"create_lock_for","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"deposit_for","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"detach","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"epoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"get_last_user_slope","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increase_amount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_lock_duration","type":"uint256"}],"name":"increase_unlock_time","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"isApprovedOrOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"locked","outputs":[{"internalType":"int128","name":"amount","type":"int128"},{"internalType":"uint256","name":"end","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"locked__end","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"merge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownership_change","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"point_history","outputs":[{"internalType":"int128","name":"bias","type":"int128"},{"internalType":"int128","name":"slope","type":"int128"},{"internalType":"uint256","name":"ts","type":"uint256"},{"internalType":"uint256","name":"blk","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_voter","type":"address"}],"name":"setVoter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"slope_changes","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_tokenIndex","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":"totalNFTSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_block","type":"uint256"}],"name":"totalSupplyAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"t","type":"uint256"}],"name":"totalSupplyAtT","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":"uint256","name":"","type":"uint256"}],"name":"user_point_epoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"user_point_history","outputs":[{"internalType":"int128","name":"bias","type":"int128"},{"internalType":"int128","name":"slope","type":"int128"},{"internalType":"uint256","name":"ts","type":"uint256"},{"internalType":"uint256","name":"blk","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_idx","type":"uint256"}],"name":"user_point_history__ts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"voted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"voter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"voting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040526014805460ff191660011790553480156200001e57600080fd5b5060405162003e6838038062003e68833981016040819052620000419162000181565b6001600160a01b038116608052600b80546001600160a01b03191633179055437f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746be55427f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bd5560136020527f317681100331673b27c2499894e78912f138ae85f2dd790e454ff96a89cf2d77805460ff1990811660019081179092557f5829b1f18259a9cdcd4268c3b072804d2f8e3dedbb1b883db1fa2055bb26d84f8054821683179055635b5e139f60e01b60009081527f65cb089fa41783e5af12e88573d882f263c09532a373334f0b809825d5a904ab80549092169092179055600c546040519091309160008051602062003e48833981519152908290a4600c54604051600090309060008051602062003e48833981519152908390a450620001b3565b6000602082840312156200019457600080fd5b81516001600160a01b0381168114620001ac57600080fd5b9392505050565b608051613c6b620001dd600039600081816108d601528181610c4601526128aa0152613c6b6000f3fe608060405234801561001057600080fd5b50600436106103425760003560e01c80638c2c9baf116101b8578063c87b56dd11610104578063e7e242d4116100a2578063f8a057631161007c578063f8a057631461089b578063fbd3a29d146108be578063fc0c546a146108d1578063fd4a77f1146108f857600080fd5b8063e7e242d414610839578063e985e9c51461084c578063ee99fe281461088857600080fd5b8063d4e54c3b116100de578063d4e54c3b146107eb578063e0514aba146107fe578063e2c7928114610811578063e441135c1461081957600080fd5b8063c87b56dd14610787578063d1c2babb1461079a578063d1febfb9146107ad57600080fd5b8063a183af5211610171578063b45a3c0e1161014b578063b45a3c0e14610711578063b88d4fde14610759578063c1f0fb9f1461076c578063c2c4c5c11461077f57600080fd5b8063a183af52146106d8578063a22cb465146106eb578063a4d855df146106fe57600080fd5b80638c2c9baf1461064d5780638fbb38ff14610660578063900cf0cf1461068357806395d89b411461068c578063981b24d0146106b2578063986b7d8a146106c557600080fd5b80632f745c591161029257806354fd4d50116102305780636f5488371161020a5780636f548837146105e457806370a08231146106045780637116c60c14610617578063711974841461062a57600080fd5b806354fd4d501461059a5780636352211e146105be57806365fc3873146105d157600080fd5b8063430c20811161026c578063430c20811461053b578063461f711c1461054e57806346c96aac146105745780634bc2a6571461058757600080fd5b80632f745c59146104d8578063313ce5671461050e57806342842e0e1461052857600080fd5b80630d6a2033116102ff5780631c984bc3116102d95780631c984bc31461049957806323b872dd146104ac57806325a58b56146104bf5780632e1a7d4d146104c557600080fd5b80630d6a2033146104365780631376f3da1461045657806318160ddd1461049157600080fd5b806301790e011461034757806301ffc9a714610363578063047fc9aa146103a057806306fdde03146103a9578063081812fc146103e0578063095ea7b314610421575b600080fd5b61035060015481565b6040519081526020015b60405180910390f35b6103906103713660046130fa565b6001600160e01b03191660009081526013602052604090205460ff1690565b604051901515815260200161035a565b61035060005481565b6103d36040518060400160405280600b81526020016a1d9953555315124813919560aa1b81525081565b60405161035a919061316f565b6104096103ee366004613182565b6000908152600e60205260409020546001600160a01b031690565b6040516001600160a01b03909116815260200161035a565b61043461042f3660046131b7565b61090b565b005b610350610444366004613182565b60096020526000908152604090205481565b6104696104643660046131e1565b6109f4565b60408051600f95860b81529390940b602084015292820152606081019190915260800161035a565b610350610a3b565b6103506104a73660046131e1565b610a4b565b6104346104ba366004613203565b610a7e565b43610350565b6104346104d3366004613182565b610a8f565b6103506104e63660046131b7565b6001600160a01b03919091166000908152601060209081526040808320938352929052205490565b610516601281565b60405160ff909116815260200161035a565b610434610536366004613203565b610d59565b6103906105493660046131b7565b610d74565b61056161055c366004613182565b610d87565b604051600f9190910b815260200161035a565b600b54610409906001600160a01b031681565b61043461059536600461323f565b610dca565b6103d3604051806040016040528060058152602001640312e302e360dc1b81525081565b6104096105cc366004613182565b610e03565b6103506105df3660046131e1565b610e7a565b6103506105f2366004613182565b60036020526000908152604090205481565b61035061061236600461323f565b610ebc565b610350610625366004613182565b610eda565b610561610638366004613182565b600860205260009081526040902054600f0b81565b61035061065b3660046131e1565b610f3a565b61039061066e366004613182565b600a6020526000908152604090205460ff1681565b61035060045481565b6103d36040518060400160405280600781526020016676654d554c544960c81b81525081565b6103506106c0366004613182565b610f46565b6104346106d3366004613182565b6110e8565b6104346106e63660046131e1565b61112c565b6104346106f9366004613268565b61122b565b61043461070c3660046131e1565b6112b0565b61073f61071f366004613182565b60026020526000908152604090208054600190910154600f9190910b9082565b60408051600f9390930b835260208301919091520161035a565b6104346107673660046132b5565b611495565b61043461077a366004613182565b6115a7565b6104346115d6565b6103d3610795366004613182565b611616565b6104346107a83660046131e1565b6116c3565b6104696107bb366004613182565b600560205260009081526040902080546001820154600290920154600f82810b93600160801b909304900b919084565b6103506107f9366004613391565b611831565b61035061080c3660046131e1565b611874565b600154610350565b610350610827366004613182565b60076020526000908152604090205481565b610350610847366004613182565b611880565b61039061085a3660046133c6565b6001600160a01b03918216600090815260126020908152604080832093909416825291909152205460ff1690565b6104346108963660046131e1565b6118a8565b6103506108a9366004613182565b60009081526002602052604090206001015490565b6104346108cc366004613182565b611980565b6104097f000000000000000000000000000000000000000000000000000000000000000081565b610434610906366004613182565b6119b1565b6000818152600d60205260409020546001600160a01b03168061092d57600080fd5b806001600160a01b0316836001600160a01b0316141561094c57600080fd5b6000828152600d60209081526040808320546001600160a01b0385811685526012845282852033808752945291909320549216149060ff16818061098d5750805b61099657600080fd5b6000848152600e602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918716917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a45050505050565b600660205281600052604060002081633b9aca008110610a1357600080fd5b6003020180546001820154600290920154600f82810b9550600160801b90920490910b925084565b6000610a4642610eda565b905090565b600082815260066020526040812082633b9aca008110610a6d57610a6d6133f9565b600302016001015490505b92915050565b610a8a838383336119e3565b505050565b60145460ff16600114610aa157600080fd5b6014805460ff19166002179055610ab83382611aa9565b610ac457610ac461340f565b600081815260096020526040902054158015610aef57506000818152600a602052604090205460ff16155b610b145760405162461bcd60e51b8152600401610b0b90613425565b60405180910390fd5b60008181526002602090815260409182902082518084019093528054600f0b835260010154908201819052421015610b875760405162461bcd60e51b8152602060048201526016602482015275546865206c6f636b206469646e27742065787069726560501b6044820152606401610b0b565b8051604080518082018252600080825260208083018281528783526002909152928120915182546001600160801b0319166001600160801b03909116178255915160019091015554600f9190910b90610be0828261345d565b600081905550610c0a848460405180604001604052806000600f0b81526020016000815250611b0f565b6000610c1585610e03565b9050610c208561212e565b60405163a9059cbb60e01b81526001600160a01b038281166004830152602482018590527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af1158015610c8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb39190613474565b610cbf57610cbf61340f565b60408051868152602081018590524281830152905133917f02f25270a4d87bea75db541cdfe559334a275b4a233520ed6c0a2429667cca94919081900360600190a27f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c82610d2d858261345d565b6040805192835260208301919091520160405180910390a150506014805460ff19166001179055505050565b610a8a83838360405180602001604052806000815250611495565b6000610d808383611aa9565b9392505050565b6000818152600760209081526040808320546006909252822081633b9aca008110610db457610db46133f9565b6003020154600160801b9004600f0b9392505050565b600b546001600160a01b03163314610de157600080fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600d60205260408120546001600160a01b031680610a785760405162461bcd60e51b815260206004820152602960248201527f5645204e46543a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b0b565b60145460009060ff16600114610e8f57600080fd5b6014805460ff19166002179055610ea78383336121f6565b90506014805460ff1916600117905592915050565b6001600160a01b0381166000908152600f6020526040812054610a78565b600454600081815260056020908152604080832081516080810183528154600f81810b8352600160801b909104900b93810193909352600181015491830191909152600201546060820152909190610f32818561234d565b949350505050565b6000610d80838361244f565b600043821115610f5857610f5861340f565b6004546000610f67848361272c565b600081815260056020908152604080832081516080810183528154600f81810b8352600160801b909104900b9381019390935260018101549183019190915260020154606082015291925083831015611076576000600581610fca866001613491565b8152602080820192909252604090810160002081516080810183528154600f81810b8352600160801b909104900b93810193909352600181015491830191909152600201546060808301829052850151919250146110705782606001518160600151611036919061345d565b8360400151826040015161104a919061345d565b6060850151611059908a61345d565b61106391906134a9565b61106d91906134de565b91505b506110c5565b438260600151146110c5576060820151611090904361345d565b604083015161109f904261345d565b60608401516110ae908961345d565b6110b891906134a9565b6110c291906134de565b90505b6110de828284604001516110d99190613491565b61234d565b9695505050505050565b600b546001600160a01b031633146110ff57600080fd5b60008181526009602052604090205461111a9060019061345d565b60009182526009602052604090912055565b60145460ff1660011461113e57600080fd5b6014805460ff191660021790556111553383611aa9565b6111615761116161340f565b60008281526002602090815260409182902082518084019093528054600f0b83526001015490820152816111975761119761340f565b60008160000151600f0b136111e75760405162461bcd60e51b8152602060048201526016602482015275139bc8195e1a5cdd1a5b99c81b1bd8dac8199bdd5b9960521b6044820152606401610b0b565b4281602001511161120a5760405162461bcd60e51b8152600401610b0b906134f2565b611219838360008460026127b6565b50506014805460ff1916600117905550565b6001600160a01b0382163314156112445761124461340f565b3360008181526012602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60145460ff166001146112c257600080fd5b6014805460ff191660021790556112d93383611aa9565b6112e5576112e561340f565b600082815260026020908152604080832081518083019092528054600f0b825260010154918101919091529062093a80806113208542613491565b61132a91906134de565b61133491906134a9565b9050428260200151116113785760405162461bcd60e51b815260206004820152600c60248201526b131bd8dac8195e1c1a5c995960a21b6044820152606401610b0b565b60008260000151600f0b136113c35760405162461bcd60e51b8152602060048201526011602482015270139bdd1a1a5b99c81a5cc81b1bd8dad959607a1b6044820152606401610b0b565b816020015181116114165760405162461bcd60e51b815260206004820152601f60248201527f43616e206f6e6c7920696e637265617365206c6f636b206475726174696f6e006044820152606401610b0b565b611424630784ce0042613491565b8111156114735760405162461bcd60e51b815260206004820152601e60248201527f566f74696e67206c6f636b2063616e2062652034207965617273206d617800006044820152606401610b0b565b611482846000838560036127b6565b50506014805460ff191660011790555050565b6114a1848484336119e3565b823b156115a157604051630a85bd0160e11b81526001600160a01b0384169063150b7a02906114da903390889087908790600401613536565b6020604051808303816000875af1925050508015611515575060408051601f3d908101601f1916820190925261151291810190613569565b60015b61156f573d808015611543576040519150601f19603f3d011682016040523d82523d6000602084013e611548565b606091505b5080516115675760405162461bcd60e51b8152600401610b0b90613586565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b1461159f5760405162461bcd60e51b8152600401610b0b90613586565b505b50505050565b600b546001600160a01b031633146115be57600080fd5b6000908152600a60205260409020805460ff19169055565b611614600060405180604001604052806000600f0b8152602001600081525060405180604001604052806000600f0b81526020016000815250611b0f565b565b6000818152600d60205260409020546060906001600160a01b031661167d5760405162461bcd60e51b815260206004820152601b60248201527f517565727920666f72206e6f6e6578697374656e7420746f6b656e00000000006044820152606401610b0b565b60008281526002602090815260409182902082518084019093528054600f0b83526001015490820152610d80836116b481426129be565b60208401518451600f0b612a90565b6000828152600960205260409020541580156116ee57506000828152600a602052604090205460ff16155b61170a5760405162461bcd60e51b8152600401610b0b90613425565b8082141561171757600080fd5b6117213383611aa9565b61172a57600080fd5b6117343382611aa9565b61173d57600080fd5b6000828152600260208181526040808420815180830183528154600f90810b825260019283015482860190815288885295855283872084518086019095528054820b855290920154938301849052805194519095929490910b9211156117a75782602001516117ad565b83602001515b604080518082018252600080825260208083018281528b835260028252848320935184546001600160801b0319166001600160801b03909116178455516001909301929092558251808401909352808352908201529091506118129087908690611b0f565b61181b8661212e565b6118298583838660046127b6565b505050505050565b60145460009060ff1660011461184657600080fd5b6014805460ff1916600217905561185e8484846121f6565b90506014805460ff191660011790559392505050565b6000610d8083836129be565b60008181526003602052604081205443141561189e57506000919050565b610a7882426129be565b60145460ff166001146118ba57600080fd5b6014805460ff191660029081179091556000838152602091825260409081902081518083019092528054600f0b82526001015491810191909152816118fe57600080fd5b60008160000151600f0b1361194e5760405162461bcd60e51b8152602060048201526016602482015275139bc8195e1a5cdd1a5b99c81b1bd8dac8199bdd5b9960521b6044820152606401610b0b565b428160200151116119715760405162461bcd60e51b8152600401610b0b906134f2565b611219838360008460006127b6565b600b546001600160a01b0316331461199757600080fd5b60008181526009602052604090205461111a906001613491565b600b546001600160a01b031633146119c857600080fd5b6000908152600a60205260409020805460ff19166001179055565b600082815260096020526040902054158015611a0e57506000828152600a602052604090205460ff16155b611a2a5760405162461bcd60e51b8152600401610b0b90613425565b611a348183611aa9565b611a3d57600080fd5b611a478483612bc7565b611a518483612c2e565b611a5b8383612caf565b6000828152600360205260408082204390555183916001600160a01b0380871692908816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a450505050565b6000818152600d6020908152604080832054600e8352818420546001600160a01b039182168086526012855283862088841680885295529285205492938085149392909116149060ff168280611afc5750815b80611b045750805b979650505050505050565b60408051608081018252600080825260208201819052918101829052606081019190915260408051608081018252600080825260208201819052918101829052606081019190915260045460009081908715611c7b57428760200151118015611b7f575060008760000151600f0b135b15611bc4578651611b9590630784ce00906135d8565b600f0b602080870191909152870151611baf90429061345d565b8560200151611bbe9190613616565b600f0b85525b428660200151118015611bde575060008660000151600f0b135b15611c23578551611bf490630784ce00906135d8565b600f0b602080860191909152860151611c0e90429061345d565b8460200151611c1d9190613616565b600f0b84525b602080880151600090815260088252604090205490870151600f9190910b935015611c7b57866020015186602001511415611c6057829150611c7b565b602080870151600090815260089091526040902054600f0b91505b604080516080810182526000808252602082015242918101919091524360608201528115611cf0575060008181526005602090815260409182902082516080810184528154600f81810b8352600160801b909104900b9281019290925260018101549282019290925260029091015460608201525b604081015181600042831015611d3d576040840151611d0f904261345d565b6060850151611d1e904361345d565b611d3090670de0b6b3a76400006134a9565b611d3a91906134de565b90505b600062093a80611d4d81866134de565b611d5791906134a9565b905060005b60ff811015611ed257611d7262093a8083613491565b9150600042831115611d8657429250611d9a565b50600082815260086020526040902054600f0b5b611da4868461345d565b8760200151611db39190613616565b87518890611dc29083906136ab565b600f0b905250602087018051829190611ddc9083906136fb565b600f90810b90915288516000910b12159050611df757600087525b60008760200151600f0b1215611e0f57600060208801525b60408088018490528501519295508592670de0b6b3a764000090611e33908561345d565b611e3d90866134a9565b611e4791906134de565b8560600151611e569190613491565b6060880152611e66600189613491565b975042831415611e7c5750436060870152611ed2565b6000888152600560209081526040918290208951918a01516001600160801b03908116600160801b029216919091178155908801516001820155606088015160029091015550611ecb8161374a565b9050611d5c565b505060048590558b15611f5d5788602001518860200151611ef391906136ab565b84602001818151611f0491906136fb565b600f0b90525088518851611f1891906136ab565b84518590611f279083906136fb565b600f90810b90915260208601516000910b12159050611f4857600060208501525b60008460000151600f0b1215611f5d57600084525b6000858152600560209081526040918290208651918701516001600160801b03908116600160801b02921691909117815590850151600182015560608501516002909101558b1561212057428b602001511115612015576020890151611fc390886136fb565b96508a602001518a602001511415611fe7576020880151611fe490886136ab565b96505b60208b810151600090815260089091526040902080546001600160801b0319166001600160801b0389161790555b428a602001511115612070578a602001518a60200151111561207057602088015161204090876136ab565b60208b810151600090815260089091526040902080546001600160801b0319166001600160801b03831617905595505b60008c81526007602052604081205461208a906001613491565b905080600760008f815260200190815260200160002081905550428960400181815250504389606001818152505088600660008f815260200190815260200160002082633b9aca0081106120e0576120e06133f9565b825160208401516001600160801b03908116600160801b029116176003919091029190910190815560408201516001820155606090910151600290910155505b505050505050505050505050565b6121383382611aa9565b6121845760405162461bcd60e51b815260206004820181905260248201527f63616c6c6572206973206e6f74206f776e6572206e6f7220617070726f7665646044820152606401610b0b565b600061218f82610e03565b905061219b8183612bc7565b6121a58183612c2e565b600180549060006121b583613765565b909155505060405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60008062093a80806122088642613491565b61221291906134de565b61221c91906134a9565b90506000851161222b57600080fd5b4281116122895760405162461bcd60e51b815260206004820152602660248201527f43616e206f6e6c79206c6f636b20756e74696c2074696d6520696e207468652060448201526566757475726560d01b6064820152608401610b0b565b612297630784ce0042613491565b8111156122e65760405162461bcd60e51b815260206004820152601e60248201527f566f74696e67206c6f636b2063616e2062652034207965617273206d617800006044820152606401610b0b565b600c600081546122f59061374a565b90915550600c546123068482612d45565b5060008181526002602090815260409182902082518084019093528054600f0b835260019081015491830191909152612344918391899186916127b6565b95945050505050565b600080839050600062093a8080836040015161236991906134de565b61237391906134a9565b905060005b60ff8110156124275761238e62093a8083613491565b91506000858311156123a2578592506123b6565b50600082815260086020526040902054600f0b5b60408401516123c5908461345d565b84602001516123d49190613616565b845185906123e39083906136ab565b600f0b905250828614156123f75750612427565b808460200181815161240991906136fb565b600f0b90525050604083018290526124208161374a565b9050612378565b5060008260000151600f0b121561243d57600082525b50516001600160801b03169392505050565b6000438211156124615761246161340f565b600083815260076020526040812054815b60808110156125055781831061248757612505565b600060026124958486613491565b6124a0906001613491565b6124aa91906134de565b6000888152600660205260409020909150869082633b9aca0081106124d1576124d16133f9565b6003020160020154116124e6578093506124f4565b6124f160018261345d565b92505b506124fe8161374a565b9050612472565b50600085815260066020526040812083633b9aca008110612528576125286133f9565b60408051608081018252600392909202929092018054600f81810b8452600160801b909104900b60208301526001810154928201929092526002909101546060820152600454909150600061257d878361272c565b600081815260056020908152604080832081516080810183528154600f81810b8352600160801b909104900b93810193909352600181015491830191909152600201546060820152919250808484101561265c5760006005816125e1876001613491565b8152602080820192909252604090810160002081516080810183528154600f81810b8352600160801b909104900b9381019390935260018101549183019190915260020154606080830182905286015191925061263e919061345d565b925083604001518160400151612654919061345d565b915050612680565b606083015161266b904361345d565b915082604001514261267d919061345d565b90505b604083015182156126bd578284606001518c61269c919061345d565b6126a690846134a9565b6126b091906134de565b6126ba9082613491565b90505b60408701516126cc908261345d565b87602001516126db9190613616565b875188906126ea9083906136ab565b600f90810b90915288516000910b12905061271a57505093516001600160801b03169650610a7895505050505050565b60009950505050505050505050610a78565b60008082815b60808110156127ac57818310612747576127ac565b600060026127558486613491565b612760906001613491565b61276a91906134de565b600081815260056020526040902060020154909150871061278d5780935061279b565b61279860018261345d565b92505b506127a58161374a565b9050612732565b5090949350505050565b60005482906127c58682613491565b6000908155604080518082019091528181526020810191909152825160208085015190830152600f0b81528251879084906128019083906136fb565b600f0b905250851561281557602083018690525b6000888152600260209081526040909120845181546001600160801b0319166001600160801b0390911617815590840151600190910155612857888285611b0f565b338715801590612879575060048560048111156128765761287661377c565b14155b15612923576040516323b872dd60e01b81526001600160a01b038281166004830152306024830152604482018a90527f000000000000000000000000000000000000000000000000000000000000000016906323b872dd906064016020604051808303816000875af11580156128f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129179190613474565b6129235761292361340f565b8360200151816001600160a01b03167fff04ccafc360e16b67d682d17bd9503c4c6b9a131f6be6325762dc9ffc7de6248b8b89426040516129679493929190613792565b60405180910390a37f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c8361299b8a82613491565b6040805192835260208301919091520160405180910390a1505050505050505050565b600082815260076020526040812054806129dc576000915050610a78565b600084815260066020526040812082633b9aca0081106129fe576129fe6133f9565b60408051608081018252600392909202929092018054600f81810b8452600160801b909104900b602083015260018101549282018390526002015460608201529150612a4a90856137d0565b8160200151612a599190613616565b81518290612a689083906136ab565b600f90810b90915282516000910b12159050612a8357600081525b51600f0b9150610a789050565b606060405180610120016040528060fd8152602001613af960fd9139905080612ab886612dbd565b604051602001612ac992919061380f565b604051602081830303815290604052905080612ae485612dbd565b604051602001612af592919061388b565b604051602081830303815290604052905080612b1084612dbd565b604051602001612b2192919061390b565b604051602081830303815290604052905080612b3c83612dbd565b604051602001612b4d92919061398c565b60405160208183030381529060405290506000612b9a612b6c87612dbd565b612b7584612ebb565b604051602001612b869291906139e7565b604051602081830303815290604052612ebb565b905080604051602001612bad9190613a9f565b604051602081830303815290604052915050949350505050565b6000818152600d60205260409020546001600160a01b03838116911614612bf057612bf061340f565b6000818152600e60205260409020546001600160a01b031615612c2a576000818152600e6020526040902080546001600160a01b03191690555b5050565b6000818152600d60205260409020546001600160a01b03838116911614612c5757612c5761340f565b6000818152600d6020526040902080546001600160a01b0319169055612c7d8282613021565b6001600160a01b0382166000908152600f60205260408120805460019290612ca690849061345d565b90915550505050565b6000818152600d60205260409020546001600160a01b031615612cd457612cd461340f565b6000818152600d6020908152604080832080546001600160a01b0319166001600160a01b038716908117909155808452600f80845282852080546010865284872081885286528487208890558787526011865293862093909355908452909152805460019290612ca6908490613491565b60006001600160a01b038316612d5d57612d5d61340f565b612d678383612caf565b60018054906000612d778361374a565b909155505060405182906001600160a01b038516906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a450600192915050565b606081612de15750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612e0b5780612df58161374a565b9150612e049050600a836134de565b9150612de5565b60008167ffffffffffffffff811115612e2657612e2661329f565b6040519080825280601f01601f191660200182016040528015612e50576020820181803683370190505b5090505b8415610f3257612e6560018361345d565b9150612e72600a86613ae4565b612e7d906030613491565b60f81b818381518110612e9257612e926133f9565b60200101906001600160f81b031916908160001a905350612eb4600a866134de565b9450612e54565b805160609080612edb575050604080516020810190915260008152919050565b60006003612eea836002613491565b612ef491906134de565b612eff9060046134a9565b90506000612f0e826020613491565b67ffffffffffffffff811115612f2657612f2661329f565b6040519080825280601f01601f191660200182016040528015612f50576020820181803683370190505b5090506000604051806060016040528060408152602001613bf6604091399050600181016020830160005b86811015612fdc576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101612f7b565b506003860660018114612ff6576002811461300757613013565b613d3d60f01b600119830152613013565b603d60f81b6000198301525b505050918152949350505050565b6001600160a01b0382166000908152600f60205260408120546130469060019061345d565b60008381526011602052604090205490915080821415613096576001600160a01b0384166000908152601060209081526040808320858452825280832083905585835260119091528120556115a1565b6001600160a01b039390931660009081526010602090815260408083209383529281528282208054868452848420819055835260119091528282209490945592839055908252812055565b6001600160e01b0319811681146130f757600080fd5b50565b60006020828403121561310c57600080fd5b8135610d80816130e1565b60005b8381101561313257818101518382015260200161311a565b838111156115a15750506000910152565b6000815180845261315b816020860160208601613117565b601f01601f19169290920160200192915050565b602081526000610d806020830184613143565b60006020828403121561319457600080fd5b5035919050565b80356001600160a01b03811681146131b257600080fd5b919050565b600080604083850312156131ca57600080fd5b6131d38361319b565b946020939093013593505050565b600080604083850312156131f457600080fd5b50508035926020909101359150565b60008060006060848603121561321857600080fd5b6132218461319b565b925061322f6020850161319b565b9150604084013590509250925092565b60006020828403121561325157600080fd5b610d808261319b565b80151581146130f757600080fd5b6000806040838503121561327b57600080fd5b6132848361319b565b915060208301356132948161325a565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600080600080608085870312156132cb57600080fd5b6132d48561319b565b93506132e26020860161319b565b925060408501359150606085013567ffffffffffffffff8082111561330657600080fd5b818701915087601f83011261331a57600080fd5b81358181111561332c5761332c61329f565b604051601f8201601f19908116603f011681019083821181831017156133545761335461329f565b816040528281528a602084870101111561336d57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806000606084860312156133a657600080fd5b83359250602084013591506133bd6040850161319b565b90509250925092565b600080604083850312156133d957600080fd5b6133e28361319b565b91506133f06020840161319b565b90509250929050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052600160045260246000fd5b602080825260089082015267185d1d1858da195960c21b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008282101561346f5761346f613447565b500390565b60006020828403121561348657600080fd5b8151610d808161325a565b600082198211156134a4576134a4613447565b500190565b60008160001904831182151516156134c3576134c3613447565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826134ed576134ed6134c8565b500490565b60208082526024908201527f43616e6e6f742061646420746f2065787069726564206c6f636b2e20576974686040820152636472617760e01b606082015260800190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906110de90830184613143565b60006020828403121561357b57600080fd5b8151610d80816130e1565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600081600f0b83600f0b806135ef576135ef6134c8565b60016001607f1b031982146000198214161561360d5761360d613447565b90059392505050565b600081600f0b83600f0b60016001607f1b0360008213600084138383048511828216161561364657613646613447565b60016001607f1b0319600085128281168783058712161561366957613669613447565b6000871292508582058712848416161561368557613685613447565b8585058712818416161561369b5761369b613447565b5050509290910295945050505050565b600081600f0b83600f0b600081128160016001607f1b0319018312811516156136d6576136d6613447565b8160016001607f1b030183138116156136f1576136f1613447565b5090039392505050565b600081600f0b83600f0b600082128260016001607f1b030382138115161561372557613725613447565b8260016001607f1b031903821281161561374157613741613447565b50019392505050565b600060001982141561375e5761375e613447565b5060010190565b60008161377457613774613447565b506000190190565b634e487b7160e01b600052602160045260246000fd5b8481526020810184905260808101600584106137be57634e487b7160e01b600052602160045260246000fd5b60408201939093526060015292915050565b60008083128015600160ff1b8501841216156137ee576137ee613447565b6001600160ff1b038401831381161561380957613809613447565b50500390565b60008351613821818460208801613117565b6503a37b5b2b7160d51b9083019081528351613844816006840160208801613117565b7f3c2f746578743e3c7465787420783d2231302220793d2234302220636c61737360069290910191820152671e913130b9b2911f60c11b6026820152602e01949350505050565b6000835161389d818460208801613117565b6903130b630b731b2a7b3160b51b90830190815283516138c481600a840160208801613117565b7f3c2f746578743e3c7465787420783d2231302220793d2236302220636c617373600a9290910191820152671e913130b9b2911f60c11b602a820152603201949350505050565b6000835161391d818460208801613117565b6a03637b1b5b2b22fb2b732160ad1b908301908152835161394581600b840160208801613117565b7f3c2f746578743e3c7465787420783d2231302220793d2238302220636c617373600b9290910191820152671e913130b9b2911f60c11b602b820152603301949350505050565b6000835161399e818460208801613117565b6503b30b63ab2960d51b90830190815283516139c1816006840160208801613117565b6c1e17ba32bc3a1f1e17b9bb339f60991b60069290910191820152601301949350505050565b6f7b226e616d65223a20226c6f636b202360801b81528251600090613a13816010850160208801613117565b7f222c20226465736372697074696f6e223a202276654d554c5449204e4654222c6010918401918201527f2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b62616030820152641cd94d8d0b60da1b60508201528351613a84816055840160208801613117565b61227d60f01b60559290910191820152605701949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251613ad781601d850160208701613117565b91909101601d0192915050565b600082613af357613af36134c8565b50069056fe3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a2077686974653b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22626c61636b22202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212203f9326b2c7092f7d64715758533e2a310cc38f3109569bacab81d542ef75b46664736f6c634300080b0033ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef00000000000000000000000065ef703f5594d2573eb71aaf55bc0cb548492df4
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103425760003560e01c80638c2c9baf116101b8578063c87b56dd11610104578063e7e242d4116100a2578063f8a057631161007c578063f8a057631461089b578063fbd3a29d146108be578063fc0c546a146108d1578063fd4a77f1146108f857600080fd5b8063e7e242d414610839578063e985e9c51461084c578063ee99fe281461088857600080fd5b8063d4e54c3b116100de578063d4e54c3b146107eb578063e0514aba146107fe578063e2c7928114610811578063e441135c1461081957600080fd5b8063c87b56dd14610787578063d1c2babb1461079a578063d1febfb9146107ad57600080fd5b8063a183af5211610171578063b45a3c0e1161014b578063b45a3c0e14610711578063b88d4fde14610759578063c1f0fb9f1461076c578063c2c4c5c11461077f57600080fd5b8063a183af52146106d8578063a22cb465146106eb578063a4d855df146106fe57600080fd5b80638c2c9baf1461064d5780638fbb38ff14610660578063900cf0cf1461068357806395d89b411461068c578063981b24d0146106b2578063986b7d8a146106c557600080fd5b80632f745c591161029257806354fd4d50116102305780636f5488371161020a5780636f548837146105e457806370a08231146106045780637116c60c14610617578063711974841461062a57600080fd5b806354fd4d501461059a5780636352211e146105be57806365fc3873146105d157600080fd5b8063430c20811161026c578063430c20811461053b578063461f711c1461054e57806346c96aac146105745780634bc2a6571461058757600080fd5b80632f745c59146104d8578063313ce5671461050e57806342842e0e1461052857600080fd5b80630d6a2033116102ff5780631c984bc3116102d95780631c984bc31461049957806323b872dd146104ac57806325a58b56146104bf5780632e1a7d4d146104c557600080fd5b80630d6a2033146104365780631376f3da1461045657806318160ddd1461049157600080fd5b806301790e011461034757806301ffc9a714610363578063047fc9aa146103a057806306fdde03146103a9578063081812fc146103e0578063095ea7b314610421575b600080fd5b61035060015481565b6040519081526020015b60405180910390f35b6103906103713660046130fa565b6001600160e01b03191660009081526013602052604090205460ff1690565b604051901515815260200161035a565b61035060005481565b6103d36040518060400160405280600b81526020016a1d9953555315124813919560aa1b81525081565b60405161035a919061316f565b6104096103ee366004613182565b6000908152600e60205260409020546001600160a01b031690565b6040516001600160a01b03909116815260200161035a565b61043461042f3660046131b7565b61090b565b005b610350610444366004613182565b60096020526000908152604090205481565b6104696104643660046131e1565b6109f4565b60408051600f95860b81529390940b602084015292820152606081019190915260800161035a565b610350610a3b565b6103506104a73660046131e1565b610a4b565b6104346104ba366004613203565b610a7e565b43610350565b6104346104d3366004613182565b610a8f565b6103506104e63660046131b7565b6001600160a01b03919091166000908152601060209081526040808320938352929052205490565b610516601281565b60405160ff909116815260200161035a565b610434610536366004613203565b610d59565b6103906105493660046131b7565b610d74565b61056161055c366004613182565b610d87565b604051600f9190910b815260200161035a565b600b54610409906001600160a01b031681565b61043461059536600461323f565b610dca565b6103d3604051806040016040528060058152602001640312e302e360dc1b81525081565b6104096105cc366004613182565b610e03565b6103506105df3660046131e1565b610e7a565b6103506105f2366004613182565b60036020526000908152604090205481565b61035061061236600461323f565b610ebc565b610350610625366004613182565b610eda565b610561610638366004613182565b600860205260009081526040902054600f0b81565b61035061065b3660046131e1565b610f3a565b61039061066e366004613182565b600a6020526000908152604090205460ff1681565b61035060045481565b6103d36040518060400160405280600781526020016676654d554c544960c81b81525081565b6103506106c0366004613182565b610f46565b6104346106d3366004613182565b6110e8565b6104346106e63660046131e1565b61112c565b6104346106f9366004613268565b61122b565b61043461070c3660046131e1565b6112b0565b61073f61071f366004613182565b60026020526000908152604090208054600190910154600f9190910b9082565b60408051600f9390930b835260208301919091520161035a565b6104346107673660046132b5565b611495565b61043461077a366004613182565b6115a7565b6104346115d6565b6103d3610795366004613182565b611616565b6104346107a83660046131e1565b6116c3565b6104696107bb366004613182565b600560205260009081526040902080546001820154600290920154600f82810b93600160801b909304900b919084565b6103506107f9366004613391565b611831565b61035061080c3660046131e1565b611874565b600154610350565b610350610827366004613182565b60076020526000908152604090205481565b610350610847366004613182565b611880565b61039061085a3660046133c6565b6001600160a01b03918216600090815260126020908152604080832093909416825291909152205460ff1690565b6104346108963660046131e1565b6118a8565b6103506108a9366004613182565b60009081526002602052604090206001015490565b6104346108cc366004613182565b611980565b6104097f00000000000000000000000065ef703f5594d2573eb71aaf55bc0cb548492df481565b610434610906366004613182565b6119b1565b6000818152600d60205260409020546001600160a01b03168061092d57600080fd5b806001600160a01b0316836001600160a01b0316141561094c57600080fd5b6000828152600d60209081526040808320546001600160a01b0385811685526012845282852033808752945291909320549216149060ff16818061098d5750805b61099657600080fd5b6000848152600e602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918716917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a45050505050565b600660205281600052604060002081633b9aca008110610a1357600080fd5b6003020180546001820154600290920154600f82810b9550600160801b90920490910b925084565b6000610a4642610eda565b905090565b600082815260066020526040812082633b9aca008110610a6d57610a6d6133f9565b600302016001015490505b92915050565b610a8a838383336119e3565b505050565b60145460ff16600114610aa157600080fd5b6014805460ff19166002179055610ab83382611aa9565b610ac457610ac461340f565b600081815260096020526040902054158015610aef57506000818152600a602052604090205460ff16155b610b145760405162461bcd60e51b8152600401610b0b90613425565b60405180910390fd5b60008181526002602090815260409182902082518084019093528054600f0b835260010154908201819052421015610b875760405162461bcd60e51b8152602060048201526016602482015275546865206c6f636b206469646e27742065787069726560501b6044820152606401610b0b565b8051604080518082018252600080825260208083018281528783526002909152928120915182546001600160801b0319166001600160801b03909116178255915160019091015554600f9190910b90610be0828261345d565b600081905550610c0a848460405180604001604052806000600f0b81526020016000815250611b0f565b6000610c1585610e03565b9050610c208561212e565b60405163a9059cbb60e01b81526001600160a01b038281166004830152602482018590527f00000000000000000000000065ef703f5594d2573eb71aaf55bc0cb548492df4169063a9059cbb906044016020604051808303816000875af1158015610c8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb39190613474565b610cbf57610cbf61340f565b60408051868152602081018590524281830152905133917f02f25270a4d87bea75db541cdfe559334a275b4a233520ed6c0a2429667cca94919081900360600190a27f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c82610d2d858261345d565b6040805192835260208301919091520160405180910390a150506014805460ff19166001179055505050565b610a8a83838360405180602001604052806000815250611495565b6000610d808383611aa9565b9392505050565b6000818152600760209081526040808320546006909252822081633b9aca008110610db457610db46133f9565b6003020154600160801b9004600f0b9392505050565b600b546001600160a01b03163314610de157600080fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600d60205260408120546001600160a01b031680610a785760405162461bcd60e51b815260206004820152602960248201527f5645204e46543a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b0b565b60145460009060ff16600114610e8f57600080fd5b6014805460ff19166002179055610ea78383336121f6565b90506014805460ff1916600117905592915050565b6001600160a01b0381166000908152600f6020526040812054610a78565b600454600081815260056020908152604080832081516080810183528154600f81810b8352600160801b909104900b93810193909352600181015491830191909152600201546060820152909190610f32818561234d565b949350505050565b6000610d80838361244f565b600043821115610f5857610f5861340f565b6004546000610f67848361272c565b600081815260056020908152604080832081516080810183528154600f81810b8352600160801b909104900b9381019390935260018101549183019190915260020154606082015291925083831015611076576000600581610fca866001613491565b8152602080820192909252604090810160002081516080810183528154600f81810b8352600160801b909104900b93810193909352600181015491830191909152600201546060808301829052850151919250146110705782606001518160600151611036919061345d565b8360400151826040015161104a919061345d565b6060850151611059908a61345d565b61106391906134a9565b61106d91906134de565b91505b506110c5565b438260600151146110c5576060820151611090904361345d565b604083015161109f904261345d565b60608401516110ae908961345d565b6110b891906134a9565b6110c291906134de565b90505b6110de828284604001516110d99190613491565b61234d565b9695505050505050565b600b546001600160a01b031633146110ff57600080fd5b60008181526009602052604090205461111a9060019061345d565b60009182526009602052604090912055565b60145460ff1660011461113e57600080fd5b6014805460ff191660021790556111553383611aa9565b6111615761116161340f565b60008281526002602090815260409182902082518084019093528054600f0b83526001015490820152816111975761119761340f565b60008160000151600f0b136111e75760405162461bcd60e51b8152602060048201526016602482015275139bc8195e1a5cdd1a5b99c81b1bd8dac8199bdd5b9960521b6044820152606401610b0b565b4281602001511161120a5760405162461bcd60e51b8152600401610b0b906134f2565b611219838360008460026127b6565b50506014805460ff1916600117905550565b6001600160a01b0382163314156112445761124461340f565b3360008181526012602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60145460ff166001146112c257600080fd5b6014805460ff191660021790556112d93383611aa9565b6112e5576112e561340f565b600082815260026020908152604080832081518083019092528054600f0b825260010154918101919091529062093a80806113208542613491565b61132a91906134de565b61133491906134a9565b9050428260200151116113785760405162461bcd60e51b815260206004820152600c60248201526b131bd8dac8195e1c1a5c995960a21b6044820152606401610b0b565b60008260000151600f0b136113c35760405162461bcd60e51b8152602060048201526011602482015270139bdd1a1a5b99c81a5cc81b1bd8dad959607a1b6044820152606401610b0b565b816020015181116114165760405162461bcd60e51b815260206004820152601f60248201527f43616e206f6e6c7920696e637265617365206c6f636b206475726174696f6e006044820152606401610b0b565b611424630784ce0042613491565b8111156114735760405162461bcd60e51b815260206004820152601e60248201527f566f74696e67206c6f636b2063616e2062652034207965617273206d617800006044820152606401610b0b565b611482846000838560036127b6565b50506014805460ff191660011790555050565b6114a1848484336119e3565b823b156115a157604051630a85bd0160e11b81526001600160a01b0384169063150b7a02906114da903390889087908790600401613536565b6020604051808303816000875af1925050508015611515575060408051601f3d908101601f1916820190925261151291810190613569565b60015b61156f573d808015611543576040519150601f19603f3d011682016040523d82523d6000602084013e611548565b606091505b5080516115675760405162461bcd60e51b8152600401610b0b90613586565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b1461159f5760405162461bcd60e51b8152600401610b0b90613586565b505b50505050565b600b546001600160a01b031633146115be57600080fd5b6000908152600a60205260409020805460ff19169055565b611614600060405180604001604052806000600f0b8152602001600081525060405180604001604052806000600f0b81526020016000815250611b0f565b565b6000818152600d60205260409020546060906001600160a01b031661167d5760405162461bcd60e51b815260206004820152601b60248201527f517565727920666f72206e6f6e6578697374656e7420746f6b656e00000000006044820152606401610b0b565b60008281526002602090815260409182902082518084019093528054600f0b83526001015490820152610d80836116b481426129be565b60208401518451600f0b612a90565b6000828152600960205260409020541580156116ee57506000828152600a602052604090205460ff16155b61170a5760405162461bcd60e51b8152600401610b0b90613425565b8082141561171757600080fd5b6117213383611aa9565b61172a57600080fd5b6117343382611aa9565b61173d57600080fd5b6000828152600260208181526040808420815180830183528154600f90810b825260019283015482860190815288885295855283872084518086019095528054820b855290920154938301849052805194519095929490910b9211156117a75782602001516117ad565b83602001515b604080518082018252600080825260208083018281528b835260028252848320935184546001600160801b0319166001600160801b03909116178455516001909301929092558251808401909352808352908201529091506118129087908690611b0f565b61181b8661212e565b6118298583838660046127b6565b505050505050565b60145460009060ff1660011461184657600080fd5b6014805460ff1916600217905561185e8484846121f6565b90506014805460ff191660011790559392505050565b6000610d8083836129be565b60008181526003602052604081205443141561189e57506000919050565b610a7882426129be565b60145460ff166001146118ba57600080fd5b6014805460ff191660029081179091556000838152602091825260409081902081518083019092528054600f0b82526001015491810191909152816118fe57600080fd5b60008160000151600f0b1361194e5760405162461bcd60e51b8152602060048201526016602482015275139bc8195e1a5cdd1a5b99c81b1bd8dac8199bdd5b9960521b6044820152606401610b0b565b428160200151116119715760405162461bcd60e51b8152600401610b0b906134f2565b611219838360008460006127b6565b600b546001600160a01b0316331461199757600080fd5b60008181526009602052604090205461111a906001613491565b600b546001600160a01b031633146119c857600080fd5b6000908152600a60205260409020805460ff19166001179055565b600082815260096020526040902054158015611a0e57506000828152600a602052604090205460ff16155b611a2a5760405162461bcd60e51b8152600401610b0b90613425565b611a348183611aa9565b611a3d57600080fd5b611a478483612bc7565b611a518483612c2e565b611a5b8383612caf565b6000828152600360205260408082204390555183916001600160a01b0380871692908816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a450505050565b6000818152600d6020908152604080832054600e8352818420546001600160a01b039182168086526012855283862088841680885295529285205492938085149392909116149060ff168280611afc5750815b80611b045750805b979650505050505050565b60408051608081018252600080825260208201819052918101829052606081019190915260408051608081018252600080825260208201819052918101829052606081019190915260045460009081908715611c7b57428760200151118015611b7f575060008760000151600f0b135b15611bc4578651611b9590630784ce00906135d8565b600f0b602080870191909152870151611baf90429061345d565b8560200151611bbe9190613616565b600f0b85525b428660200151118015611bde575060008660000151600f0b135b15611c23578551611bf490630784ce00906135d8565b600f0b602080860191909152860151611c0e90429061345d565b8460200151611c1d9190613616565b600f0b84525b602080880151600090815260088252604090205490870151600f9190910b935015611c7b57866020015186602001511415611c6057829150611c7b565b602080870151600090815260089091526040902054600f0b91505b604080516080810182526000808252602082015242918101919091524360608201528115611cf0575060008181526005602090815260409182902082516080810184528154600f81810b8352600160801b909104900b9281019290925260018101549282019290925260029091015460608201525b604081015181600042831015611d3d576040840151611d0f904261345d565b6060850151611d1e904361345d565b611d3090670de0b6b3a76400006134a9565b611d3a91906134de565b90505b600062093a80611d4d81866134de565b611d5791906134a9565b905060005b60ff811015611ed257611d7262093a8083613491565b9150600042831115611d8657429250611d9a565b50600082815260086020526040902054600f0b5b611da4868461345d565b8760200151611db39190613616565b87518890611dc29083906136ab565b600f0b905250602087018051829190611ddc9083906136fb565b600f90810b90915288516000910b12159050611df757600087525b60008760200151600f0b1215611e0f57600060208801525b60408088018490528501519295508592670de0b6b3a764000090611e33908561345d565b611e3d90866134a9565b611e4791906134de565b8560600151611e569190613491565b6060880152611e66600189613491565b975042831415611e7c5750436060870152611ed2565b6000888152600560209081526040918290208951918a01516001600160801b03908116600160801b029216919091178155908801516001820155606088015160029091015550611ecb8161374a565b9050611d5c565b505060048590558b15611f5d5788602001518860200151611ef391906136ab565b84602001818151611f0491906136fb565b600f0b90525088518851611f1891906136ab565b84518590611f279083906136fb565b600f90810b90915260208601516000910b12159050611f4857600060208501525b60008460000151600f0b1215611f5d57600084525b6000858152600560209081526040918290208651918701516001600160801b03908116600160801b02921691909117815590850151600182015560608501516002909101558b1561212057428b602001511115612015576020890151611fc390886136fb565b96508a602001518a602001511415611fe7576020880151611fe490886136ab565b96505b60208b810151600090815260089091526040902080546001600160801b0319166001600160801b0389161790555b428a602001511115612070578a602001518a60200151111561207057602088015161204090876136ab565b60208b810151600090815260089091526040902080546001600160801b0319166001600160801b03831617905595505b60008c81526007602052604081205461208a906001613491565b905080600760008f815260200190815260200160002081905550428960400181815250504389606001818152505088600660008f815260200190815260200160002082633b9aca0081106120e0576120e06133f9565b825160208401516001600160801b03908116600160801b029116176003919091029190910190815560408201516001820155606090910151600290910155505b505050505050505050505050565b6121383382611aa9565b6121845760405162461bcd60e51b815260206004820181905260248201527f63616c6c6572206973206e6f74206f776e6572206e6f7220617070726f7665646044820152606401610b0b565b600061218f82610e03565b905061219b8183612bc7565b6121a58183612c2e565b600180549060006121b583613765565b909155505060405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60008062093a80806122088642613491565b61221291906134de565b61221c91906134a9565b90506000851161222b57600080fd5b4281116122895760405162461bcd60e51b815260206004820152602660248201527f43616e206f6e6c79206c6f636b20756e74696c2074696d6520696e207468652060448201526566757475726560d01b6064820152608401610b0b565b612297630784ce0042613491565b8111156122e65760405162461bcd60e51b815260206004820152601e60248201527f566f74696e67206c6f636b2063616e2062652034207965617273206d617800006044820152606401610b0b565b600c600081546122f59061374a565b90915550600c546123068482612d45565b5060008181526002602090815260409182902082518084019093528054600f0b835260019081015491830191909152612344918391899186916127b6565b95945050505050565b600080839050600062093a8080836040015161236991906134de565b61237391906134a9565b905060005b60ff8110156124275761238e62093a8083613491565b91506000858311156123a2578592506123b6565b50600082815260086020526040902054600f0b5b60408401516123c5908461345d565b84602001516123d49190613616565b845185906123e39083906136ab565b600f0b905250828614156123f75750612427565b808460200181815161240991906136fb565b600f0b90525050604083018290526124208161374a565b9050612378565b5060008260000151600f0b121561243d57600082525b50516001600160801b03169392505050565b6000438211156124615761246161340f565b600083815260076020526040812054815b60808110156125055781831061248757612505565b600060026124958486613491565b6124a0906001613491565b6124aa91906134de565b6000888152600660205260409020909150869082633b9aca0081106124d1576124d16133f9565b6003020160020154116124e6578093506124f4565b6124f160018261345d565b92505b506124fe8161374a565b9050612472565b50600085815260066020526040812083633b9aca008110612528576125286133f9565b60408051608081018252600392909202929092018054600f81810b8452600160801b909104900b60208301526001810154928201929092526002909101546060820152600454909150600061257d878361272c565b600081815260056020908152604080832081516080810183528154600f81810b8352600160801b909104900b93810193909352600181015491830191909152600201546060820152919250808484101561265c5760006005816125e1876001613491565b8152602080820192909252604090810160002081516080810183528154600f81810b8352600160801b909104900b9381019390935260018101549183019190915260020154606080830182905286015191925061263e919061345d565b925083604001518160400151612654919061345d565b915050612680565b606083015161266b904361345d565b915082604001514261267d919061345d565b90505b604083015182156126bd578284606001518c61269c919061345d565b6126a690846134a9565b6126b091906134de565b6126ba9082613491565b90505b60408701516126cc908261345d565b87602001516126db9190613616565b875188906126ea9083906136ab565b600f90810b90915288516000910b12905061271a57505093516001600160801b03169650610a7895505050505050565b60009950505050505050505050610a78565b60008082815b60808110156127ac57818310612747576127ac565b600060026127558486613491565b612760906001613491565b61276a91906134de565b600081815260056020526040902060020154909150871061278d5780935061279b565b61279860018261345d565b92505b506127a58161374a565b9050612732565b5090949350505050565b60005482906127c58682613491565b6000908155604080518082019091528181526020810191909152825160208085015190830152600f0b81528251879084906128019083906136fb565b600f0b905250851561281557602083018690525b6000888152600260209081526040909120845181546001600160801b0319166001600160801b0390911617815590840151600190910155612857888285611b0f565b338715801590612879575060048560048111156128765761287661377c565b14155b15612923576040516323b872dd60e01b81526001600160a01b038281166004830152306024830152604482018a90527f00000000000000000000000065ef703f5594d2573eb71aaf55bc0cb548492df416906323b872dd906064016020604051808303816000875af11580156128f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129179190613474565b6129235761292361340f565b8360200151816001600160a01b03167fff04ccafc360e16b67d682d17bd9503c4c6b9a131f6be6325762dc9ffc7de6248b8b89426040516129679493929190613792565b60405180910390a37f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c8361299b8a82613491565b6040805192835260208301919091520160405180910390a1505050505050505050565b600082815260076020526040812054806129dc576000915050610a78565b600084815260066020526040812082633b9aca0081106129fe576129fe6133f9565b60408051608081018252600392909202929092018054600f81810b8452600160801b909104900b602083015260018101549282018390526002015460608201529150612a4a90856137d0565b8160200151612a599190613616565b81518290612a689083906136ab565b600f90810b90915282516000910b12159050612a8357600081525b51600f0b9150610a789050565b606060405180610120016040528060fd8152602001613af960fd9139905080612ab886612dbd565b604051602001612ac992919061380f565b604051602081830303815290604052905080612ae485612dbd565b604051602001612af592919061388b565b604051602081830303815290604052905080612b1084612dbd565b604051602001612b2192919061390b565b604051602081830303815290604052905080612b3c83612dbd565b604051602001612b4d92919061398c565b60405160208183030381529060405290506000612b9a612b6c87612dbd565b612b7584612ebb565b604051602001612b869291906139e7565b604051602081830303815290604052612ebb565b905080604051602001612bad9190613a9f565b604051602081830303815290604052915050949350505050565b6000818152600d60205260409020546001600160a01b03838116911614612bf057612bf061340f565b6000818152600e60205260409020546001600160a01b031615612c2a576000818152600e6020526040902080546001600160a01b03191690555b5050565b6000818152600d60205260409020546001600160a01b03838116911614612c5757612c5761340f565b6000818152600d6020526040902080546001600160a01b0319169055612c7d8282613021565b6001600160a01b0382166000908152600f60205260408120805460019290612ca690849061345d565b90915550505050565b6000818152600d60205260409020546001600160a01b031615612cd457612cd461340f565b6000818152600d6020908152604080832080546001600160a01b0319166001600160a01b038716908117909155808452600f80845282852080546010865284872081885286528487208890558787526011865293862093909355908452909152805460019290612ca6908490613491565b60006001600160a01b038316612d5d57612d5d61340f565b612d678383612caf565b60018054906000612d778361374a565b909155505060405182906001600160a01b038516906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a450600192915050565b606081612de15750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612e0b5780612df58161374a565b9150612e049050600a836134de565b9150612de5565b60008167ffffffffffffffff811115612e2657612e2661329f565b6040519080825280601f01601f191660200182016040528015612e50576020820181803683370190505b5090505b8415610f3257612e6560018361345d565b9150612e72600a86613ae4565b612e7d906030613491565b60f81b818381518110612e9257612e926133f9565b60200101906001600160f81b031916908160001a905350612eb4600a866134de565b9450612e54565b805160609080612edb575050604080516020810190915260008152919050565b60006003612eea836002613491565b612ef491906134de565b612eff9060046134a9565b90506000612f0e826020613491565b67ffffffffffffffff811115612f2657612f2661329f565b6040519080825280601f01601f191660200182016040528015612f50576020820181803683370190505b5090506000604051806060016040528060408152602001613bf6604091399050600181016020830160005b86811015612fdc576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101612f7b565b506003860660018114612ff6576002811461300757613013565b613d3d60f01b600119830152613013565b603d60f81b6000198301525b505050918152949350505050565b6001600160a01b0382166000908152600f60205260408120546130469060019061345d565b60008381526011602052604090205490915080821415613096576001600160a01b0384166000908152601060209081526040808320858452825280832083905585835260119091528120556115a1565b6001600160a01b039390931660009081526010602090815260408083209383529281528282208054868452848420819055835260119091528282209490945592839055908252812055565b6001600160e01b0319811681146130f757600080fd5b50565b60006020828403121561310c57600080fd5b8135610d80816130e1565b60005b8381101561313257818101518382015260200161311a565b838111156115a15750506000910152565b6000815180845261315b816020860160208601613117565b601f01601f19169290920160200192915050565b602081526000610d806020830184613143565b60006020828403121561319457600080fd5b5035919050565b80356001600160a01b03811681146131b257600080fd5b919050565b600080604083850312156131ca57600080fd5b6131d38361319b565b946020939093013593505050565b600080604083850312156131f457600080fd5b50508035926020909101359150565b60008060006060848603121561321857600080fd5b6132218461319b565b925061322f6020850161319b565b9150604084013590509250925092565b60006020828403121561325157600080fd5b610d808261319b565b80151581146130f757600080fd5b6000806040838503121561327b57600080fd5b6132848361319b565b915060208301356132948161325a565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600080600080608085870312156132cb57600080fd5b6132d48561319b565b93506132e26020860161319b565b925060408501359150606085013567ffffffffffffffff8082111561330657600080fd5b818701915087601f83011261331a57600080fd5b81358181111561332c5761332c61329f565b604051601f8201601f19908116603f011681019083821181831017156133545761335461329f565b816040528281528a602084870101111561336d57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806000606084860312156133a657600080fd5b83359250602084013591506133bd6040850161319b565b90509250925092565b600080604083850312156133d957600080fd5b6133e28361319b565b91506133f06020840161319b565b90509250929050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052600160045260246000fd5b602080825260089082015267185d1d1858da195960c21b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008282101561346f5761346f613447565b500390565b60006020828403121561348657600080fd5b8151610d808161325a565b600082198211156134a4576134a4613447565b500190565b60008160001904831182151516156134c3576134c3613447565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826134ed576134ed6134c8565b500490565b60208082526024908201527f43616e6e6f742061646420746f2065787069726564206c6f636b2e20576974686040820152636472617760e01b606082015260800190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906110de90830184613143565b60006020828403121561357b57600080fd5b8151610d80816130e1565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600081600f0b83600f0b806135ef576135ef6134c8565b60016001607f1b031982146000198214161561360d5761360d613447565b90059392505050565b600081600f0b83600f0b60016001607f1b0360008213600084138383048511828216161561364657613646613447565b60016001607f1b0319600085128281168783058712161561366957613669613447565b6000871292508582058712848416161561368557613685613447565b8585058712818416161561369b5761369b613447565b5050509290910295945050505050565b600081600f0b83600f0b600081128160016001607f1b0319018312811516156136d6576136d6613447565b8160016001607f1b030183138116156136f1576136f1613447565b5090039392505050565b600081600f0b83600f0b600082128260016001607f1b030382138115161561372557613725613447565b8260016001607f1b031903821281161561374157613741613447565b50019392505050565b600060001982141561375e5761375e613447565b5060010190565b60008161377457613774613447565b506000190190565b634e487b7160e01b600052602160045260246000fd5b8481526020810184905260808101600584106137be57634e487b7160e01b600052602160045260246000fd5b60408201939093526060015292915050565b60008083128015600160ff1b8501841216156137ee576137ee613447565b6001600160ff1b038401831381161561380957613809613447565b50500390565b60008351613821818460208801613117565b6503a37b5b2b7160d51b9083019081528351613844816006840160208801613117565b7f3c2f746578743e3c7465787420783d2231302220793d2234302220636c61737360069290910191820152671e913130b9b2911f60c11b6026820152602e01949350505050565b6000835161389d818460208801613117565b6903130b630b731b2a7b3160b51b90830190815283516138c481600a840160208801613117565b7f3c2f746578743e3c7465787420783d2231302220793d2236302220636c617373600a9290910191820152671e913130b9b2911f60c11b602a820152603201949350505050565b6000835161391d818460208801613117565b6a03637b1b5b2b22fb2b732160ad1b908301908152835161394581600b840160208801613117565b7f3c2f746578743e3c7465787420783d2231302220793d2238302220636c617373600b9290910191820152671e913130b9b2911f60c11b602b820152603301949350505050565b6000835161399e818460208801613117565b6503b30b63ab2960d51b90830190815283516139c1816006840160208801613117565b6c1e17ba32bc3a1f1e17b9bb339f60991b60069290910191820152601301949350505050565b6f7b226e616d65223a20226c6f636b202360801b81528251600090613a13816010850160208801613117565b7f222c20226465736372697074696f6e223a202276654d554c5449204e4654222c6010918401918201527f2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b62616030820152641cd94d8d0b60da1b60508201528351613a84816055840160208801613117565b61227d60f01b60559290910191820152605701949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251613ad781601d850160208701613117565b91909101601d0192915050565b600082613af357613af36134c8565b50069056fe3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a2077686974653b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22626c61636b22202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212203f9326b2c7092f7d64715758533e2a310cc38f3109569bacab81d542ef75b46664736f6c634300080b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000065ef703f5594d2573eb71aaf55bc0cb548492df4
-----Decoded View---------------
Arg [0] : token_addr (address): 0x65Ef703f5594D2573eb71Aaf55BC0CB548492df4
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000065ef703f5594d2573eb71aaf55bc0cb548492df4
Deployed Bytecode Sourcemap
10686:43487:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11497:21;;;;;;;;;160:25:1;;;148:2;133:18;11497:21:0;;;;;;;;14706:136;;;;;;:::i;:::-;-1:-1:-1;;;;;;14801:33:0;14777:4;14801:33;;;:19;:33;;;;;;;;;14706:136;;;;747:14:1;;740:22;722:41;;710:2;695:18;14706:136:0;582:187:1;11472:18:0;;;;;;12084:43;;;;;;;;;;;;;;;-1:-1:-1;;;12084:43:0;;;;;;;;;;;;:::i;17108:117::-;;;;;;:::i;:::-;17167:7;17194:23;;;:13;:23;;;;;;-1:-1:-1;;;;;17194:23:0;;17108:117;;;;-1:-1:-1;;;;;1874:32:1;;;1856:51;;1844:2;1829:18;17108:117:0;1710:203:1;27460:658:0;;;;;;:::i;:::-;;:::i;:::-;;11967:40;;;;;;:::i;:::-;;;;;;;;;;;;;;11733:60;;;;;;:::i;:::-;;:::i;:::-;;;;2864:2:1;2853:22;;;2835:41;;2912:22;;;;2907:2;2892:18;;2885:50;2951:18;;;2944:34;3009:2;2994:18;;2987:34;;;;2822:3;2807:19;11733:60:0;2608:419:1;50635:109:0;;;:::i;15422:150::-;;;;;;:::i;:::-;;:::i;23629:174::-;;;;;;:::i;:::-;;:::i;38913:91::-;38984:12;38913:91;;43373:1011;;;;;;:::i;:::-;;:::i;17629:159::-;;;;;;:::i;:::-;-1:-1:-1;;;;;17739:28:0;;;;17715:4;17739:28;;;:20;:28;;;;;;;;:41;;;;;;;;;17629:159;12229:35;;12262:2;12229:35;;;;;3537:4:1;3525:17;;;3507:36;;3495:2;3480:18;12229:35:0;3365:184:1;26731:173:0;;;;;;:::i;:::-;;:::i;18564:153::-;;;;;;:::i;:::-;;:::i;15021:194::-;;;;;;:::i;:::-;;:::i;:::-;;;3727:2:1;3716:22;;;;3698:41;;3686:2;3671:18;15021:194:0;3554:191:1;12055:20:0;;;;;-1:-1:-1;;;;;12055:20:0;;;37496:115;;;;;;:::i;:::-;;:::i;12182:40::-;;;;;;;;;;;;;;;-1:-1:-1;;;12182:40:0;;;;;16755:223;;;;;;:::i;:::-;;:::i;41552:166::-;;;;;;:::i;:::-;;:::i;11578:45::-;;;;;;:::i;:::-;;;;;;;;;;;;;;16432:106;;;;;;:::i;:::-;;:::i;50429:198::-;;;;;;:::i;:::-;;:::i;11883:44::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;49067:140;;;;;;:::i;:::-;;:::i;12014:34::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;11632:17;;;;;;12134:41;;;;;;;;;;;;;;;-1:-1:-1;;;12134:41:0;;;;;50940:880;;;;;;:::i;:::-;;:::i;38030:145::-;;;;;;:::i;:::-;;:::i;41898:503::-;;;;;;:::i;:::-;;:::i;28630:301::-;;;;;;:::i;:::-;;:::i;42537:724::-;;;;;;:::i;:::-;;:::i;11525:44::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4585:2:1;4574:22;;;;4556:41;;4628:2;4613:18;;4606:34;;;;4529:18;11525:44:0;4384:262:1;25012:988:0;;;;;;:::i;:::-;;:::i;37747:122::-;;;;;;:::i;:::-;;:::i;39062:106::-;;;:::i;46299:415::-;;;;;;:::i;:::-;;:::i;38183:722::-;;;;;;:::i;:::-;;:::i;11656:43::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11656:43:0;;;;;;;;;41140:176;;;;;;:::i;:::-;;:::i;46929:130::-;;;;;;:::i;:::-;;:::i;16546:90::-;16619:9;;16546:90;;11831:45;;;;;;:::i;:::-;;;;;;;;;;;;;;46722:199;;;;;;:::i;:::-;;:::i;17434:153::-;;;;;;:::i;:::-;-1:-1:-1;;;;;17543:24:0;;;17518:4;17543:24;;;:16;:24;;;;;;;;17542:37;;;;;;;;;;;;;;;17434:153;39493:433;;;;;;:::i;:::-;;:::i;15721:111::-;;;;;;:::i;:::-;15780:4;15804:16;;;:6;:16;;;;;:20;;;;15721:111;37877:145;;;;;;:::i;:::-;;:::i;11435:30::-;;;;;37619:120;;;;;;:::i;:::-;;:::i;27460:658::-;27529:13;27545:19;;;:9;:19;;;;;;-1:-1:-1;;;;;27545:19:0;27635;27627:28;;;;;;27742:5;-1:-1:-1;;;;;27729:18:0;:9;-1:-1:-1;;;;;27729:18:0;;;27721:27;;;;;;27790:18;27812:19;;;:9;:19;;;;;;;;;-1:-1:-1;;;;;27888:23:0;;;;;:16;:23;;;;;27835:10;27887:37;;;;;;;;;;27812:19;;:33;;27887:37;;27812:33;;27943:39;;;27960:22;27943:39;27935:48;;;;;;28023:23;;;;:13;:23;;;;;;:35;;-1:-1:-1;;;;;;28023:35:0;-1:-1:-1;;;;;28023:35:0;;;;;;;;;28074:36;;28023:23;;28074:36;;;;;;;27518:600;;;27460:658;;:::o;11733:60::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;11733:60:0;;;;;;;-1:-1:-1;11733:60:0;:::o;50635:109::-;50681:4;50705:31;50720:15;50705:14;:31::i;:::-;50698:38;;50635:109;:::o;15422:150::-;15503:4;15527:28;;;:18;:28;;;;;15556:4;15527:34;;;;;;;:::i;:::-;;;;:37;;;15520:44;;15422:150;;;;;:::o;23629:174::-;23748:47;23762:5;23769:3;23774:8;23784:10;23748:13;:47::i;:::-;23629:174;;;:::o;43373:1011::-;13803:14;;:30;:14;13669:1;13803:30;13795:39;;;;;;13845:14;:25;;-1:-1:-1;;13845:25:0;13712:1;13845:25;;;43446:40:::1;43465:10;43477:8:::0;43446:18:::1;:40::i;:::-;43439:48;;;;:::i;:::-;43506:21;::::0;;;:11:::1;:21;::::0;;;;;:26;:46;::::1;;;-1:-1:-1::0;43537:15:0::1;::::0;;;:5:::1;:15;::::0;;;;;::::1;;43536:16;43506:46;43498:67;;;;-1:-1:-1::0;;;43498:67:0::1;;;;;;;:::i;:::-;;;;;;;;;43578:28;43609:16:::0;;;:6:::1;:16;::::0;;;;;;;;43578:47;;;;::::1;::::0;;;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;;43644:15:::1;:30;;43636:65;;;::::0;-1:-1:-1;;;43636:65:0;;7320:2:1;43636:65:0::1;::::0;::::1;7302:21:1::0;7359:2;7339:18;;;7332:30;-1:-1:-1;;;7378:18:1;;;7371:52;7440:18;;43636:65:0::1;7118:346:1::0;43636:65:0::1;43737:14:::0;;43785:18:::1;::::0;;;;::::1;::::0;;-1:-1:-1;43785:18:0;;;::::1;::::0;;::::1;::::0;;;43766:16;;;:6:::1;:16:::0;;;;;;:37;;;;-1:-1:-1;;;;;;43766:37:0::1;-1:-1:-1::0;;;;;43766:37:0;;;::::1;::::0;;;;-1:-1:-1;43766:37:0;;::::1;::::0;43835:6;43730:22:::1;::::0;;;::::1;::::0;43861:21:::1;43730:22:::0;43835:6;43861:21:::1;:::i;:::-;43852:6;:30;;;;44040:50;44052:8;44062:7;44071:18;;;;;;;;44085:1;44071:18;;;;;;44087:1;44071:18;;::::0;44040:11:::1;:50::i;:::-;44103:13;44119:17;44127:8;44119:7;:17::i;:::-;44103:33;;44172:15;44178:8;44172:5;:15::i;:::-;44207:36;::::0;-1:-1:-1;;;44207:36:0;;-1:-1:-1;;;;;7923:32:1;;;44207:36:0::1;::::0;::::1;7905:51:1::0;7972:18;;;7965:34;;;44214:5:0::1;44207:22;::::0;::::1;::::0;7878:18:1;;44207:36:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44200:44;;;;:::i;:::-;44262:54;::::0;;8462:25:1;;;8518:2;8503:18;;8496:34;;;44300:15:0::1;8546:18:1::0;;;8539:34;44262:54:0;;44271:10:::1;::::0;44262:54:::1;::::0;;;;;8450:2:1;44262:54:0;;::::1;44332:44;44339:13:::0;44354:21:::1;44370:5:::0;44339:13;44354:21:::1;:::i;:::-;44332:44;::::0;;8758:25:1;;;8814:2;8799:18;;8792:34;;;;8731:18;44332:44:0::1;;;;;;;-1:-1:-1::0;;13893:14:0;:29;;-1:-1:-1;;13893:29:0;13669:1;13893:29;;;-1:-1:-1;;;43373:1011:0:o;26731:173::-;26854:42;26871:5;26878:3;26883:8;26854:42;;;;;;;;;;;;:16;:42::i;18564:153::-;18647:4;18671:38;18690:8;18700;18671:18;:38::i;:::-;18664:45;18564:153;-1:-1:-1;;;18564:153:0:o;15021:194::-;15088:6;15121:26;;;:16;:26;;;;;;;;;15165:18;:28;;;;;15121:26;15165:36;;;;;;;:::i;:::-;;;;:42;-1:-1:-1;;;15165:42:0;;;;;15021:194;-1:-1:-1;;;15021:194:0:o;37496:115::-;37572:5;;-1:-1:-1;;;;;37572:5:0;37558:10;:19;37550:28;;;;;;37589:5;:14;;-1:-1:-1;;;;;;37589:14:0;-1:-1:-1;;;;;37589:14:0;;;;;;;;;;37496:115::o;16755:223::-;16808:7;16844:19;;;:9;:19;;;;;;-1:-1:-1;;;;;16844:19:0;16882;16874:73;;;;-1:-1:-1;;;16874:73:0;;9039:2:1;16874:73:0;;;9021:21:1;9078:2;9058:18;;;9051:30;9117:34;9097:18;;;9090:62;-1:-1:-1;;;9168:18:1;;;9161:39;9217:19;;16874:73:0;8837:405:1;41552:166:0;13803:14;;41638:4;;13803:30;:14;13669:1;13803:30;13795:39;;;;;;13845:14;:25;;-1:-1:-1;;13845:25:0;13712:1;13845:25;;;41662:48:::1;41675:6:::0;41683:14;41699:10:::1;41662:12;:48::i;:::-;41655:55;;13893:14:::0;:29;;-1:-1:-1;;13893:29:0;13669:1;13893:29;;;41552:166;;-1:-1:-1;;41552:166:0:o;16432:106::-;-1:-1:-1;;;;;16155:27:0;;16490:4;16155:27;;;:19;:27;;;;;;16514:16;16074:116;50429:198;50513:5;;50482:4;50555:21;;;:13;:21;;;;;;;;50529:47;;;;;;;;;;;;;;;-1:-1:-1;;;50529:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50482:4;;50513:5;50594:25;50529:47;50617:1;50594:10;:25::i;:::-;50587:32;50429:198;-1:-1:-1;;;;50429:198:0:o;49067:140::-;49142:4;49166:33;49182:8;49192:6;49166:15;:33::i;50940:880::-;50999:4;51033:12;51023:6;:22;;51016:30;;;;:::i;:::-;51071:5;;51057:11;51107:33;51125:6;51071:5;51107:17;:33::i;:::-;51153:18;51174:27;;;:13;:27;;;;;;;;51153:48;;;;;;;;;;;;;;;-1:-1:-1;;;51153:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51087:53;;-1:-1:-1;51238:21:0;;;51234:465;;;51276:23;51302:13;51276:23;51316:16;:12;51331:1;51316:16;:::i;:::-;51302:31;;;;;;;;;;;;;;-1:-1:-1;51302:31:0;51276:57;;;;;;;;;;;;;;;-1:-1:-1;;;51276:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51352:9;;;51276:57;;-1:-1:-1;51352:27:0;51348:155;;51477:5;:9;;;51460:10;:14;;;:26;;;;:::i;:::-;51446:5;:8;;;51430:10;:13;;;:24;;;;:::i;:::-;51416:9;;;;51407:18;;:6;:18;:::i;:::-;51406:49;;;;:::i;:::-;51405:82;;;;:::i;:::-;51400:87;;51348:155;51261:253;51234:465;;;51552:12;51539:5;:9;;;:25;51535:153;;51662:9;;;;51647:24;;:12;:24;:::i;:::-;51633:8;;;;51615:26;;:15;:26;:::i;:::-;51601:9;;;;51592:18;;:6;:18;:::i;:::-;51591:51;;;;:::i;:::-;51590:82;;;;:::i;:::-;51585:87;;51535:153;51780:32;51791:5;51809:2;51798:5;:8;;;:13;;;;:::i;:::-;51780:10;:32::i;:::-;51773:39;50940:880;-1:-1:-1;;;;;;50940:880:0:o;38030:145::-;38103:5;;-1:-1:-1;;;;;38103:5:0;38089:10;:19;38081:28;;;;;;38144:21;;;;:11;:21;;;;;;:23;;38166:1;;38144:23;:::i;:::-;38120:21;;;;:11;:21;;;;;;:47;38030:145::o;41898:503::-;13803:14;;:30;:14;13669:1;13803:30;13795:39;;;;;;13845:14;:25;;-1:-1:-1;;13845:25:0;13712:1;13845:25;;;41991:40:::1;42010:10;42022:8:::0;41991:18:::1;:40::i;:::-;41984:48;;;;:::i;:::-;42045:28;42076:16:::0;;;:6:::1;:16;::::0;;;;;;;;42045:47;;;;::::1;::::0;;;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;42112:10;42105:18:::1;;;;:::i;:::-;42187:1;42170:7;:14;;;:18;;;42162:53;;;::::0;-1:-1:-1;;;42162:53:0;;10012:2:1;42162:53:0::1;::::0;::::1;9994:21:1::0;10051:2;10031:18;;;10024:30;-1:-1:-1;;;10070:18:1;;;10063:52;10132:18;;42162:53:0::1;9810:346:1::0;42162:53:0::1;42248:15;42234:7;:11;;;:29;42226:78;;;;-1:-1:-1::0;;;42226:78:0::1;;;;;;;:::i;:::-;42317:76;42330:8;42340:6;42348:1;42351:7;42360:32;42317:12;:76::i;:::-;-1:-1:-1::0;;13893:14:0;:29;;-1:-1:-1;;13893:29:0;13669:1;13893:29;;;-1:-1:-1;41898:503:0:o;28630:301::-;-1:-1:-1;;;;;28773:23:0;;28786:10;28773:23;;28766:31;;;;:::i;:::-;28825:10;28808:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;28808:39:0;;;;;;;;;;;;:51;;-1:-1:-1;;28808:51:0;;;;;;;;;;28875:48;;722:41:1;;;28808:39:0;;28825:10;28875:48;;695:18:1;28875:48:0;;;;;;;28630:301;;:::o;42537:724::-;13803:14;;:30;:14;13669:1;13803:30;13795:39;;;;;;13845:14;:25;;-1:-1:-1;;13845:25:0;13712:1;13845:25;;;42643:40:::1;42662:10;42674:8:::0;42643:18:::1;:40::i;:::-;42636:48;;;;:::i;:::-;42697:28;42728:16:::0;;;:6:::1;:16;::::0;;;;;;;42697:47;;;;::::1;::::0;;;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;;;;11256:7:::1;::::0;42775:32:::1;42793:14:::0;42775:15:::1;:32;:::i;:::-;42774:41;;;;:::i;:::-;:48;;;;:::i;:::-;42755:67;;42894:15;42880:7;:11;;;:29;42872:54;;;::::0;-1:-1:-1;;;42872:54:0;;10768:2:1;42872:54:0::1;::::0;::::1;10750:21:1::0;10807:2;10787:18;;;10780:30;-1:-1:-1;;;10826:18:1;;;10819:42;10878:18;;42872:54:0::1;10566:336:1::0;42872:54:0::1;42962:1;42945:7;:14;;;:18;;;42937:48;;;::::0;-1:-1:-1;;;42937:48:0;;11109:2:1;42937:48:0::1;::::0;::::1;11091:21:1::0;11148:2;11128:18;;;11121:30;-1:-1:-1;;;11167:18:1;;;11160:47;11224:18;;42937:48:0::1;10907:341:1::0;42937:48:0::1;43018:7;:11;;;43004;:25;42996:69;;;::::0;-1:-1:-1;;;42996:69:0;;11455:2:1;42996:69:0::1;::::0;::::1;11437:21:1::0;11494:2;11474:18;;;11467:30;11533:33;11513:18;;;11506:61;11584:18;;42996:69:0::1;11253:355:1::0;42996:69:0::1;43099:25;11303:15;43099;:25;:::i;:::-;43084:11;:40;;43076:83;;;::::0;-1:-1:-1;;;43076:83:0;;11815:2:1;43076:83:0::1;::::0;::::1;11797:21:1::0;11854:2;11834:18;;;11827:30;11893:32;11873:18;;;11866:60;11943:18;;43076:83:0::1;11613:354:1::0;43076:83:0::1;43172:81;43185:8;43195:1;43198:11;43211:7;43220:32;43172:12;:81::i;:::-;-1:-1:-1::0;;13893:14:0;:29;;-1:-1:-1;;13893:29:0;13669:1;13893:29;;;-1:-1:-1;;42537:724:0:o;25012:988::-;25162:47;25176:5;25183:3;25188:8;25198:10;25162:13;:47::i;:::-;24130:20;;24178:8;25222:771;;25368:73;;-1:-1:-1;;;25368:73:0;;-1:-1:-1;;;;;25368:37:0;;;;;:73;;25406:10;;25418:5;;25425:8;;25435:5;;25368:73;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25368:73:0;;;;;;;;-1:-1:-1;;25368:73:0;;;;;;;;;;;;:::i;:::-;;;25364:618;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25699:13:0;;25695:272;;25742:60;;-1:-1:-1;;;25742:60:0;;;;;;;:::i;25695:272::-;25917:6;25911:13;25902:6;25898:2;25894:15;25887:38;25364:618;-1:-1:-1;;;;;;25493:51:0;;-1:-1:-1;;;25493:51:0;25485:114;;;;-1:-1:-1;;;25485:114:0;;;;;;;:::i;:::-;25442:173;25364:618;25012:988;;;;:::o;37747:122::-;37821:5;;-1:-1:-1;;;;;37821:5:0;37807:10;:19;37799:28;;;;;;37856:5;37838:15;;;:5;:15;;;;;:23;;-1:-1:-1;;37838:23:0;;;37747:122::o;39062:106::-;39104:56;39116:1;39119:19;;;;;;;;39133:1;39119:19;;;;;;39136:1;39119:19;;;39140;;;;;;;;39154:1;39140:19;;;;;;39157:1;39140:19;;;39104:11;:56::i;:::-;39062:106::o;46299:415::-;46420:1;46389:19;;;:9;:19;;;;;;46355:13;;-1:-1:-1;;;;;46389:19:0;46381:73;;;;-1:-1:-1;;;46381:73:0;;13341:2:1;46381:73:0;;;13323:21:1;13380:2;13360:18;;;13353:30;13419:29;13399:18;;;13392:57;13466:18;;46381:73:0;13139:351:1;46381:73:0;46465:28;46496:16;;;:6;:16;;;;;;;;;46465:47;;;;;;;;;;;;;;;;;;;;;46539:167;46503:8;46586:40;46503:8;46610:15;46586:13;:40::i;:::-;46641:11;;;;46679:14;;46672:22;;46539:9;:167::i;38183:722::-;38248:18;;;;:11;:18;;;;;;:23;:40;;;;-1:-1:-1;38276:12:0;;;;:5;:12;;;;;;;;38275:13;38248:40;38240:61;;;;-1:-1:-1;;;38240:61:0;;;;;;;:::i;:::-;38329:3;38320:5;:12;;38312:21;;;;;;38352:37;38371:10;38383:5;38352:18;:37::i;:::-;38344:46;;;;;;38409:35;38428:10;38440:3;38409:18;:35::i;:::-;38401:44;;;;;;38458:29;38490:13;;;:6;:13;;;;;;;;38458:45;;;;;;;;;;;;;;;;;;;;;;;;;;38546:11;;;;;;;;;38514:43;;;;;;;;;;;;;;;;;;;;;;;;38594:15;;38633:12;;38458:45;;38514:43;;38587:23;;;;-1:-1:-1;38633:28:0;:58;;38679:8;:12;;;38633:58;;;38664:8;:12;;;38633:58;38720:19;;;;;;;;-1:-1:-1;38720:19:0;;;;;;;;;;38704:13;;;:6;:13;;;;;:35;;;;-1:-1:-1;;;;;;38704:35:0;-1:-1:-1;;;;;38704:35:0;;;;;;;-1:-1:-1;38704:35:0;;;;;;;38779:19;;;;;;;;;;;;;;;38622:69;;-1:-1:-1;38750:49:0;;38704:13;;38769:8;;38750:11;:49::i;:::-;38810:12;38816:5;38810;:12::i;:::-;38833:64;38846:3;38851:6;38859:3;38864:8;38874:22;38833:12;:64::i;:::-;38229:676;;;;38183:722;;:::o;41140:176::-;13803:14;;41243:4;;13803:30;:14;13669:1;13803:30;13795:39;;;;;;13845:14;:25;;-1:-1:-1;;13845:25:0;13712:1;13845:25;;;41267:41:::1;41280:6:::0;41288:14;41304:3;41267:12:::1;:41::i;:::-;41260:48;;13893:14:::0;:29;;-1:-1:-1;;13893:29:0;13669:1;13893:29;;;41140:176;;-1:-1:-1;;;41140:176:0:o;46929:130::-;47000:4;47024:27;47038:8;47048:2;47024:13;:27::i;46722:199::-;46782:4;46803:26;;;:16;:26;;;;;;46833:12;46803:42;46799:56;;;-1:-1:-1;46854:1:0;;46722:199;-1:-1:-1;46722:199:0:o;46799:56::-;46873:40;46887:8;46897:15;46873:13;:40::i;39493:433::-;13803:14;;:30;:14;13669:1;13803:30;13795:39;;;;;;13845:14;:25;;-1:-1:-1;;13845:25:0;13712:1;13845:25;;;;;;:14;39606:16;;;::::1;::::0;;;;;;;;39575:47;;;;::::1;::::0;;;;;::::1;;::::0;;13845:25;39575:47:::1;::::0;;;::::1;::::0;;;;39643:10;39635:19:::1;;;::::0;::::1;;39718:1;39701:7;:14;;;:18;;;39693:53;;;::::0;-1:-1:-1;;;39693:53:0;;10012:2:1;39693:53:0::1;::::0;::::1;9994:21:1::0;10051:2;10031:18;;;10024:30;-1:-1:-1;;;10070:18:1;;;10063:52;10132:18;;39693:53:0::1;9810:346:1::0;39693:53:0::1;39779:15;39765:7;:11;;;:29;39757:78;;;;-1:-1:-1::0;;;39757:78:0::1;;;;;;;:::i;:::-;39846:72;39859:8;39869:6;39877:1;39880:7;39889:28;39846:12;:72::i;37877:145::-:0;37950:5;;-1:-1:-1;;;;;37950:5:0;37936:10;:19;37928:28;;;;;;37991:21;;;;:11;:21;;;;;;:23;;38013:1;37991:23;:::i;37619:120::-;37692:5;;-1:-1:-1;;;;;37692:5:0;37678:10;:19;37670:28;;;;;;37709:15;;;;:5;:15;;;;;:22;;-1:-1:-1;;37709:22:0;37727:4;37709:22;;;37619:120::o;22230:789::-;22384:21;;;;:11;:21;;;;;;:26;:46;;;;-1:-1:-1;22415:15:0;;;;:5;:15;;;;;;;;22414:16;22384:46;22376:67;;;;-1:-1:-1;;;22376:67:0;;;;;;;:::i;:::-;22493:37;22512:7;22521:8;22493:18;:37::i;:::-;22485:46;;;;;;22613:31;22628:5;22635:8;22613:14;:31::i;:::-;22719:33;22736:5;22743:8;22719:16;:33::i;:::-;22783:26;22795:3;22800:8;22783:11;:26::i;:::-;22895;;;;:16;:26;;;;;;22924:12;22895:41;;22981:30;22912:8;;-1:-1:-1;;;;;22981:30:0;;;;;;;;;;;22230:789;;;;:::o;18134:422::-;18218:4;18251:19;;;:9;:19;;;;;;;;;18368:13;:23;;;;;;-1:-1:-1;;;;;18251:19:0;;;18434:23;;;:16;:23;;;;;18303:17;;;18433:35;;;;;;;;;18251:19;;18303:17;;;;18368:23;;;;18356:35;;18433;;18303:17;;18486:35;;;18504:17;18486:35;:62;;;;18525:23;18486:62;18479:69;18134:422;-1:-1:-1;;;;;;;18134:422:0:o;29906:5882::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30198:5:0;;30120:17;;;;30220:13;;30216:1170;;30362:15;30345:10;:14;;;:32;:57;;;;;30401:1;30381:10;:17;;;:21;;;30345:57;30341:234;;;30437:17;;:28;;11361:15;;30437:28;:::i;:::-;30423:42;;:11;;;;:42;;;;30525:14;;;:32;;30542:15;;30525:32;:::i;:::-;30497:5;:11;;;:62;;;;:::i;:::-;30484:75;;;;30341:234;30610:15;30593:10;:14;;;:32;:57;;;;;30649:1;30629:10;:17;;;:21;;;30593:57;30589:234;;;30685:17;;:28;;11361:15;;30685:28;:::i;:::-;30671:42;;:11;;;;:42;;;;30773:14;;;:32;;30790:15;;30773:32;:::i;:::-;30745:5;:11;;;:62;;;;:::i;:::-;30732:75;;;;30589:234;31091:14;;;;;31077:29;;;;:13;:29;;;;;;31125:14;;;;31077:29;;;;;;-1:-1:-1;31125:19:0;31121:254;;31187:10;:14;;;31169:10;:14;;;:32;31165:195;;;31239:10;31226:23;;31165:195;;;31325:14;;;;;31311:29;;;;:13;:29;;;;;;;;;;-1:-1:-1;31165:195:0;31424:66;;;;;;;;31398:23;31424:66;;;;;;;31454:15;31424:66;;;;;;;31476:12;31424:66;;;;31505:10;;31501:77;;-1:-1:-1;31545:21:0;;;;:13;:21;;;;;;;;;31532:34;;;;;;;;;;;;;;;-1:-1:-1;;;31532:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31501:77;31611:13;;;;:10;31588:20;31954:15;:31;-1:-1:-1;31950:160:0;;;32084:13;;;;32066:31;;:15;:31;:::i;:::-;32046:14;;;;32031:29;;:12;:29;:::i;:::-;32017:44;;11419:7;32017:44;:::i;:::-;32016:82;;;;:::i;:::-;32002:96;;31950:160;32349:8;11256:7;32361:22;11256:7;32361:15;:22;:::i;:::-;32360:31;;;;:::i;:::-;32349:42;;32411:6;32406:1383;32427:3;32423:1;:7;32406:1383;;;32633:11;11256:7;32633:11;;:::i;:::-;;;32663:14;32710:15;32704:3;:21;32700:168;;;32756:15;32750:21;;32700:168;;;-1:-1:-1;32830:18:0;;;;:13;:18;;;;;;;;32700:168;32938:21;32944:15;32938:3;:21;:::i;:::-;32905:10;:16;;;:56;;;;:::i;:::-;32886:75;;:10;;:75;;;;;:::i;:::-;;;;;-1:-1:-1;32980:16:0;;;:27;;33000:7;;32980:16;:27;;33000:7;;32980:27;:::i;:::-;;;;;;;;33030:15;;33048:1;33030:19;;;33026:127;;-1:-1:-1;33026:127:0;;33132:1;33114:19;;33026:127;33194:1;33175:10;:16;;;:20;;;33171:147;;;33297:1;33278:16;;;:20;33171:147;33376:13;;;;:19;;;33478:21;;;33354:3;;-1:-1:-1;33354:3:0;;11419:7;;33472:27;;33354:3;33472:27;:::i;:::-;33457:43;;:11;:43;:::i;:::-;33456:58;;;;:::i;:::-;33431:18;:22;;;:83;;;;:::i;:::-;33414:14;;;:100;33533:11;33543:1;33533:11;;:::i;:::-;;;33574:15;33567:3;:22;33563:211;;;-1:-1:-1;33631:12:0;33614:14;;;:29;33666:5;;33563:211;33720:21;;;;:13;:21;;;;;;;;;:34;;;;;;-1:-1:-1;;;;;33720:34:0;;;-1:-1:-1;;;33720:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32432:3:0;;;:::i;:::-;;;32406:1383;;;-1:-1:-1;;33812:5:0;:14;;;33895:13;;33891:483;;34103:5;:11;;;34089:5;:11;;;:25;;;;:::i;:::-;34068:10;:16;;:47;;;;;;;:::i;:::-;;;;;-1:-1:-1;34163:10:0;;34150;;:23;;34163:10;34150:23;:::i;:::-;34130:44;;:10;;:44;;;;;:::i;:::-;;;;;;;;34193:16;;;;34212:1;34193:20;;;34189:81;;-1:-1:-1;34189:81:0;;34253:1;34234:16;;;:20;34189:81;34306:1;34288:10;:15;;;:19;;;34284:79;;;34346:1;34328:19;;34284:79;34436:21;;;;:13;:21;;;;;;;;;:34;;;;;;-1:-1:-1;;;;;34436:34:0;;;-1:-1:-1;;;34436:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;34487:13;;34483:1298;;34727:15;34710:10;:14;;;:32;34706:402;;;34857:11;;;;34843:25;;;;:::i;:::-;;;34909:10;:14;;;34891:10;:14;;;:32;34887:145;;;34962:11;;;;34948:25;;;;:::i;:::-;;;34887:145;35064:14;;;;;35050:29;;;;:13;:29;;;;;;:42;;-1:-1:-1;;;;;;35050:42:0;-1:-1:-1;;;;;35050:42:0;;;;;34706:402;35145:15;35128:10;:14;;;:32;35124:344;;;35202:10;:14;;;35185:10;:14;;;:31;35181:209;;;35255:11;;;;35241:25;;;;:::i;:::-;35342:14;;;;;35328:29;;;;:13;:29;;;;;;:42;;-1:-1:-1;;;;;;35328:42:0;-1:-1:-1;;;;;35328:42:0;;;;;;-1:-1:-1;35181:209:0;35522:15;35540:26;;;:16;:26;;;;;;:30;;35569:1;35540:30;:::i;:::-;35522:48;;35616:10;35587:16;:26;35604:8;35587:26;;;;;;;;;;;:39;;;;35652:15;35641:5;:8;;:26;;;;;35694:12;35682:5;:9;;:24;;;;;35764:5;35721:18;:28;35740:8;35721:28;;;;;;;;;;;35750:10;35721:40;;;;;;;:::i;:::-;:48;;;;;;-1:-1:-1;;;;;35721:48:0;;;-1:-1:-1;;;35721:48:0;;;;:40;;;;;;;;;:48;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34483:1298:0;30051:5737;;;;;;;;;29906:5882;;;:::o;53766:404::-;53824:40;53843:10;53855:8;53824:18;:40::i;:::-;53816:85;;;;-1:-1:-1;;;53816:85:0;;15654:2:1;53816:85:0;;;15636:21:1;;;15673:18;;;15666:30;15732:34;15712:18;;;15705:62;15784:18;;53816:85:0;15452:356:1;53816:85:0;53914:13;53930:17;53938:8;53930:7;:17::i;:::-;53914:33;;53987:31;54002:5;54009:8;53987:14;:31::i;:::-;54054:33;54071:5;54078:8;54054:16;:33::i;:::-;54098:9;:11;;;:9;:11;;;:::i;:::-;;;;-1:-1:-1;;54125:37:0;;54153:8;;54149:1;;-1:-1:-1;;;;;54125:37:0;;;;;54149:1;;54125:37;53805:365;53766:404;:::o;40194:678::-;40281:4;;11256:7;;40318:32;40336:14;40318:15;:32;:::i;:::-;40317:41;;;;:::i;:::-;:48;;;;:::i;:::-;40298:67;;40432:1;40423:6;:10;40415:19;;;;;;40495:15;40481:11;:29;40473:80;;;;-1:-1:-1;;;40473:80:0;;16156:2:1;40473:80:0;;;16138:21:1;16195:2;16175:18;;;16168:30;16234:34;16214:18;;;16207:62;-1:-1:-1;;;16285:18:1;;;16278:36;16331:19;;40473:80:0;15954:402:1;40473:80:0;40587:25;11303:15;40587;:25;:::i;:::-;40572:11;:40;;40564:83;;;;-1:-1:-1;;;40564:83:0;;11815:2:1;40564:83:0;;;11797:21:1;11854:2;11834:18;;;11827:30;11893:32;11873:18;;;11866:60;11943:18;;40564:83:0;11613:354:1;40564:83:0;40662:7;;40660:9;;;;;:::i;:::-;;;;-1:-1:-1;40696:7:0;;40714:20;40720:3;40696:7;40714:5;:20::i;:::-;-1:-1:-1;40791:16:0;;;;:6;:16;;;;;;;;;40747:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;40760:8;;40770:6;;40778:11;;40747:12;:91::i;:::-;40856:8;40194:678;-1:-1:-1;;;;;40194:678:0:o;49464:791::-;49535:4;49552:23;49578:5;49552:31;;49594:8;11256:7;;49606:10;:13;;;:20;;;;:::i;:::-;49605:29;;;;:::i;:::-;49594:40;;49650:6;49645:472;49666:3;49662:1;:7;49645:472;;;49691:11;11256:7;49691:11;;:::i;:::-;;;49717:14;49760:1;49754:3;:7;49750:124;;;49788:1;49782:7;;49750:124;;;-1:-1:-1;49840:18:0;;;;:13;:18;;;;;;;;49750:124;49946:13;;;;49940:19;;:3;:19;:::i;:::-;49907:10;:16;;;:54;;;;:::i;:::-;49888:73;;:10;;:73;;;;;:::i;:::-;;;;;-1:-1:-1;49980:8:0;;;49976:54;;;50009:5;;;49976:54;50064:7;50044:10;:16;;:27;;;;;;;:::i;:::-;;;;;-1:-1:-1;;50086:13:0;;;:19;;;49671:3;;;:::i;:::-;;;49645:472;;;;50151:1;50133:10;:15;;;:19;;;50129:71;;;50187:1;50169:19;;50129:71;-1:-1:-1;50230:15:0;-1:-1:-1;;;;;50217:30:0;;49464:791;-1:-1:-1;;;49464:791:0:o;47369:1690::-;47445:4;47583:12;47573:6;:22;;47566:30;;;;:::i;:::-;47635:9;47671:26;;;:16;:26;;;;;;47635:9;47708:391;47729:3;47725:1;:7;47708:391;;;47824:4;47816;:12;47812:58;;47849:5;;47812:58;47884:9;47916:1;47897:11;47904:4;47897;:11;:::i;:::-;:15;;47911:1;47897:15;:::i;:::-;47896:21;;;;:::i;:::-;47936:28;;;;:18;:28;;;;;47884:33;;-1:-1:-1;47978:6:0;;47884:33;47936:34;;;;;;;:::i;:::-;;;;:38;;;:48;47932:156;;48012:4;48005:11;;47932:156;;;48064:8;48071:1;48064:4;:8;:::i;:::-;48057:15;;47932:156;-1:-1:-1;47734:3:0;;;:::i;:::-;;;47708:391;;;-1:-1:-1;48111:19:0;48133:28;;;:18;:28;;;;;48162:4;48133:34;;;;;;;:::i;:::-;48111:56;;;;;;;;48133:34;;;;;;;;;48111:56;;;;;;;;-1:-1:-1;;;48111:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48197:5;;48111:56;;-1:-1:-1;;48227:36:0;48245:6;48197:5;48227:17;:36::i;:::-;48274:20;48297:21;;;:13;:21;;;;;;;;48274:44;;;;;;;;;;;;;;;-1:-1:-1;;;48274:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48213:50;;-1:-1:-1;48274:20:0;48383:18;;;48379:311;;;48418:20;48441:13;48418:20;48455:10;:6;48464:1;48455:10;:::i;:::-;48441:25;;;;;;;;;;;;;;-1:-1:-1;48441:25:0;48418:48;;;;;;;;;;;;;;;-1:-1:-1;;;48418:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48505:11;;;48418:48;;-1:-1:-1;48491:25:0;;48505:11;48491:25;:::i;:::-;48481:35;;48550:7;:10;;;48537:7;:10;;;:23;;;;:::i;:::-;48531:29;;48403:169;48379:311;;;48618:11;;;;48603:26;;:12;:26;:::i;:::-;48593:36;;48668:7;:10;;;48650:15;:28;;;;:::i;:::-;48644:34;;48379:311;48718:10;;;;48743:12;;48739:99;;48819:7;48803;:11;;;48794:6;:20;;;;:::i;:::-;48787:28;;:3;:28;:::i;:::-;48786:40;;;;:::i;:::-;48772:54;;;;:::i;:::-;;;48739:99;48907:9;;;;48894:22;;:10;:22;:::i;:::-;48865:6;:12;;;:53;;;;:::i;:::-;48850:68;;:6;;:68;;;;;:::i;:::-;;;;;;;;48933:11;;48948:1;48933:16;;;;-1:-1:-1;48929:123:0;;-1:-1:-1;;48986:11:0;;-1:-1:-1;;;;;48973:26:0;;-1:-1:-1;48966:33:0;;-1:-1:-1;;;;;;48966:33:0;48929:123;49039:1;49032:8;;;;;;;;;;;;;44796:583;44875:4;;44954:9;44875:4;44974:376;44995:3;44991:1;:7;44974:376;;;45090:4;45082;:12;45078:58;;45115:5;;45078:58;45150:9;45182:1;45163:11;45170:4;45163;:11;:::i;:::-;:15;;45177:1;45163:15;:::i;:::-;45162:21;;;;:::i;:::-;45202:19;;;;:13;:19;;;;;:23;;;45150:33;;-1:-1:-1;45202:33:0;-1:-1:-1;45198:141:0;;45263:4;45256:11;;45198:141;;;45315:8;45322:1;45315:4;:8;:::i;:::-;45308:15;;45198:141;-1:-1:-1;45000:3:0;;;:::i;:::-;;;44974:376;;;-1:-1:-1;45367:4:0;;44796:583;-1:-1:-1;;;;44796:583:0:o;36131:1357::-;36334:28;36411:6;36365:14;;36439:22;36455:6;36411;36439:22;:::i;:::-;36430:6;:31;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;36553:14:0;;36569:11;;;;;36534:14;;;36514:67;;;;;36674:40;;36706:6;;36553:7;;36674:40;;36706:6;;36674:40;:::i;:::-;;;;;-1:-1:-1;36729:16:0;;36725:74;;36762:11;;;:25;;;36725:74;36809:16;;;;:6;:16;;;;;;;;:26;;;;-1:-1:-1;;;;;;36809:26:0;-1:-1:-1;;;;;36809:26:0;;;;;;;;;;-1:-1:-1;36809:26:0;;;;37087:42;36809:16;37109:10;36809:26;37087:11;:42::i;:::-;37157:10;37182:11;;;;;:53;;-1:-1:-1;37213:22:0;37197:12;:38;;;;;;;;:::i;:::-;;;37182:53;37178:149;;;37259:55;;-1:-1:-1;;;37259:55:0;;-1:-1:-1;;;;;16751:15:1;;;37259:55:0;;;16733:34:1;37300:4:0;16783:18:1;;;16776:43;16835:18;;;16828:34;;;37266:5:0;37259:26;;;;16668:18:1;;37259:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37252:63;;;;:::i;:::-;37376:7;:11;;;37352:4;-1:-1:-1;;;;;37344:75:0;;37358:8;37368:6;37389:12;37403:15;37344:75;;;;;;;;;:::i;:::-;;;;;;;;37435:45;37442:13;37457:22;37473:6;37442:13;37457:22;:::i;:::-;37435:45;;;8758:25:1;;;8814:2;8799:18;;8792:34;;;;8731:18;37435:45:0;;;;;;;36323:1165;;;;36131:1357;;;;;:::o;45659:531::-;45729:4;45760:26;;;:16;:26;;;;;;45801:11;45797:386;;45836:1;45829:8;;;;;45797:386;45870:23;45896:28;;;:18;:28;;;;;45925:6;45896:36;;;;;;;:::i;:::-;45870:62;;;;;;;;45896:36;;;;;;;;;45870:62;;;;;;;;-1:-1:-1;;;45870:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45992:34:0;;45999:2;45992:34;:::i;:::-;45966:10;:16;;;:61;;;;:::i;:::-;45947:80;;:10;;:80;;;;;:::i;:::-;;;;;;;;46046:15;;46064:1;46046:19;;;46042:79;;-1:-1:-1;46042:79:0;;46104:1;46086:19;;46042:79;46154:15;46147:23;;;-1:-1:-1;46135:36:0;;-1:-1:-1;46135:36:0;51828:1211;51933:20;51966:264;;;;;;;;;;;;;;;;;;;52274:6;52292:18;52301:8;52292;:18::i;:::-;52257:98;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52241:115;;52400:6;52422:20;52431:10;52422:8;:20::i;:::-;52383:104;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52367:121;;52532:6;52555:21;52564:11;52555:8;:21::i;:::-;52515:106;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52499:123;;52666:6;52684:16;52693:6;52684:8;:16::i;:::-;52649:69;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52633:86;;52732:18;52753:195;52817:18;52826:8;52817;:18::i;:::-;52910:28;52930:6;52910:13;:28::i;:::-;52780:165;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52753:13;:195::i;:::-;52732:216;;53025:4;52975:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;52959:72;;51955:1084;51828:1211;;;;;;:::o;21482:324::-;21620:19;;;;:9;:19;;;;;;-1:-1:-1;;;;;21620:29:0;;;:19;;:29;21613:37;;;;:::i;:::-;21700:1;21665:23;;;:13;:23;;;;;;-1:-1:-1;;;;;21665:23:0;:37;21661:138;;21785:1;21751:23;;;:13;:23;;;;;:36;;-1:-1:-1;;;;;;21751:36:0;;;21661:138;21482:324;;:::o;20942:422::-;21080:19;;;;:9;:19;;;;;;-1:-1:-1;;;;;21080:28:0;;;:19;;:28;21073:36;;;;:::i;:::-;21179:1;21149:19;;;:9;:19;;;;;:32;;-1:-1:-1;;;;;;21149:32:0;;;21238:42;21264:5;21159:8;21238:25;:42::i;:::-;-1:-1:-1;;;;;21325:26:0;;;;;;:19;:26;;;;;:31;;21355:1;;21325:26;:31;;21355:1;;21325:31;:::i;:::-;;;;-1:-1:-1;;;;20942:422:0:o;20426:402::-;20586:1;20555:19;;;:9;:19;;;;;;-1:-1:-1;;;;;20555:19:0;:33;20548:41;;;;:::i;:::-;20629:19;;;;:9;:19;;;;;;;;:25;;-1:-1:-1;;;;;;20629:25:0;-1:-1:-1;;;;;20629:25:0;;;;;;;;16155:27;;;:19;:27;;;;;;;;19015:20;:25;;;;;:40;;;;;;;;:51;;;19077:27;;;:17;:27;;;;;:43;;;;20791:24;;;;;;:29;;-1:-1:-1;;20629:19:0;20791:29;;-1:-1:-1;;20791:29:0;:::i;29271:349::-;29332:4;-1:-1:-1;;;;;29400:17:0;;29393:25;;;;:::i;:::-;29491:26;29503:3;29508:8;29491:11;:26::i;:::-;29528:9;:11;;;:9;:11;;;:::i;:::-;;;;-1:-1:-1;;29555:35:0;;29581:8;;-1:-1:-1;;;;;29555:35:0;;;29572:1;;29555:35;;29572:1;;29555:35;-1:-1:-1;29608:4:0;29271:349;;;;:::o;53047:711::-;53100:13;53321:10;53317:53;;-1:-1:-1;;53348:10:0;;;;;;;;;;;;-1:-1:-1;;;53348:10:0;;;;;53047:711::o;53317:53::-;53392:5;53380:9;53430:78;53437:9;;53430:78;;53463:8;;;;:::i;:::-;;-1:-1:-1;53486:10:0;;-1:-1:-1;53494:2:0;53486:10;;:::i;:::-;;;53430:78;;;53518:19;53550:6;53540:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53540:17:0;;53518:39;;53568:151;53575:10;;53568:151;;53602:11;53612:1;53602:11;;:::i;:::-;;-1:-1:-1;53668:10:0;53676:2;53668:5;:10;:::i;:::-;53658:21;;:2;:21;:::i;:::-;53645:36;;53628:6;53635;53628:14;;;;;;;;:::i;:::-;;;;:53;-1:-1:-1;;;;;53628:53:0;;;;;;;;-1:-1:-1;53696:11:0;53705:2;53696:11;;:::i;:::-;;;53568:151;;1077:1601;1172:11;;1135:13;;1198:8;1194:23;;-1:-1:-1;;1208:9:0;;;;;;;;;-1:-1:-1;1208:9:0;;;1077:1601;-1:-1:-1;1077:1601:0:o;1194:23::-;1269:15;1304:1;1293:7;:3;1299:1;1293:7;:::i;:::-;1292:13;;;;:::i;:::-;1287:19;;:1;:19;:::i;:::-;1269:37;-1:-1:-1;1364:19:0;1396:15;1269:37;1409:2;1396:15;:::i;:::-;1386:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1386:26:0;;1364:48;;1425:18;1446:5;;;;;;;;;;;;;;;;;1425:26;;1515:1;1508:5;1504:13;1560:2;1552:6;1548:15;1611:1;1579:777;1634:3;1631:1;1628:10;1579:777;;;1689:1;1732:12;;;;;1726:19;1827:4;1815:2;1811:14;;;;;1793:40;;1787:47;1936:2;1932:14;;;1928:25;;1914:40;;1908:47;2065:1;2061:13;;;2057:24;;2043:39;;2037:46;2185:16;;;;2171:31;;2165:38;1863:1;1859:11;;;1957:4;1904:58;;;1895:68;1988:11;;2033:57;;;2024:67;;;;2116:11;;2161:49;;2152:59;2240:3;2236:13;2269:22;;2339:1;2324:17;;;;1682:9;1579:777;;;1583:44;2388:1;2383:3;2379:11;2409:1;2404:84;;;;2507:1;2502:82;;;;2372:212;;2404:84;-1:-1:-1;;;;;2437:17:0;;2430:43;2404:84;;2502:82;-1:-1:-1;;;;;2535:17:0;;2528:41;2372:212;-1:-1:-1;;;2600:26:0;;;2607:6;1077:1601;-1:-1:-1;;;;1077:1601:0:o;19308:1011::-;-1:-1:-1;;;;;16155:27:0;;19412:18;16155:27;;;:19;:27;;;;;;19433:17;;19449:1;;19433:17;:::i;:::-;19461:18;19482:27;;;:17;:27;;;;;;19412:38;;-1:-1:-1;19526:30:0;;;19522:790;;;-1:-1:-1;;;;;19617:27:0;;19662:1;19617:27;;;:20;:27;;;;;;;;:42;;;;;;;;:46;;;19719:27;;;:17;:27;;;;;:31;19522:790;;;-1:-1:-1;;;;;19802:27:0;;;;19783:16;19802:27;;;:20;:27;;;;;;;;:42;;;;;;;;;;;19925;;;;;;:56;;;20037:30;;:17;:30;;;;;;:46;;;;20167;;;;20269:27;;;;;:31;19308:1011::o;196:131:1:-;-1:-1:-1;;;;;;270:32:1;;260:43;;250:71;;317:1;314;307:12;250:71;196:131;:::o;332:245::-;390:6;443:2;431:9;422:7;418:23;414:32;411:52;;;459:1;456;449:12;411:52;498:9;485:23;517:30;541:5;517:30;:::i;774:258::-;846:1;856:113;870:6;867:1;864:13;856:113;;;946:11;;;940:18;927:11;;;920:39;892:2;885:10;856:113;;;987:6;984:1;981:13;978:48;;;-1:-1:-1;;1022:1:1;1004:16;;997:27;774:258::o;1037:::-;1079:3;1117:5;1111:12;1144:6;1139:3;1132:19;1160:63;1216:6;1209:4;1204:3;1200:14;1193:4;1186:5;1182:16;1160:63;:::i;:::-;1277:2;1256:15;-1:-1:-1;;1252:29:1;1243:39;;;;1284:4;1239:50;;1037:258;-1:-1:-1;;1037:258:1:o;1300:220::-;1449:2;1438:9;1431:21;1412:4;1469:45;1510:2;1499:9;1495:18;1487:6;1469:45;:::i;1525:180::-;1584:6;1637:2;1625:9;1616:7;1612:23;1608:32;1605:52;;;1653:1;1650;1643:12;1605:52;-1:-1:-1;1676:23:1;;1525:180;-1:-1:-1;1525:180:1:o;1918:173::-;1986:20;;-1:-1:-1;;;;;2035:31:1;;2025:42;;2015:70;;2081:1;2078;2071:12;2015:70;1918:173;;;:::o;2096:254::-;2164:6;2172;2225:2;2213:9;2204:7;2200:23;2196:32;2193:52;;;2241:1;2238;2231:12;2193:52;2264:29;2283:9;2264:29;:::i;:::-;2254:39;2340:2;2325:18;;;;2312:32;;-1:-1:-1;;;2096:254:1:o;2355:248::-;2423:6;2431;2484:2;2472:9;2463:7;2459:23;2455:32;2452:52;;;2500:1;2497;2490:12;2452:52;-1:-1:-1;;2523:23:1;;;2593:2;2578:18;;;2565:32;;-1:-1:-1;2355:248:1:o;3032:328::-;3109:6;3117;3125;3178:2;3166:9;3157:7;3153:23;3149:32;3146:52;;;3194:1;3191;3184:12;3146:52;3217:29;3236:9;3217:29;:::i;:::-;3207:39;;3265:38;3299:2;3288:9;3284:18;3265:38;:::i;:::-;3255:48;;3350:2;3339:9;3335:18;3322:32;3312:42;;3032:328;;;;;:::o;3750:186::-;3809:6;3862:2;3850:9;3841:7;3837:23;3833:32;3830:52;;;3878:1;3875;3868:12;3830:52;3901:29;3920:9;3901:29;:::i;3941:118::-;4027:5;4020:13;4013:21;4006:5;4003:32;3993:60;;4049:1;4046;4039:12;4064:315;4129:6;4137;4190:2;4178:9;4169:7;4165:23;4161:32;4158:52;;;4206:1;4203;4196:12;4158:52;4229:29;4248:9;4229:29;:::i;:::-;4219:39;;4308:2;4297:9;4293:18;4280:32;4321:28;4343:5;4321:28;:::i;:::-;4368:5;4358:15;;;4064:315;;;;;:::o;4651:127::-;4712:10;4707:3;4703:20;4700:1;4693:31;4743:4;4740:1;4733:15;4767:4;4764:1;4757:15;4783:1138;4878:6;4886;4894;4902;4955:3;4943:9;4934:7;4930:23;4926:33;4923:53;;;4972:1;4969;4962:12;4923:53;4995:29;5014:9;4995:29;:::i;:::-;4985:39;;5043:38;5077:2;5066:9;5062:18;5043:38;:::i;:::-;5033:48;;5128:2;5117:9;5113:18;5100:32;5090:42;;5183:2;5172:9;5168:18;5155:32;5206:18;5247:2;5239:6;5236:14;5233:34;;;5263:1;5260;5253:12;5233:34;5301:6;5290:9;5286:22;5276:32;;5346:7;5339:4;5335:2;5331:13;5327:27;5317:55;;5368:1;5365;5358:12;5317:55;5404:2;5391:16;5426:2;5422;5419:10;5416:36;;;5432:18;;:::i;:::-;5507:2;5501:9;5475:2;5561:13;;-1:-1:-1;;5557:22:1;;;5581:2;5553:31;5549:40;5537:53;;;5605:18;;;5625:22;;;5602:46;5599:72;;;5651:18;;:::i;:::-;5691:10;5687:2;5680:22;5726:2;5718:6;5711:18;5766:7;5761:2;5756;5752;5748:11;5744:20;5741:33;5738:53;;;5787:1;5784;5777:12;5738:53;5843:2;5838;5834;5830:11;5825:2;5817:6;5813:15;5800:46;5888:1;5883:2;5878;5870:6;5866:15;5862:24;5855:35;5909:6;5899:16;;;;;;;4783:1138;;;;;;;:::o;5926:322::-;6003:6;6011;6019;6072:2;6060:9;6051:7;6047:23;6043:32;6040:52;;;6088:1;6085;6078:12;6040:52;6124:9;6111:23;6101:33;;6181:2;6170:9;6166:18;6153:32;6143:42;;6204:38;6238:2;6227:9;6223:18;6204:38;:::i;:::-;6194:48;;5926:322;;;;;:::o;6253:260::-;6321:6;6329;6382:2;6370:9;6361:7;6357:23;6353:32;6350:52;;;6398:1;6395;6388:12;6350:52;6421:29;6440:9;6421:29;:::i;:::-;6411:39;;6469:38;6503:2;6492:9;6488:18;6469:38;:::i;:::-;6459:48;;6253:260;;;;;:::o;6518:127::-;6579:10;6574:3;6570:20;6567:1;6560:31;6610:4;6607:1;6600:15;6634:4;6631:1;6624:15;6650:127;6711:10;6706:3;6702:20;6699:1;6692:31;6742:4;6739:1;6732:15;6766:4;6763:1;6756:15;6782:331;6984:2;6966:21;;;7023:1;7003:18;;;6996:29;-1:-1:-1;;;7056:2:1;7041:18;;7034:38;7104:2;7089:18;;6782:331::o;7469:127::-;7530:10;7525:3;7521:20;7518:1;7511:31;7561:4;7558:1;7551:15;7585:4;7582:1;7575:15;7601:125;7641:4;7669:1;7666;7663:8;7660:34;;;7674:18;;:::i;:::-;-1:-1:-1;7711:9:1;;7601:125::o;8010:245::-;8077:6;8130:2;8118:9;8109:7;8105:23;8101:32;8098:52;;;8146:1;8143;8136:12;8098:52;8178:9;8172:16;8197:28;8219:5;8197:28;:::i;9247:128::-;9287:3;9318:1;9314:6;9311:1;9308:13;9305:39;;;9324:18;;:::i;:::-;-1:-1:-1;9360:9:1;;9247:128::o;9380:168::-;9420:7;9486:1;9482;9478:6;9474:14;9471:1;9468:21;9463:1;9456:9;9449:17;9445:45;9442:71;;;9493:18;;:::i;:::-;-1:-1:-1;9533:9:1;;9380:168::o;9553:127::-;9614:10;9609:3;9605:20;9602:1;9595:31;9645:4;9642:1;9635:15;9669:4;9666:1;9659:15;9685:120;9725:1;9751;9741:35;;9756:18;;:::i;:::-;-1:-1:-1;9790:9:1;;9685:120::o;10161:400::-;10363:2;10345:21;;;10402:2;10382:18;;;10375:30;10441:34;10436:2;10421:18;;10414:62;-1:-1:-1;;;10507:2:1;10492:18;;10485:34;10551:3;10536:19;;10161:400::o;11972:489::-;-1:-1:-1;;;;;12241:15:1;;;12223:34;;12293:15;;12288:2;12273:18;;12266:43;12340:2;12325:18;;12318:34;;;12388:3;12383:2;12368:18;;12361:31;;;12166:4;;12409:46;;12435:19;;12427:6;12409:46;:::i;12466:249::-;12535:6;12588:2;12576:9;12567:7;12563:23;12559:32;12556:52;;;12604:1;12601;12594:12;12556:52;12636:9;12630:16;12655:30;12679:5;12655:30;:::i;12720:414::-;12922:2;12904:21;;;12961:2;12941:18;;;12934:30;13000:34;12995:2;12980:18;;12973:62;-1:-1:-1;;;13066:2:1;13051:18;;13044:48;13124:3;13109:19;;12720:414::o;13495:305::-;13534:1;13576;13572:2;13561:17;13613:1;13609:2;13598:17;13634:3;13624:37;;13641:18;;:::i;:::-;-1:-1:-1;;;;;;13677:48:1;;-1:-1:-1;;13727:15:1;;13673:70;13670:96;;;13746:18;;:::i;:::-;13780:14;;;13495:305;-1:-1:-1;;;13495:305:1:o;13805:698::-;13844:7;13892:1;13888:2;13877:17;13929:1;13925:2;13914:17;-1:-1:-1;;;;;14012:1:1;14007:3;14003:11;14042:1;14037:3;14033:11;14089:3;14085:2;14081:12;14076:3;14073:21;14068:2;14064;14060:11;14056:39;14053:65;;;14098:18;;:::i;:::-;-1:-1:-1;;;;;;14204:1:1;14195:11;;14222;;;14244:13;;;14235:23;;14218:41;14215:67;;;14262:18;;:::i;:::-;14310:1;14305:3;14301:11;14291:21;;14359:3;14355:2;14350:13;14345:3;14341:23;14336:2;14332;14328:11;14324:41;14321:67;;;14368:18;;:::i;:::-;14435:3;14431:2;14426:13;14421:3;14417:23;14412:2;14408;14404:11;14400:41;14397:67;;;14444:18;;:::i;:::-;-1:-1:-1;;;14484:13:1;;;;;13805:698;-1:-1:-1;;;;;13805:698:1:o;14508:398::-;14547:4;14592:1;14588:2;14577:17;14629:1;14625:2;14614:17;14659:1;14654:3;14650:11;14743:3;-1:-1:-1;;;;;14702:39:1;14698:49;14693:3;14689:59;14684:2;14677:10;14673:76;14670:102;;;14752:18;;:::i;:::-;14841:3;-1:-1:-1;;;;;14801:44:1;14796:3;14792:54;14788:2;14784:63;14781:89;;;14850:18;;:::i;:::-;-1:-1:-1;14887:13:1;;;14508:398;-1:-1:-1;;;14508:398:1:o;14911:396::-;14950:3;14994:1;14990:2;14979:17;15031:1;15027:2;15016:17;15061:1;15056:3;15052:11;15140:3;-1:-1:-1;;;;;15100:44:1;15095:3;15091:54;15086:2;15079:10;15075:71;15072:97;;;15149:18;;:::i;:::-;15243:3;-1:-1:-1;;;;;15202:39:1;15198:49;15193:3;15189:59;15185:2;15181:68;15178:94;;;15252:18;;:::i;:::-;-1:-1:-1;15288:13:1;;14911:396;-1:-1:-1;;;14911:396:1:o;15312:135::-;15351:3;-1:-1:-1;;15372:17:1;;15369:43;;;15392:18;;:::i;:::-;-1:-1:-1;15439:1:1;15428:13;;15312:135::o;15813:136::-;15852:3;15880:5;15870:39;;15889:18;;:::i;:::-;-1:-1:-1;;;15925:18:1;;15813:136::o;16361:127::-;16422:10;16417:3;16413:20;16410:1;16403:31;16453:4;16450:1;16443:15;16477:4;16474:1;16467:15;16873:557;17117:25;;;17173:2;17158:18;;17151:34;;;17104:3;17089:19;;17215:1;17204:13;;17194:144;;17260:10;17255:3;17251:20;17248:1;17241:31;17295:4;17292:1;17285:15;17323:4;17320:1;17313:15;17194:144;17369:2;17354:18;;17347:34;;;;17412:2;17397:18;17390:34;16873:557;;-1:-1:-1;;16873:557:1:o;17435:267::-;17474:4;17503:9;;;17528:10;;-1:-1:-1;;;17547:19:1;;17540:27;;17524:44;17521:70;;;17571:18;;:::i;:::-;-1:-1:-1;;;;;17618:27:1;;17611:35;;17603:44;;17600:70;;;17650:18;;:::i;:::-;-1:-1:-1;;17687:9:1;;17435:267::o;17707:895::-;18088:3;18126:6;18120:13;18142:53;18188:6;18183:3;18176:4;18168:6;18164:17;18142:53;:::i;:::-;-1:-1:-1;;;18217:16:1;;;18242:23;;;18290:13;;18312:65;18290:13;18364:1;18353:13;;18346:4;18334:17;;18312:65;:::i;:::-;18444:66;18440:1;18396:20;;;;18432:10;;;18425:86;-1:-1:-1;;;18535:2:1;18527:11;;18520:49;18593:2;18585:11;;17707:895;-1:-1:-1;;;;17707:895:1:o;18607:901::-;18988:3;19026:6;19020:13;19042:53;19088:6;19083:3;19076:4;19068:6;19064:17;19042:53;:::i;:::-;-1:-1:-1;;;19117:16:1;;;19142:27;;;19194:13;;19216:66;19194:13;19268:2;19257:14;;19250:4;19238:17;;19216:66;:::i;:::-;19350;19345:2;19301:20;;;;19337:11;;;19330:87;-1:-1:-1;;;19441:2:1;19433:11;;19426:49;19499:2;19491:11;;18607:901;-1:-1:-1;;;;18607:901:1:o;19513:902::-;19894:3;19932:6;19926:13;19948:53;19994:6;19989:3;19982:4;19974:6;19970:17;19948:53;:::i;:::-;-1:-1:-1;;;20023:16:1;;;20048:28;;;20101:13;;20123:66;20101:13;20175:2;20164:14;;20157:4;20145:17;;20123:66;:::i;:::-;20257;20252:2;20208:20;;;;20244:11;;;20237:87;-1:-1:-1;;;20348:2:1;20340:11;;20333:49;20406:2;20398:11;;19513:902;-1:-1:-1;;;;19513:902:1:o;20420:786::-;20801:3;20839:6;20833:13;20855:53;20901:6;20896:3;20889:4;20881:6;20877:17;20855:53;:::i;:::-;-1:-1:-1;;;20930:16:1;;;20955:23;;;21003:13;;21025:65;21003:13;21077:1;21066:13;;21059:4;21047:17;;21025:65;:::i;:::-;-1:-1:-1;;;21153:1:1;21109:20;;;;21145:10;;;21138:35;21197:2;21189:11;;20420:786;-1:-1:-1;;;;20420:786:1:o;21211:1151::-;-1:-1:-1;;;21711:57:1;;21791:13;;21693:3;;21813:62;21791:13;21863:2;21854:12;;21847:4;21835:17;;21813:62;:::i;:::-;21939:66;21934:2;21894:16;;;21926:11;;;21919:87;22035:66;22030:2;22022:11;;22015:87;-1:-1:-1;;;22126:2:1;22118:11;;22111:28;22164:13;;22186:63;22164:13;22235:2;22227:11;;22220:4;22208:17;;22186:63;:::i;:::-;-1:-1:-1;;;22309:2:1;22268:17;;;;22301:11;;;22294:35;22353:2;22345:11;;21211:1151;-1:-1:-1;;;;21211:1151:1:o;22367:448::-;22629:31;22624:3;22617:44;22599:3;22690:6;22684:13;22706:62;22761:6;22756:2;22751:3;22747:12;22740:4;22732:6;22728:17;22706:62;:::i;:::-;22788:16;;;;22806:2;22784:25;;22367:448;-1:-1:-1;;22367:448:1:o;22820:112::-;22852:1;22878;22868:35;;22883:18;;:::i;:::-;-1:-1:-1;22917:9:1;;22820:112::o
Swarm Source
ipfs://3f9326b2c7092f7d64715758533e2a310cc38f3109569bacab81d542ef75b466
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.