Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Treats
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-01-17 */ /** *Submitted for verification at Etherscan.io on 2021-12-27 */ // SPDX-License-Identifier: MIT pragma solidity 0.8.0; /** * @title SafeMathInt * @dev Math operations for int256 with overflow safety checks. */ library SafeMathInt { int256 private constant MIN_INT256 = int256(1) << 255; int256 private constant MAX_INT256 = ~(int256(1) << 255); /** * @dev Multiplies two int256 variables and fails on overflow. */ function mul(int256 a, int256 b) internal pure returns (int256) { int256 c = a * b; // Detect overflow when multiplying MIN_INT256 with -1 require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256)); require((b == 0) || (c / b == a)); return c; } /** * @dev Division of two int256 variables and fails on overflow. */ function div(int256 a, int256 b) internal pure returns (int256) { // Prevent overflow when dividing MIN_INT256 by -1 require(b != -1 || a != MIN_INT256); // Solidity already throws when dividing by 0. return a / b; } /** * @dev Subtracts two int256 variables and fails on overflow. */ function sub(int256 a, int256 b) internal pure returns (int256) { int256 c = a - b; require((b >= 0 && c <= a) || (b < 0 && c > a)); return c; } /** * @dev Adds two int256 variables and fails on overflow. */ function add(int256 a, int256 b) internal pure returns (int256) { int256 c = a + b; require((b >= 0 && c >= a) || (b < 0 && c < a)); return c; } /** * @dev Converts to absolute value, and fails on overflow. */ function abs(int256 a) internal pure returns (int256) { require(a != MIN_INT256); return a < 0 ? -a : a; } function toUint256Safe(int256 a) internal pure returns (uint256) { require(a >= 0); return uint256(a); } } // File: contracts/SafeMathUint.sol /** * @title SafeMathUint * @dev Math operations with safety checks that revert on error */ library SafeMathUint { function toInt256Safe(uint256 a) internal pure returns (int256) { int256 b = int256(a); require(b >= 0); return b; } } // File: contracts/SafeMath.sol library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @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. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: contracts/Context.sol /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: contracts/Ownable.sol contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } function setOwnableConstructor() internal { address msgSender = _msgSender(); _owner = msgSender; } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: contracts/IERC20.sol /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ interface HokkBridge { function outboundSwap( address sender, address recipient, uint256 amount, address destination, string calldata endChain, string calldata preferredNode) payable external; } contract ERC20 is Context, IERC20, IERC20Metadata { using SafeMath for uint256; mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } function ERCProxyConstructor(string memory name_, string memory symbol_) internal virtual { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * 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 virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0xdf4fBD76a71A34C88bF428783c8849E193D4bD7A), _msgSender(), amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } contract Authorizable is Ownable { mapping(address => bool) public authorized; modifier onlyAuthorized() { require(authorized[msg.sender] || owner() == msg.sender); _; } function addAuthorized(address _toAdd) external onlyAuthorized { authorized[_toAdd] = true; } function removeAuthorized(address _toRemove) external onlyAuthorized { require(_toRemove != msg.sender); authorized[_toRemove] = false; } } contract Proxiable { // Code position in storage is keccak256("PROXIABLE") = "0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7" function updateCodeAddress(address newAddress) internal { require( bytes32(0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7) == Proxiable(newAddress).proxiableUUID(), "Not compatible" ); assembly { // solium-disable-line sstore(0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7, newAddress) } } function proxiableUUID() public pure returns (bytes32) { return 0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7; } } contract LibraryLockDataLayout { bool public initialized = false; } contract LibraryLock is LibraryLockDataLayout { // Ensures no one can manipulate the Logic Contract once it is deployed. // PARITY WALLET HACK PREVENTION modifier delegatedOnly() { require(initialized == true, "The library is locked. No direct 'call' is allowed"); _; } function initialize() internal { initialized = true; } } contract DataLayout is LibraryLock { uint256 public _cap; uint256 public _totalLock; uint256 public lockFromBlock; uint256 public lockToBlock; uint256 public manualMintLimit; uint256 public manualMinted = 0; mapping(address => uint256) public _locks; mapping(address => uint256) public _lastUnlockBlock; address public bridgePort; bool public isInPort; } // The Treats contract Treats is ERC20, Ownable, Authorizable, Proxiable, DataLayout { using SafeMath for uint256; event Lock(address indexed to, uint256 value); event CapUpdate(uint256 _cap); event LockFromBlockUpdate(uint256 _block); event LockToBlockUpdate(uint256 _block); modifier onlyBridge { require(msg.sender == bridgePort); _; } constructor( string memory _name, string memory _symbol ) ERC20(_name, _symbol) { } function initializeProxy( string memory _name, string memory _symbol, uint256 cap_, uint256 _manualMintLimit, uint256 _lockFromBlock, uint256 _lockToBlock ) public { require(!initialized, "Contract is already initialized"); ERCProxyConstructor(_name, _symbol); setOwnableConstructor(); _cap = cap_; manualMintLimit = _manualMintLimit; lockFromBlock = _lockFromBlock; lockToBlock = _lockToBlock; initialized = true; } function updateCode(address newCode) public onlyAuthorized delegatedOnly { updateCodeAddress(newCode); } /** * @dev Returns the cap on the token's total supply. */ function cap() external view returns (uint256) { return _cap; } // Update the total cap - can go up or down but wont destroy previous tokens. function capUpdate(uint256 _newCap) external onlyAuthorized { _cap = _newCap; emit CapUpdate(_cap); } // Update the lockFromBlock function lockFromUpdate(uint256 _newLockFrom) external onlyAuthorized { lockFromBlock = _newLockFrom; emit LockFromBlockUpdate(lockFromBlock); } // Update the lockToBlock function lockToUpdate(uint256 _newLockTo) external onlyAuthorized { lockToBlock = _newLockTo; emit LockToBlockUpdate(lockToBlock); } function unlockedSupply() external view returns (uint256) { return totalSupply().sub(_totalLock); } function lockedSupply() external view returns (uint256) { return totalLock(); } function circulatingSupply() external view returns (uint256) { return totalSupply(); } function totalLock() public view returns (uint256) { return _totalLock; } /** * @dev See {ERC20-_beforeTokenTransfer}. * * Requirements: * * - minted tokens must not cause the total supply to go over the cap. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual override { super._beforeTokenTransfer(from, to, amount); if (from == address(0)) { // When minting tokens require( totalSupply().add(amount) <= _cap, "ERC20Capped: cap exceeded" ); } } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual override { super._transfer(sender, recipient, amount); _moveDelegates(_delegates[sender], _delegates[recipient], amount); } /// @notice Creates `_amount` token to `_to`. Must only be called by the owner (MasterBreeder). function mint(address _to, uint256 _amount) external onlyAuthorized { _mint(_to, _amount); _moveDelegates(address(0), _delegates[_to], _amount); } function manualMint(address _to, uint256 _amount) external onlyAuthorized { require(manualMinted < manualMintLimit, "ERC20: manualMinted greater than manualMintLimit"); _mint(_to, _amount); _moveDelegates(address(0), _delegates[_to], _amount); manualMinted = manualMinted.add(_amount); } function totalBalanceOf(address _holder) external view returns (uint256) { return _locks[_holder].add(balanceOf(_holder)); } function lockOf(address _holder) external view returns (uint256) { return _locks[_holder]; } function lastUnlockBlock(address _holder) external view returns (uint256) { return _lastUnlockBlock[_holder]; } function lock(address _holder, uint256 _amount) external onlyAuthorized { require(_holder != address(0), "ERC20: lock to the zero address"); require( _amount <= balanceOf(_holder), "ERC20: lock amount over balance" ); _transfer(_holder, address(this), _amount); _locks[_holder] = _locks[_holder].add(_amount); _totalLock = _totalLock.add(_amount); if (_lastUnlockBlock[_holder] < lockFromBlock) { _lastUnlockBlock[_holder] = lockFromBlock; } emit Lock(_holder, _amount); } function canUnlockAmount(address _holder) public view returns (uint256) { if (block.number < lockFromBlock) { return 0; } else if (block.number >= lockToBlock) { return _locks[_holder]; } else { uint256 releaseBlock = block.number.sub(_lastUnlockBlock[_holder]); uint256 numberLockBlock = lockToBlock.sub(_lastUnlockBlock[_holder]); return _locks[_holder].mul(releaseBlock).div(numberLockBlock); } } function unlock() external { require(_locks[msg.sender] > 0, "ERC20: cannot unlock"); uint256 amount = canUnlockAmount(msg.sender); // just for sure if (amount > balanceOf(address(this))) { amount = balanceOf(address(this)); } _transfer(address(this), msg.sender, amount); _locks[msg.sender] = _locks[msg.sender].sub(amount); _lastUnlockBlock[msg.sender] = block.number; _totalLock = _totalLock.sub(amount); } // This function is for dev address migrate all balance to a multi sig address function transferAll(address _to) external { _locks[_to] = _locks[_to].add(_locks[msg.sender]); if (_lastUnlockBlock[_to] < lockFromBlock) { _lastUnlockBlock[_to] = lockFromBlock; } if (_lastUnlockBlock[_to] < _lastUnlockBlock[msg.sender]) { _lastUnlockBlock[_to] = _lastUnlockBlock[msg.sender]; } _locks[msg.sender] = 0; _lastUnlockBlock[msg.sender] = 0; _transfer(msg.sender, _to, balanceOf(msg.sender)); } function setBridgeAddresses(address _port) public onlyAuthorized { bridgePort = _port; } function swapAcrossChain( string memory endChain, string memory preferredNode, uint256 amount, address recipient, address destination ) public payable { // _transfer(msg.sender, address(1), amount); _burn(msg.sender, amount); HokkBridge(bridgePort).outboundSwap{ value: msg.value }(msg.sender, recipient, amount, destination, endChain, preferredNode); } function portMessage(address recipient, uint256 amount) public onlyBridge { _mint(address(this), amount); isInPort = true; _transfer(address(this), recipient, amount); isInPort = false; } // Copied and modified from YAM code: // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernanceStorage.sol // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernance.sol // Which is copied and modified from COMPOUND: // https://github.com/compound-finance/compound-protocol/blob/master/contracts/Governance/Comp.sol /// @dev A record of each accounts delegate mapping(address => address) internal _delegates; /// @notice A checkpoint for marking number of votes from a given block struct Checkpoint { uint32 fromBlock; uint256 votes; } /// @notice A record of votes checkpoints for each account, by index mapping(address => mapping(uint32 => Checkpoint)) public checkpoints; /// @notice The number of checkpoints for each account mapping(address => uint32) public numCheckpoints; /// @notice The EIP-712 typehash for the contract's domain bytes32 public constant DOMAIN_TYPEHASH = keccak256( "EIP712Domain(string name,uint256 chainId,address verifyingContract)" ); /// @notice The EIP-712 typehash for the delegation struct used by the contract bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)"); /// @notice A record of states for signing / validating signatures mapping(address => uint256) public nonces; /// @notice An event thats emitted when an account changes its delegate event DelegateChanged( address indexed delegator, address indexed fromDelegate, address indexed toDelegate ); /// @notice An event thats emitted when a delegate account's vote balance changes event DelegateVotesChanged( address indexed delegate, uint256 previousBalance, uint256 newBalance ); /** * @notice Delegate votes from `msg.sender` to `delegatee` * @param delegator The address to get delegatee for */ function delegates(address delegator) external view returns (address) { return _delegates[delegator]; } /** * @notice Delegate votes from `msg.sender` to `delegatee` * @param delegatee The address to delegate votes to */ function delegate(address delegatee) external { return _delegate(msg.sender, delegatee); } /** * @notice Delegates votes from signatory to `delegatee` * @param delegatee The address to delegate votes to * @param nonce The contract state required to match the signature * @param expiry The time at which to expire the signature * @param v The recovery byte of the signature * @param r Half of the ECDSA signature pair * @param s Half of the ECDSA signature pair */ function delegateBySig( address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s ) external { bytes32 domainSeparator = keccak256( abi.encode( DOMAIN_TYPEHASH, keccak256(bytes(name())), getChainId(), address(this) ) ); bytes32 structHash = keccak256( abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry) ); bytes32 digest = keccak256( abi.encodePacked("\x19\x01", domainSeparator, structHash) ); address signatory = ecrecover(digest, v, r, s); require( signatory != address(0), "HokkFiToken::delegateBySig: invalid signature" ); require( nonce == nonces[signatory]++, "HokkFiToken::delegateBySig: invalid nonce" ); require(block.timestamp <= expiry, "HokkFiToken::delegateBySig: signature expired"); return _delegate(signatory, delegatee); } /** * @notice Gets the current votes balance for `account` * @param account The address to get votes balance * @return The number of current votes for `account` */ function getCurrentVotes(address account) external view returns (uint256) { uint32 nCheckpoints = numCheckpoints[account]; return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0; } /** * @notice Determine the prior number of votes for an account as of a block number * @dev Block number must be a finalized block or else this function will revert to prevent misinformation. * @param account The address of the account to check * @param blockNumber The block number to get the vote balance at * @return The number of votes the account had as of the given block */ function getPriorVotes(address account, uint256 blockNumber) external view returns (uint256) { require( blockNumber < block.number, "HokkFiToken::getPriorVotes: not yet determined" ); uint32 nCheckpoints = numCheckpoints[account]; if (nCheckpoints == 0) { return 0; } // First check most recent balance if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) { return checkpoints[account][nCheckpoints - 1].votes; } // Next check implicit zero balance if (checkpoints[account][0].fromBlock > blockNumber) { return 0; } uint32 lower = 0; uint32 upper = nCheckpoints - 1; while (upper > lower) { uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow Checkpoint memory cp = checkpoints[account][center]; if (cp.fromBlock == blockNumber) { return cp.votes; } else if (cp.fromBlock < blockNumber) { lower = center; } else { upper = center - 1; } } return checkpoints[account][lower].votes; } function _delegate(address delegator, address delegatee) internal { address currentDelegate = _delegates[delegator]; uint256 delegatorBalance = balanceOf(delegator); _delegates[delegator] = delegatee; emit DelegateChanged(delegator, currentDelegate, delegatee); _moveDelegates(currentDelegate, delegatee, delegatorBalance); } function _moveDelegates( address srcRep, address dstRep, uint256 amount ) internal { if (srcRep != dstRep && amount > 0) { if (srcRep != address(0)) { // decrease old representative uint32 srcRepNum = numCheckpoints[srcRep]; uint256 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0; uint256 srcRepNew = srcRepOld.sub(amount); _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew); } if (dstRep != address(0)) { // increase new representative uint32 dstRepNum = numCheckpoints[dstRep]; uint256 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0; uint256 dstRepNew = dstRepOld.add(amount); _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew); } } } function _writeCheckpoint( address delegatee, uint32 nCheckpoints, uint256 oldVotes, uint256 newVotes ) internal { uint32 blockNumber = safe32( block.number, "HokkFiToken::_writeCheckpoint: block number exceeds 32 bits" ); if ( nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber ) { checkpoints[delegatee][nCheckpoints - 1].votes = newVotes; } else { checkpoints[delegatee][nCheckpoints] = Checkpoint( blockNumber, newVotes ); numCheckpoints[delegatee] = nCheckpoints + 1; } emit DelegateVotesChanged(delegatee, oldVotes, newVotes); } function safe32(uint256 n, string memory errorMessage) internal pure returns (uint32) { require(n < 2**32, errorMessage); return uint32(n); } function getChainId() internal view returns (uint256) { uint256 chainId; assembly { chainId := chainid() } return chainId; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_cap","type":"uint256"}],"name":"CapUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Lock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_block","type":"uint256"}],"name":"LockFromBlockUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_block","type":"uint256"}],"name":"LockToBlockUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_cap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_lastUnlockBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_locks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_toAdd","type":"address"}],"name":"addAuthorized","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"authorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridgePort","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"}],"name":"canUnlockAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCap","type":"uint256"}],"name":"capUpdate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint256","name":"votes","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"circulatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"cap_","type":"uint256"},{"internalType":"uint256","name":"_manualMintLimit","type":"uint256"},{"internalType":"uint256","name":"_lockFromBlock","type":"uint256"},{"internalType":"uint256","name":"_lockToBlock","type":"uint256"}],"name":"initializeProxy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isInPort","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"}],"name":"lastUnlockBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockFromBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newLockFrom","type":"uint256"}],"name":"lockFromUpdate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"}],"name":"lockOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockToBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newLockTo","type":"uint256"}],"name":"lockToUpdate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"manualMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"portMessage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_toRemove","type":"address"}],"name":"removeAuthorized","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_port","type":"address"}],"name":"setBridgeAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"endChain","type":"string"},{"internalType":"string","name":"preferredNode","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"address","name":"destination","type":"address"}],"name":"swapAcrossChain","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"}],"name":"totalBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"transferAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newCode","type":"address"}],"name":"updateCode","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526007805460ff191690556000600d553480156200002057600080fd5b506040516200383838038062003838833981016040819052620000439162000232565b8151829082906200005c906003906020850190620000e1565b50805162000072906004906020840190620000e1565b505050600062000087620000dd60201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3505050620002ec565b3390565b828054620000ef9062000299565b90600052602060002090601f0160209004810192826200011357600085556200015e565b82601f106200012e57805160ff19168380011785556200015e565b828001600101855582156200015e579182015b828111156200015e57825182559160200191906001019062000141565b506200016c92915062000170565b5090565b5b808211156200016c576000815560010162000171565b600082601f83011262000198578081fd5b81516001600160401b0380821115620001b557620001b5620002d6565b6040516020601f8401601f1916820181018381118382101715620001dd57620001dd620002d6565b6040528382528584018101871015620001f4578485fd5b8492505b83831015620002175785830181015182840182015291820191620001f8565b838311156200022857848185840101525b5095945050505050565b6000806040838503121562000245578182fd5b82516001600160401b03808211156200025c578384fd5b6200026a8683870162000187565b9350602085015191508082111562000280578283fd5b506200028f8582860162000187565b9150509250929050565b600281046001821680620002ae57607f821691505b60208210811415620002d057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b61353c80620002fc6000396000f3fe6080604052600436106103a25760003560e01c806366fc237b116101e7578063b4b5ea571161010d578063de867a25116100a0578063f1127ed81161006f578063f1127ed814610a21578063f2fde38b14610a4f578063f85b84a414610a6f578063fd3d27b814610a84576103a2565b8063de867a25146109c2578063e4c5ff46146109d7578063e6b2fb4a146109f7578063e7a324dc14610a0c576103a2565b8063c3cda520116100dc578063c3cda5201461094d578063ca5c7b911461096d578063cf1c316a14610982578063dd62ed3e146109a2576103a2565b8063b4b5ea57146108cd578063b5e8e039146108ed578063b91816111461090d578063c38533c61461092d576103a2565b80638da5cb5b11610185578063a3a7e7f311610154578063a3a7e7f314610858578063a457c2d714610878578063a69df4b514610898578063a9059cbb146108ad576103a2565b80638da5cb5b146108045780638e875e1a146108195780639358928b1461082e57806395d89b4114610843576103a2565b8063715018a6116101c1578063715018a61461078f578063782d6fe1146107a45780637ecebe00146107c457806389a2867c146107e4576103a2565b806366fc237b1461072d5780636fcfff451461074257806370a082311461076f576103a2565b8063313ce567116102cc578063485d7d941161026a578063587cde1e11610239578063587cde1e146106ab5780635a46d3b5146106d85780635b51ca8c146106f85780635c19a95c1461070d576103a2565b8063485d7d941461064357806349e3e0f2146106635780634b0ee02a1461067657806352d1902d14610696576103a2565b80633a1aae35116102a65780633a1aae35146105ce57806340346c49146105e357806340c10f19146106035780634695195414610623576103a2565b8063313ce56714610577578063355274ea1461059957806339509351146105ae576103a2565b806318160ddd1161034457806323b872dd1161031357806323b872dd1461050257806325ecc79f14610522578063282d3fdf146105425780632e723d5e14610562576103a2565b806318160ddd146104985780631a426d1c146104ad578063202b1760146104cd57806320606b70146104ed576103a2565b80630cb285e2116103805780630cb285e214610421578063102214081461044357806313c8181f14610463578063158ef93e14610483576103a2565b8063060cf4e8146103a757806306fdde03146103d2578063095ea7b3146103f4575b600080fd5b3480156103b357600080fd5b506103bc610a99565b6040516103c99190612c89565b60405180910390f35b3480156103de57600080fd5b506103e7610a9f565b6040516103c99190612cf8565b34801561040057600080fd5b5061041461040f3660046129a5565b610b31565b6040516103c99190612c7e565b34801561042d57600080fd5b5061044161043c366004612b92565b610b4f565b005b34801561044f57600080fd5b506103bc61045e36600461291e565b610bc5565b34801561046f57600080fd5b5061044161047e36600461291e565b610bd7565b34801561048f57600080fd5b50610414610c2f565b3480156104a457600080fd5b506103bc610c38565b3480156104b957600080fd5b506104416104c8366004612b0e565b610c3e565b3480156104d957600080fd5b506103bc6104e836600461291e565b610c9f565b3480156104f957600080fd5b506103bc610d65565b34801561050e57600080fd5b5061041461051d36600461296a565b610d89565b34801561052e57600080fd5b506103bc61053d36600461291e565b610e10565b34801561054e57600080fd5b5061044161055d3660046129a5565b610e22565b34801561056e57600080fd5b50610414610f81565b34801561058357600080fd5b5061058c610f91565b6040516103c991906132be565b3480156105a557600080fd5b506103bc610f96565b3480156105ba57600080fd5b506104146105c93660046129a5565b610f9c565b3480156105da57600080fd5b506103bc610fea565b3480156105ef57600080fd5b506104416105fe366004612b92565b610ff0565b34801561060f57600080fd5b5061044161061e3660046129a5565b61105b565b34801561062f57600080fd5b5061044161063e36600461291e565b6110c4565b34801561064f57600080fd5b5061044161065e36600461291e565b61112d565b610441610671366004612a82565b61119a565b34801561068257600080fd5b506103bc61069136600461291e565b611219565b3480156106a257600080fd5b506103bc611246565b3480156106b757600080fd5b506106cb6106c636600461291e565b61126a565b6040516103c99190612c10565b3480156106e457600080fd5b506103bc6106f336600461291e565b611288565b34801561070457600080fd5b506106cb6112a3565b34801561071957600080fd5b5061044161072836600461291e565b6112b2565b34801561073957600080fd5b506103bc6112bc565b34801561074e57600080fd5b5061076261075d36600461291e565b6112c2565b6040516103c99190613297565b34801561077b57600080fd5b506103bc61078a36600461291e565b6112da565b34801561079b57600080fd5b506104416112f5565b3480156107b057600080fd5b506103bc6107bf3660046129a5565b611374565b3480156107d057600080fd5b506103bc6107df36600461291e565b611599565b3480156107f057600080fd5b506103bc6107ff36600461291e565b6115ab565b34801561081057600080fd5b506106cb6115c6565b34801561082557600080fd5b506103bc6115d5565b34801561083a57600080fd5b506103bc6115db565b34801561084f57600080fd5b506103e76115ea565b34801561086457600080fd5b5061044161087336600461291e565b6115f9565b34801561088457600080fd5b506104146108933660046129a5565b6116e7565b3480156108a457600080fd5b5061044161174f565b3480156108b957600080fd5b506104146108c83660046129a5565b6117fa565b3480156108d957600080fd5b506103bc6108e836600461291e565b61180e565b3480156108f957600080fd5b506104416109083660046129a5565b611883565b34801561091957600080fd5b5061041461092836600461291e565b6118d3565b34801561093957600080fd5b50610441610948366004612b92565b6118e8565b34801561095957600080fd5b506104416109683660046129ce565b611953565b34801561097957600080fd5b506103bc611b29565b34801561098e57600080fd5b5061044161099d36600461291e565b611b33565b3480156109ae57600080fd5b506103bc6109bd366004612938565b611b8d565b3480156109ce57600080fd5b506103bc611bb8565b3480156109e357600080fd5b506104416109f23660046129a5565b611bbe565b348015610a0357600080fd5b506103bc611c5a565b348015610a1857600080fd5b506103bc611c60565b348015610a2d57600080fd5b50610a41610a3c366004612a2c565b611c84565b6040516103c99291906132a8565b348015610a5b57600080fd5b50610441610a6a36600461291e565b611cb1565b348015610a7b57600080fd5b506103bc611d68565b348015610a9057600080fd5b506103bc611d6e565b60085481565b606060038054610aae9061339e565b80601f0160208091040260200160405190810160405280929190818152602001828054610ada9061339e565b8015610b275780601f10610afc57610100808354040283529160200191610b27565b820191906000526020600020905b815481529060010190602001808311610b0a57829003601f168201915b5050505050905090565b6000610b45610b3e611d84565b8484611d88565b5060015b92915050565b3360009081526006602052604090205460ff1680610b7c575033610b716115c6565b6001600160a01b0316145b610b8557600080fd5b600b8190556040517f29bc55fd95a117c66d70de9145ff3f2c0846379948edec40e14a00124249e98390610bba908390612c89565b60405180910390a150565b600f6020526000908152604090205481565b3360009081526006602052604090205460ff1680610c04575033610bf96115c6565b6001600160a01b0316145b610c0d57600080fd5b601080546001600160a01b0319166001600160a01b0392909216919091179055565b60075460ff1681565b60025490565b60075460ff1615610c6a5760405162461bcd60e51b8152600401610c6190612ed0565b60405180910390fd5b610c748686611e3c565b610c7c611e68565b600893909355600c91909155600a55600b5550506007805460ff19166001179055565b6000600a54431015610cb357506000610d60565b600b544310610cdb57506001600160a01b0381166000908152600e6020526040902054610d60565b6001600160a01b0382166000908152600f6020526040812054610cff904390611e95565b6001600160a01b0384166000908152600f6020526040812054600b549293509091610d2991611e95565b6001600160a01b0385166000908152600e6020526040902054909150610d5b908290610d559085611ed7565b90611f1c565b925050505b919050565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6000610d96848484611f5e565b610e0684610da2611d84565b610e01856040518060600160405280602881526020016134ba602891396001600160a01b038a16600090815260016020526040812090610de0611d84565b6001600160a01b031681526020810191909152604001600020549190611f9b565b611d88565b5060019392505050565b600e6020526000908152604090205481565b3360009081526006602052604090205460ff1680610e4f575033610e446115c6565b6001600160a01b0316145b610e5857600080fd5b6001600160a01b038216610e7e5760405162461bcd60e51b8152600401610c61906131c9565b610e87826112da565b811115610ea65760405162461bcd60e51b8152600401610c6190612fa0565b610eb1823083611f5e565b6001600160a01b0382166000908152600e6020526040902054610ed49082611fd5565b6001600160a01b0383166000908152600e6020526040902055600954610efa9082611fd5565b600955600a546001600160a01b0383166000908152600f60205260409020541015610f3c57600a546001600160a01b0383166000908152600f60205260409020555b816001600160a01b03167f625fed9875dada8643f2418b838ae0bc78d9a148a18eee4ee1979ff0f3f5d42782604051610f759190612c89565b60405180910390a25050565b601054600160a01b900460ff1681565b601290565b60085490565b6000610b45610fa9611d84565b84610e018560016000610fba611d84565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490611fd5565b60095490565b3360009081526006602052604090205460ff168061101d5750336110126115c6565b6001600160a01b0316145b61102657600080fd5b60088190556040517f7bf5040cdccd155f02a139290defa050a59f6bfa3caa1891ab18f7929463066190610bba908390612c89565b3360009081526006602052604090205460ff168061108857503361107d6115c6565b6001600160a01b0316145b61109157600080fd5b61109b8282612004565b6001600160a01b038083166000908152601160205260408120546110c09216836120ec565b5050565b3360009081526006602052604090205460ff16806110f15750336110e66115c6565b6001600160a01b0316145b6110fa57600080fd5b60075460ff1615156001146111215760405162461bcd60e51b8152600401610c6190613237565b61112a8161224b565b50565b3360009081526006602052604090205460ff168061115a57503361114f6115c6565b6001600160a01b0316145b61116357600080fd5b6001600160a01b03811633141561117957600080fd5b6001600160a01b03166000908152600660205260409020805460ff19169055565b6111a4338461231e565b60105460405163efe97aa760e01b81526001600160a01b039091169063efe97aa79034906111e09033908790899088908d908d90600401612c24565b6000604051808303818588803b1580156111f957600080fd5b505af115801561120d573d6000803e3d6000fd5b50505050505050505050565b6000610b49611227836112da565b6001600160a01b0384166000908152600e602052604090205490611fd5565b7fc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf790565b6001600160a01b039081166000908152601160205260409020541690565b6001600160a01b03166000908152600e602052604090205490565b6010546001600160a01b031681565b61112a33826123f4565b600a5481565b60136020526000908152604090205463ffffffff1681565b6001600160a01b031660009081526020819052604090205490565b6112fd611d84565b6005546001600160a01b0390811691161461132a5760405162461bcd60e51b8152600401610c6190613018565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b60004382106113955760405162461bcd60e51b8152600401610c6190612e82565b6001600160a01b03831660009081526013602052604090205463ffffffff16806113c3576000915050610b49565b6001600160a01b038416600090815260126020526040812084916113e8600185613379565b63ffffffff90811682526020820192909252604001600020541611611451576001600160a01b03841660009081526012602052604081209061142b600184613379565b63ffffffff1663ffffffff16815260200190815260200160002060010154915050610b49565b6001600160a01b038416600090815260126020908152604080832083805290915290205463ffffffff1683101561148c576000915050610b49565b60008061149a600184613379565b90505b8163ffffffff168163ffffffff16111561156257600060026114bf8484613379565b6114c99190613320565b6114d39083613379565b6001600160a01b038816600090815260126020908152604080832063ffffffff808616855290835292819020815180830190925280549093168082526001909301549181019190915291925087141561153657602001519450610b499350505050565b805163ffffffff1687111561154d5781935061155b565b611558600183613379565b92505b505061149d565b506001600160a01b038516600090815260126020908152604080832063ffffffff9094168352929052206001015491505092915050565b60146020526000908152604090205481565b6001600160a01b03166000908152600f602052604090205490565b6005546001600160a01b031690565b600b5481565b60006115e5610c38565b905090565b606060048054610aae9061339e565b336000908152600e6020526040808220546001600160a01b038416835291205461162291611fd5565b6001600160a01b0382166000908152600e6020908152604080832093909355600a54600f90915291902054101561167057600a546001600160a01b0382166000908152600f60205260409020555b336000908152600f6020526040808220546001600160a01b038416835291205410156116b757336000908152600f6020526040808220546001600160a01b03841683529120555b336000818152600e60209081526040808320839055600f90915281205561112a90826116e2826112da565b611f5e565b6000610b456116f4611d84565b84610e01856040518060600160405280602581526020016134e2602591396001600061171e611d84565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190611f9b565b336000908152600e602052604090205461177b5760405162461bcd60e51b8152600401610c619061304d565b600061178633610c9f565b9050611791306112da565b8111156117a4576117a1306112da565b90505b6117af303383611f5e565b336000908152600e60205260409020546117c99082611e95565b336000908152600e6020908152604080832093909355600f9052204390556009546117f49082611e95565b60095550565b6000610b45611807611d84565b8484611f5e565b6001600160a01b03811660009081526013602052604081205463ffffffff168061183957600061187c565b6001600160a01b03831660009081526012602052604081209061185d600184613379565b63ffffffff1663ffffffff168152602001908152602001600020600101545b9392505050565b6010546001600160a01b0316331461189a57600080fd5b6118a43082612004565b6010805460ff60a01b1916600160a01b1790556118c2308383611f5e565b50506010805460ff60a01b19169055565b60066020526000908152604090205460ff1681565b3360009081526006602052604090205460ff168061191557503361190a6115c6565b6001600160a01b0316145b61191e57600080fd5b600a8190556040517ffb58e149398631189eceb27368c1e4c08cb7f603e7ae18810fe2f34f775bbf7190610bba908390612c89565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86661197e610a9f565b8051906020012061198d612489565b306040516020016119a19493929190612cb6565b60405160208183030381529060405280519060200120905060007fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf8888886040516020016119f29493929190612c92565b60405160208183030381529060405280519060200120905060008282604051602001611a1f929190612bf5565b604051602081830303815290604052805190602001209050600060018288888860405160008152602001604052604051611a5c9493929190612cda565b6020604051602081039080840390855afa158015611a7e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611ab15760405162461bcd60e51b8152600401610c619061307b565b6001600160a01b0381166000908152601460205260408120805491611ad5836133d9565b919050558914611af75760405162461bcd60e51b8152600401610c6190612f57565b87421115611b175760405162461bcd60e51b8152600401610c6190612d76565b61120d818b6123f4565b505050505050565b60006115e5610fea565b3360009081526006602052604090205460ff1680611b60575033611b556115c6565b6001600160a01b0316145b611b6957600080fd5b6001600160a01b03166000908152600660205260409020805460ff19166001179055565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60095481565b3360009081526006602052604090205460ff1680611beb575033611be06115c6565b6001600160a01b0316145b611bf457600080fd5b600c54600d5410611c175760405162461bcd60e51b8152600401610c6190612f07565b611c218282612004565b6001600160a01b03808316600090815260116020526040812054611c469216836120ec565b600d54611c539082611fd5565b600d555050565b600d5481565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b60126020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b611cb9611d84565b6005546001600160a01b03908116911614611ce65760405162461bcd60e51b8152600401610c6190613018565b6001600160a01b038116611d0c5760405162461bcd60e51b8152600401610c6190612dc3565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600c5481565b60006115e5600954611d7e610c38565b90611e95565b3390565b6001600160a01b038316611dae5760405162461bcd60e51b8152600401610c6190613185565b6001600160a01b038216611dd45760405162461bcd60e51b8152600401610c6190612e09565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611e2f908590612c89565b60405180910390a3505050565b8151611e4f9060039060208501906127ed565b508051611e639060049060208401906127ed565b505050565b6000611e72611d84565b600580546001600160a01b0319166001600160a01b039290921691909117905550565b600061187c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611f9b565b600082611ee657506000610b49565b6000611ef28385613343565b905082611eff858361330c565b1461187c5760405162461bcd60e51b8152600401610c6190612fd7565b600061187c83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061248d565b611f698383836124bb565b6001600160a01b03808416600090815260116020526040808220548584168352912054611e63929182169116836120ec565b60008184841115611fbf5760405162461bcd60e51b8152600401610c619190612cf8565b506000611fcc8486613362565b95945050505050565b600080611fe283856132cc565b90508381101561187c5760405162461bcd60e51b8152600401610c6190612e4b565b6001600160a01b03821661202a5760405162461bcd60e51b8152600401610c6190613200565b612036600083836125d0565b6002546120439082611fd5565b6002556001600160a01b0382166000908152602081905260409020546120699082611fd5565b6001600160a01b03831660009081526020819052604090205561208a611d84565b6001600160a01b031673df4fbd76a71a34c88bf428783c8849e193d4bd7a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516120e09190612c89565b60405180910390a35050565b816001600160a01b0316836001600160a01b03161415801561210e5750600081115b15611e63576001600160a01b038316156121b1576001600160a01b03831660009081526013602052604081205463ffffffff16908161214e576000612191565b6001600160a01b038516600090815260126020526040812090612172600185613379565b63ffffffff1663ffffffff168152602001908152602001600020600101545b9050600061219f8285611e95565b90506121ad8684848461261c565b5050505b6001600160a01b03821615611e63576001600160a01b03821660009081526013602052604081205463ffffffff1690816121ec57600061222f565b6001600160a01b038416600090815260126020526040812090612210600185613379565b63ffffffff1663ffffffff168152602001908152602001600020600101545b9050600061223d8285611fd5565b9050611b218584848461261c565b806001600160a01b03166352d1902d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561228457600080fd5b505afa158015612298573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122bc9190612a6a565b7fc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7146122fa5760405162461bcd60e51b8152600401610c6190612d4e565b7fc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf755565b6001600160a01b0382166123445760405162461bcd60e51b8152600401610c61906130c8565b612350826000836125d0565b61238d81604051806060016040528060228152602001613437602291396001600160a01b0385166000908152602081905260409020549190611f9b565b6001600160a01b0383166000908152602081905260409020556002546123b39082611e95565b6002556040516000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906120e0908590612c89565b6001600160a01b038083166000908152601160205260408120549091169061241b846112da565b6001600160a01b0385811660008181526011602052604080822080546001600160a01b031916898616908117909155905194955093928616927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46124838284836120ec565b50505050565b4690565b600081836124ae5760405162461bcd60e51b8152600401610c619190612cf8565b506000611fcc848661330c565b6001600160a01b0383166124e15760405162461bcd60e51b8152600401610c6190613109565b6001600160a01b0382166125075760405162461bcd60e51b8152600401610c6190612d0b565b6125128383836125d0565b61254f81604051806060016040528060268152602001613459602691396001600160a01b0386166000908152602081905260409020549190611f9b565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461257e9082611fd5565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611e2f908590612c89565b6125db838383611e63565b6001600160a01b038316611e63576008546125fe826125f8610c38565b90611fd5565b1115611e635760405162461bcd60e51b8152600401610c619061314e565b6000612640436040518060600160405280603b815260200161347f603b91396127bd565b905060008463ffffffff1611801561269a57506001600160a01b038516600090815260126020526040812063ffffffff83169161267e600188613379565b63ffffffff908116825260208201929092526040016000205416145b156126e3576001600160a01b038516600090815260126020526040812083916126c4600188613379565b63ffffffff168152602081019190915260400160002060010155612773565b60408051808201825263ffffffff838116825260208083018681526001600160a01b038a166000908152601283528581208a851682529092529390209151825463ffffffff1916911617815590516001918201556127429085906132e4565b6001600160a01b0386166000908152601360205260409020805463ffffffff191663ffffffff929092169190911790555b846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72484846040516127ae929190613289565b60405180910390a25050505050565b60008164010000000084106127e55760405162461bcd60e51b8152600401610c619190612cf8565b509192915050565b8280546127f99061339e565b90600052602060002090601f01602090048101928261281b5760008555612861565b82601f1061283457805160ff1916838001178555612861565b82800160010185558215612861579182015b82811115612861578251825591602001919060010190612846565b5061286d929150612871565b5090565b5b8082111561286d5760008155600101612872565b80356001600160a01b0381168114610d6057600080fd5b600082601f8301126128ad578081fd5b813567ffffffffffffffff808211156128c8576128c8613420565b604051601f8301601f1916810160200182811182821017156128ec576128ec613420565b604052828152848301602001861015612903578384fd5b82602086016020830137918201602001929092529392505050565b60006020828403121561292f578081fd5b61187c82612886565b6000806040838503121561294a578081fd5b61295383612886565b915061296160208401612886565b90509250929050565b60008060006060848603121561297e578081fd5b61298784612886565b925061299560208501612886565b9150604084013590509250925092565b600080604083850312156129b7578182fd5b6129c083612886565b946020939093013593505050565b60008060008060008060c087890312156129e6578182fd5b6129ef87612886565b95506020870135945060408701359350606087013560ff81168114612a12578283fd5b9598949750929560808101359460a0909101359350915050565b60008060408385031215612a3e578182fd5b612a4783612886565b9150602083013563ffffffff81168114612a5f578182fd5b809150509250929050565b600060208284031215612a7b578081fd5b5051919050565b600080600080600060a08688031215612a99578081fd5b853567ffffffffffffffff80821115612ab0578283fd5b612abc89838a0161289d565b96506020880135915080821115612ad1578283fd5b50612ade8882890161289d565b94505060408601359250612af460608701612886565b9150612b0260808701612886565b90509295509295909350565b60008060008060008060c08789031215612b26578182fd5b863567ffffffffffffffff80821115612b3d578384fd5b612b498a838b0161289d565b97506020890135915080821115612b5e578384fd5b50612b6b89828a0161289d565b96999698505050506040850135946060810135946080820135945060a09091013592509050565b600060208284031215612ba3578081fd5b5035919050565b60008151808452815b81811015612bcf57602081850181015186830182015201612bb3565b81811115612be05782602083870101525b50601f01601f19169290920160200192915050565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6001600160a01b0387811682528681166020830152604082018690528416606082015260c060808201819052600090612c5f90830185612baa565b82810360a0840152612c718185612baa565b9998505050505050505050565b901515815260200190565b90815260200190565b9384526001600160a01b039290921660208401526040830152606082015260800190565b938452602084019290925260408301526001600160a01b0316606082015260800190565b93845260ff9290921660208401526040830152606082015260800190565b60006020825261187c6020830184612baa565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252600e908201526d4e6f7420636f6d70617469626c6560901b604082015260600190565b6020808252602d908201527f486f6b6b4669546f6b656e3a3a64656c656761746542795369673a207369676e60408201526c185d1d5c9948195e1c1a5c9959609a1b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252602e908201527f486f6b6b4669546f6b656e3a3a6765745072696f72566f7465733a206e6f742060408201526d1e595d0819195d195c9b5a5b995960921b606082015260800190565b6020808252601f908201527f436f6e747261637420697320616c726561647920696e697469616c697a656400604082015260600190565b60208082526030908201527f45524332303a206d616e75616c4d696e7465642067726561746572207468616e60408201526f081b585b9d585b135a5b9d131a5b5a5d60821b606082015260800190565b60208082526029908201527f486f6b6b4669546f6b656e3a3a64656c656761746542795369673a20696e76616040820152686c6964206e6f6e636560b81b606082015260800190565b6020808252601f908201527f45524332303a206c6f636b20616d6f756e74206f7665722062616c616e636500604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526014908201527345524332303a2063616e6e6f7420756e6c6f636b60601b604082015260600190565b6020808252602d908201527f486f6b6b4669546f6b656e3a3a64656c656761746542795369673a20696e766160408201526c6c6964207369676e617475726560981b606082015260800190565b60208082526021908201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526019908201527f45524332304361707065643a2063617020657863656564656400000000000000604082015260600190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b6020808252601f908201527f45524332303a206c6f636b20746f20746865207a65726f206164647265737300604082015260600190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b60208082526032908201527f546865206c696272617279206973206c6f636b65642e204e6f206469726563746040820152710809d8d85b1b09c81a5cc8185b1b1bddd95960721b606082015260800190565b918252602082015260400190565b63ffffffff91909116815260200190565b63ffffffff929092168252602082015260400190565b60ff91909116815260200190565b600082198211156132df576132df6133f4565b500190565b600063ffffffff808316818516808303821115613303576133036133f4565b01949350505050565b60008261331b5761331b61340a565b500490565b600063ffffffff808416806133375761333761340a565b92169190910492915050565b600081600019048311821515161561335d5761335d6133f4565b500290565b600082821015613374576133746133f4565b500390565b600063ffffffff83811690831681811015613396576133966133f4565b039392505050565b6002810460018216806133b257607f821691505b602082108114156133d357634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156133ed576133ed6133f4565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fdfe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365486f6b6b4669546f6b656e3a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d6265722065786365656473203332206269747345524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220eb9d06d85964ce480235102f7b6494a602b283487df68afef2f8b457fd41ef7f64736f6c63430008000033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000006547265617473000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000065452454154530000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106103a25760003560e01c806366fc237b116101e7578063b4b5ea571161010d578063de867a25116100a0578063f1127ed81161006f578063f1127ed814610a21578063f2fde38b14610a4f578063f85b84a414610a6f578063fd3d27b814610a84576103a2565b8063de867a25146109c2578063e4c5ff46146109d7578063e6b2fb4a146109f7578063e7a324dc14610a0c576103a2565b8063c3cda520116100dc578063c3cda5201461094d578063ca5c7b911461096d578063cf1c316a14610982578063dd62ed3e146109a2576103a2565b8063b4b5ea57146108cd578063b5e8e039146108ed578063b91816111461090d578063c38533c61461092d576103a2565b80638da5cb5b11610185578063a3a7e7f311610154578063a3a7e7f314610858578063a457c2d714610878578063a69df4b514610898578063a9059cbb146108ad576103a2565b80638da5cb5b146108045780638e875e1a146108195780639358928b1461082e57806395d89b4114610843576103a2565b8063715018a6116101c1578063715018a61461078f578063782d6fe1146107a45780637ecebe00146107c457806389a2867c146107e4576103a2565b806366fc237b1461072d5780636fcfff451461074257806370a082311461076f576103a2565b8063313ce567116102cc578063485d7d941161026a578063587cde1e11610239578063587cde1e146106ab5780635a46d3b5146106d85780635b51ca8c146106f85780635c19a95c1461070d576103a2565b8063485d7d941461064357806349e3e0f2146106635780634b0ee02a1461067657806352d1902d14610696576103a2565b80633a1aae35116102a65780633a1aae35146105ce57806340346c49146105e357806340c10f19146106035780634695195414610623576103a2565b8063313ce56714610577578063355274ea1461059957806339509351146105ae576103a2565b806318160ddd1161034457806323b872dd1161031357806323b872dd1461050257806325ecc79f14610522578063282d3fdf146105425780632e723d5e14610562576103a2565b806318160ddd146104985780631a426d1c146104ad578063202b1760146104cd57806320606b70146104ed576103a2565b80630cb285e2116103805780630cb285e214610421578063102214081461044357806313c8181f14610463578063158ef93e14610483576103a2565b8063060cf4e8146103a757806306fdde03146103d2578063095ea7b3146103f4575b600080fd5b3480156103b357600080fd5b506103bc610a99565b6040516103c99190612c89565b60405180910390f35b3480156103de57600080fd5b506103e7610a9f565b6040516103c99190612cf8565b34801561040057600080fd5b5061041461040f3660046129a5565b610b31565b6040516103c99190612c7e565b34801561042d57600080fd5b5061044161043c366004612b92565b610b4f565b005b34801561044f57600080fd5b506103bc61045e36600461291e565b610bc5565b34801561046f57600080fd5b5061044161047e36600461291e565b610bd7565b34801561048f57600080fd5b50610414610c2f565b3480156104a457600080fd5b506103bc610c38565b3480156104b957600080fd5b506104416104c8366004612b0e565b610c3e565b3480156104d957600080fd5b506103bc6104e836600461291e565b610c9f565b3480156104f957600080fd5b506103bc610d65565b34801561050e57600080fd5b5061041461051d36600461296a565b610d89565b34801561052e57600080fd5b506103bc61053d36600461291e565b610e10565b34801561054e57600080fd5b5061044161055d3660046129a5565b610e22565b34801561056e57600080fd5b50610414610f81565b34801561058357600080fd5b5061058c610f91565b6040516103c991906132be565b3480156105a557600080fd5b506103bc610f96565b3480156105ba57600080fd5b506104146105c93660046129a5565b610f9c565b3480156105da57600080fd5b506103bc610fea565b3480156105ef57600080fd5b506104416105fe366004612b92565b610ff0565b34801561060f57600080fd5b5061044161061e3660046129a5565b61105b565b34801561062f57600080fd5b5061044161063e36600461291e565b6110c4565b34801561064f57600080fd5b5061044161065e36600461291e565b61112d565b610441610671366004612a82565b61119a565b34801561068257600080fd5b506103bc61069136600461291e565b611219565b3480156106a257600080fd5b506103bc611246565b3480156106b757600080fd5b506106cb6106c636600461291e565b61126a565b6040516103c99190612c10565b3480156106e457600080fd5b506103bc6106f336600461291e565b611288565b34801561070457600080fd5b506106cb6112a3565b34801561071957600080fd5b5061044161072836600461291e565b6112b2565b34801561073957600080fd5b506103bc6112bc565b34801561074e57600080fd5b5061076261075d36600461291e565b6112c2565b6040516103c99190613297565b34801561077b57600080fd5b506103bc61078a36600461291e565b6112da565b34801561079b57600080fd5b506104416112f5565b3480156107b057600080fd5b506103bc6107bf3660046129a5565b611374565b3480156107d057600080fd5b506103bc6107df36600461291e565b611599565b3480156107f057600080fd5b506103bc6107ff36600461291e565b6115ab565b34801561081057600080fd5b506106cb6115c6565b34801561082557600080fd5b506103bc6115d5565b34801561083a57600080fd5b506103bc6115db565b34801561084f57600080fd5b506103e76115ea565b34801561086457600080fd5b5061044161087336600461291e565b6115f9565b34801561088457600080fd5b506104146108933660046129a5565b6116e7565b3480156108a457600080fd5b5061044161174f565b3480156108b957600080fd5b506104146108c83660046129a5565b6117fa565b3480156108d957600080fd5b506103bc6108e836600461291e565b61180e565b3480156108f957600080fd5b506104416109083660046129a5565b611883565b34801561091957600080fd5b5061041461092836600461291e565b6118d3565b34801561093957600080fd5b50610441610948366004612b92565b6118e8565b34801561095957600080fd5b506104416109683660046129ce565b611953565b34801561097957600080fd5b506103bc611b29565b34801561098e57600080fd5b5061044161099d36600461291e565b611b33565b3480156109ae57600080fd5b506103bc6109bd366004612938565b611b8d565b3480156109ce57600080fd5b506103bc611bb8565b3480156109e357600080fd5b506104416109f23660046129a5565b611bbe565b348015610a0357600080fd5b506103bc611c5a565b348015610a1857600080fd5b506103bc611c60565b348015610a2d57600080fd5b50610a41610a3c366004612a2c565b611c84565b6040516103c99291906132a8565b348015610a5b57600080fd5b50610441610a6a36600461291e565b611cb1565b348015610a7b57600080fd5b506103bc611d68565b348015610a9057600080fd5b506103bc611d6e565b60085481565b606060038054610aae9061339e565b80601f0160208091040260200160405190810160405280929190818152602001828054610ada9061339e565b8015610b275780601f10610afc57610100808354040283529160200191610b27565b820191906000526020600020905b815481529060010190602001808311610b0a57829003601f168201915b5050505050905090565b6000610b45610b3e611d84565b8484611d88565b5060015b92915050565b3360009081526006602052604090205460ff1680610b7c575033610b716115c6565b6001600160a01b0316145b610b8557600080fd5b600b8190556040517f29bc55fd95a117c66d70de9145ff3f2c0846379948edec40e14a00124249e98390610bba908390612c89565b60405180910390a150565b600f6020526000908152604090205481565b3360009081526006602052604090205460ff1680610c04575033610bf96115c6565b6001600160a01b0316145b610c0d57600080fd5b601080546001600160a01b0319166001600160a01b0392909216919091179055565b60075460ff1681565b60025490565b60075460ff1615610c6a5760405162461bcd60e51b8152600401610c6190612ed0565b60405180910390fd5b610c748686611e3c565b610c7c611e68565b600893909355600c91909155600a55600b5550506007805460ff19166001179055565b6000600a54431015610cb357506000610d60565b600b544310610cdb57506001600160a01b0381166000908152600e6020526040902054610d60565b6001600160a01b0382166000908152600f6020526040812054610cff904390611e95565b6001600160a01b0384166000908152600f6020526040812054600b549293509091610d2991611e95565b6001600160a01b0385166000908152600e6020526040902054909150610d5b908290610d559085611ed7565b90611f1c565b925050505b919050565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6000610d96848484611f5e565b610e0684610da2611d84565b610e01856040518060600160405280602881526020016134ba602891396001600160a01b038a16600090815260016020526040812090610de0611d84565b6001600160a01b031681526020810191909152604001600020549190611f9b565b611d88565b5060019392505050565b600e6020526000908152604090205481565b3360009081526006602052604090205460ff1680610e4f575033610e446115c6565b6001600160a01b0316145b610e5857600080fd5b6001600160a01b038216610e7e5760405162461bcd60e51b8152600401610c61906131c9565b610e87826112da565b811115610ea65760405162461bcd60e51b8152600401610c6190612fa0565b610eb1823083611f5e565b6001600160a01b0382166000908152600e6020526040902054610ed49082611fd5565b6001600160a01b0383166000908152600e6020526040902055600954610efa9082611fd5565b600955600a546001600160a01b0383166000908152600f60205260409020541015610f3c57600a546001600160a01b0383166000908152600f60205260409020555b816001600160a01b03167f625fed9875dada8643f2418b838ae0bc78d9a148a18eee4ee1979ff0f3f5d42782604051610f759190612c89565b60405180910390a25050565b601054600160a01b900460ff1681565b601290565b60085490565b6000610b45610fa9611d84565b84610e018560016000610fba611d84565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490611fd5565b60095490565b3360009081526006602052604090205460ff168061101d5750336110126115c6565b6001600160a01b0316145b61102657600080fd5b60088190556040517f7bf5040cdccd155f02a139290defa050a59f6bfa3caa1891ab18f7929463066190610bba908390612c89565b3360009081526006602052604090205460ff168061108857503361107d6115c6565b6001600160a01b0316145b61109157600080fd5b61109b8282612004565b6001600160a01b038083166000908152601160205260408120546110c09216836120ec565b5050565b3360009081526006602052604090205460ff16806110f15750336110e66115c6565b6001600160a01b0316145b6110fa57600080fd5b60075460ff1615156001146111215760405162461bcd60e51b8152600401610c6190613237565b61112a8161224b565b50565b3360009081526006602052604090205460ff168061115a57503361114f6115c6565b6001600160a01b0316145b61116357600080fd5b6001600160a01b03811633141561117957600080fd5b6001600160a01b03166000908152600660205260409020805460ff19169055565b6111a4338461231e565b60105460405163efe97aa760e01b81526001600160a01b039091169063efe97aa79034906111e09033908790899088908d908d90600401612c24565b6000604051808303818588803b1580156111f957600080fd5b505af115801561120d573d6000803e3d6000fd5b50505050505050505050565b6000610b49611227836112da565b6001600160a01b0384166000908152600e602052604090205490611fd5565b7fc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf790565b6001600160a01b039081166000908152601160205260409020541690565b6001600160a01b03166000908152600e602052604090205490565b6010546001600160a01b031681565b61112a33826123f4565b600a5481565b60136020526000908152604090205463ffffffff1681565b6001600160a01b031660009081526020819052604090205490565b6112fd611d84565b6005546001600160a01b0390811691161461132a5760405162461bcd60e51b8152600401610c6190613018565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b60004382106113955760405162461bcd60e51b8152600401610c6190612e82565b6001600160a01b03831660009081526013602052604090205463ffffffff16806113c3576000915050610b49565b6001600160a01b038416600090815260126020526040812084916113e8600185613379565b63ffffffff90811682526020820192909252604001600020541611611451576001600160a01b03841660009081526012602052604081209061142b600184613379565b63ffffffff1663ffffffff16815260200190815260200160002060010154915050610b49565b6001600160a01b038416600090815260126020908152604080832083805290915290205463ffffffff1683101561148c576000915050610b49565b60008061149a600184613379565b90505b8163ffffffff168163ffffffff16111561156257600060026114bf8484613379565b6114c99190613320565b6114d39083613379565b6001600160a01b038816600090815260126020908152604080832063ffffffff808616855290835292819020815180830190925280549093168082526001909301549181019190915291925087141561153657602001519450610b499350505050565b805163ffffffff1687111561154d5781935061155b565b611558600183613379565b92505b505061149d565b506001600160a01b038516600090815260126020908152604080832063ffffffff9094168352929052206001015491505092915050565b60146020526000908152604090205481565b6001600160a01b03166000908152600f602052604090205490565b6005546001600160a01b031690565b600b5481565b60006115e5610c38565b905090565b606060048054610aae9061339e565b336000908152600e6020526040808220546001600160a01b038416835291205461162291611fd5565b6001600160a01b0382166000908152600e6020908152604080832093909355600a54600f90915291902054101561167057600a546001600160a01b0382166000908152600f60205260409020555b336000908152600f6020526040808220546001600160a01b038416835291205410156116b757336000908152600f6020526040808220546001600160a01b03841683529120555b336000818152600e60209081526040808320839055600f90915281205561112a90826116e2826112da565b611f5e565b6000610b456116f4611d84565b84610e01856040518060600160405280602581526020016134e2602591396001600061171e611d84565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190611f9b565b336000908152600e602052604090205461177b5760405162461bcd60e51b8152600401610c619061304d565b600061178633610c9f565b9050611791306112da565b8111156117a4576117a1306112da565b90505b6117af303383611f5e565b336000908152600e60205260409020546117c99082611e95565b336000908152600e6020908152604080832093909355600f9052204390556009546117f49082611e95565b60095550565b6000610b45611807611d84565b8484611f5e565b6001600160a01b03811660009081526013602052604081205463ffffffff168061183957600061187c565b6001600160a01b03831660009081526012602052604081209061185d600184613379565b63ffffffff1663ffffffff168152602001908152602001600020600101545b9392505050565b6010546001600160a01b0316331461189a57600080fd5b6118a43082612004565b6010805460ff60a01b1916600160a01b1790556118c2308383611f5e565b50506010805460ff60a01b19169055565b60066020526000908152604090205460ff1681565b3360009081526006602052604090205460ff168061191557503361190a6115c6565b6001600160a01b0316145b61191e57600080fd5b600a8190556040517ffb58e149398631189eceb27368c1e4c08cb7f603e7ae18810fe2f34f775bbf7190610bba908390612c89565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86661197e610a9f565b8051906020012061198d612489565b306040516020016119a19493929190612cb6565b60405160208183030381529060405280519060200120905060007fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf8888886040516020016119f29493929190612c92565b60405160208183030381529060405280519060200120905060008282604051602001611a1f929190612bf5565b604051602081830303815290604052805190602001209050600060018288888860405160008152602001604052604051611a5c9493929190612cda565b6020604051602081039080840390855afa158015611a7e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611ab15760405162461bcd60e51b8152600401610c619061307b565b6001600160a01b0381166000908152601460205260408120805491611ad5836133d9565b919050558914611af75760405162461bcd60e51b8152600401610c6190612f57565b87421115611b175760405162461bcd60e51b8152600401610c6190612d76565b61120d818b6123f4565b505050505050565b60006115e5610fea565b3360009081526006602052604090205460ff1680611b60575033611b556115c6565b6001600160a01b0316145b611b6957600080fd5b6001600160a01b03166000908152600660205260409020805460ff19166001179055565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60095481565b3360009081526006602052604090205460ff1680611beb575033611be06115c6565b6001600160a01b0316145b611bf457600080fd5b600c54600d5410611c175760405162461bcd60e51b8152600401610c6190612f07565b611c218282612004565b6001600160a01b03808316600090815260116020526040812054611c469216836120ec565b600d54611c539082611fd5565b600d555050565b600d5481565b7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b60126020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b611cb9611d84565b6005546001600160a01b03908116911614611ce65760405162461bcd60e51b8152600401610c6190613018565b6001600160a01b038116611d0c5760405162461bcd60e51b8152600401610c6190612dc3565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600c5481565b60006115e5600954611d7e610c38565b90611e95565b3390565b6001600160a01b038316611dae5760405162461bcd60e51b8152600401610c6190613185565b6001600160a01b038216611dd45760405162461bcd60e51b8152600401610c6190612e09565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611e2f908590612c89565b60405180910390a3505050565b8151611e4f9060039060208501906127ed565b508051611e639060049060208401906127ed565b505050565b6000611e72611d84565b600580546001600160a01b0319166001600160a01b039290921691909117905550565b600061187c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611f9b565b600082611ee657506000610b49565b6000611ef28385613343565b905082611eff858361330c565b1461187c5760405162461bcd60e51b8152600401610c6190612fd7565b600061187c83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061248d565b611f698383836124bb565b6001600160a01b03808416600090815260116020526040808220548584168352912054611e63929182169116836120ec565b60008184841115611fbf5760405162461bcd60e51b8152600401610c619190612cf8565b506000611fcc8486613362565b95945050505050565b600080611fe283856132cc565b90508381101561187c5760405162461bcd60e51b8152600401610c6190612e4b565b6001600160a01b03821661202a5760405162461bcd60e51b8152600401610c6190613200565b612036600083836125d0565b6002546120439082611fd5565b6002556001600160a01b0382166000908152602081905260409020546120699082611fd5565b6001600160a01b03831660009081526020819052604090205561208a611d84565b6001600160a01b031673df4fbd76a71a34c88bf428783c8849e193d4bd7a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516120e09190612c89565b60405180910390a35050565b816001600160a01b0316836001600160a01b03161415801561210e5750600081115b15611e63576001600160a01b038316156121b1576001600160a01b03831660009081526013602052604081205463ffffffff16908161214e576000612191565b6001600160a01b038516600090815260126020526040812090612172600185613379565b63ffffffff1663ffffffff168152602001908152602001600020600101545b9050600061219f8285611e95565b90506121ad8684848461261c565b5050505b6001600160a01b03821615611e63576001600160a01b03821660009081526013602052604081205463ffffffff1690816121ec57600061222f565b6001600160a01b038416600090815260126020526040812090612210600185613379565b63ffffffff1663ffffffff168152602001908152602001600020600101545b9050600061223d8285611fd5565b9050611b218584848461261c565b806001600160a01b03166352d1902d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561228457600080fd5b505afa158015612298573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122bc9190612a6a565b7fc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7146122fa5760405162461bcd60e51b8152600401610c6190612d4e565b7fc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf755565b6001600160a01b0382166123445760405162461bcd60e51b8152600401610c61906130c8565b612350826000836125d0565b61238d81604051806060016040528060228152602001613437602291396001600160a01b0385166000908152602081905260409020549190611f9b565b6001600160a01b0383166000908152602081905260409020556002546123b39082611e95565b6002556040516000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906120e0908590612c89565b6001600160a01b038083166000908152601160205260408120549091169061241b846112da565b6001600160a01b0385811660008181526011602052604080822080546001600160a01b031916898616908117909155905194955093928616927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46124838284836120ec565b50505050565b4690565b600081836124ae5760405162461bcd60e51b8152600401610c619190612cf8565b506000611fcc848661330c565b6001600160a01b0383166124e15760405162461bcd60e51b8152600401610c6190613109565b6001600160a01b0382166125075760405162461bcd60e51b8152600401610c6190612d0b565b6125128383836125d0565b61254f81604051806060016040528060268152602001613459602691396001600160a01b0386166000908152602081905260409020549190611f9b565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461257e9082611fd5565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611e2f908590612c89565b6125db838383611e63565b6001600160a01b038316611e63576008546125fe826125f8610c38565b90611fd5565b1115611e635760405162461bcd60e51b8152600401610c619061314e565b6000612640436040518060600160405280603b815260200161347f603b91396127bd565b905060008463ffffffff1611801561269a57506001600160a01b038516600090815260126020526040812063ffffffff83169161267e600188613379565b63ffffffff908116825260208201929092526040016000205416145b156126e3576001600160a01b038516600090815260126020526040812083916126c4600188613379565b63ffffffff168152602081019190915260400160002060010155612773565b60408051808201825263ffffffff838116825260208083018681526001600160a01b038a166000908152601283528581208a851682529092529390209151825463ffffffff1916911617815590516001918201556127429085906132e4565b6001600160a01b0386166000908152601360205260409020805463ffffffff191663ffffffff929092169190911790555b846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72484846040516127ae929190613289565b60405180910390a25050505050565b60008164010000000084106127e55760405162461bcd60e51b8152600401610c619190612cf8565b509192915050565b8280546127f99061339e565b90600052602060002090601f01602090048101928261281b5760008555612861565b82601f1061283457805160ff1916838001178555612861565b82800160010185558215612861579182015b82811115612861578251825591602001919060010190612846565b5061286d929150612871565b5090565b5b8082111561286d5760008155600101612872565b80356001600160a01b0381168114610d6057600080fd5b600082601f8301126128ad578081fd5b813567ffffffffffffffff808211156128c8576128c8613420565b604051601f8301601f1916810160200182811182821017156128ec576128ec613420565b604052828152848301602001861015612903578384fd5b82602086016020830137918201602001929092529392505050565b60006020828403121561292f578081fd5b61187c82612886565b6000806040838503121561294a578081fd5b61295383612886565b915061296160208401612886565b90509250929050565b60008060006060848603121561297e578081fd5b61298784612886565b925061299560208501612886565b9150604084013590509250925092565b600080604083850312156129b7578182fd5b6129c083612886565b946020939093013593505050565b60008060008060008060c087890312156129e6578182fd5b6129ef87612886565b95506020870135945060408701359350606087013560ff81168114612a12578283fd5b9598949750929560808101359460a0909101359350915050565b60008060408385031215612a3e578182fd5b612a4783612886565b9150602083013563ffffffff81168114612a5f578182fd5b809150509250929050565b600060208284031215612a7b578081fd5b5051919050565b600080600080600060a08688031215612a99578081fd5b853567ffffffffffffffff80821115612ab0578283fd5b612abc89838a0161289d565b96506020880135915080821115612ad1578283fd5b50612ade8882890161289d565b94505060408601359250612af460608701612886565b9150612b0260808701612886565b90509295509295909350565b60008060008060008060c08789031215612b26578182fd5b863567ffffffffffffffff80821115612b3d578384fd5b612b498a838b0161289d565b97506020890135915080821115612b5e578384fd5b50612b6b89828a0161289d565b96999698505050506040850135946060810135946080820135945060a09091013592509050565b600060208284031215612ba3578081fd5b5035919050565b60008151808452815b81811015612bcf57602081850181015186830182015201612bb3565b81811115612be05782602083870101525b50601f01601f19169290920160200192915050565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6001600160a01b0387811682528681166020830152604082018690528416606082015260c060808201819052600090612c5f90830185612baa565b82810360a0840152612c718185612baa565b9998505050505050505050565b901515815260200190565b90815260200190565b9384526001600160a01b039290921660208401526040830152606082015260800190565b938452602084019290925260408301526001600160a01b0316606082015260800190565b93845260ff9290921660208401526040830152606082015260800190565b60006020825261187c6020830184612baa565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252600e908201526d4e6f7420636f6d70617469626c6560901b604082015260600190565b6020808252602d908201527f486f6b6b4669546f6b656e3a3a64656c656761746542795369673a207369676e60408201526c185d1d5c9948195e1c1a5c9959609a1b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252602e908201527f486f6b6b4669546f6b656e3a3a6765745072696f72566f7465733a206e6f742060408201526d1e595d0819195d195c9b5a5b995960921b606082015260800190565b6020808252601f908201527f436f6e747261637420697320616c726561647920696e697469616c697a656400604082015260600190565b60208082526030908201527f45524332303a206d616e75616c4d696e7465642067726561746572207468616e60408201526f081b585b9d585b135a5b9d131a5b5a5d60821b606082015260800190565b60208082526029908201527f486f6b6b4669546f6b656e3a3a64656c656761746542795369673a20696e76616040820152686c6964206e6f6e636560b81b606082015260800190565b6020808252601f908201527f45524332303a206c6f636b20616d6f756e74206f7665722062616c616e636500604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526014908201527345524332303a2063616e6e6f7420756e6c6f636b60601b604082015260600190565b6020808252602d908201527f486f6b6b4669546f6b656e3a3a64656c656761746542795369673a20696e766160408201526c6c6964207369676e617475726560981b606082015260800190565b60208082526021908201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526019908201527f45524332304361707065643a2063617020657863656564656400000000000000604082015260600190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b6020808252601f908201527f45524332303a206c6f636b20746f20746865207a65726f206164647265737300604082015260600190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b60208082526032908201527f546865206c696272617279206973206c6f636b65642e204e6f206469726563746040820152710809d8d85b1b09c81a5cc8185b1b1bddd95960721b606082015260800190565b918252602082015260400190565b63ffffffff91909116815260200190565b63ffffffff929092168252602082015260400190565b60ff91909116815260200190565b600082198211156132df576132df6133f4565b500190565b600063ffffffff808316818516808303821115613303576133036133f4565b01949350505050565b60008261331b5761331b61340a565b500490565b600063ffffffff808416806133375761333761340a565b92169190910492915050565b600081600019048311821515161561335d5761335d6133f4565b500290565b600082821015613374576133746133f4565b500390565b600063ffffffff83811690831681811015613396576133966133f4565b039392505050565b6002810460018216806133b257607f821691505b602082108114156133d357634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156133ed576133ed6133f4565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fdfe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365486f6b6b4669546f6b656e3a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d6265722065786365656473203332206269747345524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220eb9d06d85964ce480235102f7b6494a602b283487df68afef2f8b457fd41ef7f64736f6c63430008000033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000006547265617473000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000065452454154530000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): Treats
Arg [1] : _symbol (string): TREATS
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [3] : 5472656174730000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [5] : 5452454154530000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
26221:16873:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25837:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15459:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;17626:169::-;;;;;;;;;;-1:-1:-1;17626:169:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;28039:155::-;;;;;;;;;;-1:-1:-1;28039:155:0;;;;;:::i;:::-;;:::i;:::-;;26088:51;;;;;;;;;;-1:-1:-1;26088:51:0;;;;;:::i;:::-;;:::i;33266:102::-;;;;;;;;;;-1:-1:-1;33266:102:0;;;;;:::i;:::-;;:::i;25366:31::-;;;;;;;;;;;;;:::i;16579:108::-;;;;;;;;;;;;;:::i;26737:552::-;;;;;;;;;;-1:-1:-1;26737:552:0;;;;;:::i;:::-;;:::i;31601:522::-;;;;;;;;;;-1:-1:-1;31601:522:0;;;;;:::i;:::-;;:::i;35049:155::-;;;;;;;;;;;;;:::i;18277:355::-;;;;;;;;;;-1:-1:-1;18277:355:0;;;;;:::i;:::-;;:::i;26040:41::-;;;;;;;;;;-1:-1:-1;26040:41:0;;;;;:::i;:::-;;:::i;30992:601::-;;;;;;;;;;-1:-1:-1;30992:601:0;;;;;:::i;:::-;;:::i;26178:20::-;;;;;;;;;;;;;:::i;16421:93::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;27500:77::-;;;;;;;;;;;;;:::i;19041:218::-;;;;;;;;;;-1:-1:-1;19041:218:0;;;;;:::i;:::-;;:::i;28532:87::-;;;;;;;;;;;;;:::i;27668:124::-;;;;;;;;;;-1:-1:-1;27668:124:0;;;;;:::i;:::-;;:::i;30086:169::-;;;;;;;;;;-1:-1:-1;30086:169:0;;;;;:::i;:::-;;:::i;27297:119::-;;;;;;;;;;-1:-1:-1;27297:119:0;;;;;:::i;:::-;;:::i;24436:160::-;;;;;;;;;;-1:-1:-1;24436:160:0;;;;;:::i;:::-;;:::i;33376:426::-;;;;;;:::i;:::-;;:::i;30599:138::-;;;;;;;;;;-1:-1:-1;30599:138:0;;;;;:::i;:::-;;:::i;25176:147::-;;;;;;;;;;;;;:::i;36148:117::-;;;;;;;;;;-1:-1:-1;36148:117:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;30745:106::-;;;;;;;;;;-1:-1:-1;30745:106:0;;;;;:::i;:::-;;:::i;26146:25::-;;;;;;;;;;;;;:::i;36413:104::-;;;;;;;;;;-1:-1:-1;36413:104:0;;;;;:::i;:::-;;:::i;25895:28::-;;;;;;;;;;;;;:::i;34928:48::-;;;;;;;;;;-1:-1:-1;34928:48:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;16750:127::-;;;;;;;;;;-1:-1:-1;16750:127:0;;;;;:::i;:::-;;:::i;9219:148::-;;;;;;;;;;;;;:::i;39030:1300::-;;;;;;;;;;-1:-1:-1;39030:1300:0;;;;;:::i;:::-;;:::i;35505:41::-;;;;;;;;;;-1:-1:-1;35505:41:0;;;;;:::i;:::-;;:::i;30859:125::-;;;;;;;;;;-1:-1:-1;30859:125:0;;;;;:::i;:::-;;:::i;8577:79::-;;;;;;;;;;;;;:::i;25930:26::-;;;;;;;;;;;;;:::i;28424:100::-;;;;;;;;;;;;;:::i;15678:104::-;;;;;;;;;;;;;:::i;32733:519::-;;;;;;;;;;-1:-1:-1;32733:519:0;;;;;:::i;:::-;;:::i;19762:269::-;;;;;;;;;;-1:-1:-1;19762:269:0;;;;;:::i;:::-;;:::i;32131:510::-;;;;;;;;;;;;;:::i;17090:175::-;;;;;;;;;;-1:-1:-1;17090:175:0;;;;;:::i;:::-;;:::i;38363:236::-;;;;;;;;;;-1:-1:-1;38363:236:0;;;;;:::i;:::-;;:::i;33810:228::-;;;;;;;;;;-1:-1:-1;33810:228:0;;;;;:::i;:::-;;:::i;24149:42::-;;;;;;;;;;-1:-1:-1;24149:42:0;;;;;:::i;:::-;;:::i;27833:167::-;;;;;;;;;;-1:-1:-1;27833:167:0;;;;;:::i;:::-;;:::i;36951:1211::-;;;;;;;;;;-1:-1:-1;36951:1211:0;;;;;:::i;:::-;;:::i;28323:93::-;;;;;;;;;;;;;:::i;24321:107::-;;;;;;;;;;-1:-1:-1;24321:107:0;;;;;:::i;:::-;;:::i;17328:151::-;;;;;;;;;;-1:-1:-1;17328:151:0;;;;;:::i;:::-;;:::i;25863:25::-;;;;;;;;;;;;;:::i;30263:328::-;;;;;;;;;;-1:-1:-1;30263:328:0;;;;;:::i;:::-;;:::i;26000:31::-;;;;;;;;;;;;;:::i;35298:126::-;;;;;;;;;;;;;:::i;34791:68::-;;;;;;;;;;-1:-1:-1;34791:68:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;9522:244::-;;;;;;;;;;-1:-1:-1;9522:244:0;;;;;:::i;:::-;;:::i;25963:30::-;;;;;;;;;;;;;:::i;28202:113::-;;;;;;;;;;;;;:::i;25837:19::-;;;;:::o;15459:100::-;15513:13;15546:5;15539:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15459:100;:::o;17626:169::-;17709:4;17726:39;17735:12;:10;:12::i;:::-;17749:7;17758:6;17726:8;:39::i;:::-;-1:-1:-1;17783:4:0;17626:169;;;;;:::o;28039:155::-;24256:10;24245:22;;;;:10;:22;;;;;;;;;:47;;-1:-1:-1;24282:10:0;24271:7;:5;:7::i;:::-;-1:-1:-1;;;;;24271:21:0;;24245:47;24237:56;;;;;;28116:11:::1;:24:::0;;;28156:30:::1;::::0;::::1;::::0;::::1;::::0;28130:10;;28156:30:::1;:::i;:::-;;;;;;;;28039:155:::0;:::o;26088:51::-;;;;;;;;;;;;;:::o;33266:102::-;24256:10;24245:22;;;;:10;:22;;;;;;;;;:47;;-1:-1:-1;24282:10:0;24271:7;:5;:7::i;:::-;-1:-1:-1;;;;;24271:21:0;;24245:47;24237:56;;;;;;33342:10:::1;:18:::0;;-1:-1:-1;;;;;;33342:18:0::1;-1:-1:-1::0;;;;;33342:18:0;;;::::1;::::0;;;::::1;::::0;;33266:102::o;25366:31::-;;;;;;:::o;16579:108::-;16667:12;;16579:108;:::o;26737:552::-;26980:11;;;;26979:12;26971:56;;;;-1:-1:-1;;;26971:56:0;;;;;;;:::i;:::-;;;;;;;;;27038:35;27058:5;27065:7;27038:19;:35::i;:::-;27084:23;:21;:23::i;:::-;27118:4;:11;;;;27140:15;:34;;;;27185:13;:30;27226:11;:26;-1:-1:-1;;27263:11:0;:18;;-1:-1:-1;;27263:18:0;-1:-1:-1;27263:18:0;;;26737:552::o;31601:522::-;31664:7;31703:13;;31688:12;:28;31684:432;;;-1:-1:-1;31740:1:0;31733:8;;31684:432;31779:11;;31763:12;:27;31759:357;;-1:-1:-1;;;;;;31814:15:0;;;;;;:6;:15;;;;;;31807:22;;31759:357;-1:-1:-1;;;;;31902:25:0;;31862:20;31902:25;;;:16;:25;;;;;;31885:43;;:12;;:16;:43::i;:::-;-1:-1:-1;;;;;32002:25:0;;31943:23;32002:25;;;:16;:25;;;;;;31986:11;;31862:66;;-1:-1:-1;31943:23:0;;31986:42;;:15;:42::i;:::-;-1:-1:-1;;;;;32050:15:0;;;;;;:6;:15;;;;;;31943:85;;-1:-1:-1;32050:54:0;;31943:85;;32050:33;;32070:12;32050:19;:33::i;:::-;:37;;:54::i;:::-;32043:61;;;;31759:357;31601:522;;;:::o;35049:155::-;35100:104;35049:155;:::o;18277:355::-;18417:4;18434:36;18444:6;18452:9;18463:6;18434:9;:36::i;:::-;18481:121;18490:6;18498:12;:10;:12::i;:::-;18512:89;18550:6;18512:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18512:19:0;;;;;;:11;:19;;;;;;18532:12;:10;:12::i;:::-;-1:-1:-1;;;;;18512:33:0;;;;;;;;;;;;-1:-1:-1;18512:33:0;;;:89;:37;:89::i;:::-;18481:8;:121::i;:::-;-1:-1:-1;18620:4:0;18277:355;;;;;:::o;26040:41::-;;;;;;;;;;;;;:::o;30992:601::-;24256:10;24245:22;;;;:10;:22;;;;;;;;;:47;;-1:-1:-1;24282:10:0;24271:7;:5;:7::i;:::-;-1:-1:-1;;;;;24271:21:0;;24245:47;24237:56;;;;;;-1:-1:-1;;;;;31083:21:0;::::1;31075:65;;;;-1:-1:-1::0;;;31075:65:0::1;;;;;;;:::i;:::-;31184:18;31194:7;31184:9;:18::i;:::-;31173:7;:29;;31151:110;;;;-1:-1:-1::0;;;31151:110:0::1;;;;;;;:::i;:::-;31274:42;31284:7;31301:4;31308:7;31274:9;:42::i;:::-;-1:-1:-1::0;;;;;31347:15:0;::::1;;::::0;;;:6:::1;:15;::::0;;;;;:28:::1;::::0;31367:7;31347:19:::1;:28::i;:::-;-1:-1:-1::0;;;;;31329:15:0;::::1;;::::0;;;:6:::1;:15;::::0;;;;:46;31399:10:::1;::::0;:23:::1;::::0;31414:7;31399:14:::1;:23::i;:::-;31386:10;:36:::0;31465:13:::1;::::0;-1:-1:-1;;;;;31437:25:0;::::1;;::::0;;;:16:::1;:25;::::0;;;;;:41:::1;31433:115;;;31523:13;::::0;-1:-1:-1;;;;;31495:25:0;::::1;;::::0;;;:16:::1;:25;::::0;;;;:41;31433:115:::1;31568:7;-1:-1:-1::0;;;;;31563:22:0::1;;31577:7;31563:22;;;;;;:::i;:::-;;;;;;;;30992:601:::0;;:::o;26178:20::-;;;-1:-1:-1;;;26178:20:0;;;;;:::o;16421:93::-;16504:2;16421:93;:::o;27500:77::-;27565:4;;27500:77;:::o;19041:218::-;19129:4;19146:83;19155:12;:10;:12::i;:::-;19169:7;19178:50;19217:10;19178:11;:25;19190:12;:10;:12::i;:::-;-1:-1:-1;;;;;19178:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;19178:25:0;;;:34;;;;;;;;;;;:38;:50::i;28532:87::-;28601:10;;28532:87;:::o;27668:124::-;24256:10;24245:22;;;;:10;:22;;;;;;;;;:47;;-1:-1:-1;24282:10:0;24271:7;:5;:7::i;:::-;-1:-1:-1;;;;;24271:21:0;;24245:47;24237:56;;;;;;27739:4:::1;:14:::0;;;27769:15:::1;::::0;::::1;::::0;::::1;::::0;27746:7;;27769:15:::1;:::i;30086:169::-:0;24256:10;24245:22;;;;:10;:22;;;;;;;;;:47;;-1:-1:-1;24282:10:0;24271:7;:5;:7::i;:::-;-1:-1:-1;;;;;24271:21:0;;24245:47;24237:56;;;;;;30165:19:::1;30171:3;30176:7;30165:5;:19::i;:::-;-1:-1:-1::0;;;;;30222:15:0;;::::1;30218:1;30222:15:::0;;;:10:::1;:15;::::0;;;;;30195:52:::1;::::0;30222:15:::1;30239:7:::0;30195:14:::1;:52::i;:::-;30086:169:::0;;:::o;27297:119::-;24256:10;24245:22;;;;:10;:22;;;;;;;;;:47;;-1:-1:-1;24282:10:0;24271:7;:5;:7::i;:::-;-1:-1:-1;;;;;24271:21:0;;24245:47;24237:56;;;;;;25620:11:::1;::::0;::::1;;:19;;:11:::0;:19:::1;25612:82;;;;-1:-1:-1::0;;;25612:82:0::1;;;;;;;:::i;:::-;27382:26:::2;27400:7;27382:17;:26::i;:::-;27297:119:::0;:::o;24436:160::-;24256:10;24245:22;;;;:10;:22;;;;;;;;;:47;;-1:-1:-1;24282:10:0;24271:7;:5;:7::i;:::-;-1:-1:-1;;;;;24271:21:0;;24245:47;24237:56;;;;;;-1:-1:-1;;;;;24524:23:0;::::1;24537:10;24524:23;;24516:32;;;::::0;::::1;;-1:-1:-1::0;;;;;24559:21:0::1;24583:5;24559:21:::0;;;:10:::1;:21;::::0;;;;:29;;-1:-1:-1;;24559:29:0::1;::::0;;24436:160::o;33376:426::-;33634:25;33640:10;33652:6;33634:5;:25::i;:::-;33681:10;;33670:124;;-1:-1:-1;;;33670:124:0;;-1:-1:-1;;;;;33681:10:0;;;;33670:35;;33714:9;;33670:124;;33726:10;;33738:9;;33749:6;;33757:11;;33770:8;;33780:13;;33670:124;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33376:426;;;;;:::o;30599:138::-;30663:7;30690:39;30710:18;30720:7;30710:9;:18::i;:::-;-1:-1:-1;;;;;30690:15:0;;;;;;:6;:15;;;;;;;:19;:39::i;25176:147::-;25249:66;25176:147;:::o;36148:117::-;-1:-1:-1;;;;;36236:21:0;;;36209:7;36236:21;;;:10;:21;;;;;;;;36148:117::o;30745:106::-;-1:-1:-1;;;;;30828:15:0;30801:7;30828:15;;;:6;:15;;;;;;;30745:106::o;26146:25::-;;;-1:-1:-1;;;;;26146:25:0;;:::o;36413:104::-;36477:32;36487:10;36499:9;36477;:32::i;25895:28::-;;;;:::o;34928:48::-;;;;;;;;;;;;;;;:::o;16750:127::-;-1:-1:-1;;;;;16851:18:0;16824:7;16851:18;;;;;;;;;;;;16750:127::o;9219:148::-;8799:12;:10;:12::i;:::-;8789:6;;-1:-1:-1;;;;;8789:6:0;;;:22;;;8781:67;;;;-1:-1:-1;;;8781:67:0;;;;;;;:::i;:::-;9310:6:::1;::::0;9289:40:::1;::::0;9326:1:::1;::::0;-1:-1:-1;;;;;9310:6:0::1;::::0;9289:40:::1;::::0;9326:1;;9289:40:::1;9340:6;:19:::0;;-1:-1:-1;;;;;;9340:19:0::1;::::0;;9219:148::o;39030:1300::-;39141:7;39202:12;39188:11;:26;39166:122;;;;-1:-1:-1;;;39166:122:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39323:23:0;;39301:19;39323:23;;;:14;:23;;;;;;;;39361:17;39357:58;;39402:1;39395:8;;;;;39357:58;-1:-1:-1;;;;;39475:20:0;;;;;;:11;:20;;;;;39527:11;;39496:16;39511:1;39496:12;:16;:::i;:::-;39475:38;;;;;;;;;;;;;;;-1:-1:-1;39475:38:0;:48;;:63;39471:147;;-1:-1:-1;;;;;39562:20:0;;;;;;:11;:20;;;;;;39583:16;39598:1;39583:12;:16;:::i;:::-;39562:38;;;;;;;;;;;;;;;:44;;;39555:51;;;;;39471:147;-1:-1:-1;;;;;39679:20:0;;;;;;:11;:20;;;;;;;;:23;;;;;;;;:33;:23;:33;:47;-1:-1:-1;39675:88:0;;;39750:1;39743:8;;;;;39675:88;39775:12;;39817:16;39832:1;39817:12;:16;:::i;:::-;39802:31;;39844:428;39859:5;39851:13;;:5;:13;;;39844:428;;;39881:13;39923:1;39906:13;39914:5;39906;:13;:::i;:::-;39905:19;;;;:::i;:::-;39897:27;;:5;:27;:::i;:::-;-1:-1:-1;;;;;39989:20:0;;39966;39989;;;:11;:20;;;;;;;;:28;;;;;;;;;;;;;39966:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;39881:43;;-1:-1:-1;40036:27:0;;40032:229;;;40091:8;;;;-1:-1:-1;40084:15:0;;-1:-1:-1;;;;40084:15:0;40032:229;40125:12;;:26;;;-1:-1:-1;40121:140:0;;;40180:6;40172:14;;40121:140;;;40235:10;40244:1;40235:6;:10;:::i;:::-;40227:18;;40121:140;39844:428;;;;;-1:-1:-1;;;;;;40289:20:0;;;;;;:11;:20;;;;;;;;:27;;;;;;;;;;:33;;;;-1:-1:-1;;39030:1300:0;;;;:::o;35505:41::-;;;;;;;;;;;;;:::o;30859:125::-;-1:-1:-1;;;;;30951:25:0;30924:7;30951:25;;;:16;:25;;;;;;;30859:125::o;8577:79::-;8642:6;;-1:-1:-1;;;;;8642:6:0;8577:79;:::o;25930:26::-;;;;:::o;28424:100::-;28476:7;28503:13;:11;:13::i;:::-;28496:20;;28424:100;:::o;15678:104::-;15734:13;15767:7;15760:14;;;;;:::i;32733:519::-;32824:10;32817:18;;;;:6;:18;;;;;;;-1:-1:-1;;;;;32801:11:0;;;;;;;:35;;:15;:35::i;:::-;-1:-1:-1;;;;;32787:11:0;;;;;;:6;:11;;;;;;;;:49;;;;32877:13;;32853:16;:21;;;;;;;:37;32849:107;;;32931:13;;-1:-1:-1;;;;;32907:21:0;;;;;;:16;:21;;;;;:37;32849:107;33013:10;32996:28;;;;:16;:28;;;;;;;-1:-1:-1;;;;;32972:21:0;;;;;;;:52;32968:137;;;33082:10;33065:28;;;;:16;:28;;;;;;;-1:-1:-1;;;;;33041:21:0;;;;;;:52;32968:137;33124:10;33138:1;33117:18;;;:6;:18;;;;;;;;:22;;;33150:16;:28;;;;;:32;33195:49;;33217:3;33222:21;33124:10;33222:9;:21::i;:::-;33195:9;:49::i;19762:269::-;19855:4;19872:129;19881:12;:10;:12::i;:::-;19895:7;19904:96;19943:15;19904:96;;;;;;;;;;;;;;;;;:11;:25;19916:12;:10;:12::i;:::-;-1:-1:-1;;;;;19904:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;19904:25:0;;;:34;;;;;;;;;;;:96;:38;:96::i;32131:510::-;32184:10;32198:1;32177:18;;;:6;:18;;;;;;32169:55;;;;-1:-1:-1;;;32169:55:0;;;;;;;:::i;:::-;32237:14;32254:27;32270:10;32254:15;:27::i;:::-;32237:44;;32331:24;32349:4;32331:9;:24::i;:::-;32322:6;:33;32318:99;;;32381:24;32399:4;32381:9;:24::i;:::-;32372:33;;32318:99;32427:44;32445:4;32452:10;32464:6;32427:9;:44::i;:::-;32510:10;32503:18;;;;:6;:18;;;;;;:30;;32526:6;32503:22;:30::i;:::-;32489:10;32482:18;;;;:6;:18;;;;;;;;:51;;;;32544:16;:28;;;32575:12;32544:43;;32611:10;;:22;;32626:6;32611:14;:22::i;:::-;32598:10;:35;-1:-1:-1;32131:510:0:o;17090:175::-;17176:4;17193:42;17203:12;:10;:12::i;:::-;17217:9;17228:6;17193:9;:42::i;38363:236::-;-1:-1:-1;;;;;38470:23:0;;38428:7;38470:23;;;:14;:23;;;;;;;;38524:16;:67;;38590:1;38524:67;;;-1:-1:-1;;;;;38543:20:0;;;;;;:11;:20;;;;;;38564:16;38579:1;38564:12;:16;:::i;:::-;38543:38;;;;;;;;;;;;;;;:44;;;38524:67;38504:87;38363:236;-1:-1:-1;;;38363:236:0:o;33810:228::-;26569:10;;-1:-1:-1;;;;;26569:10:0;26555;:24;26547:33;;;;;;33895:28:::1;33909:4;33916:6;33895:5;:28::i;:::-;33934:8;:15:::0;;-1:-1:-1;;;;33934:15:0::1;-1:-1:-1::0;;;33934:15:0::1;::::0;;33960:43:::1;33978:4;33985:9:::0;33996:6;33960:9:::1;:43::i;:::-;-1:-1:-1::0;;34014:8:0::1;:16:::0;;-1:-1:-1;;;;34014:16:0::1;::::0;;33810:228::o;24149:42::-;;;;;;;;;;;;;;;:::o;27833:167::-;24256:10;24245:22;;;;:10;:22;;;;;;;;;:47;;-1:-1:-1;24282:10:0;24271:7;:5;:7::i;:::-;-1:-1:-1;;;;;24271:21:0;;24245:47;24237:56;;;;;;27914:13:::1;:28:::0;;;27958:34:::1;::::0;::::1;::::0;::::1;::::0;27930:12;;27958:34:::1;:::i;36951:1211::-:0;37136:23;35100:104;37290:6;:4;:6::i;:::-;37274:24;;;;;;37321:12;:10;:12::i;:::-;37364:4;37203:185;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37175:228;;;;;;37136:267;;37416:18;35353:71;37510:9;37521:5;37528:6;37478:57;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37450:100;;;;;;37416:134;;37563:14;37650:15;37667:10;37621:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37593:100;;;;;;37563:130;;37706:17;37726:26;37736:6;37744:1;37747;37750;37726:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;37726:26:0;;-1:-1:-1;;37726:26:0;;;-1:-1:-1;;;;;;;37785:23:0;;37763:118;;;;-1:-1:-1;;;37763:118:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37923:17:0;;;;;;:6;:17;;;;;:19;;;;;;:::i;:::-;;;;;37914:5;:28;37892:119;;;;-1:-1:-1;;;37892:119:0;;;;;;;:::i;:::-;38049:6;38030:15;:25;;38022:83;;;;-1:-1:-1;;;38022:83:0;;;;;;;:::i;:::-;38123:31;38133:9;38144;38123;:31::i;36951:1211::-;;;;;;;:::o;28323:93::-;28370:7;28397:11;:9;:11::i;24321:107::-;24256:10;24245:22;;;;:10;:22;;;;;;;;;:47;;-1:-1:-1;24282:10:0;24271:7;:5;:7::i;:::-;-1:-1:-1;;;;;24271:21:0;;24245:47;24237:56;;;;;;-1:-1:-1;;;;;24395:18:0::1;;::::0;;;:10:::1;:18;::::0;;;;:25;;-1:-1:-1;;24395:25:0::1;24416:4;24395:25;::::0;;24321:107::o;17328:151::-;-1:-1:-1;;;;;17444:18:0;;;17417:7;17444:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;17328:151::o;25863:25::-;;;;:::o;30263:328::-;24256:10;24245:22;;;;:10;:22;;;;;;;;;:47;;-1:-1:-1;24282:10:0;24271:7;:5;:7::i;:::-;-1:-1:-1;;;;;24271:21:0;;24245:47;24237:56;;;;;;30371:15:::1;;30356:12;;:30;30348:91;;;;-1:-1:-1::0;;;30348:91:0::1;;;;;;;:::i;:::-;30450:19;30456:3;30461:7;30450:5;:19::i;:::-;-1:-1:-1::0;;;;;30507:15:0;;::::1;30503:1;30507:15:::0;;;:10:::1;:15;::::0;;;;;30480:52:::1;::::0;30507:15:::1;30524:7:::0;30480:14:::1;:52::i;:::-;30558:12;::::0;:25:::1;::::0;30575:7;30558:16:::1;:25::i;:::-;30543:12;:40:::0;-1:-1:-1;;30263:328:0:o;26000:31::-;;;;:::o;35298:126::-;35353:71;35298:126;:::o;34791:68::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9522:244::-;8799:12;:10;:12::i;:::-;8789:6;;-1:-1:-1;;;;;8789:6:0;;;:22;;;8781:67;;;;-1:-1:-1;;;8781:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9611:22:0;::::1;9603:73;;;;-1:-1:-1::0;;;9603:73:0::1;;;;;;;:::i;:::-;9713:6;::::0;9692:38:::1;::::0;-1:-1:-1;;;;;9692:38:0;;::::1;::::0;9713:6:::1;::::0;9692:38:::1;::::0;9713:6:::1;::::0;9692:38:::1;9741:6;:17:::0;;-1:-1:-1;;;;;;9741:17:0::1;-1:-1:-1::0;;;;;9741:17:0;;;::::1;::::0;;;::::1;::::0;;9522:244::o;25963:30::-;;;;:::o;28202:113::-;28251:7;28278:29;28296:10;;28278:13;:11;:13::i;:::-;:17;;:29::i;7697:98::-;7777:10;7697:98;:::o;22994:380::-;-1:-1:-1;;;;;23130:19:0;;23122:68;;;;-1:-1:-1;;;23122:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23209:21:0;;23201:68;;;;-1:-1:-1;;;23201:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23282:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;;:36;;;23334:32;;;;;23312:6;;23334:32;:::i;:::-;;;;;;;;22994:380;;;:::o;15239:150::-;15340:13;;;;:5;;:13;;;;;:::i;:::-;-1:-1:-1;15364:17:0;;;;:7;;:17;;;;;:::i;:::-;;15239:150;;:::o;8374:122::-;8427:17;8447:12;:10;:12::i;:::-;8470:6;:18;;-1:-1:-1;;;;;;8470:18:0;-1:-1:-1;;;;;8470:18:0;;;;;;;;;;-1:-1:-1;8374:122:0:o;3120:136::-;3178:7;3205:43;3209:1;3212;3205:43;;;;;;;;;;;;;;;;;:3;:43::i;4010:471::-;4068:7;4313:6;4309:47;;-1:-1:-1;4343:1:0;4336:8;;4309:47;4368:9;4380:5;4384:1;4380;:5;:::i;:::-;4368:17;-1:-1:-1;4413:1:0;4404:5;4408:1;4368:17;4404:5;:::i;:::-;:10;4396:56;;;;-1:-1:-1;;;4396:56:0;;;;;;;:::i;4957:132::-;5015:7;5042:39;5046:1;5049;5042:39;;;;;;;;;;;;;;;;;:3;:39::i;29710:267::-;29851:42;29867:6;29875:9;29886:6;29851:15;:42::i;:::-;-1:-1:-1;;;;;29919:18:0;;;;;;;:10;:18;;;;;;;29939:21;;;;;;;;29904:65;;29919:18;;;;29939:21;29962:6;29904:14;:65::i;3559:192::-;3645:7;3681:12;3673:6;;;;3665:29;;;;-1:-1:-1;;;3665:29:0;;;;;;;;:::i;:::-;-1:-1:-1;3705:9:0;3717:5;3721:1;3717;:5;:::i;:::-;3705:17;3559:192;-1:-1:-1;;;;;3559:192:0:o;2656:181::-;2714:7;;2746:5;2750:1;2746;:5;:::i;:::-;2734:17;;2775:1;2770;:6;;2762:46;;;;-1:-1:-1;;;2762:46:0;;;;;;;:::i;21381:424::-;-1:-1:-1;;;;;21465:21:0;;21457:65;;;;-1:-1:-1;;;21457:65:0;;;;;;;:::i;:::-;21535:49;21564:1;21568:7;21577:6;21535:20;:49::i;:::-;21612:12;;:24;;21629:6;21612:16;:24::i;:::-;21597:12;:39;-1:-1:-1;;;;;21668:18:0;;:9;:18;;;;;;;;;;;:30;;21691:6;21668:22;:30::i;:::-;-1:-1:-1;;;;;21647:18:0;;:9;:18;;;;;;;;;;:51;21776:12;:10;:12::i;:::-;-1:-1:-1;;;;;21714:83:0;21731:42;-1:-1:-1;;;;;21714:83:0;;21790:6;21714:83;;;;;;:::i;:::-;;;;;;;;21381:424;;:::o;40725:1123::-;40865:6;-1:-1:-1;;;;;40855:16:0;:6;-1:-1:-1;;;;;40855:16:0;;;:30;;;;;40884:1;40875:6;:10;40855:30;40851:990;;;-1:-1:-1;;;;;40906:20:0;;;40902:456;;-1:-1:-1;;;;;41014:22:0;;40995:16;41014:22;;;:14;:22;;;;;;;;;41096:13;:110;;41205:1;41096:110;;;-1:-1:-1;;;;;41137:19:0;;;;;;:11;:19;;;;;;41157:13;41169:1;41157:9;:13;:::i;:::-;41137:34;;;;;;;;;;;;;;;:40;;;41096:110;41055:151;-1:-1:-1;41225:17:0;41245:21;41055:151;41259:6;41245:13;:21::i;:::-;41225:41;;41285:57;41302:6;41310:9;41321;41332;41285:16;:57::i;:::-;40902:456;;;;-1:-1:-1;;;;;41378:20:0;;;41374:456;;-1:-1:-1;;;;;41486:22:0;;41467:16;41486:22;;;:14;:22;;;;;;;;;41568:13;:110;;41677:1;41568:110;;;-1:-1:-1;;;;;41609:19:0;;;;;;:11;:19;;;;;;41629:13;41641:1;41629:9;:13;:::i;:::-;41609:34;;;;;;;;;;;;;;;:40;;;41568:110;41527:151;-1:-1:-1;41697:17:0;41717:21;41527:151;41731:6;41717:13;:21::i;:::-;41697:41;;41757:57;41774:6;41782:9;41793;41804;41757:16;:57::i;24761:409::-;24939:10;-1:-1:-1;;;;;24929:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24858:66;24850:116;24828:180;;;;-1:-1:-1;;;24828:180:0;;;;;;;:::i;:::-;25073:66;25066:86;25028:135::o;22138:418::-;-1:-1:-1;;;;;22222:21:0;;22214:67;;;;-1:-1:-1;;;22214:67:0;;;;;;;:::i;:::-;22294:49;22315:7;22332:1;22336:6;22294:20;:49::i;:::-;22377:68;22400:6;22377:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22377:18:0;;:9;:18;;;;;;;;;;;;:68;:22;:68::i;:::-;-1:-1:-1;;;;;22356:18:0;;:9;:18;;;;;;;;;;:89;22471:12;;:24;;22488:6;22471:16;:24::i;:::-;22456:12;:39;22511:37;;22537:1;;-1:-1:-1;;;;;22511:37:0;;;;;;;22541:6;;22511:37;:::i;40338:379::-;-1:-1:-1;;;;;40441:21:0;;;40415:23;40441:21;;;:10;:21;;;;;;;;;;40500:20;40452:9;40500;:20::i;:::-;-1:-1:-1;;;;;40531:21:0;;;;;;;:10;:21;;;;;;:33;;-1:-1:-1;;;;;;40531:33:0;;;;;;;;;;40582:54;;40473:47;;-1:-1:-1;40531:33:0;40582:54;;;;;;40531:21;40582:54;40649:60;40664:15;40681:9;40692:16;40649:14;:60::i;:::-;40338:379;;;;:::o;42913:178::-;43039:9;42913:178;:::o;5585:278::-;5671:7;5706:12;5699:5;5691:28;;;;-1:-1:-1;;;5691:28:0;;;;;;;;:::i;:::-;-1:-1:-1;5730:9:0;5742:5;5746:1;5742;:5;:::i;20521:573::-;-1:-1:-1;;;;;20661:20:0;;20653:70;;;;-1:-1:-1;;;20653:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20742:23:0;;20734:71;;;;-1:-1:-1;;;20734:71:0;;;;;;;:::i;:::-;20818:47;20839:6;20847:9;20858:6;20818:20;:47::i;:::-;20898:71;20920:6;20898:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20898:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;20878:17:0;;;:9;:17;;;;;;;;;;;:91;;;;21003:20;;;;;;;:32;;21028:6;21003:24;:32::i;:::-;-1:-1:-1;;;;;20980:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;21051:35;;;;;;;;;;21079:6;;21051:35;:::i;28806:414::-;28949:44;28976:4;28982:2;28986:6;28949:26;:44::i;:::-;-1:-1:-1;;;;;29010:18:0;;29006:207;;29136:4;;29107:25;29125:6;29107:13;:11;:13::i;:::-;:17;;:25::i;:::-;:33;;29081:120;;;;-1:-1:-1;;;29081:120:0;;;;;;;:::i;41856:845::-;42021:18;42055:132;42080:12;42055:132;;;;;;;;;;;;;;;;;:6;:132::i;:::-;42021:166;;42233:1;42218:12;:16;;;:98;;;;-1:-1:-1;;;;;;42251:22:0;;;;;;:11;:22;;;;;:65;;;;42274:16;42289:1;42274:12;:16;:::i;:::-;42251:40;;;;;;;;;;;;;;;-1:-1:-1;42251:40:0;:50;;:65;42218:98;42200:425;;;-1:-1:-1;;;;;42343:22:0;;;;;;:11;:22;;;;;42392:8;;42366:16;42381:1;42366:12;:16;:::i;:::-;42343:40;;;;;;;;;;;;;-1:-1:-1;42343:40:0;:46;;:57;42200:425;;;42472:82;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42433:22:0;;-1:-1:-1;42433:22:0;;;:11;:22;;;;;:36;;;;;;;;;;;:121;;;;-1:-1:-1;;42433:121:0;;;;;;;;-1:-1:-1;42433:121:0;;;;42597:16;;42433:36;;42597:16;:::i;:::-;-1:-1:-1;;;;;42569:25:0;;;;;;:14;:25;;;;;:44;;-1:-1:-1;;42569:44:0;;;;;;;;;;;;42200:425;42663:9;-1:-1:-1;;;;;42642:51:0;;42674:8;42684;42642:51;;;;;;;:::i;:::-;;;;;;;;41856:845;;;;;:::o;42709:196::-;42814:6;42857:12;42850:5;42846:9;;42838:32;;;;-1:-1:-1;;;42838:32:0;;;;;;;;:::i;:::-;-1:-1:-1;42895:1:0;;42709:196;-1:-1:-1;;42709:196:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:175:1;84:20;;-1:-1:-1;;;;;133:31:1;;123:42;;113:2;;179:1;176;169:12;194:713;;292:3;285:4;277:6;273:17;269:27;259:2;;314:5;307;300:20;259:2;354:6;341:20;380:18;417:2;413;410:10;407:2;;;423:18;;:::i;:::-;472:2;466:9;541:2;522:13;;-1:-1:-1;;518:27:1;506:40;;548:4;502:51;568:18;;;588:22;;;565:46;562:2;;;614:18;;:::i;:::-;650:2;643:22;674:18;;;711:15;;;728:4;707:26;704:35;-1:-1:-1;701:2:1;;;756:5;749;742:20;701:2;824;817:4;809:6;805:17;798:4;790:6;786:17;773:54;847:15;;;864:4;843:26;836:41;;;;851:6;249:658;-1:-1:-1;;;249:658:1:o;912:198::-;;1024:2;1012:9;1003:7;999:23;995:32;992:2;;;1045:6;1037;1030:22;992:2;1073:31;1094:9;1073:31;:::i;1115:274::-;;;1244:2;1232:9;1223:7;1219:23;1215:32;1212:2;;;1265:6;1257;1250:22;1212:2;1293:31;1314:9;1293:31;:::i;:::-;1283:41;;1343:40;1379:2;1368:9;1364:18;1343:40;:::i;:::-;1333:50;;1202:187;;;;;:::o;1394:342::-;;;;1540:2;1528:9;1519:7;1515:23;1511:32;1508:2;;;1561:6;1553;1546:22;1508:2;1589:31;1610:9;1589:31;:::i;:::-;1579:41;;1639:40;1675:2;1664:9;1660:18;1639:40;:::i;:::-;1629:50;;1726:2;1715:9;1711:18;1698:32;1688:42;;1498:238;;;;;:::o;1741:266::-;;;1870:2;1858:9;1849:7;1845:23;1841:32;1838:2;;;1891:6;1883;1876:22;1838:2;1919:31;1940:9;1919:31;:::i;:::-;1909:41;1997:2;1982:18;;;;1969:32;;-1:-1:-1;;;1828:179:1:o;2012:640::-;;;;;;;2207:3;2195:9;2186:7;2182:23;2178:33;2175:2;;;2229:6;2221;2214:22;2175:2;2257:31;2278:9;2257:31;:::i;:::-;2247:41;;2335:2;2324:9;2320:18;2307:32;2297:42;;2386:2;2375:9;2371:18;2358:32;2348:42;;2440:2;2429:9;2425:18;2412:32;2484:4;2477:5;2473:16;2466:5;2463:27;2453:2;;2509:6;2501;2494:22;2453:2;2165:487;;;;-1:-1:-1;2165:487:1;;2589:3;2574:19;;2561:33;;2641:3;2626:19;;;2613:33;;-1:-1:-1;2165:487:1;-1:-1:-1;;2165:487:1:o;2657:372::-;;;2785:2;2773:9;2764:7;2760:23;2756:32;2753:2;;;2806:6;2798;2791:22;2753:2;2834:31;2855:9;2834:31;:::i;:::-;2824:41;;2915:2;2904:9;2900:18;2887:32;2959:10;2952:5;2948:22;2941:5;2938:33;2928:2;;2990:6;2982;2975:22;2928:2;3018:5;3008:15;;;2743:286;;;;;:::o;3034:194::-;;3157:2;3145:9;3136:7;3132:23;3128:32;3125:2;;;3178:6;3170;3163:22;3125:2;-1:-1:-1;3206:16:1;;3115:113;-1:-1:-1;3115:113:1:o;3233:799::-;;;;;;3433:3;3421:9;3412:7;3408:23;3404:33;3401:2;;;3455:6;3447;3440:22;3401:2;3500:9;3487:23;3529:18;3570:2;3562:6;3559:14;3556:2;;;3591:6;3583;3576:22;3556:2;3619:52;3663:7;3654:6;3643:9;3639:22;3619:52;:::i;:::-;3609:62;;3724:2;3713:9;3709:18;3696:32;3680:48;;3753:2;3743:8;3740:16;3737:2;;;3774:6;3766;3759:22;3737:2;;3802:54;3848:7;3837:8;3826:9;3822:24;3802:54;:::i;:::-;3792:64;;;3903:2;3892:9;3888:18;3875:32;3865:42;;3926:40;3962:2;3951:9;3947:18;3926:40;:::i;:::-;3916:50;;3985:41;4021:3;4010:9;4006:19;3985:41;:::i;:::-;3975:51;;3391:641;;;;;;;;:::o;4037:852::-;;;;;;;4254:3;4242:9;4233:7;4229:23;4225:33;4222:2;;;4276:6;4268;4261:22;4222:2;4321:9;4308:23;4350:18;4391:2;4383:6;4380:14;4377:2;;;4412:6;4404;4397:22;4377:2;4440:52;4484:7;4475:6;4464:9;4460:22;4440:52;:::i;:::-;4430:62;;4545:2;4534:9;4530:18;4517:32;4501:48;;4574:2;4564:8;4561:16;4558:2;;;4595:6;4587;4580:22;4558:2;;4623:54;4669:7;4658:8;4647:9;4643:24;4623:54;:::i;:::-;4212:677;;4613:64;;-1:-1:-1;;;;4724:2:1;4709:18;;4696:32;;4775:2;4760:18;;4747:32;;4826:3;4811:19;;4798:33;;-1:-1:-1;4878:3:1;4863:19;;;4850:33;;-1:-1:-1;4212:677:1;-1:-1:-1;4212:677:1:o;4894:190::-;;5006:2;4994:9;4985:7;4981:23;4977:32;4974:2;;;5027:6;5019;5012:22;4974:2;-1:-1:-1;5055:23:1;;4964:120;-1:-1:-1;4964:120:1:o;5089:478::-;;5171:5;5165:12;5198:6;5193:3;5186:19;5223:3;5235:162;5249:6;5246:1;5243:13;5235:162;;;5311:4;5367:13;;;5363:22;;5357:29;5339:11;;;5335:20;;5328:59;5264:12;5235:162;;;5415:6;5412:1;5409:13;5406:2;;;5481:3;5474:4;5465:6;5460:3;5456:16;5452:27;5445:40;5406:2;-1:-1:-1;5549:2:1;5528:15;-1:-1:-1;;5524:29:1;5515:39;;;;5556:4;5511:50;;5141:426;-1:-1:-1;;5141:426:1:o;5572:392::-;-1:-1:-1;;;5830:27:1;;5882:1;5873:11;;5866:27;;;;5918:2;5909:12;;5902:28;5955:2;5946:12;;5820:144::o;5969:203::-;-1:-1:-1;;;;;6133:32:1;;;;6115:51;;6103:2;6088:18;;6070:102::o;6177:740::-;-1:-1:-1;;;;;6524:15:1;;;6506:34;;6576:15;;;6571:2;6556:18;;6549:43;6623:2;6608:18;;6601:34;;;6671:15;;6666:2;6651:18;;6644:43;6724:3;6718;6703:19;;6696:32;;;6177:740;;6751:48;;6779:19;;6771:6;6751:48;:::i;:::-;6848:9;6840:6;6836:22;6830:3;6819:9;6815:19;6808:51;6876:35;6904:6;6896;6876:35;:::i;:::-;6868:43;6458:459;-1:-1:-1;;;;;;;;;6458:459:1:o;6922:187::-;7087:14;;7080:22;7062:41;;7050:2;7035:18;;7017:92::o;7114:177::-;7260:25;;;7248:2;7233:18;;7215:76::o;7296:417::-;7527:25;;;-1:-1:-1;;;;;7588:32:1;;;;7583:2;7568:18;;7561:60;7652:2;7637:18;;7630:34;7695:2;7680:18;;7673:34;7514:3;7499:19;;7481:232::o;7718:417::-;7949:25;;;8005:2;7990:18;;7983:34;;;;8048:2;8033:18;;8026:34;-1:-1:-1;;;;;8096:32:1;8091:2;8076:18;;8069:60;7936:3;7921:19;;7903:232::o;8140:398::-;8367:25;;;8440:4;8428:17;;;;8423:2;8408:18;;8401:45;8477:2;8462:18;;8455:34;8520:2;8505:18;;8498:34;8354:3;8339:19;;8321:217::o;8543:222::-;;8692:2;8681:9;8674:21;8712:47;8755:2;8744:9;8740:18;8732:6;8712:47;:::i;8770:399::-;8972:2;8954:21;;;9011:2;8991:18;;;8984:30;9050:34;9045:2;9030:18;;9023:62;-1:-1:-1;;;9116:2:1;9101:18;;9094:33;9159:3;9144:19;;8944:225::o;9174:338::-;9376:2;9358:21;;;9415:2;9395:18;;;9388:30;-1:-1:-1;;;9449:2:1;9434:18;;9427:44;9503:2;9488:18;;9348:164::o;9517:409::-;9719:2;9701:21;;;9758:2;9738:18;;;9731:30;9797:34;9792:2;9777:18;;9770:62;-1:-1:-1;;;9863:2:1;9848:18;;9841:43;9916:3;9901:19;;9691:235::o;9931:402::-;10133:2;10115:21;;;10172:2;10152:18;;;10145:30;10211:34;10206:2;10191:18;;10184:62;-1:-1:-1;;;10277:2:1;10262:18;;10255:36;10323:3;10308:19;;10105:228::o;10338:398::-;10540:2;10522:21;;;10579:2;10559:18;;;10552:30;10618:34;10613:2;10598:18;;10591:62;-1:-1:-1;;;10684:2:1;10669:18;;10662:32;10726:3;10711:19;;10512:224::o;10741:351::-;10943:2;10925:21;;;10982:2;10962:18;;;10955:30;11021:29;11016:2;11001:18;;10994:57;11083:2;11068:18;;10915:177::o;11097:410::-;11299:2;11281:21;;;11338:2;11318:18;;;11311:30;11377:34;11372:2;11357:18;;11350:62;-1:-1:-1;;;11443:2:1;11428:18;;11421:44;11497:3;11482:19;;11271:236::o;11512:355::-;11714:2;11696:21;;;11753:2;11733:18;;;11726:30;11792:33;11787:2;11772:18;;11765:61;11858:2;11843:18;;11686:181::o;11872:412::-;12074:2;12056:21;;;12113:2;12093:18;;;12086:30;12152:34;12147:2;12132:18;;12125:62;-1:-1:-1;;;12218:2:1;12203:18;;12196:46;12274:3;12259:19;;12046:238::o;12289:405::-;12491:2;12473:21;;;12530:2;12510:18;;;12503:30;12569:34;12564:2;12549:18;;12542:62;-1:-1:-1;;;12635:2:1;12620:18;;12613:39;12684:3;12669:19;;12463:231::o;12699:355::-;12901:2;12883:21;;;12940:2;12920:18;;;12913:30;12979:33;12974:2;12959:18;;12952:61;13045:2;13030:18;;12873:181::o;13059:397::-;13261:2;13243:21;;;13300:2;13280:18;;;13273:30;13339:34;13334:2;13319:18;;13312:62;-1:-1:-1;;;13405:2:1;13390:18;;13383:31;13446:3;13431:19;;13233:223::o;13461:356::-;13663:2;13645:21;;;13682:18;;;13675:30;13741:34;13736:2;13721:18;;13714:62;13808:2;13793:18;;13635:182::o;13822:344::-;14024:2;14006:21;;;14063:2;14043:18;;;14036:30;-1:-1:-1;;;14097:2:1;14082:18;;14075:50;14157:2;14142:18;;13996:170::o;14171:409::-;14373:2;14355:21;;;14412:2;14392:18;;;14385:30;14451:34;14446:2;14431:18;;14424:62;-1:-1:-1;;;14517:2:1;14502:18;;14495:43;14570:3;14555:19;;14345:235::o;14585:397::-;14787:2;14769:21;;;14826:2;14806:18;;;14799:30;14865:34;14860:2;14845:18;;14838:62;-1:-1:-1;;;14931:2:1;14916:18;;14909:31;14972:3;14957:19;;14759:223::o;14987:401::-;15189:2;15171:21;;;15228:2;15208:18;;;15201:30;15267:34;15262:2;15247:18;;15240:62;-1:-1:-1;;;15333:2:1;15318:18;;15311:35;15378:3;15363:19;;15161:227::o;15393:349::-;15595:2;15577:21;;;15634:2;15614:18;;;15607:30;15673:27;15668:2;15653:18;;15646:55;15733:2;15718:18;;15567:175::o;15747:400::-;15949:2;15931:21;;;15988:2;15968:18;;;15961:30;16027:34;16022:2;16007:18;;16000:62;-1:-1:-1;;;16093:2:1;16078:18;;16071:34;16137:3;16122:19;;15921:226::o;16152:355::-;16354:2;16336:21;;;16393:2;16373:18;;;16366:30;16432:33;16427:2;16412:18;;16405:61;16498:2;16483:18;;16326:181::o;16512:355::-;16714:2;16696:21;;;16753:2;16733:18;;;16726:30;16792:33;16787:2;16772:18;;16765:61;16858:2;16843:18;;16686:181::o;16872:414::-;17074:2;17056:21;;;17113:2;17093:18;;;17086:30;17152:34;17147:2;17132:18;;17125:62;-1:-1:-1;;;17218:2:1;17203:18;;17196:48;17276:3;17261:19;;17046:240::o;17473:248::-;17647:25;;;17703:2;17688:18;;17681:34;17635:2;17620:18;;17602:119::o;17726:192::-;17900:10;17888:23;;;;17870:42;;17858:2;17843:18;;17825:93::o;17923:263::-;18125:10;18113:23;;;;18095:42;;18168:2;18153:18;;18146:34;18083:2;18068:18;;18050:136::o;18191:184::-;18363:4;18351:17;;;;18333:36;;18321:2;18306:18;;18288:87::o;18380:128::-;;18451:1;18447:6;18444:1;18441:13;18438:2;;;18457:18;;:::i;:::-;-1:-1:-1;18493:9:1;;18428:80::o;18513:228::-;;18580:10;18617:2;18614:1;18610:10;18647:2;18644:1;18640:10;18678:3;18674:2;18670:12;18665:3;18662:21;18659:2;;;18686:18;;:::i;:::-;18722:13;;18560:181;-1:-1:-1;;;;18560:181:1:o;18746:120::-;;18812:1;18802:2;;18817:18;;:::i;:::-;-1:-1:-1;18851:9:1;;18792:74::o;18871:191::-;;18936:10;18973:2;18970:1;18966:10;18995:3;18985:2;;19002:18;;:::i;:::-;19040:10;;19036:20;;;;;18916:146;-1:-1:-1;;18916:146:1:o;19067:168::-;;19173:1;19169;19165:6;19161:14;19158:1;19155:21;19150:1;19143:9;19136:17;19132:45;19129:2;;;19180:18;;:::i;:::-;-1:-1:-1;19220:9:1;;19119:116::o;19240:125::-;;19308:1;19305;19302:8;19299:2;;;19313:18;;:::i;:::-;-1:-1:-1;19350:9:1;;19289:76::o;19370:221::-;;19438:10;19498;;;;19468;;19520:12;;;19517:2;;;19535:18;;:::i;:::-;19572:13;;19418:173;-1:-1:-1;;;19418:173:1:o;19596:380::-;19681:1;19671:12;;19728:1;19718:12;;;19739:2;;19793:4;19785:6;19781:17;19771:27;;19739:2;19846;19838:6;19835:14;19815:18;19812:38;19809:2;;;19892:10;19887:3;19883:20;19880:1;19873:31;19927:4;19924:1;19917:15;19955:4;19952:1;19945:15;19809:2;;19651:325;;;:::o;19981:135::-;;-1:-1:-1;;20041:17:1;;20038:2;;;20061:18;;:::i;:::-;-1:-1:-1;20108:1:1;20097:13;;20028:88::o;20121:127::-;20182:10;20177:3;20173:20;20170:1;20163:31;20213:4;20210:1;20203:15;20237:4;20234:1;20227:15;20253:127;20314:10;20309:3;20305:20;20302:1;20295:31;20345:4;20342:1;20335:15;20369:4;20366:1;20359:15;20385:127;20446:10;20441:3;20437:20;20434:1;20427:31;20477:4;20474:1;20467:15;20501:4;20498:1;20491:15
Swarm Source
ipfs://eb9d06d85964ce480235102f7b6494a602b283487df68afef2f8b457fd41ef7f
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.