ERC-20
Overview
Max Total Supply
1,200,000 HAG
Holders
137
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
HagToken
Compiler Version
v0.5.8+commit.23d335f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-01-17 */ // File: contracts/1404/IERC1404.sol pragma solidity 0.5.8; interface IERC1404 { /// @notice Detects if a transfer will be reverted and if so returns an appropriate reference code /// @param from Sending address /// @param to Receiving address /// @param value Amount of tokens being transferred /// @return Code by which to reference message for rejection reasoning /// @dev Overwrite with your custom transfer restriction logic function detectTransferRestriction (address from, address to, uint256 value) external view returns (uint8); /// @notice Detects if a transferFrom will be reverted and if so returns an appropriate reference code /// @param sender Transaction sending address /// @param from Source of funds address /// @param to Receiving address /// @param value Amount of tokens being transferred /// @return Code by which to reference message for rejection reasoning /// @dev Overwrite with your custom transfer restriction logic function detectTransferFromRestriction (address sender, address from, address to, uint256 value) external view returns (uint8); /// @notice Returns a human-readable message for a given restriction code /// @param restrictionCode Identifier for looking up a message /// @return Text showing the restriction's reasoning /// @dev Overwrite with your custom message and restrictionCode handling function messageForTransferRestriction (uint8 restrictionCode) external view returns (string memory); } interface IERC1404getSuccessCode { /// @notice Return the uint256 that represents the SUCCESS_CODE /// @return uint256 SUCCESS_CODE function getSuccessCode () external view returns (uint256); } /** * @title IERC1404Success * @dev Combines IERC1404 and IERC1404getSuccessCode interfaces, to be implemented by the TransferRestrictions contract */ contract IERC1404Success is IERC1404getSuccessCode, IERC1404 { } // File: contracts/1404/IERC1404Validators.sol pragma solidity 0.5.8; /** * @title IERC1404Validators * @dev Interfaces implemented by the token contract to be called by the TransferRestrictions contract */ interface IERC1404Validators { /// @notice Returns the token balance for an account /// @param account The address to get the token balance of /// @return uint256 representing the token balance for the account function balanceOf (address account) external view returns (uint256); /// @notice Returns a boolean indicating the paused state of the contract /// @return true if contract is paused, false if unpaused function paused () external view returns (bool); /// @notice Determine if sender and receiver are whitelisted, return true if both accounts are whitelisted /// @param from The address sending tokens. /// @param to The address receiving tokens. /// @return true if both accounts are whitelisted, false if not function checkWhitelists (address from, address to) external view returns (bool); /// @notice Determine if a users tokens are locked preventing a transfer /// @param _address the address to retrieve the data from /// @param amount the amount to send /// @param balance the token balance of the sending account /// @return true if user has sufficient unlocked token to transfer the requested amount, false if not function checkTimelock (address _address, uint256 amount, uint256 balance) external view returns (bool); } // File: @openzeppelin/contracts/access/Roles.sol pragma solidity ^0.5.0; /** * @title Roles * @dev Library for managing addresses assigned to a Role. */ library Roles { struct Role { mapping (address => bool) bearer; } /** * @dev Give an account access to this role. */ function add(Role storage role, address account) internal { require(!has(role, account), "Roles: account already has role"); role.bearer[account] = true; } /** * @dev Remove an account's access to this role. */ function remove(Role storage role, address account) internal { require(has(role, account), "Roles: account does not have role"); role.bearer[account] = false; } /** * @dev Check if an account has this role. * @return bool */ function has(Role storage role, address account) internal view returns (bool) { require(account != address(0), "Roles: account is the zero address"); return role.bearer[account]; } } // File: contracts/roles/OwnerRole.sol pragma solidity 0.5.8; contract OwnerRole { using Roles for Roles.Role; event OwnerAdded(address indexed addedOwner, address indexed addedBy); event OwnerRemoved(address indexed removedOwner, address indexed removedBy); Roles.Role private _owners; modifier onlyOwner() { require(isOwner(msg.sender), "OwnerRole: caller does not have the Owner role"); _; } function isOwner(address account) public view returns (bool) { return _owners.has(account); } function addOwner(address account) public onlyOwner { _addOwner(account); } function removeOwner(address account) public onlyOwner { require(msg.sender != account, "Owners cannot remove themselves as owner"); _removeOwner(account); } function _addOwner(address account) internal { _owners.add(account); emit OwnerAdded(account, msg.sender); } function _removeOwner(address account) internal { _owners.remove(account); emit OwnerRemoved(account, msg.sender); } } // File: @openzeppelin/contracts/GSN/Context.sol pragma solidity ^0.5.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with 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 { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol pragma solidity ^0.5.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ 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: @openzeppelin/contracts/math/SafeMath.sol pragma solidity ^0.5.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. * * _Available since v2.4.0._ */ 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. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 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; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. 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 mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. 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. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol pragma solidity ^0.5.0; /** * @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 {ERC20Mintable}. * * 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 Context, IERC20 { using SafeMath for uint256; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view 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 returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public 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 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 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 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 { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _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 { require(account != address(0), "ERC20: mint to the zero address"); _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 { require(account != address(0), "ERC20: burn from the zero address"); _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 is 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 { 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 Destroys `amount` tokens from `account`.`amount` is then deducted * from the caller's allowance. * * See {_burn} and {_approve}. */ function _burnFrom(address account, uint256 amount) internal { _burn(account, amount); _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance")); } } // File: contracts/roles/RevokerRole.sol pragma solidity 0.5.8; contract RevokerRole is OwnerRole { event RevokerAdded(address indexed addedRevoker, address indexed addedBy); event RevokerRemoved(address indexed removedRevoker, address indexed removedBy); Roles.Role private _revokers; modifier onlyRevoker() { require(isRevoker(msg.sender), "RevokerRole: caller does not have the Revoker role"); _; } function isRevoker(address account) public view returns (bool) { return _revokers.has(account); } function addRevoker(address account) public onlyOwner { _addRevoker(account); } function removeRevoker(address account) public onlyOwner { _removeRevoker(account); } function _addRevoker(address account) internal { _revokers.add(account); emit RevokerAdded(account, msg.sender); } function _removeRevoker(address account) internal { _revokers.remove(account); emit RevokerRemoved(account, msg.sender); } } // File: contracts/capabilities/Revocable.sol pragma solidity 0.5.8; /** * Allows an administrator to move tokens from a target account to their own. */ contract Revocable is ERC20, RevokerRole { event Revoke(address indexed revoker, address indexed from, uint256 amount); function revoke( address _from, uint256 _amount ) public onlyRevoker returns (bool) { ERC20._transfer(_from, msg.sender, _amount); emit Revoke(msg.sender, _from, _amount); return true; } } // File: contracts/roles/WhitelisterRole.sol pragma solidity 0.5.8; contract WhitelisterRole is OwnerRole { event WhitelisterAdded(address indexed addedWhitelister, address indexed addedBy); event WhitelisterRemoved(address indexed removedWhitelister, address indexed removedBy); Roles.Role private _whitelisters; modifier onlyWhitelister() { require(isWhitelister(msg.sender), "WhitelisterRole: caller does not have the Whitelister role"); _; } function isWhitelister(address account) public view returns (bool) { return _whitelisters.has(account); } function addWhitelister(address account) public onlyOwner { _addWhitelister(account); } function removeWhitelister(address account) public onlyOwner { _removeWhitelister(account); } function _addWhitelister(address account) internal { _whitelisters.add(account); emit WhitelisterAdded(account, msg.sender); } function _removeWhitelister(address account) internal { _whitelisters.remove(account); emit WhitelisterRemoved(account, msg.sender); } } // File: contracts/capabilities/Whitelistable.sol pragma solidity 0.5.8; /** * @title Whitelistable * @dev Allows tracking whether addressess are allowed to hold tokens. */ contract Whitelistable is WhitelisterRole { event WhitelistUpdate(address _address, bool status, string data); // Tracks whether an address is whitelisted // data field can track any external field (like a hash of personal details) struct whiteListItem { bool status; string data; } // white list status mapping (address => whiteListItem) public whitelist; /** * @dev Set a white list address * @param to the address to be set * @param status the whitelisting status (true for yes, false for no) * @param data a string with data about the whitelisted address */ function setWhitelist(address to, bool status, string memory data) public onlyWhitelister returns(bool){ whitelist[to] = whiteListItem(status, data); emit WhitelistUpdate(to, status, data); return true; } /** * @dev Get the status of the whitelist * @param _address the address to be check */ function getWhitelistStatus(address _address) public view returns(bool){ return whitelist[_address].status; } /** * @dev Get the data of and address in the whitelist * @param _address the address to retrieve the data from */ function getWhitelistData(address _address) public view returns(string memory){ return whitelist[_address].data; } /** * @dev Determine if sender and receiver are whitelisted, return true if both accounts are whitelisted * @param from The address sending tokens. * @param to The address receiving tokens. */ function checkWhitelists(address from, address to) external view returns (bool) { return whitelist[from].status && whitelist[to].status; } } // File: contracts/roles/TimelockerRole.sol pragma solidity 0.5.8; contract TimelockerRole is OwnerRole { event TimelockerAdded(address indexed addedTimelocker, address indexed addedBy); event TimelockerRemoved(address indexed removedTimelocker, address indexed removedBy); Roles.Role private _timelockers; modifier onlyTimelocker() { require(isTimelocker(msg.sender), "TimelockerRole: caller does not have the Timelocker role"); _; } function isTimelocker(address account) public view returns (bool) { return _timelockers.has(account); } function addTimelocker(address account) public onlyOwner { _addTimelocker(account); } function removeTimelocker(address account) public onlyOwner { _removeTimelocker(account); } function _addTimelocker(address account) internal { _timelockers.add(account); emit TimelockerAdded(account, msg.sender); } function _removeTimelocker(address account) internal { _timelockers.remove(account); emit TimelockerRemoved(account, msg.sender); } } // File: contracts/capabilities/Timelockable.sol pragma solidity 0.5.8; /** * @title Hag Timelockable * @dev Lockup all or a portion of an accounts tokens until an expiration date */ contract Timelockable is TimelockerRole { using SafeMath for uint256; struct lockupItem { uint256 amount; uint256 releaseTime; } mapping (address => lockupItem) lockups; event AccountLock(address _address, uint256 amount, uint256 releaseTime); event AccountRelease(address _address, uint256 amount); /** * @dev lock address and amount and lock it, set the release time * @param _address the address to lock * @param amount the amount to lock * @param releaseTime of the locked amount (in seconds since the epoch) */ function lock( address _address, uint256 amount, uint256 releaseTime) public onlyTimelocker returns (bool) { require(releaseTime > block.timestamp, "Release time needs to be in the future"); require(_address != address(0), "Address must be valid for lockup"); lockupItem memory _lockupItem = lockupItem(amount, releaseTime); lockups[_address] = _lockupItem; emit AccountLock(_address, amount, releaseTime); return true; } /** * @dev release locked amount * @param _address the address to retrieve the data from * @param amountToRelease the amount to check */ function release( address _address, uint256 amountToRelease) public onlyTimelocker returns(bool) { require(_address != address(0), "Address must be valid for release"); uint256 _lockedAmount = lockups[_address].amount; // nothing to release if(_lockedAmount == 0){ emit AccountRelease(_address, 0); return true; } // extract release time for re-locking uint256 _releaseTime = lockups[_address].releaseTime; // delete the lock entry delete lockups[_address]; if(_lockedAmount >= amountToRelease){ uint256 newLockedAmount = _lockedAmount.sub(amountToRelease); // re-lock the new locked balance lock(_address, newLockedAmount, _releaseTime); emit AccountRelease(_address, amountToRelease); return true; } else { // if they requested to release more than the locked amount emit the event with the locked amount that has been released emit AccountRelease(_address, _lockedAmount); return true; } } /** * @dev return true if the given account has enough unlocked tokens to send the requested amount * @param _address the address to retrieve the data from * @param amount the amount to send * @param balance the token balance of the sending account */ function checkTimelock(address _address, uint256 amount, uint256 balance) external view returns (bool) { // if the user does not have enough tokens to send regardless of lock return true here // the failure will still fail but this should make it explicit that the transfer failure is not // due to locked tokens but because of too low token balance if (balance < amount) { return true; } // get the sending addresses token balance that is not locked uint256 nonLockedAmount = balance.sub(lockups[_address].amount); // determine if the sending address has enough free tokens to send the entire amount bool notLocked = amount <= nonLockedAmount; // if the timelock is greater then the release time the time lock is expired bool timeLockExpired = block.timestamp > lockups[_address].releaseTime; // if the timelock is expired OR the requested amount is available the transfer is not locked if(timeLockExpired || notLocked){ return true; // if the timelocked is not expired AND the requested amount is not available the tranfer is locked } else { return false; } } /** * @dev get address lockup info * @param _address the address to retrieve the data from * @return array of 2 uint256, release time (in seconds since the epoch) and amount (in HAG) */ function checkLockup(address _address) public view returns(uint256, uint256) { // copy lockup data into memory lockupItem memory _lockupItem = lockups[_address]; return (_lockupItem.releaseTime, _lockupItem.amount); } } // File: contracts/roles/PauserRole.sol pragma solidity 0.5.8; contract PauserRole is OwnerRole { event PauserAdded(address indexed addedPauser, address indexed addedBy); event PauserRemoved(address indexed removedPauser, address indexed removedBy); Roles.Role private _pausers; modifier onlyPauser() { require(isPauser(msg.sender), "PauserRole: caller does not have the Pauser role"); _; } function isPauser(address account) public view returns (bool) { return _pausers.has(account); } function addPauser(address account) public onlyOwner { _addPauser(account); } function removePauser(address account) public onlyOwner { _removePauser(account); } function _addPauser(address account) internal { _pausers.add(account); emit PauserAdded(account, msg.sender); } function _removePauser(address account) internal { _pausers.remove(account); emit PauserRemoved(account, msg.sender); } } // File: contracts/capabilities/Pausable.sol pragma solidity 0.5.8; /** * Allows transfers on a token contract to be paused by an administrator. */ contract Pausable is PauserRole { event Paused(); event Unpaused(); bool private _paused; /** * @return true if the contract is paused, false otherwise. */ function paused() external view returns (bool) { return _paused; } /** * @dev internal function, triggers paused state */ function _pause() internal { _paused = true; emit Paused(); } /** * @dev internal function, returns to unpaused state */ function _unpause() internal { _paused = false; emit Unpaused(); } /** * @dev called by pauser role to pause, triggers stopped state */ function pause() public onlyPauser { _pause(); } /** * @dev called by pauer role to unpause, returns to normal state */ function unpause() public onlyPauser { _unpause(); } } // File: @openzeppelin/contracts/token/ERC20/ERC20Detailed.sol pragma solidity ^0.5.0; /** * @dev Optional functions from the ERC20 standard. */ contract ERC20Detailed is IERC20 { string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for `name`, `symbol`, and `decimals`. All three of * these values are immutable: they can only be set once during * construction. */ constructor (string memory name, string memory symbol, uint8 decimals) public { _name = name; _symbol = symbol; _decimals = decimals; } /** * @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. * * 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; } } pragma solidity ^0.5.0; contract MinterRole is OwnerRole { event MinterAdded(address indexed addedMinter, address indexed addedBy); event MinterRemoved(address indexed removedMinter, address indexed removedBy); Roles.Role private _minters; modifier onlyMinter() { require(isMinter(msg.sender), "MinterRole: caller does not have the Minter role"); _; } function isMinter(address account) public view returns (bool) { return _minters.has(account); } function _addMinter(address account) internal { _minters.add(account); emit MinterAdded(account, msg.sender); } function _removeMinter(address account) internal { _minters.remove(account); emit MinterRemoved(account, msg.sender); } function addMinter(address account) public onlyOwner { _addMinter(account); } function removeMinter(address account) public onlyOwner { _removeMinter(account); } } pragma solidity ^0.5.0; contract Mintable is ERC20, MinterRole { event Mint(address indexed minter, address indexed to, uint256 amount); function _mint(address minter, address to, uint256 amount) internal returns (bool) { ERC20._mint(to, amount); emit Mint(minter, to, amount); return true; } /** Allow Owners to mint tokens to valid addresses */ function mint(address account, uint256 amount) public onlyMinter returns (bool) { return Mintable._mint(msg.sender, account, amount); } } pragma solidity ^0.5.0; contract BurnerRole is OwnerRole { event BurnerAdded(address indexed addedBurner, address indexed addedBy); event BurnerRemoved(address indexed removedBurner, address indexed removedBy); Roles.Role private _burners; modifier onlyBurner() { require(isBurner(msg.sender), "BurnerRole: caller does not have the Burner role"); _; } function isBurner(address account) public view returns (bool) { return _burners.has(account); } function _addBurner(address account) internal { _burners.add(account); emit BurnerAdded(account, msg.sender); } function _removeBurner(address account) internal { _burners.remove(account); emit BurnerRemoved(account, msg.sender); } function addBurner(address account) public onlyOwner { _addBurner(account); } function removeBurner(address account) public onlyOwner { _removeBurner(account); } } pragma solidity ^0.5.0; contract Burnable is ERC20, BurnerRole { event Burn(address indexed burner, address indexed from, uint256 amount); function _burn(address burner, address from, uint256 amount) internal returns (bool) { ERC20._burn(from, amount); emit Burn(burner, from, amount); return true; } /** Allow Burners to burn tokens from valid addresses */ function burn(address account, uint256 amount) public onlyBurner returns (bool) { return _burn(msg.sender, account, amount); } } // File: contracts/HagToken.sol pragma solidity 0.5.8; contract HagToken is IERC1404, IERC1404Validators, IERC20, ERC20Detailed, OwnerRole, Revocable, Whitelistable, Timelockable, Pausable, Mintable, Burnable { // Token Details string constant TOKEN_NAME = "HAG Token"; string constant TOKEN_SYMBOL = "HAG"; uint8 constant TOKEN_DECIMALS = 18; // Token supply - 1.2 Million Tokens, with 18 decimal precision uint256 constant ONE_POINT_TWO_MILLION = 1200000; uint256 constant TOKEN_SUPPLY = ONE_POINT_TWO_MILLION * (10 ** uint256(TOKEN_DECIMALS)); // This tracks the external contract where restriction logic is executed IERC1404Success private transferRestrictions; // Event tracking when restriction logic contract is updated event RestrictionsUpdated (address newRestrictionsAddress, address updatedBy); /** Constructor for the token to set readable details and mint all tokens to the specified owner. */ constructor(address owner) public ERC20Detailed(TOKEN_NAME, TOKEN_SYMBOL, TOKEN_DECIMALS) { _mint(owner, TOKEN_SUPPLY); _addOwner(owner); } /** Function that can only be called by an owner that updates the address with the ERC1404 Transfer Restrictions defined */ function updateTransferRestrictions(address _newRestrictionsAddress) public onlyOwner returns (bool) { transferRestrictions = IERC1404Success(_newRestrictionsAddress); emit RestrictionsUpdated(address(transferRestrictions), msg.sender); return true; } /** The address with the Transfer Restrictions contract */ function getRestrictionsAddress () public view returns (address) { return address(transferRestrictions); } /** This function detects whether a transfer should be restricted and not allowed. If the function returns SUCCESS_CODE (0) then it should be allowed. */ function detectTransferRestriction (address from, address to, uint256 amount) public view returns (uint8) { // Verify the external contract is valid require(address(transferRestrictions) != address(0), 'TransferRestrictions contract must be set'); // call detectTransferRestriction on the current transferRestrictions contract return transferRestrictions.detectTransferRestriction(from, to, amount); } /** This function detects whether a transferFrom should be restricted and not allowed. If the function returns SUCCESS_CODE (0) then it should be allowed. */ function detectTransferFromRestriction (address sender, address from, address to, uint256 amount) public view returns (uint8) { // Verify the external contract is valid require(address(transferRestrictions) != address(0), 'TransferRestrictions contract must be set'); // call detectTransferFromRestriction on the current transferRestrictions contract return transferRestrictions.detectTransferFromRestriction(sender, from, to, amount); } /** This function allows a wallet or other client to get a human readable string to show a user if a transfer was restricted. It should return enough information for the user to know why it failed. */ function messageForTransferRestriction (uint8 restrictionCode) external view returns (string memory) { // call messageForTransferRestriction on the current transferRestrictions contract return transferRestrictions.messageForTransferRestriction(restrictionCode); } /** Evaluates whether a transfer should be allowed or not. */ modifier notRestricted (address from, address to, uint256 value) { uint8 restrictionCode = transferRestrictions.detectTransferRestriction(from, to, value); require(restrictionCode == transferRestrictions.getSuccessCode(), transferRestrictions.messageForTransferRestriction(restrictionCode)); _; } /** Evaluates whether a transferFrom should be allowed or not. */ modifier notRestrictedTransferFrom (address sender, address from, address to, uint256 value) { uint8 transferFromRestrictionCode = transferRestrictions.detectTransferFromRestriction(sender, from, to, value); require(transferFromRestrictionCode == transferRestrictions.getSuccessCode(), transferRestrictions.messageForTransferRestriction(transferFromRestrictionCode)); _; } /** Overrides the parent class token transfer function to enforce restrictions. */ function transfer (address to, uint256 value) public notRestricted(msg.sender, to, value) returns (bool success) { success = ERC20.transfer(to, value); } /** Overrides the parent class token transferFrom function to enforce restrictions. */ function transferFrom (address from, address to, uint256 value) public notRestrictedTransferFrom(msg.sender, from, to, value) returns (bool success) { success = ERC20.transferFrom(from, to, value); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"removeBurner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addTimelocker","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"},{"name":"amountToRelease","type":"uint256"}],"name":"release","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getRestrictionsAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"sender","type":"address"},{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"amount","type":"uint256"}],"name":"detectTransferFromRestriction","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"amount","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isTimelocker","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"removeOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"status","type":"bool"},{"name":"data","type":"string"}],"name":"setWhitelist","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"removeMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"},{"name":"amount","type":"uint256"}],"name":"mint","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isBurner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isPauser","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"getWhitelistData","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"removePauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isWhitelister","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"restrictionCode","type":"uint8"}],"name":"messageForTransferRestriction","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"removeWhitelister","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addPauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"removeTimelocker","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addRevoker","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"}],"name":"checkWhitelists","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"checkLockup","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"whitelist","outputs":[{"name":"status","type":"bool"},{"name":"data","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"},{"name":"amount","type":"uint256"}],"name":"burn","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isMinter","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"removeRevoker","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"},{"name":"amount","type":"uint256"},{"name":"balance","type":"uint256"}],"name":"checkTimelock","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"amount","type":"uint256"}],"name":"detectTransferRestriction","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"getWhitelistStatus","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newRestrictionsAddress","type":"address"}],"name":"updateTransferRestrictions","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"},{"name":"amount","type":"uint256"},{"name":"releaseTime","type":"uint256"}],"name":"lock","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_amount","type":"uint256"}],"name":"revoke","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addWhitelister","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addBurner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isRevoker","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"owner","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newRestrictionsAddress","type":"address"},{"indexed":false,"name":"updatedBy","type":"address"}],"name":"RestrictionsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"burner","type":"address"},{"indexed":true,"name":"from","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addedBurner","type":"address"},{"indexed":true,"name":"addedBy","type":"address"}],"name":"BurnerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"removedBurner","type":"address"},{"indexed":true,"name":"removedBy","type":"address"}],"name":"BurnerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"minter","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addedMinter","type":"address"},{"indexed":true,"name":"addedBy","type":"address"}],"name":"MinterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"removedMinter","type":"address"},{"indexed":true,"name":"removedBy","type":"address"}],"name":"MinterRemoved","type":"event"},{"anonymous":false,"inputs":[],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addedPauser","type":"address"},{"indexed":true,"name":"addedBy","type":"address"}],"name":"PauserAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"removedPauser","type":"address"},{"indexed":true,"name":"removedBy","type":"address"}],"name":"PauserRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_address","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"releaseTime","type":"uint256"}],"name":"AccountLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_address","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"AccountRelease","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addedTimelocker","type":"address"},{"indexed":true,"name":"addedBy","type":"address"}],"name":"TimelockerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"removedTimelocker","type":"address"},{"indexed":true,"name":"removedBy","type":"address"}],"name":"TimelockerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_address","type":"address"},{"indexed":false,"name":"status","type":"bool"},{"indexed":false,"name":"data","type":"string"}],"name":"WhitelistUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addedWhitelister","type":"address"},{"indexed":true,"name":"addedBy","type":"address"}],"name":"WhitelisterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"removedWhitelister","type":"address"},{"indexed":true,"name":"removedBy","type":"address"}],"name":"WhitelisterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"revoker","type":"address"},{"indexed":true,"name":"from","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Revoke","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addedRevoker","type":"address"},{"indexed":true,"name":"addedBy","type":"address"}],"name":"RevokerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"removedRevoker","type":"address"},{"indexed":true,"name":"removedBy","type":"address"}],"name":"RevokerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addedOwner","type":"address"},{"indexed":true,"name":"addedBy","type":"address"}],"name":"OwnerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"removedOwner","type":"address"},{"indexed":true,"name":"removedBy","type":"address"}],"name":"OwnerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405160208062003b4c833981018060405260208110156200003357600080fd5b5051604080518082018252600981527f48414720546f6b656e000000000000000000000000000000000000000000000060208281019182528351808501909452600384527f4841470000000000000000000000000000000000000000000000000000000000908401528151919291601291620000b391600091906200042c565b508151620000c99060019060208501906200042c565b506002805460ff191660ff9290921691909117905550620000fe90508169fe1c215e8f838e00000062000116602090811b901c565b6200010f816200023560201b60201c565b50620004d1565b6001600160a01b0382166200018c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b620001a8816005546200028960201b620028c31790919060201c565b6005556001600160a01b038216600090815260036020908152604090912054620001dd918390620028c362000289821b17901c565b6001600160a01b03831660008181526003602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b620002508160066200030560201b62002f721790919060201c565b60405133906001600160a01b038316907fc82bdbbf677a2462f2a7e22e4ba9abd209496b69cd7b868b3b1d28f76e09a40a90600090a350565b600082820183811015620002fe57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b620003178282620003a960201b60201c565b156200038457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b60006001600160a01b0382166200040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018062003b2a6022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200046f57805160ff19168380011785556200049f565b828001600101855582156200049f579182015b828111156200049f57825182559160200191906001019062000482565b50620004ad929150620004b1565b5090565b620004ce91905b80821115620004ad5760008155600101620004b8565b90565b61364980620004e16000396000f3fe608060405234801561001057600080fd5b506004361061030c5760003560e01c80637f4ab1dd1161019d578063a9059cbb116100e9578063db0cc92a116100a2578063eac449d91161007c578063eac449d914610bc3578063eaf9144a14610bef578063f44637ba14610c15578063f6c4b01f14610c3b5761030c565b8063db0cc92a14610b3d578063dd62ed3e14610b63578063e2ab691d14610b915761030c565b8063a9059cbb14610a37578063aa271e1a14610a63578063c06f8b9414610a89578063c697e4a314610aaf578063d4ce141514610ae1578063d9ba32fc14610b175761030c565b8063961a66f6116101565780639a6e292f116101305780639a6e292f146108f75780639b19251a146109365780639dc29fac146109df578063a457c2d714610a0b5761030c565b8063961a66f61461087d578063983b2d56146108a357806399da091d146108c95761030c565b80637f4ab1dd146107db57806382c3f79c146107fb57806382dc1ec414610821578063841aca44146108475780638456cb591461086d57806395d89b41146108755761030c565b80633092afd51161025c57806346fbf68e116102155780636b2c0f55116101ef5780636b2c0f55146107435780637065cb481461076957806370a082311461078f5780637d0c269f146107b55761030c565b806346fbf68e146106ef5780635c975abb1461071557806368aa98131461071d5761030c565b80633092afd51461063b578063313ce5671461066157806339509351146106695780633f4ba83a1461069557806340c10f191461069d5780634334614a146106c95761030c565b8063095ea7b3116102c957806318160ddd116102a357806318160ddd1461050a57806323b872dd1461052457806327ac19751461055a5780632f54bf6e146106155761030c565b8063095ea7b3146104925780630c57133f146104be578063173825d9146104e45761030c565b80630284685814610311578063031d4053146103395780630357371d1461035f57806305557bd41461039f57806306fdde03146103c35780630754cede14610440575b600080fd5b6103376004803603602081101561032757600080fd5b50356001600160a01b0316610c61565b005b6103376004803603602081101561034f57600080fd5b50356001600160a01b0316610cb4565b61038b6004803603604081101561037557600080fd5b506001600160a01b038135169060200135610d04565b604080519115158252519081900360200190f35b6103a7610eef565b604080516001600160a01b039092168252519081900360200190f35b6103cb610eff565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104055781810151838201526020016103ed565b50505050905090810190601f1680156104325780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61047c6004803603608081101561045657600080fd5b506001600160a01b03813581169160208101358216916040820135169060600135610f95565b6040805160ff9092168252519081900360200190f35b61038b600480360360408110156104a857600080fd5b506001600160a01b03813516906020013561107e565b61038b600480360360208110156104d457600080fd5b50356001600160a01b031661109b565b610337600480360360208110156104fa57600080fd5b50356001600160a01b03166110ae565b610512611149565b60408051918252519081900360200190f35b61038b6004803603606081101561053a57600080fd5b506001600160a01b0381358116916020810135909116906040013561114f565b61038b6004803603606081101561057057600080fd5b6001600160a01b03823516916020810135151591810190606081016040820135600160201b8111156105a157600080fd5b8201836020820111156105b357600080fd5b803590602001918460018302840111600160201b831117156105d457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506113e9945050505050565b61038b6004803603602081101561062b57600080fd5b50356001600160a01b0316611552565b6103376004803603602081101561065157600080fd5b50356001600160a01b0316611565565b61047c6115b5565b61038b6004803603604081101561067f57600080fd5b506001600160a01b0381351690602001356115be565b610337611617565b61038b600480360360408110156106b357600080fd5b506001600160a01b038135169060200135611668565b61038b600480360360208110156106df57600080fd5b50356001600160a01b03166116bc565b61038b6004803603602081101561070557600080fd5b50356001600160a01b03166116cf565b61038b6116e2565b6103cb6004803603602081101561073357600080fd5b50356001600160a01b03166116eb565b6103376004803603602081101561075957600080fd5b50356001600160a01b03166117b5565b6103376004803603602081101561077f57600080fd5b50356001600160a01b0316611805565b610512600480360360208110156107a557600080fd5b50356001600160a01b0316611855565b61038b600480360360208110156107cb57600080fd5b50356001600160a01b0316611870565b6103cb600480360360208110156107f157600080fd5b503560ff16611883565b6103376004803603602081101561081157600080fd5b50356001600160a01b0316611960565b6103376004803603602081101561083757600080fd5b50356001600160a01b03166119b0565b6103376004803603602081101561085d57600080fd5b50356001600160a01b0316611a00565b610337611a50565b6103cb611a9f565b6103376004803603602081101561089357600080fd5b50356001600160a01b0316611aff565b610337600480360360208110156108b957600080fd5b50356001600160a01b0316611b4f565b61038b600480360360408110156108df57600080fd5b506001600160a01b0381358116916020013516611b9f565b61091d6004803603602081101561090d57600080fd5b50356001600160a01b0316611be3565b6040805192835260208301919091528051918290030190f35b61095c6004803603602081101561094c57600080fd5b50356001600160a01b0316611c2a565b604051808315151515815260200180602001828103825283818151815260200191508051906020019080838360005b838110156109a357818101518382015260200161098b565b50505050905090810190601f1680156109d05780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b61038b600480360360408110156109f557600080fd5b506001600160a01b038135169060200135611cd8565b61038b60048036036040811015610a2157600080fd5b506001600160a01b038135169060200135611d2c565b61038b60048036036040811015610a4d57600080fd5b506001600160a01b038135169060200135611d9a565b61038b60048036036020811015610a7957600080fd5b50356001600160a01b0316611fea565b61033760048036036020811015610a9f57600080fd5b50356001600160a01b0316611ffd565b61038b60048036036060811015610ac557600080fd5b506001600160a01b03813516906020810135906040013561204d565b61047c60048036036060811015610af757600080fd5b506001600160a01b038135811691602081013590911690604001356120d5565b61038b60048036036020811015610b2d57600080fd5b50356001600160a01b03166121b5565b61038b60048036036020811015610b5357600080fd5b50356001600160a01b03166121d3565b61051260048036036040811015610b7957600080fd5b506001600160a01b0381358116916020013516612281565b61038b60048036036060811015610ba757600080fd5b506001600160a01b0381351690602081013590604001356122ac565b61038b60048036036040811015610bd957600080fd5b506001600160a01b038135169060200135612421565b61033760048036036020811015610c0557600080fd5b50356001600160a01b03166124be565b61033760048036036020811015610c2b57600080fd5b50356001600160a01b031661250e565b61038b60048036036020811015610c5157600080fd5b50356001600160a01b031661255e565b610c6a33611552565b610ca857604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612571565b50565b610cbd33611552565b610cfb57604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb1816125bb565b6000610d0f3361109b565b610d4d57604051600160e51b62461bcd0281526004018080602001828103825260388152602001806133666038913960400191505060405180910390fd5b6001600160a01b038316610d9557604051600160e51b62461bcd0281526004018080602001828103825260218152602001806135af6021913960400191505060405180910390fd5b6001600160a01b0383166000908152600b602052604090205480610e0157604080516001600160a01b03861681526000602082015281517f784c9f4cec58b38461217a62f8f9c0f2cac7b46c0ed23bd1a7f4a5376ac787e1929181900390910190a16001915050610ee9565b6001600160a01b0384166000908152600b602052604081206001810180549183905591909155838210610e9e576000610e40838663ffffffff61260516565b9050610e4d8682846122ac565b50604080516001600160a01b03881681526020810187905281517f784c9f4cec58b38461217a62f8f9c0f2cac7b46c0ed23bd1a7f4a5376ac787e1929181900390910190a160019350505050610ee9565b604080516001600160a01b03871681526020810184905281517f784c9f4cec58b38461217a62f8f9c0f2cac7b46c0ed23bd1a7f4a5376ac787e1929181900390910190a16001925050505b92915050565b6010546001600160a01b03165b90565b60008054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610f8b5780601f10610f6057610100808354040283529160200191610f8b565b820191906000526020600020905b815481529060010190602001808311610f6e57829003601f168201915b5050505050905090565b6010546000906001600160a01b0316610fe257604051600160e51b62461bcd0281526004018080602001828103825260298152602001806135f56029913960400191505060405180910390fd5b60105460408051600160e11b6303aa676f0281526001600160a01b038881166004830152878116602483015286811660448301526064820186905291519190921691630754cede916084808301926020929190829003018186803b15801561104957600080fd5b505afa15801561105d573d6000803e3d6000fd5b505050506040513d602081101561107357600080fd5b505195945050505050565b600061109261108b612647565b848461264b565b50600192915050565b6000610ee9600a8363ffffffff61273d16565b6110b733611552565b6110f557604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b336001600160a01b038216141561114057604051600160e51b62461bcd0281526004018080602001828103825260288152602001806134bd6028913960400191505060405180910390fd5b610cb1816127a7565b60055490565b60105460408051600160e11b6303aa676f02815233600482018190526001600160a01b03808816602484015280871660448401526064830186905292516000949193889388938893889390911691630754cede916084808301926020929190829003018186803b1580156111c257600080fd5b505afa1580156111d6573d6000803e3d6000fd5b505050506040513d60208110156111ec57600080fd5b505160105460408051600160e01b635ec6475902815290519293506001600160a01b0390911691635ec6475991600480820192602092909190829003018186803b15801561123957600080fd5b505afa15801561124d573d6000803e3d6000fd5b505050506040513d602081101561126357600080fd5b505160105460408051600160e01b637f4ab1dd02815260ff851660048201819052915191909314926001600160a01b0390921691637f4ab1dd916024808301926000929190829003018186803b1580156112bc57600080fd5b505afa1580156112d0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156112f957600080fd5b810190808051600160201b81111561131057600080fd5b8201602081018481111561132357600080fd5b8151600160201b81118282018710171561133c57600080fd5b5050929190505050906113d057604051600160e51b62461bcd0281526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561139557818101518382015260200161137d565b50505050905090810190601f1680156113c25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506113dc8989896127f1565b9998505050505050505050565b60006113f433611870565b61143257604051600160e51b62461bcd02815260040180806020018281038252603a815260200180613551603a913960400191505060405180910390fd5b604080518082018252841515815260208082018581526001600160a01b038816600090815260098352939093208251815460ff19169015151781559251805192939261148492600185019201906131ea565b509050507f461193ae6c23672174f7a3ea35649aacdc857bfcae58cd12d61ea432c05bcbd584848460405180846001600160a01b03166001600160a01b031681526020018315151515815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561150b5781810151838201526020016114f3565b50505050905090810190601f1680156115385780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a15060015b9392505050565b6000610ee960068363ffffffff61273d16565b61156e33611552565b6115ac57604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612879565b60025460ff1690565b60006110926115cb612647565b8461161285600460006115dc612647565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff6128c316565b61264b565b611620336116cf565b61165e57604051600160e51b62461bcd0281526004018080602001828103825260308152602001806132e26030913960400191505060405180910390fd5b611666612920565b565b600061167333611fea565b6116b157604051600160e51b62461bcd0281526004018080602001828103825260308152602001806133f46030913960400191505060405180910390fd5b61154b338484612955565b6000610ee9600f8363ffffffff61273d16565b6000610ee9600c8363ffffffff61273d16565b600d5460ff1690565b606060096000836001600160a01b03166001600160a01b031681526020019081526020016000206001018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156117a95780601f1061177e576101008083540402835291602001916117a9565b820191906000526020600020905b81548152906001019060200180831161178c57829003601f168201915b50505050509050919050565b6117be33611552565b6117fc57604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb1816129b6565b61180e33611552565b61184c57604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612a00565b6001600160a01b031660009081526003602052604090205490565b6000610ee960088363ffffffff61273d16565b60105460408051600160e01b637f4ab1dd02815260ff8416600482015290516060926001600160a01b031691637f4ab1dd916024808301926000929190829003018186803b1580156118d457600080fd5b505afa1580156118e8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561191157600080fd5b810190808051600160201b81111561192857600080fd5b8201602081018481111561193b57600080fd5b8151600160201b81118282018710171561195457600080fd5b50909695505050505050565b61196933611552565b6119a757604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612a4a565b6119b933611552565b6119f757604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612a94565b611a0933611552565b611a4757604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612ade565b611a59336116cf565b611a9757604051600160e51b62461bcd0281526004018080602001828103825260308152602001806132e26030913960400191505060405180910390fd5b611666612b28565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815260609390929091830182828015610f8b5780601f10610f6057610100808354040283529160200191610f8b565b611b0833611552565b611b4657604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612b60565b611b5833611552565b611b9657604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612baa565b6001600160a01b03821660009081526009602052604081205460ff16801561154b5750506001600160a01b031660009081526009602052604090205460ff16919050565b600080611bee613268565b5050506001600160a01b03166000908152600b602090815260409182902082518084019093528054808452600190910154929091018290529091565b6009602090815260009182526040918290208054600180830180548651600261010094831615949094026000190190911692909204601f810186900486028301860190965285825260ff909216949293909290830182828015611cce5780601f10611ca357610100808354040283529160200191611cce565b820191906000526020600020905b815481529060010190602001808311611cb157829003601f168201915b5050505050905082565b6000611ce3336116bc565b611d2157604051600160e51b62461bcd0281526004018080602001828103825260308152602001806133c46030913960400191505060405180910390fd5b61154b338484612bf4565b6000611092611d39612647565b84611612856040518060600160405280602581526020016135d06025913960046000611d63612647565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff612c5516565b60105460408051600160e01b63d4ce141502815233600482018190526001600160a01b038087166024840152604483018690529251600094919387938793879392169163d4ce141591606480820192602092909190829003018186803b158015611e0357600080fd5b505afa158015611e17573d6000803e3d6000fd5b505050506040513d6020811015611e2d57600080fd5b505160105460408051600160e01b635ec6475902815290519293506001600160a01b0390911691635ec6475991600480820192602092909190829003018186803b158015611e7a57600080fd5b505afa158015611e8e573d6000803e3d6000fd5b505050506040513d6020811015611ea457600080fd5b505160105460408051600160e01b637f4ab1dd02815260ff851660048201819052915191909314926001600160a01b0390921691637f4ab1dd916024808301926000929190829003018186803b158015611efd57600080fd5b505afa158015611f11573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611f3a57600080fd5b810190808051600160201b811115611f5157600080fd5b82016020810184811115611f6457600080fd5b8151600160201b811182820187101715611f7d57600080fd5b505092919050505090611fd457604051600160e51b62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561139557818101518382015260200161137d565b50611fdf8787612cb2565b979650505050505050565b6000610ee9600e8363ffffffff61273d16565b61200633611552565b61204457604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612cc6565b60008282101561205f5750600161154b565b6001600160a01b0384166000908152600b602052604081205461208990849063ffffffff61260516565b6001600160a01b0386166000908152600b60205260409020600101549091508185111590421180806120b85750815b156120c9576001935050505061154b565b6000935050505061154b565b6010546000906001600160a01b031661212257604051600160e51b62461bcd0281526004018080602001828103825260298152602001806135f56029913960400191505060405180910390fd5b60105460408051600160e01b63d4ce14150281526001600160a01b0387811660048301528681166024830152604482018690529151919092169163d4ce1415916064808301926020929190829003018186803b15801561218157600080fd5b505afa158015612195573d6000803e3d6000fd5b505050506040513d60208110156121ab57600080fd5b5051949350505050565b6001600160a01b031660009081526009602052604090205460ff1690565b60006121de33611552565b61221c57604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b601080546001600160a01b0319166001600160a01b0384811691909117918290556040805192909116825233602083015280517f6c0cb4cdcdbedb9d71fdb2e31e3ad5a42fc2cffc2642730034017c04192e3afe9281900390910190a1506001919050565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b60006122b73361109b565b6122f557604051600160e51b62461bcd0281526004018080602001828103825260388152602001806133666038913960400191505060405180910390fd5b42821161233657604051600160e51b62461bcd0281526004018080602001828103825260268152602001806135066026913960400191505060405180910390fd5b6001600160a01b0384166123945760408051600160e51b62461bcd02815260206004820181905260248201527f41646472657373206d7573742062652076616c696420666f72206c6f636b7570604482015290519081900360640190fd5b61239c613268565b5060408051808201825284815260208082018581526001600160a01b0388166000818152600b84528590208451815591516001909201919091558351908152908101869052808301859052915190917fd204e81d84b52b5a19d16a46f86c9a7d66d37c207b982c21d8d1810757b61bae919081900360600190a1506001949350505050565b600061242c3361255e565b61246a57604051600160e51b62461bcd0281526004018080602001828103825260328152602001806133346032913960400191505060405180910390fd5b612475833384612d10565b6040805183815290516001600160a01b0385169133917fb698e31a2abee5824d0d7bcfd2339aead7f9e9ae413fba50bf554ff3fa470b7b9181900360200190a350600192915050565b6124c733611552565b61250557604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612e74565b61251733611552565b61255557604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612ebe565b6000610ee960078363ffffffff61273d16565b612582600f8263ffffffff612f0816565b60405133906001600160a01b038316907f85222465e0d438163a28671b59fc9ebeb03bf39f880ddd36c8315da7512b31c090600090a350565b6125cc600a8263ffffffff612f7216565b60405133906001600160a01b038316907f28f069fa8730ef5d44b24faedbcabf2b254c53f4e02a953476a4015e3067714190600090a350565b600061154b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612c55565b3390565b6001600160a01b03831661269357604051600160e51b62461bcd02815260040180806020018281038252602481526020018061358b6024913960400191505060405180910390fd5b6001600160a01b0382166126db57604051600160e51b62461bcd0281526004018080602001828103825260228152602001806133126022913960400191505060405180910390fd5b6001600160a01b03808416600081815260046020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60006001600160a01b03821661278757604051600160e51b62461bcd02815260040180806020018281038252602281526020018061349b6022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b6127b860068263ffffffff612f0816565b60405133906001600160a01b038316907fe594d081b4382713733fe631966432c9cea5199afb2db5c3c1931f9f9300367990600090a350565b60006127fe848484612d10565b61286f8461280a612647565b61161285604051806060016040528060288152602001613473602891396001600160a01b038a16600090815260046020526040812090612848612647565b6001600160a01b03168152602081019190915260400160002054919063ffffffff612c5516565b5060019392505050565b61288a600e8263ffffffff612f0816565b60405133906001600160a01b038316907f4b5ef9a786cf64a7d82ebcf2d5132667edc9faef4ac36260d9a9e52c526b623290600090a350565b60008282018381101561154b5760408051600160e51b62461bcd02815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600d805460ff191690556040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693390600090a1565b60006129618383612ff6565b826001600160a01b0316846001600160a01b03167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8846040518082815260200191505060405180910390a35060019392505050565b6129c7600c8263ffffffff612f0816565b60405133906001600160a01b038316907fb75903ade4a0fdb07d60c882c22c779e2e1c751883c37aecdcc92a8ec72b046e90600090a350565b612a1160068263ffffffff612f7216565b60405133906001600160a01b038316907fc82bdbbf677a2462f2a7e22e4ba9abd209496b69cd7b868b3b1d28f76e09a40a90600090a350565b612a5b60088263ffffffff612f0816565b60405133906001600160a01b038316907f3ed21605dd544629fb45f2ccaedcc095ba1dbea540fb6eaf5493a7479856b0be90600090a350565b612aa5600c8263ffffffff612f7216565b60405133906001600160a01b038316907fe0953c403a52f9dc1fef4202a8d33975c958b727bee0d7b5b328965ddad98d8190600090a350565b612aef600a8263ffffffff612f0816565b60405133906001600160a01b038316907f1bac2ef39c5011bb7c20ecf6bc7cb986695b3f432a149d898c0ed368e55c780690600090a350565b600d805460ff191660011790556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e75290600090a1565b612b7160078263ffffffff612f7216565b60405133906001600160a01b038316907f2b5f18afd9a7b21f41bf023b012b3d4c8a22a21b79fa425cd4494ecbe297019690600090a350565b612bbb600e8263ffffffff612f7216565b60405133906001600160a01b038316907f3c091dafb1d99e4a4c333024492eac3b2cd8bf921a3dd547c937db33be307bb890600090a350565b6000612c0083836130eb565b826001600160a01b0316846001600160a01b03167fbac40739b0d4ca32fa2d82fc91630465ba3eddd1598da6fca393b26fb63b9453846040518082815260200191505060405180910390a35060019392505050565b60008184841115612caa57604051600160e51b62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561139557818101518382015260200161137d565b505050900390565b6000611092612cbf612647565b8484612d10565b612cd760078263ffffffff612f0816565b60405133906001600160a01b038316907fb6fe3ab11eb9ab1d9f1d41c8f42a5d72d10122099ba1548e4a6d1a4d8cefec4b90600090a350565b6001600160a01b038316612d5857604051600160e51b62461bcd02815260040180806020018281038252602581526020018061352c6025913960400191505060405180910390fd5b6001600160a01b038216612da057604051600160e51b62461bcd02815260040180806020018281038252602381526020018061329d6023913960400191505060405180910390fd5b612de38160405180606001604052806026815260200161339e602691396001600160a01b038616600090815260036020526040902054919063ffffffff612c5516565b6001600160a01b038085166000908152600360205260408082209390935590841681522054612e18908263ffffffff6128c316565b6001600160a01b0380841660008181526003602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b612e8560088263ffffffff612f7216565b60405133906001600160a01b038316907f5f36f4f5999f34947706fca376b955319b858573bf9d6bc59303c9a4cd80ced090600090a350565b612ecf600f8263ffffffff612f7216565b60405133906001600160a01b038316907f86515ebaad527298e98929c064c075f5a2604cc80afc0db29e73c01a36f8e98c90600090a350565b612f12828261273d565b612f5057604051600160e51b62461bcd0281526004018080602001828103825260218152602001806134526021913960400191505060405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b612f7c828261273d565b15612fd15760408051600160e51b62461bcd02815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b6001600160a01b0382166130545760408051600160e51b62461bcd02815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b600554613067908263ffffffff6128c316565b6005556001600160a01b038216600090815260036020526040902054613093908263ffffffff6128c316565b6001600160a01b03831660008181526003602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b03821661313357604051600160e51b62461bcd0281526004018080602001828103825260218152602001806134e56021913960400191505060405180910390fd5b613176816040518060600160405280602281526020016132c0602291396001600160a01b038516600090815260036020526040902054919063ffffffff612c5516565b6001600160a01b0383166000908152600360205260409020556005546131a2908263ffffffff61260516565b6005556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061322b57805160ff1916838001178555613258565b82800160010185558215613258579182015b8281111561325857825182559160200191906001019061323d565b50613264929150613282565b5090565b604051806040016040528060008152602001600081525090565b610efc91905b80821115613264576000815560010161328856fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e6365506175736572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652050617573657220726f6c6545524332303a20617070726f766520746f20746865207a65726f20616464726573735265766f6b6572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865205265766f6b657220726f6c6554696d656c6f636b6572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652054696d656c6f636b657220726f6c6545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654275726e6572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204275726e657220726f6c654d696e746572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204d696e74657220726f6c654f776e6572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204f776e657220726f6c65526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c6545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365526f6c65733a206163636f756e7420697320746865207a65726f20616464726573734f776e6572732063616e6e6f742072656d6f7665207468656d73656c766573206173206f776e657245524332303a206275726e2066726f6d20746865207a65726f206164647265737352656c656173652074696d65206e6565647320746f20626520696e207468652066757475726545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737357686974656c6973746572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652057686974656c697374657220726f6c6545524332303a20617070726f76652066726f6d20746865207a65726f206164647265737341646472657373206d7573742062652076616c696420666f722072656c6561736545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f5472616e736665725265737472696374696f6e7320636f6e7472616374206d75737420626520736574a165627a7a723058207d3afabbceccff0bda34b20c92cb0f58a5a8aa735387152c8f3e7670e0e4c4960029526f6c65733a206163636f756e7420697320746865207a65726f2061646472657373000000000000000000000000e4dc667f92b9d110a307b265bf8afacdd0fd3c8c
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061030c5760003560e01c80637f4ab1dd1161019d578063a9059cbb116100e9578063db0cc92a116100a2578063eac449d91161007c578063eac449d914610bc3578063eaf9144a14610bef578063f44637ba14610c15578063f6c4b01f14610c3b5761030c565b8063db0cc92a14610b3d578063dd62ed3e14610b63578063e2ab691d14610b915761030c565b8063a9059cbb14610a37578063aa271e1a14610a63578063c06f8b9414610a89578063c697e4a314610aaf578063d4ce141514610ae1578063d9ba32fc14610b175761030c565b8063961a66f6116101565780639a6e292f116101305780639a6e292f146108f75780639b19251a146109365780639dc29fac146109df578063a457c2d714610a0b5761030c565b8063961a66f61461087d578063983b2d56146108a357806399da091d146108c95761030c565b80637f4ab1dd146107db57806382c3f79c146107fb57806382dc1ec414610821578063841aca44146108475780638456cb591461086d57806395d89b41146108755761030c565b80633092afd51161025c57806346fbf68e116102155780636b2c0f55116101ef5780636b2c0f55146107435780637065cb481461076957806370a082311461078f5780637d0c269f146107b55761030c565b806346fbf68e146106ef5780635c975abb1461071557806368aa98131461071d5761030c565b80633092afd51461063b578063313ce5671461066157806339509351146106695780633f4ba83a1461069557806340c10f191461069d5780634334614a146106c95761030c565b8063095ea7b3116102c957806318160ddd116102a357806318160ddd1461050a57806323b872dd1461052457806327ac19751461055a5780632f54bf6e146106155761030c565b8063095ea7b3146104925780630c57133f146104be578063173825d9146104e45761030c565b80630284685814610311578063031d4053146103395780630357371d1461035f57806305557bd41461039f57806306fdde03146103c35780630754cede14610440575b600080fd5b6103376004803603602081101561032757600080fd5b50356001600160a01b0316610c61565b005b6103376004803603602081101561034f57600080fd5b50356001600160a01b0316610cb4565b61038b6004803603604081101561037557600080fd5b506001600160a01b038135169060200135610d04565b604080519115158252519081900360200190f35b6103a7610eef565b604080516001600160a01b039092168252519081900360200190f35b6103cb610eff565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104055781810151838201526020016103ed565b50505050905090810190601f1680156104325780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61047c6004803603608081101561045657600080fd5b506001600160a01b03813581169160208101358216916040820135169060600135610f95565b6040805160ff9092168252519081900360200190f35b61038b600480360360408110156104a857600080fd5b506001600160a01b03813516906020013561107e565b61038b600480360360208110156104d457600080fd5b50356001600160a01b031661109b565b610337600480360360208110156104fa57600080fd5b50356001600160a01b03166110ae565b610512611149565b60408051918252519081900360200190f35b61038b6004803603606081101561053a57600080fd5b506001600160a01b0381358116916020810135909116906040013561114f565b61038b6004803603606081101561057057600080fd5b6001600160a01b03823516916020810135151591810190606081016040820135600160201b8111156105a157600080fd5b8201836020820111156105b357600080fd5b803590602001918460018302840111600160201b831117156105d457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506113e9945050505050565b61038b6004803603602081101561062b57600080fd5b50356001600160a01b0316611552565b6103376004803603602081101561065157600080fd5b50356001600160a01b0316611565565b61047c6115b5565b61038b6004803603604081101561067f57600080fd5b506001600160a01b0381351690602001356115be565b610337611617565b61038b600480360360408110156106b357600080fd5b506001600160a01b038135169060200135611668565b61038b600480360360208110156106df57600080fd5b50356001600160a01b03166116bc565b61038b6004803603602081101561070557600080fd5b50356001600160a01b03166116cf565b61038b6116e2565b6103cb6004803603602081101561073357600080fd5b50356001600160a01b03166116eb565b6103376004803603602081101561075957600080fd5b50356001600160a01b03166117b5565b6103376004803603602081101561077f57600080fd5b50356001600160a01b0316611805565b610512600480360360208110156107a557600080fd5b50356001600160a01b0316611855565b61038b600480360360208110156107cb57600080fd5b50356001600160a01b0316611870565b6103cb600480360360208110156107f157600080fd5b503560ff16611883565b6103376004803603602081101561081157600080fd5b50356001600160a01b0316611960565b6103376004803603602081101561083757600080fd5b50356001600160a01b03166119b0565b6103376004803603602081101561085d57600080fd5b50356001600160a01b0316611a00565b610337611a50565b6103cb611a9f565b6103376004803603602081101561089357600080fd5b50356001600160a01b0316611aff565b610337600480360360208110156108b957600080fd5b50356001600160a01b0316611b4f565b61038b600480360360408110156108df57600080fd5b506001600160a01b0381358116916020013516611b9f565b61091d6004803603602081101561090d57600080fd5b50356001600160a01b0316611be3565b6040805192835260208301919091528051918290030190f35b61095c6004803603602081101561094c57600080fd5b50356001600160a01b0316611c2a565b604051808315151515815260200180602001828103825283818151815260200191508051906020019080838360005b838110156109a357818101518382015260200161098b565b50505050905090810190601f1680156109d05780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b61038b600480360360408110156109f557600080fd5b506001600160a01b038135169060200135611cd8565b61038b60048036036040811015610a2157600080fd5b506001600160a01b038135169060200135611d2c565b61038b60048036036040811015610a4d57600080fd5b506001600160a01b038135169060200135611d9a565b61038b60048036036020811015610a7957600080fd5b50356001600160a01b0316611fea565b61033760048036036020811015610a9f57600080fd5b50356001600160a01b0316611ffd565b61038b60048036036060811015610ac557600080fd5b506001600160a01b03813516906020810135906040013561204d565b61047c60048036036060811015610af757600080fd5b506001600160a01b038135811691602081013590911690604001356120d5565b61038b60048036036020811015610b2d57600080fd5b50356001600160a01b03166121b5565b61038b60048036036020811015610b5357600080fd5b50356001600160a01b03166121d3565b61051260048036036040811015610b7957600080fd5b506001600160a01b0381358116916020013516612281565b61038b60048036036060811015610ba757600080fd5b506001600160a01b0381351690602081013590604001356122ac565b61038b60048036036040811015610bd957600080fd5b506001600160a01b038135169060200135612421565b61033760048036036020811015610c0557600080fd5b50356001600160a01b03166124be565b61033760048036036020811015610c2b57600080fd5b50356001600160a01b031661250e565b61038b60048036036020811015610c5157600080fd5b50356001600160a01b031661255e565b610c6a33611552565b610ca857604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612571565b50565b610cbd33611552565b610cfb57604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb1816125bb565b6000610d0f3361109b565b610d4d57604051600160e51b62461bcd0281526004018080602001828103825260388152602001806133666038913960400191505060405180910390fd5b6001600160a01b038316610d9557604051600160e51b62461bcd0281526004018080602001828103825260218152602001806135af6021913960400191505060405180910390fd5b6001600160a01b0383166000908152600b602052604090205480610e0157604080516001600160a01b03861681526000602082015281517f784c9f4cec58b38461217a62f8f9c0f2cac7b46c0ed23bd1a7f4a5376ac787e1929181900390910190a16001915050610ee9565b6001600160a01b0384166000908152600b602052604081206001810180549183905591909155838210610e9e576000610e40838663ffffffff61260516565b9050610e4d8682846122ac565b50604080516001600160a01b03881681526020810187905281517f784c9f4cec58b38461217a62f8f9c0f2cac7b46c0ed23bd1a7f4a5376ac787e1929181900390910190a160019350505050610ee9565b604080516001600160a01b03871681526020810184905281517f784c9f4cec58b38461217a62f8f9c0f2cac7b46c0ed23bd1a7f4a5376ac787e1929181900390910190a16001925050505b92915050565b6010546001600160a01b03165b90565b60008054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610f8b5780601f10610f6057610100808354040283529160200191610f8b565b820191906000526020600020905b815481529060010190602001808311610f6e57829003601f168201915b5050505050905090565b6010546000906001600160a01b0316610fe257604051600160e51b62461bcd0281526004018080602001828103825260298152602001806135f56029913960400191505060405180910390fd5b60105460408051600160e11b6303aa676f0281526001600160a01b038881166004830152878116602483015286811660448301526064820186905291519190921691630754cede916084808301926020929190829003018186803b15801561104957600080fd5b505afa15801561105d573d6000803e3d6000fd5b505050506040513d602081101561107357600080fd5b505195945050505050565b600061109261108b612647565b848461264b565b50600192915050565b6000610ee9600a8363ffffffff61273d16565b6110b733611552565b6110f557604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b336001600160a01b038216141561114057604051600160e51b62461bcd0281526004018080602001828103825260288152602001806134bd6028913960400191505060405180910390fd5b610cb1816127a7565b60055490565b60105460408051600160e11b6303aa676f02815233600482018190526001600160a01b03808816602484015280871660448401526064830186905292516000949193889388938893889390911691630754cede916084808301926020929190829003018186803b1580156111c257600080fd5b505afa1580156111d6573d6000803e3d6000fd5b505050506040513d60208110156111ec57600080fd5b505160105460408051600160e01b635ec6475902815290519293506001600160a01b0390911691635ec6475991600480820192602092909190829003018186803b15801561123957600080fd5b505afa15801561124d573d6000803e3d6000fd5b505050506040513d602081101561126357600080fd5b505160105460408051600160e01b637f4ab1dd02815260ff851660048201819052915191909314926001600160a01b0390921691637f4ab1dd916024808301926000929190829003018186803b1580156112bc57600080fd5b505afa1580156112d0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156112f957600080fd5b810190808051600160201b81111561131057600080fd5b8201602081018481111561132357600080fd5b8151600160201b81118282018710171561133c57600080fd5b5050929190505050906113d057604051600160e51b62461bcd0281526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561139557818101518382015260200161137d565b50505050905090810190601f1680156113c25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506113dc8989896127f1565b9998505050505050505050565b60006113f433611870565b61143257604051600160e51b62461bcd02815260040180806020018281038252603a815260200180613551603a913960400191505060405180910390fd5b604080518082018252841515815260208082018581526001600160a01b038816600090815260098352939093208251815460ff19169015151781559251805192939261148492600185019201906131ea565b509050507f461193ae6c23672174f7a3ea35649aacdc857bfcae58cd12d61ea432c05bcbd584848460405180846001600160a01b03166001600160a01b031681526020018315151515815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561150b5781810151838201526020016114f3565b50505050905090810190601f1680156115385780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a15060015b9392505050565b6000610ee960068363ffffffff61273d16565b61156e33611552565b6115ac57604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612879565b60025460ff1690565b60006110926115cb612647565b8461161285600460006115dc612647565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff6128c316565b61264b565b611620336116cf565b61165e57604051600160e51b62461bcd0281526004018080602001828103825260308152602001806132e26030913960400191505060405180910390fd5b611666612920565b565b600061167333611fea565b6116b157604051600160e51b62461bcd0281526004018080602001828103825260308152602001806133f46030913960400191505060405180910390fd5b61154b338484612955565b6000610ee9600f8363ffffffff61273d16565b6000610ee9600c8363ffffffff61273d16565b600d5460ff1690565b606060096000836001600160a01b03166001600160a01b031681526020019081526020016000206001018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156117a95780601f1061177e576101008083540402835291602001916117a9565b820191906000526020600020905b81548152906001019060200180831161178c57829003601f168201915b50505050509050919050565b6117be33611552565b6117fc57604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb1816129b6565b61180e33611552565b61184c57604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612a00565b6001600160a01b031660009081526003602052604090205490565b6000610ee960088363ffffffff61273d16565b60105460408051600160e01b637f4ab1dd02815260ff8416600482015290516060926001600160a01b031691637f4ab1dd916024808301926000929190829003018186803b1580156118d457600080fd5b505afa1580156118e8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561191157600080fd5b810190808051600160201b81111561192857600080fd5b8201602081018481111561193b57600080fd5b8151600160201b81118282018710171561195457600080fd5b50909695505050505050565b61196933611552565b6119a757604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612a4a565b6119b933611552565b6119f757604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612a94565b611a0933611552565b611a4757604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612ade565b611a59336116cf565b611a9757604051600160e51b62461bcd0281526004018080602001828103825260308152602001806132e26030913960400191505060405180910390fd5b611666612b28565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815260609390929091830182828015610f8b5780601f10610f6057610100808354040283529160200191610f8b565b611b0833611552565b611b4657604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612b60565b611b5833611552565b611b9657604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612baa565b6001600160a01b03821660009081526009602052604081205460ff16801561154b5750506001600160a01b031660009081526009602052604090205460ff16919050565b600080611bee613268565b5050506001600160a01b03166000908152600b602090815260409182902082518084019093528054808452600190910154929091018290529091565b6009602090815260009182526040918290208054600180830180548651600261010094831615949094026000190190911692909204601f810186900486028301860190965285825260ff909216949293909290830182828015611cce5780601f10611ca357610100808354040283529160200191611cce565b820191906000526020600020905b815481529060010190602001808311611cb157829003601f168201915b5050505050905082565b6000611ce3336116bc565b611d2157604051600160e51b62461bcd0281526004018080602001828103825260308152602001806133c46030913960400191505060405180910390fd5b61154b338484612bf4565b6000611092611d39612647565b84611612856040518060600160405280602581526020016135d06025913960046000611d63612647565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff612c5516565b60105460408051600160e01b63d4ce141502815233600482018190526001600160a01b038087166024840152604483018690529251600094919387938793879392169163d4ce141591606480820192602092909190829003018186803b158015611e0357600080fd5b505afa158015611e17573d6000803e3d6000fd5b505050506040513d6020811015611e2d57600080fd5b505160105460408051600160e01b635ec6475902815290519293506001600160a01b0390911691635ec6475991600480820192602092909190829003018186803b158015611e7a57600080fd5b505afa158015611e8e573d6000803e3d6000fd5b505050506040513d6020811015611ea457600080fd5b505160105460408051600160e01b637f4ab1dd02815260ff851660048201819052915191909314926001600160a01b0390921691637f4ab1dd916024808301926000929190829003018186803b158015611efd57600080fd5b505afa158015611f11573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611f3a57600080fd5b810190808051600160201b811115611f5157600080fd5b82016020810184811115611f6457600080fd5b8151600160201b811182820187101715611f7d57600080fd5b505092919050505090611fd457604051600160e51b62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561139557818101518382015260200161137d565b50611fdf8787612cb2565b979650505050505050565b6000610ee9600e8363ffffffff61273d16565b61200633611552565b61204457604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612cc6565b60008282101561205f5750600161154b565b6001600160a01b0384166000908152600b602052604081205461208990849063ffffffff61260516565b6001600160a01b0386166000908152600b60205260409020600101549091508185111590421180806120b85750815b156120c9576001935050505061154b565b6000935050505061154b565b6010546000906001600160a01b031661212257604051600160e51b62461bcd0281526004018080602001828103825260298152602001806135f56029913960400191505060405180910390fd5b60105460408051600160e01b63d4ce14150281526001600160a01b0387811660048301528681166024830152604482018690529151919092169163d4ce1415916064808301926020929190829003018186803b15801561218157600080fd5b505afa158015612195573d6000803e3d6000fd5b505050506040513d60208110156121ab57600080fd5b5051949350505050565b6001600160a01b031660009081526009602052604090205460ff1690565b60006121de33611552565b61221c57604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b601080546001600160a01b0319166001600160a01b0384811691909117918290556040805192909116825233602083015280517f6c0cb4cdcdbedb9d71fdb2e31e3ad5a42fc2cffc2642730034017c04192e3afe9281900390910190a1506001919050565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b60006122b73361109b565b6122f557604051600160e51b62461bcd0281526004018080602001828103825260388152602001806133666038913960400191505060405180910390fd5b42821161233657604051600160e51b62461bcd0281526004018080602001828103825260268152602001806135066026913960400191505060405180910390fd5b6001600160a01b0384166123945760408051600160e51b62461bcd02815260206004820181905260248201527f41646472657373206d7573742062652076616c696420666f72206c6f636b7570604482015290519081900360640190fd5b61239c613268565b5060408051808201825284815260208082018581526001600160a01b0388166000818152600b84528590208451815591516001909201919091558351908152908101869052808301859052915190917fd204e81d84b52b5a19d16a46f86c9a7d66d37c207b982c21d8d1810757b61bae919081900360600190a1506001949350505050565b600061242c3361255e565b61246a57604051600160e51b62461bcd0281526004018080602001828103825260328152602001806133346032913960400191505060405180910390fd5b612475833384612d10565b6040805183815290516001600160a01b0385169133917fb698e31a2abee5824d0d7bcfd2339aead7f9e9ae413fba50bf554ff3fa470b7b9181900360200190a350600192915050565b6124c733611552565b61250557604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612e74565b61251733611552565b61255557604051600160e51b62461bcd02815260040180806020018281038252602e815260200180613424602e913960400191505060405180910390fd5b610cb181612ebe565b6000610ee960078363ffffffff61273d16565b612582600f8263ffffffff612f0816565b60405133906001600160a01b038316907f85222465e0d438163a28671b59fc9ebeb03bf39f880ddd36c8315da7512b31c090600090a350565b6125cc600a8263ffffffff612f7216565b60405133906001600160a01b038316907f28f069fa8730ef5d44b24faedbcabf2b254c53f4e02a953476a4015e3067714190600090a350565b600061154b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612c55565b3390565b6001600160a01b03831661269357604051600160e51b62461bcd02815260040180806020018281038252602481526020018061358b6024913960400191505060405180910390fd5b6001600160a01b0382166126db57604051600160e51b62461bcd0281526004018080602001828103825260228152602001806133126022913960400191505060405180910390fd5b6001600160a01b03808416600081815260046020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60006001600160a01b03821661278757604051600160e51b62461bcd02815260040180806020018281038252602281526020018061349b6022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b6127b860068263ffffffff612f0816565b60405133906001600160a01b038316907fe594d081b4382713733fe631966432c9cea5199afb2db5c3c1931f9f9300367990600090a350565b60006127fe848484612d10565b61286f8461280a612647565b61161285604051806060016040528060288152602001613473602891396001600160a01b038a16600090815260046020526040812090612848612647565b6001600160a01b03168152602081019190915260400160002054919063ffffffff612c5516565b5060019392505050565b61288a600e8263ffffffff612f0816565b60405133906001600160a01b038316907f4b5ef9a786cf64a7d82ebcf2d5132667edc9faef4ac36260d9a9e52c526b623290600090a350565b60008282018381101561154b5760408051600160e51b62461bcd02815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600d805460ff191690556040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693390600090a1565b60006129618383612ff6565b826001600160a01b0316846001600160a01b03167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8846040518082815260200191505060405180910390a35060019392505050565b6129c7600c8263ffffffff612f0816565b60405133906001600160a01b038316907fb75903ade4a0fdb07d60c882c22c779e2e1c751883c37aecdcc92a8ec72b046e90600090a350565b612a1160068263ffffffff612f7216565b60405133906001600160a01b038316907fc82bdbbf677a2462f2a7e22e4ba9abd209496b69cd7b868b3b1d28f76e09a40a90600090a350565b612a5b60088263ffffffff612f0816565b60405133906001600160a01b038316907f3ed21605dd544629fb45f2ccaedcc095ba1dbea540fb6eaf5493a7479856b0be90600090a350565b612aa5600c8263ffffffff612f7216565b60405133906001600160a01b038316907fe0953c403a52f9dc1fef4202a8d33975c958b727bee0d7b5b328965ddad98d8190600090a350565b612aef600a8263ffffffff612f0816565b60405133906001600160a01b038316907f1bac2ef39c5011bb7c20ecf6bc7cb986695b3f432a149d898c0ed368e55c780690600090a350565b600d805460ff191660011790556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e75290600090a1565b612b7160078263ffffffff612f7216565b60405133906001600160a01b038316907f2b5f18afd9a7b21f41bf023b012b3d4c8a22a21b79fa425cd4494ecbe297019690600090a350565b612bbb600e8263ffffffff612f7216565b60405133906001600160a01b038316907f3c091dafb1d99e4a4c333024492eac3b2cd8bf921a3dd547c937db33be307bb890600090a350565b6000612c0083836130eb565b826001600160a01b0316846001600160a01b03167fbac40739b0d4ca32fa2d82fc91630465ba3eddd1598da6fca393b26fb63b9453846040518082815260200191505060405180910390a35060019392505050565b60008184841115612caa57604051600160e51b62461bcd02815260206004820181815283516024840152835190928392604490910191908501908083836000831561139557818101518382015260200161137d565b505050900390565b6000611092612cbf612647565b8484612d10565b612cd760078263ffffffff612f0816565b60405133906001600160a01b038316907fb6fe3ab11eb9ab1d9f1d41c8f42a5d72d10122099ba1548e4a6d1a4d8cefec4b90600090a350565b6001600160a01b038316612d5857604051600160e51b62461bcd02815260040180806020018281038252602581526020018061352c6025913960400191505060405180910390fd5b6001600160a01b038216612da057604051600160e51b62461bcd02815260040180806020018281038252602381526020018061329d6023913960400191505060405180910390fd5b612de38160405180606001604052806026815260200161339e602691396001600160a01b038616600090815260036020526040902054919063ffffffff612c5516565b6001600160a01b038085166000908152600360205260408082209390935590841681522054612e18908263ffffffff6128c316565b6001600160a01b0380841660008181526003602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b612e8560088263ffffffff612f7216565b60405133906001600160a01b038316907f5f36f4f5999f34947706fca376b955319b858573bf9d6bc59303c9a4cd80ced090600090a350565b612ecf600f8263ffffffff612f7216565b60405133906001600160a01b038316907f86515ebaad527298e98929c064c075f5a2604cc80afc0db29e73c01a36f8e98c90600090a350565b612f12828261273d565b612f5057604051600160e51b62461bcd0281526004018080602001828103825260218152602001806134526021913960400191505060405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b612f7c828261273d565b15612fd15760408051600160e51b62461bcd02815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b6001600160a01b0382166130545760408051600160e51b62461bcd02815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b600554613067908263ffffffff6128c316565b6005556001600160a01b038216600090815260036020526040902054613093908263ffffffff6128c316565b6001600160a01b03831660008181526003602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b03821661313357604051600160e51b62461bcd0281526004018080602001828103825260218152602001806134e56021913960400191505060405180910390fd5b613176816040518060600160405280602281526020016132c0602291396001600160a01b038516600090815260036020526040902054919063ffffffff612c5516565b6001600160a01b0383166000908152600360205260409020556005546131a2908263ffffffff61260516565b6005556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061322b57805160ff1916838001178555613258565b82800160010185558215613258579182015b8281111561325857825182559160200191906001019061323d565b50613264929150613282565b5090565b604051806040016040528060008152602001600081525090565b610efc91905b80821115613264576000815560010161328856fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e6365506175736572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652050617573657220726f6c6545524332303a20617070726f766520746f20746865207a65726f20616464726573735265766f6b6572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865205265766f6b657220726f6c6554696d656c6f636b6572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652054696d656c6f636b657220726f6c6545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654275726e6572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204275726e657220726f6c654d696e746572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204d696e74657220726f6c654f776e6572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204f776e657220726f6c65526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c6545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365526f6c65733a206163636f756e7420697320746865207a65726f20616464726573734f776e6572732063616e6e6f742072656d6f7665207468656d73656c766573206173206f776e657245524332303a206275726e2066726f6d20746865207a65726f206164647265737352656c656173652074696d65206e6565647320746f20626520696e207468652066757475726545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737357686974656c6973746572526f6c653a2063616c6c657220646f6573206e6f742068617665207468652057686974656c697374657220726f6c6545524332303a20617070726f76652066726f6d20746865207a65726f206164647265737341646472657373206d7573742062652076616c696420666f722072656c6561736545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f5472616e736665725265737472696374696f6e7320636f6e7472616374206d75737420626520736574a165627a7a723058207d3afabbceccff0bda34b20c92cb0f58a5a8aa735387152c8f3e7670e0e4c4960029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000e4dc667f92b9d110a307b265bf8afacdd0fd3c8c
-----Decoded View---------------
Arg [0] : owner (address): 0xE4dc667f92b9d110A307b265bf8AFacdD0FD3C8c
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000e4dc667f92b9d110a307b265bf8afacdd0fd3c8c
Deployed Bytecode Sourcemap
41269:5268:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41269:5268:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40550:97;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40550:97:0;-1:-1:-1;;;;;40550:97:0;;:::i;:::-;;29070:99;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29070:99:0;-1:-1:-1;;;;;29070:99:0;;:::i;31068:1142::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;31068:1142:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;42936:120;;;:::i;:::-;;;;-1:-1:-1;;;;;42936:120:0;;;;;;;;;;;;;;37116:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;37116:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43902:513;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;43902:513:0;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17911:152;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;17911:152:0;;;;;;;;:::i;28945:117::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28945:117:0;-1:-1:-1;;;;;28945:117:0;;:::i;5302:180::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5302:180:0;-1:-1:-1;;;;;5302:180:0;;:::i;16932:91::-;;;:::i;:::-;;;;;;;;;;;;;;;;46289:245;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;46289:245:0;;;;;;;;;;;;;;;;;:::i;27314:237::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;27314:237:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;27314:237:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;27314:237:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;27314:237:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;27314:237:0;;-1:-1:-1;27314:237:0;;-1:-1:-1;;;;;27314:237:0:i;5090:107::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5090:107:0;-1:-1:-1;;;;;5090:107:0;;:::i;38977:97::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38977:97:0;-1:-1:-1;;;;;38977:97:0;;:::i;37968:83::-;;;:::i;19248:210::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;19248:210:0;;;;;;;;:::i;36331:66::-;;;:::i;39479:145::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;39479:145:0;;;;;;;;:::i;40042:109::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40042:109:0;-1:-1:-1;;;;;40042:109:0;;:::i;34691:::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34691:109:0;-1:-1:-1;;;;;34691:109:0;;:::i;35661:80::-;;;:::i;27933:128::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27933:128:0;-1:-1:-1;;;;;27933:128:0;;:::i;34907:97::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34907:97:0;-1:-1:-1;;;;;34907:97:0;;:::i;5205:89::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5205:89:0;-1:-1:-1;;;;;5205:89:0;;:::i;17086:110::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17086:110:0;-1:-1:-1;;;;;17086:110:0;;:::i;25796:119::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25796:119:0;-1:-1:-1;;;;;25796:119:0;;:::i;44650:318::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44650:318:0;;;;:::i;26032:107::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26032:107:0;-1:-1:-1;;;;;26032:107:0;;:::i;34808:91::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34808:91:0;-1:-1:-1;;;;;34808:91:0;;:::i;29177:105::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29177:105:0;-1:-1:-1;;;;;29177:105:0;;:::i;36173:62::-;;;:::i;37318:87::-;;;:::i;24241:93::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24241:93:0;-1:-1:-1;;;;;24241:93:0;;:::i;38878:91::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38878:91:0;-1:-1:-1;;;;;38878:91:0;;:::i;28287:152::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;28287:152:0;;;;;;;;;;:::i;33978:251::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33978:251:0;-1:-1:-1;;;;;33978:251:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;27019:51;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27019:51:0;-1:-1:-1;;;;;27019:51:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;27019:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41065:136;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;41065:136:0;;;;;;;;:::i;19961:261::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;19961:261:0;;;;;;;;:::i;45980:199::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;45980:199:0;;;;;;;;:::i;38469:109::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38469:109:0;-1:-1:-1;;;;;38469:109:0;;:::i;24342:99::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24342:99:0;-1:-1:-1;;;;;24342:99:0;;:::i;32500:1259::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;32500:1259:0;;;;;;;;;;;;;:::i;43240:476::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;43240:476:0;;;;;;;;;;;;;;;;;:::i;27667:123::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27667:123:0;-1:-1:-1;;;;;27667:123:0;;:::i;42539:315::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42539:315:0;-1:-1:-1;;;;;42539:315:0;;:::i;17630:134::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;17630:134:0;;;;;;;;;;:::i;30416:482::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;30416:482:0;;;;;;;;;;;;;:::i;25044:235::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;25044:235:0;;;;;;;;:::i;25923:101::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25923:101:0;-1:-1:-1;;;;;25923:101:0;;:::i;40451:91::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40451:91:0;-1:-1:-1;;;;;40451:91:0;;:::i;24122:111::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24122:111:0;-1:-1:-1;;;;;24122:111:0;;:::i;40550:97::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;-1:-1:-1;;;;;4984:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40617:22;40631:7;40617:13;:22::i;:::-;40550:97;:::o;29070:99::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;-1:-1:-1;;;;;4984:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29138:23;29153:7;29138:14;:23::i;31068:1142::-;31159:4;28832:24;28845:10;28832:12;:24::i;:::-;28824:93;;;;-1:-1:-1;;;;;28824:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31184:22:0;;31176:68;;;;-1:-1:-1;;;;;31176:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31281:17:0;;31257:21;31281:17;;;:7;:17;;;;;:24;31352:18;31349:107;;31391:27;;;-1:-1:-1;;;;;31391:27:0;;;;31416:1;31391:27;;;;;;;;;;;;;;;;;31440:4;31433:11;;;;;31349:107;-1:-1:-1;;;;;31539:17:0;;31516:20;31539:17;;;:7;:17;;;;;:29;;;;;31615:24;;;;;;;;31655:32;;;31652:551;;31702:23;31728:34;:13;31746:15;31728:34;:17;:34;:::i;:::-;31702:60;;31824:45;31829:8;31839:15;31856:12;31824:4;:45::i;:::-;-1:-1:-1;31888:41:0;;;-1:-1:-1;;;;;31888:41:0;;;;;;;;;;;;;;;;;;;;;;;31950:4;31943:11;;;;;;;31652:551;32126:39;;;-1:-1:-1;;;;;32126:39:0;;;;;;;;;;;;;;;;;;;;;;;32187:4;32180:11;;;;28928:1;31068:1142;;;;:::o;42936:120::-;43027:20;;-1:-1:-1;;;;;43027:20:0;42936:120;;:::o;37116:83::-;37186:5;37179:12;;;;;;;;-1:-1:-1;;37179:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37153:13;;37179:12;;37186:5;;37179:12;;37186:5;37179:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37116:83;:::o;43902:513::-;44137:20;;44048:5;;-1:-1:-1;;;;;44137:20:0;44121:97;;;;-1:-1:-1;;;;;44121:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44331:20;;:76;;;-1:-1:-1;;;;;44331:76:0;;-1:-1:-1;;;;;44331:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:20;;;;;:50;;:76;;;;;;;;;;;;;;:20;:76;;;5:2:-1;;;;30:1;27;20:12;5:2;44331:76:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44331:76:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44331:76:0;;43902:513;-1:-1:-1;;;;;43902:513:0:o;17911:152::-;17977:4;17994:39;18003:12;:10;:12::i;:::-;18017:7;18026:6;17994:8;:39::i;:::-;-1:-1:-1;18051:4:0;17911:152;;;;:::o;28945:117::-;29005:4;29029:25;:12;29046:7;29029:25;:16;:25;:::i;5302:180::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;-1:-1:-1;;;;;4984:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5376:10;-1:-1:-1;;;;;5376:21:0;;;;5368:74;;;;-1:-1:-1;;;;;5368:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5453:21;5466:7;5453:12;:21::i;16932:91::-;17003:12;;16932:91;:::o;46289:245::-;45610:20;;:75;;;-1:-1:-1;;;;;45610:75:0;;46404:10;45610:75;;;;;;-1:-1:-1;;;;;45610:75:0;;;;;;;;;;;;;;;;;;;;;;46451:12;;46404:10;;46416:4;;46422:2;;46426:5;;46451:12;;45610:20;;;;:50;;:75;;;;;;;;;;;;;;:20;:75;;;5:2:-1;;;;30:1;27;20:12;5:2;45610:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45610:75:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45610:75:0;45735:20;;:37;;;-1:-1:-1;;;;;45735:37:0;;;;45610:75;;-1:-1:-1;;;;;;45735:20:0;;;;:35;;:37;;;;;45610:75;;45735:37;;;;;;;;:20;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;45735:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45735:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45735:37:0;45774:20;;:79;;;-1:-1:-1;;;;;45774:79:0;;45704:68;;;45774:79;;;;;;;;45704:68;;;;;-1:-1:-1;;;;;45774:20:0;;;;:50;;:79;;;;;:20;;:79;;;;;;;:20;:79;;;5:2:-1;;;;30:1;27;20:12;5:2;45774:79:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45774:79:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;45774:79:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;45774:79:0;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;-1:-1;;;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;0:372;;45774:79:0;;;;;;45696:158;;;;;-1:-1:-1;;;;;45696:158:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;45696:158:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46491:35;46510:4;46516:2;46520:5;46491:18;:35::i;:::-;46481:45;46289:245;-1:-1:-1;;;;;;;;;46289:245:0:o;27314:237::-;27413:4;25680:25;25694:10;25680:13;:25::i;:::-;25672:96;;;;-1:-1:-1;;;;;25672:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27445:27;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27429:13:0;;-1:-1:-1;27429:13:0;;;:9;:13;;;;;;:43;;;;-1:-1:-1;;27429:43:0;;;;;;;;;;;27445:27;;27429:13;:43;;-1:-1:-1;27429:43:0;;;;;;:::i;:::-;;;;;27488:33;27504:2;27508:6;27516:4;27488:33;;;;-1:-1:-1;;;;;27488:33:0;-1:-1:-1;;;;;27488:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;27488:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27539:4:0;25779:1;27314:237;;;;;:::o;5090:107::-;5145:4;5169:20;:7;5181;5169:20;:11;:20;:::i;38977:97::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;-1:-1:-1;;;;;4984:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39044:22;39058:7;39044:13;:22::i;37968:83::-;38034:9;;;;37968:83;:::o;19248:210::-;19328:4;19345:83;19354:12;:10;:12::i;:::-;19368:7;19377:50;19416:10;19377:11;:25;19389:12;:10;:12::i;:::-;-1:-1:-1;;;;;19377:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;19377:25:0;;;:34;;;;;;;;;;;:50;:38;:50;:::i;:::-;19345:8;:83::i;36331:66::-;34590:20;34599:10;34590:8;:20::i;:::-;34582:81;;;;-1:-1:-1;;;;;34582:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36379:10;:8;:10::i;:::-;36331:66::o;39479:145::-;39553:4;38368:20;38377:10;38368:8;:20::i;:::-;38360:81;;;;-1:-1:-1;;;;;38360:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39575:43;39590:10;39602:7;39611:6;39575:14;:43::i;40042:109::-;40098:4;40122:21;:8;40135:7;40122:21;:12;:21;:::i;34691:109::-;34747:4;34771:21;:8;34784:7;34771:21;:12;:21;:::i;35661:80::-;35726:7;;;;35661:80;:::o;27933:128::-;27997:13;28029:9;:19;28039:8;-1:-1:-1;;;;;28029:19:0;-1:-1:-1;;;;;28029:19:0;;;;;;;;;;;;:24;;28022:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27933:128;;;:::o;34907:97::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;-1:-1:-1;;;;;4984:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34974:22;34988:7;34974:13;:22::i;5205:89::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;-1:-1:-1;;;;;4984:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5268:18;5278:7;5268:9;:18::i;17086:110::-;-1:-1:-1;;;;;17170:18:0;17143:7;17170:18;;;:9;:18;;;;;;;17086:110::o;25796:119::-;25857:4;25881:26;:13;25899:7;25881:26;:17;:26;:::i;44650:318::-;44893:20;;:67;;;-1:-1:-1;;;;;44893:67:0;;;;;;;;;;;44763:13;;-1:-1:-1;;;;;44893:20:0;;:50;;:67;;;;;:20;;:67;;;;;;;:20;:67;;;5:2:-1;;;;30:1;27;20:12;5:2;44893:67:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44893:67:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;44893:67:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;44893:67:0;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;-1:-1;;;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;-1:-1;44893:67:0;;44650:318;-1:-1:-1;;;;;;44650:318:0:o;26032:107::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;-1:-1:-1;;;;;4984:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26104:27;26123:7;26104:18;:27::i;34808:91::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;-1:-1:-1;;;;;4984:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34872:19;34883:7;34872:10;:19::i;29177:105::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;-1:-1:-1;;;;;4984:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29248:26;29266:7;29248:17;:26::i;36173:62::-;34590:20;34599:10;34590:8;:20::i;:::-;34582:81;;;;-1:-1:-1;;;;;34582:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36219:8;:6;:8::i;37318:87::-;37390:7;37383:14;;;;;;;;-1:-1:-1;;37383:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37357:13;;37383:14;;37390:7;;37383:14;;37390:7;37383:14;;;;;;;;;;;;;;;;;;;;;;;;24241:93;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;-1:-1:-1;;;;;4984:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24306:20;24318:7;24306:11;:20::i;38878:91::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;-1:-1:-1;;;;;4984:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38942:19;38953:7;38942:10;:19::i;28287:152::-;-1:-1:-1;;;;;28385:15:0;;28361:4;28385:15;;;:9;:15;;;;;:22;;;:46;;;;-1:-1:-1;;;;;;;28411:13:0;;;;;:9;:13;;;;;:20;;;;28287:152;-1:-1:-1;28287:152:0:o;33978:251::-;34037:7;34046;34107:29;;:::i;:::-;-1:-1:-1;;;;;;;;34139:17:0;;;;;:7;:17;;;;;;;;;34107:49;;;;;;;;;;;;;;;;;;;;;;;;;;;33978:251::o;27019:51::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27019:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;41065:136::-;41139:4;39941:20;39950:10;39941:8;:20::i;:::-;39933:81;;;;-1:-1:-1;;;;;39933:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41161:34;41167:10;41179:7;41188:6;41161:5;:34::i;19961:261::-;20046:4;20063:129;20072:12;:10;:12::i;:::-;20086:7;20095:96;20134:15;20095:96;;;;;;;;;;;;;;;;;:11;:25;20107:12;:10;:12::i;:::-;-1:-1:-1;;;;;20095:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;20095:25:0;;;:34;;;;;;;;;;;:96;;:38;:96;:::i;45980:199::-;45153:20;;:63;;;-1:-1:-1;;;;;45153:63:0;;46065:10;45153:63;;;;;;-1:-1:-1;;;;;45153:63:0;;;;;;;;;;;;;;;46106:12;;46065:10;;46077:2;;46081:5;;46106:12;;45153:20;;;:46;;:63;;;;;;;;;;;;;;;:20;:63;;;5:2:-1;;;;30:1;27;20:12;5:2;45153:63:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45153:63:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45153:63:0;45254:20;;:37;;;-1:-1:-1;;;;;45254:37:0;;;;45153:63;;-1:-1:-1;;;;;;45254:20:0;;;;:35;;:37;;;;;45153:63;;45254:37;;;;;;;;:20;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;45254:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45254:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45254:37:0;45293:20;;:67;;;-1:-1:-1;;;;;45293:67:0;;45235:56;;;45293:67;;;;;;;;45235:56;;;;;-1:-1:-1;;;;;45293:20:0;;;;:50;;:67;;;;;:20;;:67;;;;;;;:20;:67;;;5:2:-1;;;;30:1;27;20:12;5:2;45293:67:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45293:67:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;45293:67:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;45293:67:0;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;-1:-1;;;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;0:372;;45293:67:0;;;;;;45227:134;;;;;-1:-1:-1;;;;;45227:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;45227:134:0;;46146:25;46161:2;46165:5;46146:14;:25::i;:::-;46136:35;45980:199;-1:-1:-1;;;;;;;45980:199:0:o;38469:109::-;38525:4;38549:21;:8;38562:7;38549:21;:12;:21;:::i;24342:99::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;-1:-1:-1;;;;;4984:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24410:23;24425:7;24410:14;:23::i;32500:1259::-;32597:4;32900:6;32890:7;:16;32886:60;;;-1:-1:-1;32930:4:0;32923:11;;32886:60;-1:-1:-1;;;;;33067:17:0;;33029:23;33067:17;;;:7;:17;;;;;:24;33055:37;;:7;;:37;:11;:37;:::i;:::-;-1:-1:-1;;;;;33381:17:0;;33199:14;33381:17;;;:7;:17;;;;;:29;;;33029:63;;-1:-1:-1;33216:25:0;;;;;33363:15;:47;;;33529:28;;;33548:9;33529:28;33526:226;;;33580:4;33573:11;;;;;;;33526:226;33735:5;33728:12;;;;;;;43240:476;43455:20;;43366:5;;-1:-1:-1;;;;;43455:20:0;43439:97;;;;-1:-1:-1;;;;;43439:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43644:20;;:64;;;-1:-1:-1;;;;;43644:64:0;;-1:-1:-1;;;;;43644:64:0;;;;;;;;;;;;;;;;;;;;;;:20;;;;;:46;;:64;;;;;;;;;;;;;;:20;:64;;;5:2:-1;;;;30:1;27;20:12;5:2;43644:64:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43644:64:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43644:64:0;;43240:476;-1:-1:-1;;;;43240:476:0:o;27667:123::-;-1:-1:-1;;;;;27756:19:0;27733:4;27756:19;;;:9;:19;;;;;:26;;;;27667:123::o;42539:315::-;42661:4;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;-1:-1:-1;;;;;4984:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42683:20;:63;;-1:-1:-1;;;;;;42683:63:0;-1:-1:-1;;;;;42683:63:0;;;;;;;;;;;42762:62;;;42790:20;;;;42762:62;;42813:10;42762:62;;;;;;;;;;;;;;;;-1:-1:-1;42842:4:0;42539:315;;;:::o;17630:134::-;-1:-1:-1;;;;;17729:18:0;;;17702:7;17729:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;17630:134::o;30416:482::-;30517:4;28832:24;28845:10;28832:12;:24::i;:::-;28824:93;;;;-1:-1:-1;;;;;28824:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30556:15;30542:11;:29;30534:80;;;;-1:-1:-1;;;;;30534:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30633:22:0;;30625:67;;;;;-1:-1:-1;;;;;30625:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30705:29;;:::i;:::-;-1:-1:-1;30737:31:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30779:17:0;;-1:-1:-1;30779:17:0;;;:7;:17;;;;;:31;;;;;;;;;;;;;;30826:42;;;;;;;;;;;;;;;;;;;30737:31;;30826:42;;;;;;;;;;-1:-1:-1;30886:4:0;;30416:482;-1:-1:-1;;;;30416:482:0:o;25044:235::-;25150:4;24018:21;24028:10;24018:9;:21::i;:::-;24010:84;;;;-1:-1:-1;;;;;24010:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25166:43;25182:5;25189:10;25201:7;25166:15;:43::i;:::-;25221:34;;;;;;;;-1:-1:-1;;;;;25221:34:0;;;25228:10;;25221:34;;;;;;;;;-1:-1:-1;25269:4:0;25044:235;;;;:::o;25923:101::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;-1:-1:-1;;;;;4984:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25992:24;26008:7;25992:15;:24::i;40451:91::-;4992:19;5000:10;4992:7;:19::i;:::-;4984:78;;;;-1:-1:-1;;;;;4984:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40515:19;40526:7;40515:10;:19::i;24122:111::-;24179:4;24203:22;:9;24217:7;24203:22;:13;:22;:::i;40301:142::-;40361:24;:8;40377:7;40361:24;:15;:24;:::i;:::-;40401:34;;40424:10;;-1:-1:-1;;;;;40401:34:0;;;;;;;;40301:142;:::o;29290:146::-;29351:25;:12;29368:7;29351:25;:16;:25;:::i;:::-;29392:36;;29417:10;;-1:-1:-1;;;;;29392:36:0;;;;;;;;29290:146;:::o;11220:136::-;11278:7;11305:43;11309:1;11312;11305:43;;;;;;;;;;;;;;;;;:3;:43::i;6633:98::-;6713:10;6633:98;:::o;22893:338::-;-1:-1:-1;;;;;22987:19:0;;22979:68;;;;-1:-1:-1;;;;;22979:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23066:21:0;;23058:68;;;;-1:-1:-1;;;;;23058:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23139:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;23191:32;;;;;;;;;;;;;;;;;22893:338;;;:::o;4416:203::-;4488:4;-1:-1:-1;;;;;4513:21:0;;4505:68;;;;-1:-1:-1;;;;;4505:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4591:20:0;:11;:20;;;;;;;;;;;;;;;4416:203::o;5629:139::-;5688:23;:7;5703;5688:23;:14;:23;:::i;:::-;5727:33;;5749:10;;-1:-1:-1;;;;;5727:33:0;;;;;;;;5629:139;:::o;18535:304::-;18624:4;18641:36;18651:6;18659:9;18670:6;18641:9;:36::i;:::-;18688:121;18697:6;18705:12;:10;:12::i;:::-;18719:89;18757:6;18719:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18719:19:0;;;;;;:11;:19;;;;;;18739:12;:10;:12::i;:::-;-1:-1:-1;;;;;18719:33:0;;;;;;;;;;;;-1:-1:-1;18719:33:0;;;:89;;:37;:89;:::i;18688:121::-;-1:-1:-1;18827:4:0;18535:304;;;;;:::o;38728:142::-;38788:24;:8;38804:7;38788:24;:15;:24;:::i;:::-;38828:34;;38851:10;;-1:-1:-1;;;;;38828:34:0;;;;;;;;38728:142;:::o;10764:181::-;10822:7;10854:5;;;10878:6;;;;10870:46;;;;;-1:-1:-1;;;;;10870:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;35989:89;36029:7;:15;;-1:-1:-1;;36029:15:0;;;36060:10;;;;36039:5;;36060:10;35989:89::o;39231:179::-;39308:4;39323:23;39335:2;39339:6;39323:11;:23::i;:::-;39373:2;-1:-1:-1;;;;;39360:24:0;39365:6;-1:-1:-1;;;;;39360:24:0;;39377:6;39360:24;;;;;;;;;;;;;;;;;;-1:-1:-1;39400:4:0;39231:179;;;;;:::o;35154:142::-;35214:24;:8;35230:7;35214:24;:15;:24;:::i;:::-;35254:34;;35277:10;;-1:-1:-1;;;;;35254:34:0;;;;;;;;35154:142;:::o;5490:131::-;5546:20;:7;5558;5546:20;:11;:20;:::i;:::-;5582:31;;5602:10;;-1:-1:-1;;;;;5582:31:0;;;;;;;;5490:131;:::o;26304:157::-;26369:29;:13;26390:7;26369:29;:20;:29;:::i;:::-;26414:39;;26442:10;;-1:-1:-1;;;;;26414:39:0;;;;;;;;26304:157;:::o;35012:134::-;35069:21;:8;35082:7;35069:21;:12;:21;:::i;:::-;35106:32;;35127:10;;-1:-1:-1;;;;;35106:32:0;;;;;;;;35012:134;:::o;29444:154::-;29508:28;:12;29528:7;29508:28;:19;:28;:::i;:::-;29552:38;;29579:10;;-1:-1:-1;;;;;29552:38:0;;;;;;;;29444:154;:::o;35821:84::-;35859:7;:14;;-1:-1:-1;;35859:14:0;35869:4;35859:14;;;35889:8;;;;35859:7;;35889:8;35821:84::o;24449:137::-;24507:22;:9;24521:7;24507:22;:13;:22;:::i;:::-;24545:33;;24567:10;;-1:-1:-1;;;;;24545:33:0;;;;;;;;24449:137;:::o;38586:134::-;38643:21;:8;38656:7;38643:21;:12;:21;:::i;:::-;38680:32;;38701:10;;-1:-1:-1;;;;;38680:32:0;;;;;;;;38586:134;:::o;40808:185::-;40887:4;40902:25;40914:4;40920:6;40902:11;:25::i;:::-;40954:4;-1:-1:-1;;;;;40941:26:0;40946:6;-1:-1:-1;;;;;40941:26:0;;40960:6;40941:26;;;;;;;;;;;;;;;;;;-1:-1:-1;40983:4:0;40808:185;;;;;:::o;11693:192::-;11779:7;11815:12;11807:6;;;;11799:29;;;;-1:-1:-1;;;;;11799:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;11799:29:0;-1:-1:-1;;;11851:5:0;;;11693:192::o;17409:158::-;17478:4;17495:42;17505:12;:10;:12::i;:::-;17519:9;17530:6;17495:9;:42::i;24594:145::-;24655:25;:9;24672:7;24655:25;:16;:25;:::i;:::-;24696:35;;24720:10;;-1:-1:-1;;;;;24696:35:0;;;;;;;;24594:145;:::o;20712:471::-;-1:-1:-1;;;;;20810:20:0;;20802:70;;;;-1:-1:-1;;;;;20802:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20891:23:0;;20883:71;;;;-1:-1:-1;;;;;20883:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20987;21009:6;20987:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20987:17:0;;;;;;:9;:17;;;;;;;:71;;:21;:71;:::i;:::-;-1:-1:-1;;;;;20967:17:0;;;;;;;:9;:17;;;;;;:91;;;;21092:20;;;;;;;:32;;21117:6;21092:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;21069:20:0;;;;;;;:9;:20;;;;;;;;;:55;;;;21140:35;;;;;;;21069:20;;21140:35;;;;;;;;;;;;;20712:471;;;:::o;26147:149::-;26209:26;:13;26227:7;26209:26;:17;:26;:::i;:::-;26251:37;;26277:10;;-1:-1:-1;;;;;26251:37:0;;;;;;;;26147:149;:::o;40159:134::-;40216:21;:8;40229:7;40216:21;:12;:21;:::i;:::-;40253:32;;40274:10;;-1:-1:-1;;;;;40253:32:0;;;;;;;;40159:134;:::o;4138:183::-;4218:18;4222:4;4228:7;4218:3;:18::i;:::-;4210:64;;;;-1:-1:-1;;;;;4210:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4285:20:0;4308:5;4285:20;;;;;;;;;;;:28;;-1:-1:-1;;4285:28:0;;;4138:183::o;3880:178::-;3958:18;3962:4;3968:7;3958:3;:18::i;:::-;3957:19;3949:63;;;;;-1:-1:-1;;;;;3949:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4023:20:0;:11;:20;;;;;;;;;;;:27;;-1:-1:-1;;4023:27:0;4046:4;4023:27;;;3880:178::o;21464:308::-;-1:-1:-1;;;;;21540:21:0;;21532:65;;;;;-1:-1:-1;;;;;21532:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21625:12;;:24;;21642:6;21625:24;:16;:24;:::i;:::-;21610:12;:39;-1:-1:-1;;;;;21681:18:0;;;;;;:9;:18;;;;;;:30;;21704:6;21681:30;:22;:30;:::i;:::-;-1:-1:-1;;;;;21660:18:0;;;;;;:9;:18;;;;;;;;:51;;;;21727:37;;;;;;;21660:18;;;;21727:37;;;;;;;;;;21464:308;;:::o;22105:348::-;-1:-1:-1;;;;;22181:21:0;;22173:67;;;;-1:-1:-1;;;;;22173:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22274:68;22297:6;22274:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22274:18:0;;;;;;:9;:18;;;;;;;:68;;:22;:68;:::i;:::-;-1:-1:-1;;;;;22253:18:0;;;;;;:9;:18;;;;;:89;22368:12;;:24;;22385:6;22368:24;:16;:24;:::i;:::-;22353:12;:39;22408:37;;;;;;;;22434:1;;-1:-1:-1;;;;;22408:37:0;;;;;;;;;;;;22105:348;;:::o;41269:5268::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41269:5268:0;;;-1:-1:-1;41269:5268:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;
Swarm Source
bzzr://7d3afabbceccff0bda34b20c92cb0f58a5a8aa735387152c8f3e7670e0e4c496
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.