Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 11493259 | 1244 days ago | IN | Create: Etherland | 0 ETH | 0.08016111 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Etherland
Compiler Version
v0.7.5+commit.eb77ed08
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-12-21 */ // File: contracts/libraries/SafeMath.sol // SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.7.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } } // File: contracts/ERC1822/Proxiable.sol /** * @title Proxiable * @dev Etherland - EIP-1822 Proxiable contract implementation for ELAND ERC20 * @dev https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1822.md */ contract Proxiable { // Code position in storage is keccak256("PROXIABLE") = "0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7" function updateCodeAddress(address newAddress) internal { require( bytes32(0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7) == Proxiable(newAddress).proxiableUUID(), "Not compatible" ); assembly { // solium-disable-line sstore(0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7, newAddress) } } function proxiableUUID() public pure returns (bytes32) { return 0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7; } } // File: contracts/LANDID/iLANDID.sol /** * @title Etherland ERC721 LANDID administrator access granting system */ interface iLANDID { function adminRightsOf(address _admin) external view returns(int16); } // File: contracts/Storage.sol contract Storage { // // Ownable.sol // /** * @dev Etherland owner address */ address public owner; /** * @dev Generated random salt acting in the safecheck mechanism when renouncing contract ownership */ bytes32 internal relinquishmentToken; /** * @dev Standalone mode * @notice see renounceOwnership method's notice below */ bool public standalone = false; // // ERC20.sol // mapping (address => uint256) internal _balances; mapping (address => mapping (address => uint256)) internal _allowances; uint256 internal _totalSupply; string internal _name; string internal _symbol; uint8 internal _decimals; // // ERC20Capped.sol // uint256 internal _cap; // Instance of Etherland LANDID NFT Administrator rights verifier // // LandRegistry.sol // iLANDID landid; // address of Etherland LANDID NFT address public landidNftAddress; // address of the wallet dedicated to land registration address internal landRegistration; // Land registry can be opened or closed bool public landRegistryOpened = false; // Land registry rights offers uint[] public recordRightsOffers; // Schema defining a Right to register a new land struct RecordRight { // the block timestamp of the record request uint time; // the tokenId representing the resultant minted LANDID NFT token id uint tokenId; // The new land record right which was purchased in ELAND. Registration rights are considered available when the tokenId is LESS than 1 uint right; } // Land registry record rights tracking mapping (address => RecordRight[]) public registryRecordRights; // // ERC20Mintable.sol // bool _mintingFinished = false; // // Etherland.sol // /** * @dev Contact initialization state * initialized state is set upon construction * MUST be initialized to be valid */ bool public initialized = false; /** * @dev Etherland Wallets */ address public team; address public reserve; } // File: contracts/Context.sol /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract Context is Storage { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } } // File: contracts/Ownable.sol /** * @title Ownable * @dev The Ownable contract has an owner address, and provides basic authorization control * functions, this simplifies the implementation of "user permissions". */ contract Ownable is Context { event OwnershipRenounced(address indexed previousOwner); event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Throws if called by any account other than the owner or if the contract has standalone state */ modifier onlyOwner() { require(!standalone, 'denied : owner actions are locked when contract is running standalone'); require(_msgSender() != address(0), "denied : zero address has no rights"); require(_msgSender() == owner, "denied : method access is restricted to the contract owner"); _; } function getRelinquishmentToken() public onlyOwner view returns (bytes32 _relinquishmentToken) { return relinquishmentToken; } /** * IRREVERSIBLE ACTION * @dev Allows the current owner to definitively and safely relinquish control of the contract. * @notice once owner renounces to its ownership, the contract runs in standalone mode meaning that : * - the contract is left without any owner * - no other owner will ever be set for the remaining contract lifetime * - no one will no longer ever have any access to owner-restricted methods */ function renounceOwnership(bytes32 _relinquishmentToken) public onlyOwner { require( ((relinquishmentToken != bytes32(0)) && (relinquishmentToken == _relinquishmentToken)), 'denied : a relinquishment token must be pre-set calling the preRenounceOwnership method'); // require(landRegistryOpened, 'Land registry must be opened to renounce ownership'); emit OwnershipRenounced(owner); standalone = true; owner = address(0); } /** * @dev Allows the current owner to relinquish control of the contract. * @return _relinquishmentToken : auto generated bytes32 key * @notice generating this key allows the contract owner to pass it to the renounceOwnership method in order to set the contract as standalone */ function preRenounceOwnership() public onlyOwner returns(bytes32 _relinquishmentToken) { uint rand = uint(keccak256(abi.encodePacked(block.timestamp, uint8(_msgSender())))); bytes32 salt = bytes32(rand); relinquishmentToken = salt; _relinquishmentToken = salt; } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param _newOwner The address to transfer ownership to. */ function transferOwnership(address _newOwner) public onlyOwner { _transferOwnership(_newOwner); } /** * @dev Transfers control of the contract to a newOwner. * @param _newOwner The address to transfer ownership to. */ function _transferOwnership(address _newOwner) internal { require(_newOwner != address(0), "the new owner can't be the zero address"); emit OwnershipTransferred(owner, _newOwner); owner = _newOwner; } } // File: contracts/ERC20/IERC20.sol /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @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, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 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, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: contracts/ERC20/ERC20.sol /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Ownable, IERC20 { using SafeMath for uint256; /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is * called. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: can't burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Sets {decimals} to a value other than the default one of 18. * * WARNING: This function should only be called from the constructor. Most * applications that interact with token contracts will not expect * {decimals} to ever change, and may work incorrectly if it does. */ function _setupDecimals(uint8 decimals_) internal { _decimals = decimals_; } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { bool hasFrom = from != address(0); bool hasTo = to != address(0); require((hasFrom || hasTo), 'Must provide at least one address to transfer'); if(hasFrom && hasTo) { require(_balances[from] >= amount, 'not enough funds to transfer'); } else if (!hasFrom) { // require(!mintingFinished, 'minting is finished'); require(totalSupply().add(amount) <= _cap, "ERC20Capped: cap exceeded"); } else if (!hasTo) { require(_balances[from] >= amount, 'not enough funds to burn'); } } } // File: contracts/ERC20/ERC20Capped.sol /** * @dev Extension of {ERC20} that adds a cap to the supply of tokens. */ contract ERC20Capped is ERC20 { using SafeMath for uint256; // uint256 private _cap; /** * @dev Sets the value of the `cap`. This value is immutable, it can only be * set once during construction. */ function setImmutableCap(uint256 cap_) internal { require(cap() == 0, 'cap value is immutable and is already set to 1 Billion ELAND'); require(cap_ > 0, "cap must be higher than 0"); _cap = cap_; } /** * @dev Cap that is set on the total token supply * Represents the maximum amount of tokens the contract will ever mint * @notice cap value is 1 000 000 000 (1 Billion) ELAND tokens and are all pre-minted upon contract construction */ function cap() public view returns (uint256) { return _cap; } } // File: contracts/ERC20/ERC20Burnable.sol /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ contract ERC20Burnable is ERC20Capped { using SafeMath for uint256; /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public virtual { _burn(_msgSender(), amount); } /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) public virtual { uint256 decreasedAllowance = allowance(account, _msgSender()).sub(amount, "ERC20: burn amount exceeds allowance"); _approve(account, _msgSender(), decreasedAllowance); _burn(account, amount); } } // File: contracts/ERC20/ERC20Mintable.sol /** * @title Mintable token * @dev Simple ERC20 Token Mintable implementation * @notice will be used only once on contrat construction, then minting MUST be automatically terminated */ contract ERC20Mintable is ERC20Burnable { using SafeMath for uint256; /** * @dev Minting event for Etherland *MUST* fire only once by supply partition (see Etherland.sol `init` function called when migrating */ event Mint(address indexed to, uint256 amount); function mintingFinished() public view returns(bool){ return _mintingFinished; } /** * @dev Function to internally mint tokens * @param _to The address that will receive the minted tokens. * @param _amount The amount of tokens to mint. * @return A boolean that indicates if the operation was successful. * @notice this method is called only once in Etherland contract lifetime as minting is terminated upon initial contract migration on chain */ function mint( address _to, uint256 _amount ) internal returns (bool) { require(mintingFinished() == false, 'ERC20Mintable : Minting is finished'); _mint(_to, _amount); Mint(_to, _amount); return true; } } // File: contracts/LANDID/LandRegistry.sol /** * @title Land Registry * * @dev Etherland - Decentralized Land Registration Protocol * Allows ELAND owners to register lands in the Etherland eco-system by minting Etherland ERC721 LANDID NFT * * @author Mathieu Lecoq * december 20th 2020 * * @dev Property * all rights are reserved to Etherland ltd */ contract LandRegistry is ERC20Mintable { modifier isNftAdmin() { landid = iLANDID(landidNftAddress); int16 adminRight = landid.adminRightsOf(_msgSender()); require((adminRight > 0) && (adminRight < 3), 'denied : restricted to LANDID NFT admins'); _; } /** * @dev Allow any NFT admin to set public prices for record rights * @param _indexedRecordOffers Array of indexed public ELAND prices of record rights * @return boolean indicating operation success/failure */ function setRecordRightsOffers(uint[] memory _indexedRecordOffers) public isNftAdmin returns (bool) { recordRightsOffers = _indexedRecordOffers; return true; } /** * @dev Let owner open land registry to allow ELAND owners register new lands * @return boolean indicating operation success/failure */ function openLandRegistry() public isNftAdmin returns (bool) { landRegistryOpened = true; return true; } /** * @dev Let owner close land registry to avoid ELAND owners register new lands * @return boolean indicating operation success/failure */ function closeLandRegistry() public isNftAdmin returns (bool) { landRegistryOpened = false; return true; } /** * @dev Allow ELAND owners to mint LANDID automatically or not depending on current mode * @param recordIndex the index of record right offer to give corresponding to `recordRightsOffers` indexes * @return boolean indicating operation success/failure */ function registerLand(uint recordIndex) public returns (bool) { require(landRegistryOpened && (landRegistration != address(0)), "denied : can't register new land for now"); uint recordPrice = recordRightsOffers[recordIndex]; require(recordPrice > 0, 'denied : no preset price for provided record right'); bool transferred = transfer(landRegistration, recordPrice); require(transferred, 'denied : value corresponding to requested record right price has not been transferred'); RecordRight memory recordRight; recordRight.time = block.timestamp; recordRight.right = recordIndex; // store record right registryRecordRights[_msgSender()].push(recordRight); return true; } /** * @dev Assert that a RecordRight is valid and can be consumed (has no attached tokenId and has a valid block.timestamp) * @param time a valid block.timestamp corresponding to the time of the record request * @param tokenId the LANDID NFT tokenId attached to the tested RecordRight * - 0 means available * - any other value means that the right has already been consumed and that RecordRight is invalid * @return boolean indicating validity / availability of the record right */ function validRecordRight(uint time, uint tokenId) internal pure returns(bool) { return( (time > 0) && (tokenId == 0) ); } /** * @dev Allow LANDID NFT administrators to consume a registry record right of an owner indicating minting of the record request related NFT * @param _owner address of the RecordRight owner * @param recordIndex the index of record right offer that has been paid by _owner (must correspond to a `recordRightsOffers` index) * @param tokenId the LANDID NFT tokenId attached to attach to the first available/matching RecordRight * @return boolean indicating if valid target right for `recordIndex` has been found and consumed */ function consumeRecordRight(address _owner, uint recordIndex, uint tokenId) public isNftAdmin returns (bool) { RecordRight[] memory ownerRecordRights = registryRecordRights[_owner]; require(ownerRecordRights.length > 0, 'denied : no record right found for provided address'); bool consumed = false; for (uint i = 0; i < ownerRecordRights.length; i++) { RecordRight memory recordRight = ownerRecordRights[i]; if ( consumed == false && recordRight.right == recordIndex && validRecordRight(recordRight.time, recordRight.tokenId) ) { // consume right recordRight.tokenId = tokenId; registryRecordRights[_owner][i] = recordRight; consumed = true; } } if (consumed) return true; else revert('denied : no registry record right found for provided address'); } } // File: contracts/Etherland.sol /** * @title Etherland * @dev ERC-20 Compliant ELAND token * @author Mathieu Lecoq * december 20th 2020 * * @dev Property * all rights are reserved to Etherland ltd * * @dev deployed with solc 0.7.5 */ contract Etherland is LandRegistry, Proxiable { using SafeMath for uint256; /** * @return amount representing _percent % of _amount */ function percentOf(uint _total, uint _percent) internal pure returns(uint amount) { amount = ((_total * _percent) / 100); } /** * @dev Erc20 Etherland ELAND token constructor * @param _owner address of the contract owner to set when migrating this contract * @notice called only once in contract lifetime upon migration to chain */ function init( string memory name_, string memory symbol_, uint8 decimals_, address _owner, address _reserve, address _team ) public { if (initialized != true) { /* initialize contract */ initialized = true; /* give ownership of the contract to _owner */ _transferOwnership(_owner); /* define maximum supply to 1 Billion tokens */ uint maximumSupply = 1e9 * 10 ** decimals_; /* definitively end minting of ELAND token by setting cap supply to maximum supply of 1 Billion. total and circulating supply will never ever be higher than the cap */ setImmutableCap(maximumSupply); /* set contract identifiers */ _name = name_; _symbol = symbol_; _decimals = decimals_; /* set wallets for partionning */ team = _team; reserve = _reserve; /* partition the supply - 20 percent of the supply goes to the reserve wallet - 10 percent of the supply goes to the team wallet - 70 percent of the supply are kept by the owner */ mint(_reserve, percentOf(maximumSupply, 20)); mint(_team, percentOf(maximumSupply, 10)); mint(_owner, percentOf(maximumSupply, 70)); _mintingFinished = true; } } /** * @dev EIP-1822 feature * @dev Realize an update of the Etherland logic code * @dev calls the proxy contract to update stored logic code contract address at keccak256("PROXIABLE") * @notice once owner renounce contract ownership and owner address is set to the zero address, * no one will be able to update the logic code (see renounceOwnership method) */ function updateCode(address newCode) public onlyOwner { updateCodeAddress(newCode); } /** * @dev Total circulating supply * @return the number of circulating ELAND (totalSupply - team - reserve - owner) */ function circulatingSupply() public view returns(uint) { return (totalSupply().sub(balanceOf(team)).sub(balanceOf(reserve)).sub(balanceOf(owner))); } /** * @dev Transfer ELAND value to multiple addresses * @param _to array of addresses to send value to * @param _value the ELAND value to transfer for each address * @return boolean indicating operation success */ function batchTransfer(address[] memory _to, uint _value) public returns(bool) { uint ttlRecipients = _to.length; require(ttlRecipients > 0, 'at least on recipient must be defined'); require(balanceOf(_msgSender()) >= (_value.mul(ttlRecipients)), 'batch transfer denied : unsufficient balance'); for (uint i = 0; i < ttlRecipients; i++) { address recipient = _to[i]; transfer(recipient, _value); } return true; } /** * @dev Set Etherland LANDID NFT contract address * @param _landidNftAddress the address of LANDID NFT Token * @return boolean indicating operation success */ function setLandidNftAddress(address _landidNftAddress) public onlyOwner returns (bool) { landidNftAddress = _landidNftAddress; return true; } /** * @dev Set Land Registration Address * @param _landRegistration the address of the wallet dedicated to land registrations * @return boolean indicating operation success */ function setLandRegistrationAddress(address _landRegistration) public onlyOwner returns(bool) { landRegistration = _landRegistration; return true; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_to","type":"address[]"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"batchTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"circulatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"closeLandRegistry","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"recordIndex","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"consumeRecordRight","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getRelinquishmentToken","outputs":[{"internalType":"bytes32","name":"_relinquishmentToken","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint8","name":"decimals_","type":"uint8"},{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_reserve","type":"address"},{"internalType":"address","name":"_team","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"landRegistryOpened","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"landidNftAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingFinished","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openLandRegistry","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preRenounceOwnership","outputs":[{"internalType":"bytes32","name":"_relinquishmentToken","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"recordRightsOffers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"recordIndex","type":"uint256"}],"name":"registerLand","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"registryRecordRights","outputs":[{"internalType":"uint256","name":"time","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"right","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_relinquishmentToken","type":"bytes32"}],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserve","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_landRegistration","type":"address"}],"name":"setLandRegistrationAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_landidNftAddress","type":"address"}],"name":"setLandidNftAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_indexedRecordOffers","type":"uint256[]"}],"name":"setRecordRightsOffers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"standalone","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":"team","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newCode","type":"address"}],"name":"updateCode","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526002805460ff19169055600c805460ff60a01b19169055600f805461ffff1916905534801561003257600080fd5b50612f43806100426000396000f3fe608060405234801561001057600080fd5b50600436106102475760003560e01c80637060cc581161013b578063a9059cbb116100b8578063cdc935ca1161007c578063cdc935ca14610763578063dd62ed3e146108ad578063deca6b9f146108db578063e4d9d3e814610901578063f2fde38b1461090957610247565b8063a9059cbb14610702578063b3b15edb1461072e578063baadce9014610736578063be1deb3614610753578063cd3293de1461075b57610247565b80638da5cb5b116100ff5780638da5cb5b1461069857806391650653146106a05780639358928b146106c657806395d89b41146106ce578063a457c2d7146106d657610247565b80637060cc581461057e57806370a082311461059b57806379cc6790146105c157806383f12fec146105ed57806385f2aef21461069057610247565b8063313ce567116101c9578063469519541161018d578063469519541461051c5780634c2f61f21461054257806352d1902d1461054a578063619370371461055257806361e7f84c1461057657610247565b8063313ce56714610463578063355274ea14610481578063395093511461048957806340c45e36146104b557806342966c68146104ff57610247565b8063158ef93e11610210578063158ef93e146103ba57806318160ddd146103c2578063219adc2e146103dc57806323b872dd146103fb5780632b9b04ba1461043157610247565b8062bbd6491461024c57806305d2035b1461026857806306fdde0314610270578063095ea7b3146102ed57806315401ad714610319575b600080fd5b61025461092f565b604080519115158252519081900360200190f35b610254610a3c565b610278610a45565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102b257818101518382015260200161029a565b50505050905090810190601f1680156102df5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102546004803603604081101561030357600080fd5b506001600160a01b038135169060200135610adb565b6102546004803603602081101561032f57600080fd5b810190602081018135600160201b81111561034957600080fd5b82018360208201111561035b57600080fd5b803590602001918460208302840111600160201b8311171561037c57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610af9945050505050565b610254610c07565b6103ca610c15565b60408051918252519081900360200190f35b6103f9600480360360208110156103f257600080fd5b5035610c1b565b005b6102546004803603606081101561041157600080fd5b506001600160a01b03813581169160208101359091169060400135610da9565b6102546004803603606081101561044757600080fd5b506001600160a01b038135169060208101359060400135610e26565b61046b6110ff565b6040805160ff9092168252519081900360200190f35b6103ca611108565b6102546004803603604081101561049f57600080fd5b506001600160a01b03813516906020013561110e565b6104e1600480360360408110156104cb57600080fd5b506001600160a01b03813516906020013561115c565b60408051938452602084019290925282820152519081900360600190f35b6103f96004803603602081101561051557600080fd5b503561119e565b6103f96004803603602081101561053257600080fd5b50356001600160a01b03166111b2565b6102546112a6565b6103ca6113ab565b61055a6113cf565b604080516001600160a01b039092168252519081900360200190f35b6102546113de565b6103ca6004803603602081101561059457600080fd5b50356113e7565b6103ca600480360360208110156105b157600080fd5b50356001600160a01b0316611408565b6103f9600480360360408110156105d757600080fd5b506001600160a01b038135169060200135611423565b6102546004803603604081101561060357600080fd5b810190602081018135600160201b81111561061d57600080fd5b82018360208201111561062f57600080fd5b803590602001918460208302840111600160201b8311171561065057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550509135925061147d915050565b61055a611557565b61055a61156c565b610254600480360360208110156106b657600080fd5b50356001600160a01b031661157b565b6103ca61168e565b6102786116f3565b610254600480360360408110156106ec57600080fd5b506001600160a01b038135169060200135611754565b6102546004803603604081101561071857600080fd5b506001600160a01b0381351690602001356117bc565b6103ca6117d0565b6102546004803603602081101561074c57600080fd5b50356118c5565b6103ca611a4b565b61055a611b86565b6103f9600480360360c081101561077957600080fd5b810190602081018135600160201b81111561079357600080fd5b8201836020820111156107a557600080fd5b803590602001918460018302840111600160201b831117156107c657600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561081857600080fd5b82018360208201111561082a57600080fd5b803590602001918460018302840111600160201b8311171561084b57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505060ff8335169350506001600160a01b0360208301358116926040810135821692506060013516611b95565b6103ca600480360360408110156108c357600080fd5b506001600160a01b0381358116916020013516611c9c565b610254600480360360208110156108f157600080fd5b50356001600160a01b0316611cc7565b610254611dda565b6103f96004803603602081101561091f57600080fd5b50356001600160a01b0316611dea565b600b54600a80546001600160a01b0319166001600160a01b039283161790819055600091829116639adfecf9610963611ede565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156109a057600080fd5b505afa1580156109b4573d6000803e3d6000fd5b505050506040513d60208110156109ca57600080fd5b505190506000600182900b1380156109e5575060038160010b125b610a205760405162461bcd60e51b8152600401808060200182810382526028815260200180612d926028913960400191505060405180910390fd5b600c805460ff60a01b1916600160a01b179055600191505b5090565b600f5460ff1690565b60068054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ad15780601f10610aa657610100808354040283529160200191610ad1565b820191906000526020600020905b815481529060010190602001808311610ab457829003601f168201915b5050505050905090565b6000610aef610ae8611ede565b8484611ee2565b5060015b92915050565b600b54600a80546001600160a01b0319166001600160a01b039283161790819055600091829116639adfecf9610b2d611ede565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610b6a57600080fd5b505afa158015610b7e573d6000803e3d6000fd5b505050506040513d6020811015610b9457600080fd5b505190506000600182900b138015610baf575060038160010b125b610bea5760405162461bcd60e51b8152600401808060200182810382526028815260200180612d926028913960400191505060405180910390fd5b8251610bfd90600d906020860190612943565b5060019392505050565b600f54610100900460ff1681565b60055490565b60025460ff1615610c5d5760405162461bcd60e51b8152600401808060200182810382526045815260200180612e2b6045913960600191505060405180910390fd5b6000610c67611ede565b6001600160a01b03161415610cad5760405162461bcd60e51b8152600401808060200182810382526023815260200180612ba56023913960400191505060405180910390fd5b6000546001600160a01b0316610cc1611ede565b6001600160a01b031614610d065760405162461bcd60e51b815260040180806020018281038252603a815260200180612bf0603a913960400191505060405180910390fd5b60015415801590610d18575080600154145b610d535760405162461bcd60e51b8152600401808060200182810382526057815260200180612b286057913960600191505060405180910390fd5b600080546040516001600160a01b03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a2506002805460ff19166001179055600080546001600160a01b0319169055565b6000610db6848484611fce565b610bfd84610dc2611ede565b610e2185604051806060016040528060288152602001612dba602891396001600160a01b038a16600090815260046020526040812090610e00611ede565b6001600160a01b03168152602081019190915260400160002054919061212b565b611ee2565b600b54600a80546001600160a01b0319166001600160a01b039283161790819055600091829116639adfecf9610e5a611ede565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610e9757600080fd5b505afa158015610eab573d6000803e3d6000fd5b505050506040513d6020811015610ec157600080fd5b505190506000600182900b138015610edc575060038160010b125b610f175760405162461bcd60e51b8152600401808060200182810382526028815260200180612d926028913960400191505060405180910390fd5b6001600160a01b0385166000908152600e60209081526040808320805482518185028101850190935280835260609492939192909184015b82821015610f9f5783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190610f4f565b5050505090506000815111610fe55760405162461bcd60e51b8152600401808060200182810382526033815260200180612d026033913960400191505060405180910390fd5b6000805b82518110156110ae57610ffa61298a565b83828151811061100657fe5b60209081029190910101519050821580156110245750878160400151145b801561103d575061103d816000015182602001516121c2565b156110a55760208082018890526001600160a01b038a166000908152600e9091526040902080548291908490811061107157fe5b9060005260206000209060030201600082015181600001556020820151816001015560408201518160020155905050600192505b50600101610fe9565b5080156110c0576001935050506110f7565b60405162461bcd60e51b815260040180806020018281038252603c815260200180612cc6603c913960400191505060405180910390fd5b509392505050565b60085460ff1690565b60095490565b6000610aef61111b611ede565b84610e21856004600061112c611ede565b6001600160a01b03908116825260208083019390935260409182016000908120918c1681529252902054906121d8565b600e602052816000526040600020818154811061117857600080fd5b600091825260209091206003909102018054600182015460029092015490935090915083565b6111af6111a9611ede565b82612232565b50565b60025460ff16156111f45760405162461bcd60e51b8152600401808060200182810382526045815260200180612e2b6045913960600191505060405180910390fd5b60006111fe611ede565b6001600160a01b031614156112445760405162461bcd60e51b8152600401808060200182810382526023815260200180612ba56023913960400191505060405180910390fd5b6000546001600160a01b0316611258611ede565b6001600160a01b03161461129d5760405162461bcd60e51b815260040180806020018281038252603a815260200180612bf0603a913960400191505060405180910390fd5b6111af8161232e565b600b54600a80546001600160a01b0319166001600160a01b039283161790819055600091829116639adfecf96112da611ede565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561131757600080fd5b505afa15801561132b573d6000803e3d6000fd5b505050506040513d602081101561134157600080fd5b505190506000600182900b13801561135c575060038160010b125b6113975760405162461bcd60e51b8152600401808060200182810382526028815260200180612d926028913960400191505060405180910390fd5b5050600c805460ff60a01b19169055600190565b7fc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf790565b600b546001600160a01b031681565b60025460ff1681565b600d81815481106113f757600080fd5b600091825260209091200154905081565b6001600160a01b031660009081526003602052604090205490565b600061145a82604051806060016040528060248152602001612de2602491396114538661144e611ede565b611c9c565b919061212b565b905061146e83611468611ede565b83611ee2565b6114788383612232565b505050565b8151600090806114be5760405162461bcd60e51b8152600401808060200182810382526025815260200180612c746025913960400191505060405180910390fd5b6114c8838261241b565b6114d86114d3611ede565b611408565b10156115155760405162461bcd60e51b815260040180806020018281038252602c815260200180612aa8602c913960400191505060405180910390fd5b60005b8181101561154c57600085828151811061152e57fe5b6020026020010151905061154281866117bc565b5050600101611518565b506001949350505050565b600f546201000090046001600160a01b031681565b6000546001600160a01b031681565b60025460009060ff16156115c05760405162461bcd60e51b8152600401808060200182810382526045815260200180612e2b6045913960600191505060405180910390fd5b60006115ca611ede565b6001600160a01b031614156116105760405162461bcd60e51b8152600401808060200182810382526023815260200180612ba56023913960400191505060405180910390fd5b6000546001600160a01b0316611624611ede565b6001600160a01b0316146116695760405162461bcd60e51b815260040180806020018281038252603a815260200180612bf0603a913960400191505060405180910390fd5b50600b80546001600160a01b0383166001600160a01b03199091161790556001919050565b600080546116ee906116a8906001600160a01b0316611408565b6010546116e8906116c1906001600160a01b0316611408565b600f546116e8906116e0906201000090046001600160a01b0316611408565b6116e8610c15565b90612474565b905090565b60078054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ad15780601f10610aa657610100808354040283529160200191610ad1565b6000610aef611761611ede565b84610e2185604051806060016040528060258152602001612ee9602591396004600061178b611ede565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919061212b565b6000610aef6117c9611ede565b8484611fce565b60025460009060ff16156118155760405162461bcd60e51b8152600401808060200182810382526045815260200180612e2b6045913960600191505060405180910390fd5b600061181f611ede565b6001600160a01b031614156118655760405162461bcd60e51b8152600401808060200182810382526023815260200180612ba56023913960400191505060405180910390fd5b6000546001600160a01b0316611879611ede565b6001600160a01b0316146118be5760405162461bcd60e51b815260040180806020018281038252603a815260200180612bf0603a913960400191505060405180910390fd5b5060015490565b600c54600090600160a01b900460ff1680156118eb5750600c546001600160a01b031615155b6119265760405162461bcd60e51b8152600401808060200182810382526028815260200180612bc86028913960400191505060405180910390fd5b6000600d838154811061193557fe5b90600052602060002001549050600081116119815760405162461bcd60e51b8152600401808060200182810382526032815260200180612af66032913960400191505060405180910390fd5b600c5460009061199a906001600160a01b0316836117bc565b9050806119d85760405162461bcd60e51b8152600401808060200182810382526055815260200180612e946055913960600191505060405180910390fd5b6119e061298a565b42815260408101859052600e60006119f6611ede565b6001600160a01b03168152602080820192909252604090810160009081208054600180820183559183529184902085516003909302019182559284015181840155920151600290920191909155949350505050565b60025460009060ff1615611a905760405162461bcd60e51b8152600401808060200182810382526045815260200180612e2b6045913960600191505060405180910390fd5b6000611a9a611ede565b6001600160a01b03161415611ae05760405162461bcd60e51b8152600401808060200182810382526023815260200180612ba56023913960400191505060405180910390fd5b6000546001600160a01b0316611af4611ede565b6001600160a01b031614611b395760405162461bcd60e51b815260040180806020018281038252603a815260200180612bf0603a913960400191505060405180910390fd5b600042611b44611ede565b6040805160208082019490945260f89290921b6001600160f81b0319168282015280518083036021018152604190920190528051910120600181905592915050565b6010546001600160a01b031681565b600f5460ff610100909104161515600114611c9457600f805461ff001916610100179055611bc2836124b6565b633b9aca0060ff8516600a0a02611bd881612556565b8651611beb9060069060208a01906129ab565b508551611bff9060079060208901906129ab565b506008805460ff191660ff8716179055600f805462010000600160b01b031916620100006001600160a01b038581169190910291909117909155601080546001600160a01b031916918516919091179055611c6483611c5f8360146125f4565b6125fc565b50611c7482611c5f83600a6125f4565b50611c8484611c5f8360466125f4565b5050600f805460ff191660011790555b505050505050565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b60025460009060ff1615611d0c5760405162461bcd60e51b8152600401808060200182810382526045815260200180612e2b6045913960600191505060405180910390fd5b6000611d16611ede565b6001600160a01b03161415611d5c5760405162461bcd60e51b8152600401808060200182810382526023815260200180612ba56023913960400191505060405180910390fd5b6000546001600160a01b0316611d70611ede565b6001600160a01b031614611db55760405162461bcd60e51b815260040180806020018281038252603a815260200180612bf0603a913960400191505060405180910390fd5b50600c80546001600160a01b0383166001600160a01b03199091161790556001919050565b600c54600160a01b900460ff1681565b60025460ff1615611e2c5760405162461bcd60e51b8152600401808060200182810382526045815260200180612e2b6045913960600191505060405180910390fd5b6000611e36611ede565b6001600160a01b03161415611e7c5760405162461bcd60e51b8152600401808060200182810382526023815260200180612ba56023913960400191505060405180910390fd5b6000546001600160a01b0316611e90611ede565b6001600160a01b031614611ed55760405162461bcd60e51b815260040180806020018281038252603a815260200180612bf0603a913960400191505060405180910390fd5b6111af816124b6565b3390565b6001600160a01b038316611f275760405162461bcd60e51b8152600401808060200182810382526024815260200180612e706024913960400191505060405180910390fd5b6001600160a01b038216611f6c5760405162461bcd60e51b8152600401808060200182810382526022815260200180612ad46022913960400191505060405180910390fd5b6001600160a01b03808416600081815260046020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0383166120135760405162461bcd60e51b8152600401808060200182810382526025815260200180612e066025913960400191505060405180910390fd5b6001600160a01b0382166120585760405162461bcd60e51b8152600401808060200182810382526023815260200180612a3c6023913960400191505060405180910390fd5b612063838383612694565b6120a081604051806060016040528060268152602001612b7f602691396001600160a01b038616600090815260036020526040902054919061212b565b6001600160a01b0380851660009081526003602052604080822093909355908416815220546120cf90826121d8565b6001600160a01b0380841660008181526003602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156121ba5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561217f578181015183820152602001612167565b50505050905090810190601f1680156121ac5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600080831180156121d1575081155b9392505050565b6000828201838110156121d1576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b0382166122775760405162461bcd60e51b8152600401808060200182810382526027815260200180612c4d6027913960400191505060405180910390fd5b61228382600083612694565b6122c081604051806060016040528060228152602001612a86602291396001600160a01b038516600090815260036020526040902054919061212b565b6001600160a01b0383166000908152600360205260409020556005546122e69082612474565b6005556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b806001600160a01b03166352d1902d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561236757600080fd5b505afa15801561237b573d6000803e3d6000fd5b505050506040513d602081101561239157600080fd5b50517fc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7146123f7576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420636f6d70617469626c6560901b604482015290519081900360640190fd5b7fc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf755565b60008261242a57506000610af3565b8282028284828161243757fe5b04146121d15760405162461bcd60e51b8152600401808060200182810382526021815260200180612d356021913960400191505060405180910390fd5b60006121d183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061212b565b6001600160a01b0381166124fb5760405162461bcd60e51b8152600401808060200182810382526027815260200180612a5f6027913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b61255e611108565b1561259a5760405162461bcd60e51b815260040180806020018281038252603c815260200180612d56603c913960400191505060405180910390fd5b600081116125ef576040805162461bcd60e51b815260206004820152601960248201527f636170206d75737420626520686967686572207468616e203000000000000000604482015290519081900360640190fd5b600955565b606491020490565b6000612606610a3c565b156126425760405162461bcd60e51b8152600401808060200182810382526023815260200180612c2a6023913960400191505060405180910390fd5b61264c8383612851565b6040805183815290516001600160a01b038516917f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885919081900360200190a250600192915050565b6001600160a01b038381161515908316151581806126af5750805b6126ea5760405162461bcd60e51b815260040180806020018281038252602d815260200180612c99602d913960400191505060405180910390fd5b8180156126f45750805b1561276b576001600160a01b038516600090815260036020526040902054831115612766576040805162461bcd60e51b815260206004820152601c60248201527f6e6f7420656e6f7567682066756e647320746f207472616e7366657200000000604482015290519081900360640190fd5b61284a565b816127d8576009546127858461277f610c15565b906121d8565b1115612766576040805162461bcd60e51b815260206004820152601960248201527f45524332304361707065643a2063617020657863656564656400000000000000604482015290519081900360640190fd5b8061284a576001600160a01b03851660009081526003602052604090205483111561284a576040805162461bcd60e51b815260206004820152601860248201527f6e6f7420656e6f7567682066756e647320746f206275726e0000000000000000604482015290519081900360640190fd5b5050505050565b6001600160a01b0382166128ac576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6128b860008383612694565b6005546128c590826121d8565b6005556001600160a01b0382166000908152600360205260409020546128eb90826121d8565b6001600160a01b03831660008181526003602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b82805482825590600052602060002090810192821561297e579160200282015b8281111561297e578251825591602001919060010190612963565b50610a38929150612a26565b60405180606001604052806000815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826129e1576000855561297e565b82601f106129fa57805160ff191683800117855561297e565b8280016001018555821561297e579182018281111561297e578251825591602001919060010190612963565b5b80821115610a385760008155600101612a2756fe45524332303a207472616e7366657220746f20746865207a65726f2061646472657373746865206e6577206f776e65722063616e277420626520746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63656261746368207472616e736665722064656e696564203a20756e73756666696369656e742062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737364656e696564203a206e6f2070726573657420707269636520666f722070726f7669646564207265636f726420726967687464656e696564203a20612072656c696e71756973686d656e7420746f6b656e206d757374206265207072652d7365742063616c6c696e67207468652070726552656e6f756e63654f776e657273686970206d6574686f6445524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636564656e696564203a207a65726f206164647265737320686173206e6f2072696768747364656e696564203a2063616e2774207265676973746572206e6577206c616e6420666f72206e6f7764656e696564203a206d6574686f6420616363657373206973207265737472696374656420746f2074686520636f6e7472616374206f776e657245524332304d696e7461626c65203a204d696e74696e672069732066696e697368656445524332303a2063616e2774206275726e2066726f6d20746865207a65726f20616464726573736174206c65617374206f6e20726563697069656e74206d75737420626520646566696e65644d7573742070726f76696465206174206c65617374206f6e65206164647265737320746f207472616e7366657264656e696564203a206e6f207265676973747279207265636f726420726967687420666f756e6420666f722070726f7669646564206164647265737364656e696564203a206e6f207265636f726420726967687420666f756e6420666f722070726f76696465642061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f776361702076616c756520697320696d6d757461626c6520616e6420697320616c72656164792073657420746f20312042696c6c696f6e20454c414e4464656e696564203a207265737472696374656420746f204c414e444944204e46542061646d696e7345524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737364656e696564203a206f776e657220616374696f6e7320617265206c6f636b6564207768656e20636f6e74726163742069732072756e6e696e67207374616e64616c6f6e6545524332303a20617070726f76652066726f6d20746865207a65726f206164647265737364656e696564203a2076616c756520636f72726573706f6e64696e6720746f20726571756573746564207265636f726420726967687420707269636520686173206e6f74206265656e207472616e7366657272656445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212208b31d3c81e2ca3c2c9228fe9b6d4c2f36e24a509c37314a681a0d668c540586664736f6c63430007050033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102475760003560e01c80637060cc581161013b578063a9059cbb116100b8578063cdc935ca1161007c578063cdc935ca14610763578063dd62ed3e146108ad578063deca6b9f146108db578063e4d9d3e814610901578063f2fde38b1461090957610247565b8063a9059cbb14610702578063b3b15edb1461072e578063baadce9014610736578063be1deb3614610753578063cd3293de1461075b57610247565b80638da5cb5b116100ff5780638da5cb5b1461069857806391650653146106a05780639358928b146106c657806395d89b41146106ce578063a457c2d7146106d657610247565b80637060cc581461057e57806370a082311461059b57806379cc6790146105c157806383f12fec146105ed57806385f2aef21461069057610247565b8063313ce567116101c9578063469519541161018d578063469519541461051c5780634c2f61f21461054257806352d1902d1461054a578063619370371461055257806361e7f84c1461057657610247565b8063313ce56714610463578063355274ea14610481578063395093511461048957806340c45e36146104b557806342966c68146104ff57610247565b8063158ef93e11610210578063158ef93e146103ba57806318160ddd146103c2578063219adc2e146103dc57806323b872dd146103fb5780632b9b04ba1461043157610247565b8062bbd6491461024c57806305d2035b1461026857806306fdde0314610270578063095ea7b3146102ed57806315401ad714610319575b600080fd5b61025461092f565b604080519115158252519081900360200190f35b610254610a3c565b610278610a45565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102b257818101518382015260200161029a565b50505050905090810190601f1680156102df5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102546004803603604081101561030357600080fd5b506001600160a01b038135169060200135610adb565b6102546004803603602081101561032f57600080fd5b810190602081018135600160201b81111561034957600080fd5b82018360208201111561035b57600080fd5b803590602001918460208302840111600160201b8311171561037c57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610af9945050505050565b610254610c07565b6103ca610c15565b60408051918252519081900360200190f35b6103f9600480360360208110156103f257600080fd5b5035610c1b565b005b6102546004803603606081101561041157600080fd5b506001600160a01b03813581169160208101359091169060400135610da9565b6102546004803603606081101561044757600080fd5b506001600160a01b038135169060208101359060400135610e26565b61046b6110ff565b6040805160ff9092168252519081900360200190f35b6103ca611108565b6102546004803603604081101561049f57600080fd5b506001600160a01b03813516906020013561110e565b6104e1600480360360408110156104cb57600080fd5b506001600160a01b03813516906020013561115c565b60408051938452602084019290925282820152519081900360600190f35b6103f96004803603602081101561051557600080fd5b503561119e565b6103f96004803603602081101561053257600080fd5b50356001600160a01b03166111b2565b6102546112a6565b6103ca6113ab565b61055a6113cf565b604080516001600160a01b039092168252519081900360200190f35b6102546113de565b6103ca6004803603602081101561059457600080fd5b50356113e7565b6103ca600480360360208110156105b157600080fd5b50356001600160a01b0316611408565b6103f9600480360360408110156105d757600080fd5b506001600160a01b038135169060200135611423565b6102546004803603604081101561060357600080fd5b810190602081018135600160201b81111561061d57600080fd5b82018360208201111561062f57600080fd5b803590602001918460208302840111600160201b8311171561065057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550509135925061147d915050565b61055a611557565b61055a61156c565b610254600480360360208110156106b657600080fd5b50356001600160a01b031661157b565b6103ca61168e565b6102786116f3565b610254600480360360408110156106ec57600080fd5b506001600160a01b038135169060200135611754565b6102546004803603604081101561071857600080fd5b506001600160a01b0381351690602001356117bc565b6103ca6117d0565b6102546004803603602081101561074c57600080fd5b50356118c5565b6103ca611a4b565b61055a611b86565b6103f9600480360360c081101561077957600080fd5b810190602081018135600160201b81111561079357600080fd5b8201836020820111156107a557600080fd5b803590602001918460018302840111600160201b831117156107c657600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561081857600080fd5b82018360208201111561082a57600080fd5b803590602001918460018302840111600160201b8311171561084b57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505060ff8335169350506001600160a01b0360208301358116926040810135821692506060013516611b95565b6103ca600480360360408110156108c357600080fd5b506001600160a01b0381358116916020013516611c9c565b610254600480360360208110156108f157600080fd5b50356001600160a01b0316611cc7565b610254611dda565b6103f96004803603602081101561091f57600080fd5b50356001600160a01b0316611dea565b600b54600a80546001600160a01b0319166001600160a01b039283161790819055600091829116639adfecf9610963611ede565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156109a057600080fd5b505afa1580156109b4573d6000803e3d6000fd5b505050506040513d60208110156109ca57600080fd5b505190506000600182900b1380156109e5575060038160010b125b610a205760405162461bcd60e51b8152600401808060200182810382526028815260200180612d926028913960400191505060405180910390fd5b600c805460ff60a01b1916600160a01b179055600191505b5090565b600f5460ff1690565b60068054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ad15780601f10610aa657610100808354040283529160200191610ad1565b820191906000526020600020905b815481529060010190602001808311610ab457829003601f168201915b5050505050905090565b6000610aef610ae8611ede565b8484611ee2565b5060015b92915050565b600b54600a80546001600160a01b0319166001600160a01b039283161790819055600091829116639adfecf9610b2d611ede565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610b6a57600080fd5b505afa158015610b7e573d6000803e3d6000fd5b505050506040513d6020811015610b9457600080fd5b505190506000600182900b138015610baf575060038160010b125b610bea5760405162461bcd60e51b8152600401808060200182810382526028815260200180612d926028913960400191505060405180910390fd5b8251610bfd90600d906020860190612943565b5060019392505050565b600f54610100900460ff1681565b60055490565b60025460ff1615610c5d5760405162461bcd60e51b8152600401808060200182810382526045815260200180612e2b6045913960600191505060405180910390fd5b6000610c67611ede565b6001600160a01b03161415610cad5760405162461bcd60e51b8152600401808060200182810382526023815260200180612ba56023913960400191505060405180910390fd5b6000546001600160a01b0316610cc1611ede565b6001600160a01b031614610d065760405162461bcd60e51b815260040180806020018281038252603a815260200180612bf0603a913960400191505060405180910390fd5b60015415801590610d18575080600154145b610d535760405162461bcd60e51b8152600401808060200182810382526057815260200180612b286057913960600191505060405180910390fd5b600080546040516001600160a01b03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a2506002805460ff19166001179055600080546001600160a01b0319169055565b6000610db6848484611fce565b610bfd84610dc2611ede565b610e2185604051806060016040528060288152602001612dba602891396001600160a01b038a16600090815260046020526040812090610e00611ede565b6001600160a01b03168152602081019190915260400160002054919061212b565b611ee2565b600b54600a80546001600160a01b0319166001600160a01b039283161790819055600091829116639adfecf9610e5a611ede565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610e9757600080fd5b505afa158015610eab573d6000803e3d6000fd5b505050506040513d6020811015610ec157600080fd5b505190506000600182900b138015610edc575060038160010b125b610f175760405162461bcd60e51b8152600401808060200182810382526028815260200180612d926028913960400191505060405180910390fd5b6001600160a01b0385166000908152600e60209081526040808320805482518185028101850190935280835260609492939192909184015b82821015610f9f5783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190610f4f565b5050505090506000815111610fe55760405162461bcd60e51b8152600401808060200182810382526033815260200180612d026033913960400191505060405180910390fd5b6000805b82518110156110ae57610ffa61298a565b83828151811061100657fe5b60209081029190910101519050821580156110245750878160400151145b801561103d575061103d816000015182602001516121c2565b156110a55760208082018890526001600160a01b038a166000908152600e9091526040902080548291908490811061107157fe5b9060005260206000209060030201600082015181600001556020820151816001015560408201518160020155905050600192505b50600101610fe9565b5080156110c0576001935050506110f7565b60405162461bcd60e51b815260040180806020018281038252603c815260200180612cc6603c913960400191505060405180910390fd5b509392505050565b60085460ff1690565b60095490565b6000610aef61111b611ede565b84610e21856004600061112c611ede565b6001600160a01b03908116825260208083019390935260409182016000908120918c1681529252902054906121d8565b600e602052816000526040600020818154811061117857600080fd5b600091825260209091206003909102018054600182015460029092015490935090915083565b6111af6111a9611ede565b82612232565b50565b60025460ff16156111f45760405162461bcd60e51b8152600401808060200182810382526045815260200180612e2b6045913960600191505060405180910390fd5b60006111fe611ede565b6001600160a01b031614156112445760405162461bcd60e51b8152600401808060200182810382526023815260200180612ba56023913960400191505060405180910390fd5b6000546001600160a01b0316611258611ede565b6001600160a01b03161461129d5760405162461bcd60e51b815260040180806020018281038252603a815260200180612bf0603a913960400191505060405180910390fd5b6111af8161232e565b600b54600a80546001600160a01b0319166001600160a01b039283161790819055600091829116639adfecf96112da611ede565b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561131757600080fd5b505afa15801561132b573d6000803e3d6000fd5b505050506040513d602081101561134157600080fd5b505190506000600182900b13801561135c575060038160010b125b6113975760405162461bcd60e51b8152600401808060200182810382526028815260200180612d926028913960400191505060405180910390fd5b5050600c805460ff60a01b19169055600190565b7fc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf790565b600b546001600160a01b031681565b60025460ff1681565b600d81815481106113f757600080fd5b600091825260209091200154905081565b6001600160a01b031660009081526003602052604090205490565b600061145a82604051806060016040528060248152602001612de2602491396114538661144e611ede565b611c9c565b919061212b565b905061146e83611468611ede565b83611ee2565b6114788383612232565b505050565b8151600090806114be5760405162461bcd60e51b8152600401808060200182810382526025815260200180612c746025913960400191505060405180910390fd5b6114c8838261241b565b6114d86114d3611ede565b611408565b10156115155760405162461bcd60e51b815260040180806020018281038252602c815260200180612aa8602c913960400191505060405180910390fd5b60005b8181101561154c57600085828151811061152e57fe5b6020026020010151905061154281866117bc565b5050600101611518565b506001949350505050565b600f546201000090046001600160a01b031681565b6000546001600160a01b031681565b60025460009060ff16156115c05760405162461bcd60e51b8152600401808060200182810382526045815260200180612e2b6045913960600191505060405180910390fd5b60006115ca611ede565b6001600160a01b031614156116105760405162461bcd60e51b8152600401808060200182810382526023815260200180612ba56023913960400191505060405180910390fd5b6000546001600160a01b0316611624611ede565b6001600160a01b0316146116695760405162461bcd60e51b815260040180806020018281038252603a815260200180612bf0603a913960400191505060405180910390fd5b50600b80546001600160a01b0383166001600160a01b03199091161790556001919050565b600080546116ee906116a8906001600160a01b0316611408565b6010546116e8906116c1906001600160a01b0316611408565b600f546116e8906116e0906201000090046001600160a01b0316611408565b6116e8610c15565b90612474565b905090565b60078054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610ad15780601f10610aa657610100808354040283529160200191610ad1565b6000610aef611761611ede565b84610e2185604051806060016040528060258152602001612ee9602591396004600061178b611ede565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919061212b565b6000610aef6117c9611ede565b8484611fce565b60025460009060ff16156118155760405162461bcd60e51b8152600401808060200182810382526045815260200180612e2b6045913960600191505060405180910390fd5b600061181f611ede565b6001600160a01b031614156118655760405162461bcd60e51b8152600401808060200182810382526023815260200180612ba56023913960400191505060405180910390fd5b6000546001600160a01b0316611879611ede565b6001600160a01b0316146118be5760405162461bcd60e51b815260040180806020018281038252603a815260200180612bf0603a913960400191505060405180910390fd5b5060015490565b600c54600090600160a01b900460ff1680156118eb5750600c546001600160a01b031615155b6119265760405162461bcd60e51b8152600401808060200182810382526028815260200180612bc86028913960400191505060405180910390fd5b6000600d838154811061193557fe5b90600052602060002001549050600081116119815760405162461bcd60e51b8152600401808060200182810382526032815260200180612af66032913960400191505060405180910390fd5b600c5460009061199a906001600160a01b0316836117bc565b9050806119d85760405162461bcd60e51b8152600401808060200182810382526055815260200180612e946055913960600191505060405180910390fd5b6119e061298a565b42815260408101859052600e60006119f6611ede565b6001600160a01b03168152602080820192909252604090810160009081208054600180820183559183529184902085516003909302019182559284015181840155920151600290920191909155949350505050565b60025460009060ff1615611a905760405162461bcd60e51b8152600401808060200182810382526045815260200180612e2b6045913960600191505060405180910390fd5b6000611a9a611ede565b6001600160a01b03161415611ae05760405162461bcd60e51b8152600401808060200182810382526023815260200180612ba56023913960400191505060405180910390fd5b6000546001600160a01b0316611af4611ede565b6001600160a01b031614611b395760405162461bcd60e51b815260040180806020018281038252603a815260200180612bf0603a913960400191505060405180910390fd5b600042611b44611ede565b6040805160208082019490945260f89290921b6001600160f81b0319168282015280518083036021018152604190920190528051910120600181905592915050565b6010546001600160a01b031681565b600f5460ff610100909104161515600114611c9457600f805461ff001916610100179055611bc2836124b6565b633b9aca0060ff8516600a0a02611bd881612556565b8651611beb9060069060208a01906129ab565b508551611bff9060079060208901906129ab565b506008805460ff191660ff8716179055600f805462010000600160b01b031916620100006001600160a01b038581169190910291909117909155601080546001600160a01b031916918516919091179055611c6483611c5f8360146125f4565b6125fc565b50611c7482611c5f83600a6125f4565b50611c8484611c5f8360466125f4565b5050600f805460ff191660011790555b505050505050565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b60025460009060ff1615611d0c5760405162461bcd60e51b8152600401808060200182810382526045815260200180612e2b6045913960600191505060405180910390fd5b6000611d16611ede565b6001600160a01b03161415611d5c5760405162461bcd60e51b8152600401808060200182810382526023815260200180612ba56023913960400191505060405180910390fd5b6000546001600160a01b0316611d70611ede565b6001600160a01b031614611db55760405162461bcd60e51b815260040180806020018281038252603a815260200180612bf0603a913960400191505060405180910390fd5b50600c80546001600160a01b0383166001600160a01b03199091161790556001919050565b600c54600160a01b900460ff1681565b60025460ff1615611e2c5760405162461bcd60e51b8152600401808060200182810382526045815260200180612e2b6045913960600191505060405180910390fd5b6000611e36611ede565b6001600160a01b03161415611e7c5760405162461bcd60e51b8152600401808060200182810382526023815260200180612ba56023913960400191505060405180910390fd5b6000546001600160a01b0316611e90611ede565b6001600160a01b031614611ed55760405162461bcd60e51b815260040180806020018281038252603a815260200180612bf0603a913960400191505060405180910390fd5b6111af816124b6565b3390565b6001600160a01b038316611f275760405162461bcd60e51b8152600401808060200182810382526024815260200180612e706024913960400191505060405180910390fd5b6001600160a01b038216611f6c5760405162461bcd60e51b8152600401808060200182810382526022815260200180612ad46022913960400191505060405180910390fd5b6001600160a01b03808416600081815260046020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0383166120135760405162461bcd60e51b8152600401808060200182810382526025815260200180612e066025913960400191505060405180910390fd5b6001600160a01b0382166120585760405162461bcd60e51b8152600401808060200182810382526023815260200180612a3c6023913960400191505060405180910390fd5b612063838383612694565b6120a081604051806060016040528060268152602001612b7f602691396001600160a01b038616600090815260036020526040902054919061212b565b6001600160a01b0380851660009081526003602052604080822093909355908416815220546120cf90826121d8565b6001600160a01b0380841660008181526003602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156121ba5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561217f578181015183820152602001612167565b50505050905090810190601f1680156121ac5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600080831180156121d1575081155b9392505050565b6000828201838110156121d1576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b0382166122775760405162461bcd60e51b8152600401808060200182810382526027815260200180612c4d6027913960400191505060405180910390fd5b61228382600083612694565b6122c081604051806060016040528060228152602001612a86602291396001600160a01b038516600090815260036020526040902054919061212b565b6001600160a01b0383166000908152600360205260409020556005546122e69082612474565b6005556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b806001600160a01b03166352d1902d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561236757600080fd5b505afa15801561237b573d6000803e3d6000fd5b505050506040513d602081101561239157600080fd5b50517fc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7146123f7576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420636f6d70617469626c6560901b604482015290519081900360640190fd5b7fc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf755565b60008261242a57506000610af3565b8282028284828161243757fe5b04146121d15760405162461bcd60e51b8152600401808060200182810382526021815260200180612d356021913960400191505060405180910390fd5b60006121d183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061212b565b6001600160a01b0381166124fb5760405162461bcd60e51b8152600401808060200182810382526027815260200180612a5f6027913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b61255e611108565b1561259a5760405162461bcd60e51b815260040180806020018281038252603c815260200180612d56603c913960400191505060405180910390fd5b600081116125ef576040805162461bcd60e51b815260206004820152601960248201527f636170206d75737420626520686967686572207468616e203000000000000000604482015290519081900360640190fd5b600955565b606491020490565b6000612606610a3c565b156126425760405162461bcd60e51b8152600401808060200182810382526023815260200180612c2a6023913960400191505060405180910390fd5b61264c8383612851565b6040805183815290516001600160a01b038516917f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885919081900360200190a250600192915050565b6001600160a01b038381161515908316151581806126af5750805b6126ea5760405162461bcd60e51b815260040180806020018281038252602d815260200180612c99602d913960400191505060405180910390fd5b8180156126f45750805b1561276b576001600160a01b038516600090815260036020526040902054831115612766576040805162461bcd60e51b815260206004820152601c60248201527f6e6f7420656e6f7567682066756e647320746f207472616e7366657200000000604482015290519081900360640190fd5b61284a565b816127d8576009546127858461277f610c15565b906121d8565b1115612766576040805162461bcd60e51b815260206004820152601960248201527f45524332304361707065643a2063617020657863656564656400000000000000604482015290519081900360640190fd5b8061284a576001600160a01b03851660009081526003602052604090205483111561284a576040805162461bcd60e51b815260206004820152601860248201527f6e6f7420656e6f7567682066756e647320746f206275726e0000000000000000604482015290519081900360640190fd5b5050505050565b6001600160a01b0382166128ac576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6128b860008383612694565b6005546128c590826121d8565b6005556001600160a01b0382166000908152600360205260409020546128eb90826121d8565b6001600160a01b03831660008181526003602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b82805482825590600052602060002090810192821561297e579160200282015b8281111561297e578251825591602001919060010190612963565b50610a38929150612a26565b60405180606001604052806000815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826129e1576000855561297e565b82601f106129fa57805160ff191683800117855561297e565b8280016001018555821561297e579182018281111561297e578251825591602001919060010190612963565b5b80821115610a385760008155600101612a2756fe45524332303a207472616e7366657220746f20746865207a65726f2061646472657373746865206e6577206f776e65722063616e277420626520746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63656261746368207472616e736665722064656e696564203a20756e73756666696369656e742062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737364656e696564203a206e6f2070726573657420707269636520666f722070726f7669646564207265636f726420726967687464656e696564203a20612072656c696e71756973686d656e7420746f6b656e206d757374206265207072652d7365742063616c6c696e67207468652070726552656e6f756e63654f776e657273686970206d6574686f6445524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636564656e696564203a207a65726f206164647265737320686173206e6f2072696768747364656e696564203a2063616e2774207265676973746572206e6577206c616e6420666f72206e6f7764656e696564203a206d6574686f6420616363657373206973207265737472696374656420746f2074686520636f6e7472616374206f776e657245524332304d696e7461626c65203a204d696e74696e672069732066696e697368656445524332303a2063616e2774206275726e2066726f6d20746865207a65726f20616464726573736174206c65617374206f6e20726563697069656e74206d75737420626520646566696e65644d7573742070726f76696465206174206c65617374206f6e65206164647265737320746f207472616e7366657264656e696564203a206e6f207265676973747279207265636f726420726967687420666f756e6420666f722070726f7669646564206164647265737364656e696564203a206e6f207265636f726420726967687420666f756e6420666f722070726f76696465642061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f776361702076616c756520697320696d6d757461626c6520616e6420697320616c72656164792073657420746f20312042696c6c696f6e20454c414e4464656e696564203a207265737472696374656420746f204c414e444944204e46542061646d696e7345524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737364656e696564203a206f776e657220616374696f6e7320617265206c6f636b6564207768656e20636f6e74726163742069732072756e6e696e67207374616e64616c6f6e6545524332303a20617070726f76652066726f6d20746865207a65726f206164647265737364656e696564203a2076616c756520636f72726573706f6e64696e6720746f20726571756573746564207265636f726420726967687420707269636520686173206e6f74206265656e207472616e7366657272656445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212208b31d3c81e2ca3c2c9228fe9b6d4c2f36e24a509c37314a681a0d668c540586664736f6c63430007050033
Deployed Bytecode Sourcemap
33929:4671:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29885:127;;;:::i;:::-;;;;;;;;;;;;;;;;;;27812:94;;;:::i;15725:83::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17831:169;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17831:169:0;;;;;;;;:::i;29536:182::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29536:182:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29536:182:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29536:182:0;;-1:-1:-1;29536:182:0;;-1:-1:-1;;;;;29536:182:0:i;7473:31::-;;;:::i;16800:100::-;;;:::i;:::-;;;;;;;;;;;;;;;;9820:500;;;;;;;;;;;;;;;;-1:-1:-1;9820:500:0;;:::i;:::-;;18482:321;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18482:321:0;;;;;;;;;;;;;;;;;:::i;32665:996::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;32665:996:0;;;;;;;;;;;;;:::i;16652:83::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26038:75;;;:::i;19212:218::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19212:218:0;;;;;;;;:::i;7136:62::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;7136:62:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;26570:91;;;;;;;;;;;;;;;;-1:-1:-1;26570:91:0;;:::i;36687:99::-;;;;;;;;;;;;;;;;-1:-1:-1;36687:99:0;-1:-1:-1;;;;;36687:99:0;;:::i;30180:129::-;;;:::i;4963:147::-;;;:::i;6357:31::-;;;:::i;:::-;;;;-1:-1:-1;;;;;6357:31:0;;;;;;;;;;;;;;5783:30;;;:::i;6623:32::-;;;;;;;;;;;;;;;;-1:-1:-1;6623:32:0;;:::i;16963:119::-;;;;;;;;;;;;;;;;-1:-1:-1;16963:119:0;-1:-1:-1;;;;;16963:119:0;;:::i;26980:295::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;26980:295:0;;;;;;;;:::i;37352:497::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;37352:497:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;37352:497:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37352:497:0;;-1:-1:-1;;37352:497:0;;;-1:-1:-1;37352:497:0;;-1:-1:-1;;37352:497:0:i;7558:19::-;;;:::i;5488:20::-;;;:::i;38044:165::-;;;;;;;;;;;;;;;;-1:-1:-1;38044:165:0;-1:-1:-1;;;;;38044:165:0;;:::i;36938:163::-;;;:::i;15927:87::-;;;:::i;19933:269::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19933:269:0;;;;;;;;:::i;17295:175::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17295:175:0;;;;;;;;:::i;9210:140::-;;;:::i;30599:781::-;;;;;;;;;;;;;;;;-1:-1:-1;30599:781:0;;:::i;10634:303::-;;;:::i;7584:22::-;;;:::i;34469:1805::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34469:1805:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34469:1805:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34469:1805:0;;;;;;;;-1:-1:-1;34469:1805:0;;-1:-1:-1;;;;;34469:1805:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34469:1805:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34469:1805:0;;-1:-1:-1;;34469:1805:0;;;;;-1:-1:-1;;;;;;;34469:1805:0;;;;;;;;;;;;;;-1:-1:-1;34469:1805:0;;;;;:::i;17533:151::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17533:151:0;;;;;;;;;;:::i;38418:171::-;;;;;;;;;;;;;;;;-1:-1:-1;38418:171:0;-1:-1:-1;;;;;38418:171:0;;:::i;6542:38::-;;;:::i;11112:111::-;;;;;;;;;;;;;;;;-1:-1:-1;11112:111:0;-1:-1:-1;;;;;11112:111:0;;:::i;29885:127::-;29090:16;;29073:6;:34;;-1:-1:-1;;;;;;29073:34:0;-1:-1:-1;;;;;29090:16:0;;;29073:34;;;;;29940:4;;;;29137:6;:20;29158:12;:10;:12::i;:::-;29137:34;;;;;;;;;;;;;-1:-1:-1;;;;;29137:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29137:34:0;;-1:-1:-1;29204:1:0;29191:14;;;;;29190:36;;;;;29224:1;29211:10;:14;;;29190:36;29182:89;;;;-1:-1:-1;;;29182:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29957:18:::1;:25:::0;;-1:-1:-1;;;;29957:25:0::1;-1:-1:-1::0;;;29957:25:0::1;::::0;;29978:4:::1;::::0;-1:-1:-1;29282:1:0::1;29885:127:::0;;:::o;27812:94::-;27882:16;;;;27812:94;:::o;15725:83::-;15795:5;15788:12;;;;;;;;-1:-1:-1;;15788:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15762:13;;15788:12;;15795:5;;15788:12;;15795:5;15788:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15725:83;:::o;17831:169::-;17914:4;17931:39;17940:12;:10;:12::i;:::-;17954:7;17963:6;17931:8;:39::i;:::-;-1:-1:-1;17988:4:0;17831:169;;;;;:::o;29536:182::-;29090:16;;29073:6;:34;;-1:-1:-1;;;;;;29073:34:0;-1:-1:-1;;;;;29090:16:0;;;29073:34;;;;;29630:4;;;;29137:6;:20;29158:12;:10;:12::i;:::-;29137:34;;;;;;;;;;;;;-1:-1:-1;;;;;29137:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29137:34:0;;-1:-1:-1;29204:1:0;29191:14;;;;;29190:36;;;;;29224:1;29211:10;:14;;;29190:36;29182:89;;;;-1:-1:-1;;;29182:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29647:41;;::::1;::::0;:18:::1;::::0;:41:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;29706:4:0::1;::::0;29536:182;-1:-1:-1;;;29536:182:0:o;7473:31::-;;;;;;;;;:::o;16800:100::-;16880:12;;16800:100;:::o;9820:500::-;8910:10;;;;8909:11;8901:93;;;;-1:-1:-1;;;8901:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9037:1;9013:12;:10;:12::i;:::-;-1:-1:-1;;;;;9013:26:0;;;9005:74;;;;-1:-1:-1;;;9005:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9114:5;;-1:-1:-1;;;;;9114:5:0;9098:12;:10;:12::i;:::-;-1:-1:-1;;;;;9098:21:0;;9090:92;;;;-1:-1:-1;;;9090:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9929:19:::1;::::0;:33;;::::1;::::0;9928:84:::1;;;9991:20;9968:19;;:43;9928:84;9905:214;;;;-1:-1:-1::0;;;9905:214:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10249:5;::::0;;10230:25:::1;::::0;-1:-1:-1;;;;;10249:5:0;;::::1;::::0;10230:25:::1;::::0;::::1;-1:-1:-1::0;10266:10:0::1;:17:::0;;-1:-1:-1;;10266:17:0::1;10279:4;10266:17;::::0;;:10:::1;10294:18:::0;;-1:-1:-1;;;;;;10294:18:0::1;::::0;;9820:500::o;18482:321::-;18588:4;18605:36;18615:6;18623:9;18634:6;18605:9;:36::i;:::-;18652:121;18661:6;18669:12;:10;:12::i;:::-;18683:89;18721:6;18683:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18683:19:0;;;;;;:11;:19;;;;;;18703:12;:10;:12::i;:::-;-1:-1:-1;;;;;18683:33:0;;;;;;;;;;;;-1:-1:-1;18683:33:0;;;:89;:37;:89::i;:::-;18652:8;:121::i;32665:996::-;29090:16;;29073:6;:34;;-1:-1:-1;;;;;;29073:34:0;-1:-1:-1;;;;;29090:16:0;;;29073:34;;;;;32768:4;;;;29137:6;:20;29158:12;:10;:12::i;:::-;29137:34;;;;;;;;;;;;;-1:-1:-1;;;;;29137:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29137:34:0;;-1:-1:-1;29204:1:0;29191:14;;;;;29190:36;;;;;29224:1;29211:10;:14;;;29190:36;29182:89;;;;-1:-1:-1;;;29182:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32826:28:0;::::1;;::::0;;;:20:::1;:28;::::0;;;;;;;32785:69;;;;;;::::1;::::0;;;;;;;;;;:38:::1;::::0;:69;;32826:28;;32785:69;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;32900:1;32873:17;:24;:28;32865:92;;;;-1:-1:-1::0;;;32865:92:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32970:13;33009:6:::0;33004:526:::1;33025:17;:24;33021:1;:28;33004:526;;;33071:30;;:::i;:::-;33104:17;33122:1;33104:20;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;33161:17:0;::::1;::::0;::::1;:70;;;33220:11;33199;:17;;;:32;33161:70;:146;;;;;33252:55;33269:11;:16;;;33287:11;:19;;;33252:16;:55::i;:::-;33139:380;;;33376:19;::::0;;::::1;:29:::0;;;-1:-1:-1;;;;;33424:28:0;::::1;;::::0;;;:20:::1;:28:::0;;;;;;:31;;33376:11;;33424:28;33453:1;;33424:31;::::1;;;;;;;;;;;;;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;33499:4;33488:15;;33139:380;-1:-1:-1::0;33051:3:0::1;;33004:526;;;;33546:8;33542:111;;;33563:4;33556:11;;;;;;33542:111;33583:70;;-1:-1:-1::0;;;33583:70:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29282:1;32665:996:::0;;;;;;:::o;16652:83::-;16718:9;;;;16652:83;:::o;26038:75::-;26101:4;;26038:75;:::o;19212:218::-;19300:4;19317:83;19326:12;:10;:12::i;:::-;19340:7;19349:50;19388:10;19349:11;:25;19361:12;:10;:12::i;:::-;-1:-1:-1;;;;;19349:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;19349:25:0;;;:34;;;;;;;;;;;:38;:50::i;7136:62::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7136:62:0;;-1:-1:-1;7136:62:0;:::o;26570:91::-;26626:27;26632:12;:10;:12::i;:::-;26646:6;26626:5;:27::i;:::-;26570:91;:::o;36687:99::-;8910:10;;;;8909:11;8901:93;;;;-1:-1:-1;;;8901:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9037:1;9013:12;:10;:12::i;:::-;-1:-1:-1;;;;;9013:26:0;;;9005:74;;;;-1:-1:-1;;;9005:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9114:5;;-1:-1:-1;;;;;9114:5:0;9098:12;:10;:12::i;:::-;-1:-1:-1;;;;;9098:21:0;;9090:92;;;;-1:-1:-1;;;9090:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36752:26:::1;36770:7;36752:17;:26::i;30180:129::-:0;29090:16;;29073:6;:34;;-1:-1:-1;;;;;;29073:34:0;-1:-1:-1;;;;;29090:16:0;;;29073:34;;;;;30236:4;;;;29137:6;:20;29158:12;:10;:12::i;:::-;29137:34;;;;;;;;;;;;;-1:-1:-1;;;;;29137:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29137:34:0;;-1:-1:-1;29204:1:0;29191:14;;;;;29190:36;;;;;29224:1;29211:10;:14;;;29190:36;29182:89;;;;-1:-1:-1;;;29182:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30253:18:0::1;:26:::0;;-1:-1:-1;;;;30253:26:0::1;::::0;;-1:-1:-1;;30180:129:0:o;4963:147::-;5036:66;4963:147;:::o;6357:31::-;;;-1:-1:-1;;;;;6357:31:0;;:::o;5783:30::-;;;;;;:::o;6623:32::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6623:32:0;:::o;16963:119::-;-1:-1:-1;;;;;17056:18:0;17029:7;17056:18;;;:9;:18;;;;;;;16963:119::o;26980:295::-;27057:26;27086:84;27123:6;27086:84;;;;;;;;;;;;;;;;;:32;27096:7;27105:12;:10;:12::i;:::-;27086:9;:32::i;:::-;:36;:84;:36;:84::i;:::-;27057:113;;27183:51;27192:7;27201:12;:10;:12::i;:::-;27215:18;27183:8;:51::i;:::-;27245:22;27251:7;27260:6;27245:5;:22::i;:::-;26980:295;;;:::o;37352:497::-;37463:10;;37425:4;;37492:17;37484:67;;;;-1:-1:-1;;;37484:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37598:25;:6;37609:13;37598:10;:25::i;:::-;37570:23;37580:12;:10;:12::i;:::-;37570:9;:23::i;:::-;:54;;37562:111;;;;-1:-1:-1;;;37562:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37689:6;37684:136;37705:13;37701:1;:17;37684:136;;;37740:17;37760:3;37764:1;37760:6;;;;;;;;;;;;;;37740:26;;37781:27;37790:9;37801:6;37781:8;:27::i;:::-;-1:-1:-1;;37720:3:0;;37684:136;;;-1:-1:-1;37837:4:0;;37352:497;-1:-1:-1;;;;37352:497:0:o;7558:19::-;;;;;;-1:-1:-1;;;;;7558:19:0;;:::o;5488:20::-;;;-1:-1:-1;;;;;5488:20:0;;:::o;38044:165::-;8910:10;;38126:4;;8910:10;;8909:11;8901:93;;;;-1:-1:-1;;;8901:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9037:1;9013:12;:10;:12::i;:::-;-1:-1:-1;;;;;9013:26:0;;;9005:74;;;;-1:-1:-1;;;9005:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9114:5;;-1:-1:-1;;;;;9114:5:0;9098:12;:10;:12::i;:::-;-1:-1:-1;;;;;9098:21:0;;9090:92;;;;-1:-1:-1;;;9090:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38143:16:0::1;:36:::0;;-1:-1:-1;;;;;38143:36:0;::::1;-1:-1:-1::0;;;;;;38143:36:0;;::::1;;::::0;;;38044:165;;;:::o;36938:163::-;36987:4;37085:5;;37012:80;;37075:16;;-1:-1:-1;;;;;37085:5:0;37075:9;:16::i;:::-;37061:7;;37012:58;;37051:18;;-1:-1:-1;;;;;37061:7:0;37051:9;:18::i;:::-;37040:4;;37012:34;;37030:15;;37040:4;;;-1:-1:-1;;;;;37040:4:0;37030:9;:15::i;:::-;37012:13;:11;:13::i;:::-;:17;;:34::i;:80::-;37004:89;;36938:163;:::o;15927:87::-;15999:7;15992:14;;;;;;;;-1:-1:-1;;15992:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15966:13;;15992:14;;15999:7;;15992:14;;15999:7;15992:14;;;;;;;;;;;;;;;;;;;;;;;;19933:269;20026:4;20043:129;20052:12;:10;:12::i;:::-;20066:7;20075:96;20114:15;20075:96;;;;;;;;;;;;;;;;;:11;:25;20087:12;:10;:12::i;:::-;-1:-1:-1;;;;;20075:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;20075:25:0;;;:34;;;;;;;;;;;:96;:38;:96::i;17295:175::-;17381:4;17398:42;17408:12;:10;:12::i;:::-;17422:9;17433:6;17398:9;:42::i;9210:140::-;8910:10;;9275:28;;8910:10;;8909:11;8901:93;;;;-1:-1:-1;;;8901:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9037:1;9013:12;:10;:12::i;:::-;-1:-1:-1;;;;;9013:26:0;;;9005:74;;;;-1:-1:-1;;;9005:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9114:5;;-1:-1:-1;;;;;9114:5:0;9098:12;:10;:12::i;:::-;-1:-1:-1;;;;;9098:21:0;;9090:92;;;;-1:-1:-1;;;9090:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9323:19:0::1;::::0;9210:140;:::o;30599:781::-;30680:18;;30655:4;;-1:-1:-1;;;30680:18:0;;;;:54;;;;-1:-1:-1;30703:16:0;;-1:-1:-1;;;;;30703:16:0;:30;;30680:54;30672:107;;;;-1:-1:-1;;;30672:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30792:16;30811:18;30830:11;30811:31;;;;;;;;;;;;;;;;30792:50;;30875:1;30861:11;:15;30853:78;;;;-1:-1:-1;;;30853:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30972:16;;30944;;30963:39;;-1:-1:-1;;;;;30972:16:0;30990:11;30963:8;:39::i;:::-;30944:58;;31021:11;31013:109;;;;-1:-1:-1;;;31013:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31135:30;;:::i;:::-;31195:15;31176:34;;31221:17;;;:31;;;31296:20;31176:16;31317:12;:10;:12::i;:::-;-1:-1:-1;;;;;31296:34:0;;;;;;;;;;;;;;;-1:-1:-1;31296:34:0;;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30599:781;-1:-1:-1;;;;30599:781:0:o;10634:303::-;8910:10;;10691:28;;8910:10;;8909:11;8901:93;;;;-1:-1:-1;;;8901:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9037:1;9013:12;:10;:12::i;:::-;-1:-1:-1;;;;;9013:26:0;;;9005:74;;;;-1:-1:-1;;;9005:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9114:5;;-1:-1:-1;;;;;9114:5:0;9098:12;:10;:12::i;:::-;-1:-1:-1;;;;;9098:21:0;;9090:92;;;;-1:-1:-1;;;9090:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10732:9:::1;10776:15;10799:12;:10;:12::i;:::-;10759:54;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;;;-1:-1:-1;;;;;;10759:54:0;;;;;;;;;;;;;;;;;;;;10749:65;;;::::1;::::0;10759:54:::1;10865:26:::0;;;10749:65;;-1:-1:-1;;10634:303:0:o;7584:22::-;;;-1:-1:-1;;;;;7584:22:0;;:::o;34469:1805::-;34689:11;;;;;;;;:19;;:11;:19;34685:1582;;34796:11;:18;;-1:-1:-1;;34796:18:0;;;;;34935:26;34954:6;34935:18;:26::i;:::-;35091:3;35097:15;;;:2;:15;35091:21;35359:30;35091:21;35359:15;:30::i;:::-;35494:13;;;;:5;;:13;;;;;:::i;:::-;-1:-1:-1;35522:17:0;;;;:7;;:17;;;;;:::i;:::-;-1:-1:-1;35554:9:0;:21;;-1:-1:-1;;35554:21:0;;;;;;;35681:4;:12;;-1:-1:-1;;;;;;35681:12:0;;-1:-1:-1;;;;;35681:12:0;;;;;;;;;;;;;;35708:7;:18;;-1:-1:-1;;;;;;35708:18:0;;;;;;;;;;36044:44;35708:18;36059:28;36069:13;36084:2;36059:9;:28::i;:::-;36044:4;:44::i;:::-;;36103:41;36108:5;36115:28;36125:13;36140:2;36115:9;:28::i;36103:41::-;;36159:42;36164:6;36172:28;36182:13;36197:2;36172:9;:28::i;36159:42::-;-1:-1:-1;;36218:16:0;:23;;-1:-1:-1;;36218:23:0;36237:4;36218:23;;;34685:1582;34469:1805;;;;;;:::o;17533:151::-;-1:-1:-1;;;;;17649:18:0;;;17622:7;17649:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;17533:151::o;38418:171::-;8910:10;;38506:4;;8910:10;;8909:11;8901:93;;;;-1:-1:-1;;;8901:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9037:1;9013:12;:10;:12::i;:::-;-1:-1:-1;;;;;9013:26:0;;;9005:74;;;;-1:-1:-1;;;9005:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9114:5;;-1:-1:-1;;;;;9114:5:0;9098:12;:10;:12::i;:::-;-1:-1:-1;;;;;9098:21:0;;9090:92;;;;-1:-1:-1;;;9090:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38523:16:0::1;:36:::0;;-1:-1:-1;;;;;38523:36:0;::::1;-1:-1:-1::0;;;;;;38523:36:0;;::::1;;::::0;;;38418:171;;;:::o;6542:38::-;;;-1:-1:-1;;;6542:38:0;;;;;:::o;11112:111::-;8910:10;;;;8909:11;8901:93;;;;-1:-1:-1;;;8901:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9037:1;9013:12;:10;:12::i;:::-;-1:-1:-1;;;;;9013:26:0;;;9005:74;;;;-1:-1:-1;;;9005:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9114:5;;-1:-1:-1;;;;;9114:5:0;9098:12;:10;:12::i;:::-;-1:-1:-1;;;;;9098:21:0;;9090:92;;;;-1:-1:-1;;;9090:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11186:29:::1;11205:9;11186:18;:29::i;8193:106::-:0;8281:10;8193:106;:::o;23086:346::-;-1:-1:-1;;;;;23188:19:0;;23180:68;;;;-1:-1:-1;;;23180:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23267:21:0;;23259:68;;;;-1:-1:-1;;;23259:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23340:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;23392:32;;;;;;;;;;;;;;;;;23086:346;;;:::o;20692:539::-;-1:-1:-1;;;;;20798:20:0;;20790:70;;;;-1:-1:-1;;;20790:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20879:23:0;;20871:71;;;;-1:-1:-1;;;20871:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20955:47;20976:6;20984:9;20995:6;20955:20;:47::i;:::-;21035:71;21057:6;21035:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21035:17:0;;;;;;:9;:17;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;21015:17:0;;;;;;;:9;:17;;;;;;:91;;;;21140:20;;;;;;;:32;;21165:6;21140:24;:32::i;:::-;-1:-1:-1;;;;;21117:20:0;;;;;;;:9;:20;;;;;;;;;:55;;;;21188:35;;;;;;;21117:20;;21188:35;;;;;;;;;;;;;20692:539;;;:::o;1857:192::-;1943:7;1979:12;1971:6;;;;1963:29;;;;-1:-1:-1;;;1963:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2015:5:0;;;1857:192::o;31923:171::-;31996:4;32042:1;32035:4;:8;32034:41;;;;-1:-1:-1;32062:12:0;;32034:41;32013:73;31923:171;-1:-1:-1;;;31923:171:0:o;954:181::-;1012:7;1044:5;;;1068:6;;;;1060:46;;;;;-1:-1:-1;;;1060:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;22224:424;-1:-1:-1;;;;;22308:21:0;;22300:73;;;;-1:-1:-1;;;22300:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22386:49;22407:7;22424:1;22428:6;22386:20;:49::i;:::-;22469:68;22492:6;22469:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22469:18:0;;;;;;:9;:18;;;;;;;:68;:22;:68::i;:::-;-1:-1:-1;;;;;22448:18:0;;;;;;:9;:18;;;;;:89;22563:12;;:24;;22580:6;22563:16;:24::i;:::-;22548:12;:39;22603:37;;;;;;;;22629:1;;-1:-1:-1;;;;;22603:37:0;;;;;;;;;;;;22224:424;;:::o;4548:409::-;4726:10;-1:-1:-1;;;;;4716:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4716:37:0;4645:66;4637:116;4615:180;;;;;-1:-1:-1;;;4615:180:0;;;;;;;;;;;;-1:-1:-1;;;4615:180:0;;;;;;;;;;;;;;;4860:66;4853:86;4815:135::o;2308:471::-;2366:7;2611:6;2607:47;;-1:-1:-1;2641:1:0;2634:8;;2607:47;2678:5;;;2682:1;2678;:5;:1;2702:5;;;;;:10;2694:56;;;;-1:-1:-1;;;2694:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1418:136;1476:7;1503:43;1507:1;1510;1503:43;;;;;;;;;;;;;;;;;:3;:43::i;11371:232::-;-1:-1:-1;;;;;11446:23:0;;11438:75;;;;-1:-1:-1;;;11438:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11550:5;;;11529:38;;-1:-1:-1;;;;;11529:38:0;;;;11550:5;;;11529:38;;;11578:5;:17;;-1:-1:-1;;;;;;11578:17:0;-1:-1:-1;;;;;11578:17:0;;;;;;;;;;11371:232::o;25535:229::-;25602:5;:3;:5::i;:::-;:10;25594:83;;;;-1:-1:-1;;;25594:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25703:1;25696:4;:8;25688:46;;;;;-1:-1:-1;;;25688:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25745:4;:11;25535:229::o;34091:137::-;34216:3;34195:17;;34194:25;;34091:137::o;28314:290::-;28419:4;28449:17;:15;:17::i;:::-;:26;28441:74;;;;-1:-1:-1;;;28441:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28526:19;28532:3;28537:7;28526:5;:19::i;:::-;28556:18;;;;;;;;-1:-1:-1;;;;;28556:18:0;;;;;;;;;;;;;-1:-1:-1;28592:4:0;28314:290;;;;:::o;24457:704::-;-1:-1:-1;;;;;24573:18:0;;;;;;24615:16;;;;24573:18;;24651:16;;;24662:5;24651:16;24642:76;;;;-1:-1:-1;;;24642:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24732:7;:16;;;;;24743:5;24732:16;24729:425;;;-1:-1:-1;;;;;24773:15:0;;;;;;:9;:15;;;;;;:25;-1:-1:-1;24773:25:0;24765:66;;;;;-1:-1:-1;;;24765:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;24729:425;;;24863:7;24858:296;;24990:4;;24961:25;24979:6;24961:13;:11;:13::i;:::-;:17;;:25::i;:::-;:33;;24953:71;;;;;-1:-1:-1;;;24953:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;24858:296;25058:5;25053:101;;-1:-1:-1;;;;;25088:15:0;;;;;;:9;:15;;;;;;:25;-1:-1:-1;25088:25:0;25080:62;;;;;-1:-1:-1;;;25080:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;24457:704;;;;;:::o;21513:378::-;-1:-1:-1;;;;;21597:21:0;;21589:65;;;;;-1:-1:-1;;;21589:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21667:49;21696:1;21700:7;21709:6;21667:20;:49::i;:::-;21744:12;;:24;;21761:6;21744:16;:24::i;:::-;21729:12;:39;-1:-1:-1;;;;;21800:18:0;;;;;;:9;:18;;;;;;:30;;21823:6;21800:22;:30::i;:::-;-1:-1:-1;;;;;21779:18:0;;;;;;:9;:18;;;;;;;;:51;;;;21846:37;;;;;;;21779:18;;;;21846:37;;;;;;;;;;21513:378;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Swarm Source
ipfs://8b31d3c81e2ca3c2c9228fe9b6d4c2f36e24a509c37314a681a0d668c5405866
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 25 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.