ERC-20
Staking
Overview
Max Total Supply
20,138,223.9342164 NUG
Holders
51 (0.00%)
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 8 Decimals)
Balance
1,149,400.66876429 NUGValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
NUG
Compiler Version
v0.5.10+commit.5a6ea5b1
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-12-04 */ pragma solidity 0.5.10; contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ interface TRC20 { /** * @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 Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } /** * @dev Implementation of the {TRC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20Mintable}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {TRC20-approve}. */ contract ERC20 is Context, TRC20 { using SafeMath for uint256; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; // allocating 20,000,000 tokens for liquidity, promotions, airdrops uint256 private _totalSupply = 20000000 * (10 ** 8); constructor() public { _balances[msg.sender] = _totalSupply; } /** * @dev See {TRC20-totalSupply}. */ function totalSupply() public view returns (uint256) { return _totalSupply; } /** * @dev See {TRC20-balanceOf}. */ function balanceOf(address account) public view returns (uint256) { return _balances[account]; } /** * @dev See {TRC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {TRC20-allowance}. */ function allowance(address owner, address spender) public view returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {TRC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {TRC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for `sender`'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {TRC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {TRC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal { require(account != address(0), "ERC20: mint to the zero address"); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev External function to destroys `amount` tokens from `account`, reducing the * total supply. */ function burn(uint256 amount) external { require(_balances[msg.sender] >= amount, "ERC20: not enough balance!"); _burn(msg.sender, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal { require(account != address(0), "ERC20: burn from the zero address"); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. * * This is internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Destroys `amount` tokens from `account`.`amount` is then deducted * from the caller's allowance. * * See {_burn} and {_approve}. */ function _burnFrom(address account, uint256 amount) internal { _burn(account, amount); _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance")); } } contract GlobalsAndUtility is ERC20 { /* XfLobbyEnter */ event XfLobbyEnter( uint256 timestamp, uint256 enterDay, uint256 indexed entryIndex, uint256 indexed rawAmount ); /* XfLobbyExit */ event XfLobbyExit( uint256 timestamp, uint256 enterDay, uint256 indexed entryIndex, uint256 indexed xfAmount, address indexed referrerAddr ); /* DailyDataUpdate */ event DailyDataUpdate( address indexed updaterAddr, uint256 timestamp, uint256 beginDay, uint256 endDay ); /* StakeStart */ event StakeStart( uint40 indexed stakeId, address indexed stakerAddr, uint256 stakedGuns, uint256 stakeShares, uint256 stakedDays ); /* StakeGoodAccounting */ event StakeGoodAccounting( uint40 indexed stakeId, address indexed stakerAddr, address indexed senderAddr, uint256 stakedGuns, uint256 stakeShares, uint256 payout, uint256 penalty ); /* StakeEnd */ event StakeEnd( uint40 indexed stakeId, uint40 prevUnlocked, address indexed stakerAddr, uint256 lockedDay, uint256 servedDays, uint256 stakedGuns, uint256 stakeShares, uint256 dividends, uint256 payout, uint256 penalty, uint256 stakeReturn ); /* ShareRateChange */ event ShareRateChange( uint40 indexed stakeId, uint256 timestamp, uint256 newShareRate ); /* NUI allocation share address * Used for 15% drip into NUI auction * 85% of the first public auction will be redistributed over the next 3 days (auction days 2, 3, 4) into the NUG auction. */ address payable internal constant NUI_SHARE_ADDR = 0xc8001EA490F97b1DD673f77074edf18338853CA0; uint8 internal LAST_FLUSHED_DAY = 1; /* ERC20 constants */ string public constant name = "NUG"; string public constant symbol = "NUG"; uint8 public constant decimals = 8; /* Guns per Satoshi = 10,000 * 1e8 / 1e8 = 1e4 */ uint256 private constant GUNS_PER_NUG = 10 ** uint256(decimals); // 1e8 /* Time of contract launch (Dec 3rd, 00:00:00 UTC, Auction Day 1 Starts Dec 4th, 00:00:00 UTC) */ uint256 internal constant LAUNCH_TIME = 1607040000; /* Start of claim phase */ uint256 internal constant PRE_CLAIM_DAYS = 1; uint256 internal constant CLAIM_STARTING_AMOUNT = 1000000 * (10 ** 8); uint256 internal constant CLAIM_LOWEST_AMOUNT = 500000 * (10 ** 8); uint256 internal constant CLAIM_PHASE_START_DAY = PRE_CLAIM_DAYS; /* Number of words to hold 1 bit for each transform lobby day */ uint256 internal constant XF_LOBBY_DAY_WORDS = ((1 + (50 * 7)) + 255) >> 8; /* Stake timing parameters */ uint256 internal constant MIN_STAKE_DAYS = 1; uint256 internal constant MAX_STAKE_DAYS = 25; uint256 internal constant EARLY_PENALTY_MIN_DAYS = 90; uint256 private constant LATE_PENALTY_GRACE_WEEKS = 2; uint256 internal constant LATE_PENALTY_GRACE_DAYS = LATE_PENALTY_GRACE_WEEKS * 7; uint256 private constant LATE_PENALTY_SCALE_WEEKS = 100; uint256 internal constant LATE_PENALTY_SCALE_DAYS = LATE_PENALTY_SCALE_WEEKS * 7; /* Stake shares Longer Pays Better bonus constants used by _stakeStartBonusGuns() */ uint256 private constant LPB_BONUS_PERCENT = 20; uint256 private constant LPB_BONUS_MAX_PERCENT = 200; uint256 internal constant LPB = 364 * 100 / LPB_BONUS_PERCENT; uint256 internal constant LPB_MAX_DAYS = LPB * LPB_BONUS_MAX_PERCENT / 100; /* Stake shares Bigger Pays Better bonus constants used by _stakeStartBonusGuns() */ uint256 private constant BPB_BONUS_PERCENT = 10; uint256 private constant BPB_MAX_NUG = 7 * 1e6; uint256 internal constant BPB_MAX_GUNS = BPB_MAX_NUG * GUNS_PER_NUG; uint256 internal constant BPB = BPB_MAX_GUNS * 100 / BPB_BONUS_PERCENT; /* Share rate is scaled to increase precision */ uint256 internal constant SHARE_RATE_SCALE = 1e5; /* Share rate max (after scaling) */ uint256 internal constant SHARE_RATE_UINT_SIZE = 40; uint256 internal constant SHARE_RATE_MAX = (1 << SHARE_RATE_UINT_SIZE) - 1; /* weekly staking bonus */ uint8 internal constant BONUS_DAY_SCALE = 2; /* Globals expanded for memory (except _latestStakeId) and compact for storage */ struct GlobalsCache { uint256 _lockedGunsTotal; uint256 _nextStakeSharesTotal; uint256 _shareRate; uint256 _stakePenaltyTotal; uint256 _dailyDataCount; uint256 _stakeSharesTotal; uint40 _latestStakeId; uint256 _currentDay; } struct GlobalsStore { uint72 lockedGunsTotal; uint72 nextStakeSharesTotal; uint40 shareRate; uint72 stakePenaltyTotal; uint16 dailyDataCount; uint72 stakeSharesTotal; uint40 latestStakeId; } GlobalsStore public globals; /* Daily data */ struct DailyDataStore { uint72 dayPayoutTotal; uint256 dayDividends; uint72 dayStakeSharesTotal; } mapping(uint256 => DailyDataStore) public dailyData; /* Stake expanded for memory (except _stakeId) and compact for storage */ struct StakeCache { uint40 _stakeId; uint256 _stakedGuns; uint256 _stakeShares; uint256 _lockedDay; uint256 _stakedDays; uint256 _unlockedDay; } struct StakeStore { uint40 stakeId; uint72 stakedGuns; uint72 stakeShares; uint16 lockedDay; uint16 stakedDays; uint16 unlockedDay; } mapping(address => StakeStore[]) public stakeLists; /* Temporary state for calculating daily rounds */ struct DailyRoundState { uint256 _allocSupplyCached; uint256 _payoutTotal; } struct XfLobbyEntryStore { uint96 rawAmount; address referrerAddr; } struct XfLobbyQueueStore { uint40 headIndex; uint40 tailIndex; mapping(uint256 => XfLobbyEntryStore) entries; } mapping(uint256 => uint256) public xfLobby; mapping(uint256 => mapping(address => XfLobbyQueueStore)) public xfLobbyMembers; /** * @dev PUBLIC FACING: Optionally update daily data for a smaller * range to reduce gas cost for a subsequent operation * @param beforeDay Only update days before this day number (optional; 0 for current day) */ function dailyDataUpdate(uint256 beforeDay) external { GlobalsCache memory g; GlobalsCache memory gSnapshot; _globalsLoad(g, gSnapshot); /* Skip pre-claim period */ require(g._currentDay > CLAIM_PHASE_START_DAY, "NUG: Too early"); if (beforeDay != 0) { require(beforeDay <= g._currentDay, "NUG: beforeDay cannot be in the future"); _dailyDataUpdate(g, beforeDay, false); } else { /* Default to updating before current day */ _dailyDataUpdate(g, g._currentDay, false); } _globalsSync(g, gSnapshot); } /** * @dev PUBLIC FACING: External helper to return multiple values of daily data with * a single call. * @param beginDay First day of data range * @param endDay Last day (non-inclusive) of data range * @return array of day stake shares total * @return array of day payout total */ function dailyDataRange(uint256 beginDay, uint256 endDay) external view returns (uint256[] memory _dayStakeSharesTotal, uint256[] memory _dayPayoutTotal, uint256[] memory _dayDividends) { require(beginDay < endDay && endDay <= globals.dailyDataCount, "NUG: range invalid"); _dayStakeSharesTotal = new uint256[](endDay - beginDay); _dayPayoutTotal = new uint256[](endDay - beginDay); _dayDividends = new uint256[](endDay - beginDay); uint256 src = beginDay; uint256 dst = 0; do { _dayStakeSharesTotal[dst] = uint256(dailyData[src].dayStakeSharesTotal); _dayPayoutTotal[dst++] = uint256(dailyData[src].dayPayoutTotal); _dayDividends[dst++] = dailyData[src].dayDividends; } while (++src < endDay); return (_dayStakeSharesTotal, _dayPayoutTotal, _dayDividends); } /** * @dev PUBLIC FACING: External helper to return most global info with a single call. * Ugly implementation due to limitations of the standard ABI encoder. * @return Fixed array of values */ function globalInfo() external view returns (uint256[10] memory) { return [ globals.lockedGunsTotal, globals.nextStakeSharesTotal, globals.shareRate, globals.stakePenaltyTotal, globals.dailyDataCount, globals.stakeSharesTotal, globals.latestStakeId, block.timestamp, totalSupply(), xfLobby[_currentDay()] ]; } /** * @dev PUBLIC FACING: ERC20 totalSupply() is the circulating supply and does not include any * staked Guns. allocatedSupply() includes both. * @return Allocated Supply in Guns */ function allocatedSupply() external view returns (uint256) { return totalSupply() + globals.lockedGunsTotal; } /** * @dev PUBLIC FACING: External helper for the current day number since launch time * @return Current day number (zero-based) */ function currentDay() external view returns (uint256) { return _currentDay(); } function _currentDay() internal view returns (uint256) { if (block.timestamp < LAUNCH_TIME){ return 0; }else{ return (block.timestamp - LAUNCH_TIME) / 1 days; } } function _dailyDataUpdateAuto(GlobalsCache memory g) internal { _dailyDataUpdate(g, g._currentDay, true); } function _globalsLoad(GlobalsCache memory g, GlobalsCache memory gSnapshot) internal view { g._lockedGunsTotal = globals.lockedGunsTotal; g._nextStakeSharesTotal = globals.nextStakeSharesTotal; g._shareRate = globals.shareRate; g._stakePenaltyTotal = globals.stakePenaltyTotal; g._dailyDataCount = globals.dailyDataCount; g._stakeSharesTotal = globals.stakeSharesTotal; g._latestStakeId = globals.latestStakeId; g._currentDay = _currentDay(); _globalsCacheSnapshot(g, gSnapshot); } function _globalsCacheSnapshot(GlobalsCache memory g, GlobalsCache memory gSnapshot) internal pure { gSnapshot._lockedGunsTotal = g._lockedGunsTotal; gSnapshot._nextStakeSharesTotal = g._nextStakeSharesTotal; gSnapshot._shareRate = g._shareRate; gSnapshot._stakePenaltyTotal = g._stakePenaltyTotal; gSnapshot._dailyDataCount = g._dailyDataCount; gSnapshot._stakeSharesTotal = g._stakeSharesTotal; gSnapshot._latestStakeId = g._latestStakeId; } function _globalsSync(GlobalsCache memory g, GlobalsCache memory gSnapshot) internal { if (g._lockedGunsTotal != gSnapshot._lockedGunsTotal || g._nextStakeSharesTotal != gSnapshot._nextStakeSharesTotal || g._shareRate != gSnapshot._shareRate || g._stakePenaltyTotal != gSnapshot._stakePenaltyTotal) { globals.lockedGunsTotal = uint72(g._lockedGunsTotal); globals.nextStakeSharesTotal = uint72(g._nextStakeSharesTotal); globals.shareRate = uint40(g._shareRate); globals.stakePenaltyTotal = uint72(g._stakePenaltyTotal); } if (g._dailyDataCount != gSnapshot._dailyDataCount || g._stakeSharesTotal != gSnapshot._stakeSharesTotal || g._latestStakeId != gSnapshot._latestStakeId) { globals.dailyDataCount = uint16(g._dailyDataCount); globals.stakeSharesTotal = uint72(g._stakeSharesTotal); globals.latestStakeId = g._latestStakeId; } } function _stakeLoad(StakeStore storage stRef, uint40 stakeIdParam, StakeCache memory st) internal view { /* Ensure caller's stakeIndex is still current */ require(stakeIdParam == stRef.stakeId, "NUG: stakeIdParam not in stake"); st._stakeId = stRef.stakeId; st._stakedGuns = stRef.stakedGuns; st._stakeShares = stRef.stakeShares; st._lockedDay = stRef.lockedDay; st._stakedDays = stRef.stakedDays; st._unlockedDay = stRef.unlockedDay; } function _stakeUpdate(StakeStore storage stRef, StakeCache memory st) internal { stRef.stakeId = st._stakeId; stRef.stakedGuns = uint72(st._stakedGuns); stRef.stakeShares = uint72(st._stakeShares); stRef.lockedDay = uint16(st._lockedDay); stRef.stakedDays = uint16(st._stakedDays); stRef.unlockedDay = uint16(st._unlockedDay); } function _stakeAdd( StakeStore[] storage stakeListRef, uint40 newStakeId, uint256 newStakedGuns, uint256 newStakeShares, uint256 newLockedDay, uint256 newStakedDays ) internal { stakeListRef.push( StakeStore( newStakeId, uint72(newStakedGuns), uint72(newStakeShares), uint16(newLockedDay), uint16(newStakedDays), uint16(0) // unlockedDay ) ); } /** * @dev Efficiently delete from an unordered array by moving the last element * to the "hole" and reducing the array length. Can change the order of the list * and invalidate previously held indexes. * @notice stakeListRef length and stakeIndex are already ensured valid in stakeEnd() * @param stakeListRef Reference to stakeLists[stakerAddr] array in storage * @param stakeIndex Index of the element to delete */ function _stakeRemove(StakeStore[] storage stakeListRef, uint256 stakeIndex) internal { uint256 lastIndex = stakeListRef.length - 1; /* Skip the copy if element to be removed is already the last element */ if (stakeIndex != lastIndex) { /* Copy last element to the requested element's "hole" */ stakeListRef[stakeIndex] = stakeListRef[lastIndex]; } /* Reduce the array length now that the array is contiguous. Surprisingly, 'pop()' uses less gas than 'stakeListRef.length = lastIndex' */ stakeListRef.pop(); } /** * @dev Estimate the stake payout for an incomplete day * @param g Cache of stored globals * @param stakeSharesParam Param from stake to calculate bonuses for * @param day Day to calculate bonuses for * @return Payout in Guns */ function _estimatePayoutRewardsDay(GlobalsCache memory g, uint256 stakeSharesParam, uint256 day) internal view returns (uint256 payout) { /* Prevent updating state for this estimation */ GlobalsCache memory gTmp; _globalsCacheSnapshot(g, gTmp); DailyRoundState memory rs; rs._allocSupplyCached = totalSupply() + g._lockedGunsTotal; _dailyRoundCalc(gTmp, rs, day); /* Stake is no longer locked so it must be added to total as if it were */ gTmp._stakeSharesTotal += stakeSharesParam; payout = rs._payoutTotal * stakeSharesParam / gTmp._stakeSharesTotal; return payout; } function _dailyRoundCalc(GlobalsCache memory g, DailyRoundState memory rs, uint256 day) private view { /* Calculate payout round Inflation of 5.42% inflation per 364 days (approx 1 year) dailyInterestRate = exp(log(1 + 5.42%) / 364) - 1 = exp(log(1 + 0.0542) / 364) - 1 = exp(log(1.0542) / 364) - 1 = 0.0.00014523452066 (approx) payout = allocSupply * dailyInterestRate = allocSupply / (1 / dailyInterestRate) = allocSupply / (1 / 0.00014523452066) = allocSupply / 6885.4153644438375 (approx) = allocSupply * 50000 / 68854153 (* 50000/50000 for int precision) */ rs._payoutTotal = (rs._allocSupplyCached * 50000 / 68854153); if (g._stakePenaltyTotal != 0) { rs._payoutTotal += g._stakePenaltyTotal; g._stakePenaltyTotal = 0; } } function _dailyRoundCalcAndStore(GlobalsCache memory g, DailyRoundState memory rs, uint256 day) private { _dailyRoundCalc(g, rs, day); dailyData[day].dayPayoutTotal = uint72(rs._payoutTotal); dailyData[day].dayDividends = xfLobby[day]; dailyData[day].dayStakeSharesTotal = uint72(g._stakeSharesTotal); } function _dailyDataUpdate(GlobalsCache memory g, uint256 beforeDay, bool isAutoUpdate) private { if (g._dailyDataCount >= beforeDay) { /* Already up-to-date */ return; } DailyRoundState memory rs; rs._allocSupplyCached = totalSupply() + g._lockedGunsTotal; uint256 day = g._dailyDataCount; _dailyRoundCalcAndStore(g, rs, day); /* Stakes started during this day are added to the total the next day */ if (g._nextStakeSharesTotal != 0) { g._stakeSharesTotal += g._nextStakeSharesTotal; g._nextStakeSharesTotal = 0; } while (++day < beforeDay) { _dailyRoundCalcAndStore(g, rs, day); } emit DailyDataUpdate( msg.sender, block.timestamp, g._dailyDataCount, day ); g._dailyDataCount = day; } } contract StakeableToken is GlobalsAndUtility { /** * @dev PUBLIC FACING: Open a stake. * @param newStakedGuns Number of Guns to stake * @param newStakedDays Number of days to stake */ function stakeStart(uint256 newStakedGuns, uint256 newStakedDays) external { GlobalsCache memory g; GlobalsCache memory gSnapshot; _globalsLoad(g, gSnapshot); /* Enforce the minimum stake time */ require(newStakedDays >= MIN_STAKE_DAYS, "NUG: newStakedDays lower than minimum"); /* Check if log data needs to be updated */ _dailyDataUpdateAuto(g); _stakeStart(g, newStakedGuns, newStakedDays); /* Remove staked Guns from balance of staker */ _burn(msg.sender, newStakedGuns); _globalsSync(g, gSnapshot); } /** * @dev PUBLIC FACING: Unlocks a completed stake, distributing the proceeds of any penalty * immediately. The staker must still call stakeEnd() to retrieve their stake return (if any). * @param stakerAddr Address of staker * @param stakeIndex Index of stake within stake list * @param stakeIdParam The stake's id */ function stakeGoodAccounting(address stakerAddr, uint256 stakeIndex, uint40 stakeIdParam) external { GlobalsCache memory g; GlobalsCache memory gSnapshot; _globalsLoad(g, gSnapshot); /* require() is more informative than the default assert() */ require(stakeLists[stakerAddr].length != 0, "NUG: Empty stake list"); require(stakeIndex < stakeLists[stakerAddr].length, "NUG: stakeIndex invalid"); StakeStore storage stRef = stakeLists[stakerAddr][stakeIndex]; /* Get stake copy */ StakeCache memory st; _stakeLoad(stRef, stakeIdParam, st); /* Stake must have served full term */ require(g._currentDay >= st._lockedDay + st._stakedDays, "NUG: Stake not fully served"); /* Stake must still be locked */ require(st._unlockedDay == 0, "NUG: Stake already unlocked"); /* Check if log data needs to be updated */ _dailyDataUpdateAuto(g); /* Unlock the completed stake */ _stakeUnlock(g, st); /* stakeReturn & dividends values are unused here */ (, uint256 payout, uint256 dividends, uint256 penalty, uint256 cappedPenalty) = _stakePerformance( g, st, st._stakedDays ); emit StakeGoodAccounting( stakeIdParam, stakerAddr, msg.sender, st._stakedGuns, st._stakeShares, payout, penalty ); if (cappedPenalty != 0) { g._stakePenaltyTotal += cappedPenalty; } /* st._unlockedDay has changed */ _stakeUpdate(stRef, st); _globalsSync(g, gSnapshot); } /** * @dev PUBLIC FACING: Closes a stake. The order of the stake list can change so * a stake id is used to reject stale indexes. * @param stakeIndex Index of stake within stake list * @param stakeIdParam The stake's id */ function stakeEnd(uint256 stakeIndex, uint40 stakeIdParam) external { GlobalsCache memory g; GlobalsCache memory gSnapshot; _globalsLoad(g, gSnapshot); StakeStore[] storage stakeListRef = stakeLists[msg.sender]; /* require() is more informative than the default assert() */ require(stakeListRef.length != 0, "NUG: Empty stake list"); require(stakeIndex < stakeListRef.length, "NUG: stakeIndex invalid"); /* Get stake copy */ StakeCache memory st; _stakeLoad(stakeListRef[stakeIndex], stakeIdParam, st); /* Check if log data needs to be updated */ _dailyDataUpdateAuto(g); uint256 servedDays = 0; bool prevUnlocked = (st._unlockedDay != 0); uint256 stakeReturn; uint256 payout = 0; uint256 dividends = 0; uint256 penalty = 0; uint256 cappedPenalty = 0; if (g._currentDay >= st._lockedDay) { if (prevUnlocked) { /* Previously unlocked in stakeGoodAccounting(), so must have served full term */ servedDays = st._stakedDays; } else { _stakeUnlock(g, st); servedDays = g._currentDay - st._lockedDay; if (servedDays > st._stakedDays) { servedDays = st._stakedDays; } } (stakeReturn, payout, dividends, penalty, cappedPenalty) = _stakePerformance(g, st, servedDays); msg.sender.transfer(dividends); } else { /* Stake hasn't been added to the total yet, so no penalties or rewards apply */ g._nextStakeSharesTotal -= st._stakeShares; stakeReturn = st._stakedGuns; } emit StakeEnd( stakeIdParam, prevUnlocked ? 1 : 0, msg.sender, st._lockedDay, servedDays, st._stakedGuns, st._stakeShares, dividends, payout, penalty, stakeReturn ); if (cappedPenalty != 0 && !prevUnlocked) { /* Split penalty proceeds only if not previously unlocked by stakeGoodAccounting() */ g._stakePenaltyTotal += cappedPenalty; } /* Pay the stake return, if any, to the staker */ if (stakeReturn != 0) { _mint(msg.sender, stakeReturn); /* Update the share rate if necessary */ _shareRateUpdate(g, st, stakeReturn); } g._lockedGunsTotal -= st._stakedGuns; _stakeRemove(stakeListRef, stakeIndex); _globalsSync(g, gSnapshot); } /** * @dev PUBLIC FACING: Return the current stake count for a staker address * @param stakerAddr Address of staker */ function stakeCount(address stakerAddr) external view returns (uint256) { return stakeLists[stakerAddr].length; } /** * @dev Open a stake. * @param g Cache of stored globals * @param newStakedGuns Number of Guns to stake * @param newStakedDays Number of days to stake */ function _stakeStart( GlobalsCache memory g, uint256 newStakedGuns, uint256 newStakedDays ) internal { /* Enforce the maximum stake time */ require(newStakedDays <= MAX_STAKE_DAYS, "NUG: Max allowed staking days: 180"); uint256 bonusGuns = _stakeStartBonusGuns(newStakedGuns, newStakedDays); uint256 newStakeShares = (newStakedGuns + bonusGuns) * SHARE_RATE_SCALE / g._shareRate; /* Ensure newStakedGuns is enough for at least one stake share */ require(newStakeShares != 0, "NUG: newStakedGuns must be at least minimum shareRate"); /* The stakeStart timestamp will always be part-way through the current day, so it needs to be rounded-up to the next day to ensure all stakes align with the same fixed calendar days. The current day is already rounded-down, so rounded-up is current day + 1. */ uint256 newLockedDay = g._currentDay + 1; /* Create Stake */ uint40 newStakeId = ++g._latestStakeId; _stakeAdd( stakeLists[msg.sender], newStakeId, newStakedGuns, newStakeShares, newLockedDay, newStakedDays ); emit StakeStart( newStakeId, msg.sender, newStakedGuns, newStakeShares, newStakedDays ); /* Stake is added to total in the next round, not the current round */ g._nextStakeSharesTotal += newStakeShares; /* Track total staked Guns for inflation calculations */ g._lockedGunsTotal += newStakedGuns; } /** * @dev Calculates total stake payout including rewards for a multi-day range * @param g Cache of stored globals * @param stakeSharesParam Param from stake to calculate bonuses for * @param beginDay First day to calculate bonuses for * @param endDay Last day (non-inclusive) of range to calculate bonuses for * @return Payout in Guns */ function _calcPayoutRewards( GlobalsCache memory g, uint256 stakeSharesParam, uint256 beginDay, uint256 endDay ) private view returns (uint256 payout) { uint256 counter; for (uint256 day = beginDay; day < endDay; day++) { uint256 dayPayout; dayPayout = dailyData[day].dayPayoutTotal * stakeSharesParam / dailyData[day].dayStakeSharesTotal; if (counter < 4) { counter++; } /* Eligible to receive bonus */ else { dayPayout = (dailyData[day].dayPayoutTotal * stakeSharesParam / dailyData[day].dayStakeSharesTotal) * BONUS_DAY_SCALE; counter = 0; } payout += dayPayout; } return payout; } /** * @dev Calculates user dividends * @param g Cache of stored globals * @param stakeSharesParam Param from stake to calculate bonuses for * @param beginDay First day to calculate bonuses for * @param endDay Last day (non-inclusive) of range to calculate bonuses for * @return Payout in Guns */ function _calcPayoutDividendsReward( GlobalsCache memory g, uint256 stakeSharesParam, uint256 beginDay, uint256 endDay ) private view returns (uint256 payout) { for (uint256 day = beginDay; day < endDay; day++) { uint256 dayPayout; /* user's share of 85% of the day's dividends, 15% total will drip to NUI platform */ dayPayout += ((dailyData[day].dayDividends * 85) / 100) * stakeSharesParam / dailyData[day].dayStakeSharesTotal; payout += dayPayout; } return payout; } /** * @dev Calculate bonus Guns for a new stake, if any * @param newStakedGuns Number of Guns to stake * @param newStakedDays Number of days to stake */ function _stakeStartBonusGuns(uint256 newStakedGuns, uint256 newStakedDays) private pure returns (uint256 bonusGuns) { /* LONGER PAYS BETTER: If longer than 1 day stake is committed to, each extra day gives bonus shares of approximately 0.0548%, which is approximately 20% extra per year of increased stake length committed to, but capped to a maximum of 200% extra. extraDays = stakedDays - 1 longerBonus% = (extraDays / 364) * 20% = (extraDays / 364) / 5 = extraDays / 1820 = extraDays / LPB extraDays = longerBonus% * 1820 extraDaysMax = longerBonusMax% * 1820 = 200% * 1820 = 3640 = LPB_MAX_DAYS BIGGER PAYS BETTER: Bonus percentage scaled 0% to 10% for the first 7M NUG of stake. biggerBonus% = (cappedGuns / BPB_MAX_GUNS) * 10% = (cappedGuns / BPB_MAX_GUNS) / 10 = cappedGuns / (BPB_MAX_GUNS * 10) = cappedGuns / BPB COMBINED: combinedBonus% = longerBonus% + biggerBonus% cappedExtraDays cappedGuns = --------------- + ------------ LPB BPB cappedExtraDays * BPB cappedGuns * LPB = --------------------- + ------------------ LPB * BPB LPB * BPB cappedExtraDays * BPB + cappedGuns * LPB = -------------------------------------------- LPB * BPB bonusGuns = suns * combinedBonus% = suns * (cappedExtraDays * BPB + cappedGuns * LPB) / (LPB * BPB) */ uint256 cappedExtraDays = 0; /* Must be more than 1 day for Longer-Pays-Better */ if (newStakedDays > 1) { cappedExtraDays = newStakedDays <= LPB_MAX_DAYS ? newStakedDays - 1 : LPB_MAX_DAYS; } uint256 cappedStakedGuns = newStakedGuns <= BPB_MAX_GUNS ? newStakedGuns : BPB_MAX_GUNS; bonusGuns = cappedExtraDays * BPB + cappedStakedGuns * LPB; bonusGuns = newStakedGuns * bonusGuns / (LPB * BPB); return bonusGuns; } function _stakeUnlock(GlobalsCache memory g, StakeCache memory st) private pure { g._stakeSharesTotal -= st._stakeShares; st._unlockedDay = g._currentDay; } function _stakePerformance(GlobalsCache memory g, StakeCache memory st, uint256 servedDays) private view returns (uint256 stakeReturn, uint256 payout, uint256 dividends, uint256 penalty, uint256 cappedPenalty) { if (servedDays < st._stakedDays) { (payout, penalty) = _calcPayoutAndEarlyPenalty( g, st._lockedDay, st._stakedDays, servedDays, st._stakeShares ); stakeReturn = st._stakedGuns + payout; dividends = _calcPayoutDividendsReward( g, st._stakeShares, st._lockedDay, st._lockedDay + servedDays ); } else { // servedDays must == stakedDays here payout = _calcPayoutRewards( g, st._stakeShares, st._lockedDay, st._lockedDay + servedDays ); dividends = _calcPayoutDividendsReward( g, st._stakeShares, st._lockedDay, st._lockedDay + servedDays ); stakeReturn = st._stakedGuns + payout; penalty = _calcLatePenalty(st._lockedDay, st._stakedDays, st._unlockedDay, stakeReturn); } if (penalty != 0) { if (penalty > stakeReturn) { /* Cannot have a negative stake return */ cappedPenalty = stakeReturn; stakeReturn = 0; } else { /* Remove penalty from the stake return */ cappedPenalty = penalty; stakeReturn -= cappedPenalty; } } return (stakeReturn, payout, dividends, penalty, cappedPenalty); } function _calcPayoutAndEarlyPenalty( GlobalsCache memory g, uint256 lockedDayParam, uint256 stakedDaysParam, uint256 servedDays, uint256 stakeSharesParam ) private view returns (uint256 payout, uint256 penalty) { uint256 servedEndDay = lockedDayParam + servedDays; /* 50% of stakedDays (rounded up) with a minimum applied */ uint256 penaltyDays = (stakedDaysParam + 1) / 2; if (penaltyDays < EARLY_PENALTY_MIN_DAYS) { penaltyDays = EARLY_PENALTY_MIN_DAYS; } if (servedDays == 0) { /* Fill penalty days with the estimated average payout */ uint256 expected = _estimatePayoutRewardsDay(g, stakeSharesParam, lockedDayParam); penalty = expected * penaltyDays; return (payout, penalty); // Actual payout was 0 } if (penaltyDays < servedDays) { /* Simplified explanation of intervals where end-day is non-inclusive: penalty: [lockedDay ... penaltyEndDay) delta: [penaltyEndDay ... servedEndDay) payout: [lockedDay ....................... servedEndDay) */ uint256 penaltyEndDay = lockedDayParam + penaltyDays; penalty = _calcPayoutRewards(g, stakeSharesParam, lockedDayParam, penaltyEndDay); uint256 delta = _calcPayoutRewards(g, stakeSharesParam, penaltyEndDay, servedEndDay); payout = penalty + delta; return (payout, penalty); } /* penaltyDays >= servedDays */ payout = _calcPayoutRewards(g, stakeSharesParam, lockedDayParam, servedEndDay); if (penaltyDays == servedDays) { penalty = payout; } else { /* (penaltyDays > servedDays) means not enough days served, so fill the penalty days with the average payout from only the days that were served. */ penalty = payout * penaltyDays / servedDays; } return (payout, penalty); } function _calcLatePenalty( uint256 lockedDayParam, uint256 stakedDaysParam, uint256 unlockedDayParam, uint256 rawStakeReturn ) private pure returns (uint256) { /* Allow grace time before penalties accrue */ uint256 maxUnlockedDay = lockedDayParam + stakedDaysParam + LATE_PENALTY_GRACE_DAYS; if (unlockedDayParam <= maxUnlockedDay) { return 0; } /* Calculate penalty as a percentage of stake return based on time */ return rawStakeReturn * (unlockedDayParam - maxUnlockedDay) / LATE_PENALTY_SCALE_DAYS; } function _shareRateUpdate(GlobalsCache memory g, StakeCache memory st, uint256 stakeReturn) private { if (stakeReturn > st._stakedGuns) { /* Calculate the new shareRate that would yield the same number of shares if the user re-staked this stakeReturn, factoring in any bonuses they would receive in stakeStart(). */ uint256 bonusGuns = _stakeStartBonusGuns(stakeReturn, st._stakedDays); uint256 newShareRate = (stakeReturn + bonusGuns) * SHARE_RATE_SCALE / st._stakeShares; if (newShareRate > SHARE_RATE_MAX) { /* Realistically this can't happen, but there are contrived theoretical scenarios that can lead to extreme values of newShareRate, so it is capped to prevent them anyway. */ newShareRate = SHARE_RATE_MAX; } if (newShareRate > g._shareRate) { g._shareRate = newShareRate; emit ShareRateChange( st._stakeId, block.timestamp, newShareRate ); } } } } contract TransformableToken is StakeableToken { /** * @dev PUBLIC FACING: Enter the auction lobby for the current round * @param referrerAddr TRX address of referring user (optional; 0x0 for no referrer) */ function xfLobbyEnter(address referrerAddr) external payable { uint256 enterDay = _currentDay(); uint256 rawAmount = msg.value; require(rawAmount != 0, "NUG: Amount required"); XfLobbyQueueStore storage qRef = xfLobbyMembers[enterDay][msg.sender]; uint256 entryIndex = qRef.tailIndex++; qRef.entries[entryIndex] = XfLobbyEntryStore(uint96(rawAmount), referrerAddr); xfLobby[enterDay] += rawAmount; emit XfLobbyEnter( block.timestamp, enterDay, entryIndex, rawAmount ); } /** * @dev PUBLIC FACING: Leave the transform lobby after the round is complete * @param enterDay Day number when the member entered * @param count Number of queued-enters to exit (optional; 0 for all) */ function xfLobbyExit(uint256 enterDay, uint256 count) external { require(enterDay < _currentDay(), "NUG: Round is not complete"); XfLobbyQueueStore storage qRef = xfLobbyMembers[enterDay][msg.sender]; uint256 headIndex = qRef.headIndex; uint256 endIndex; if (count != 0) { require(count <= qRef.tailIndex - headIndex, "NUG: count invalid"); endIndex = headIndex + count; } else { endIndex = qRef.tailIndex; require(headIndex < endIndex, "NUG: count invalid"); } uint256 waasLobby = _waasLobby(enterDay); uint256 _xfLobby = xfLobby[enterDay]; uint256 totalXfAmount = 0; do { uint256 rawAmount = qRef.entries[headIndex].rawAmount; address referrerAddr = qRef.entries[headIndex].referrerAddr; delete qRef.entries[headIndex]; uint256 xfAmount = waasLobby * rawAmount / _xfLobby; if (referrerAddr == address(0) || referrerAddr == msg.sender) { /* No referrer or Self-referred */ _emitXfLobbyExit(enterDay, headIndex, xfAmount, referrerAddr); } else { /* Referral bonus of 5% of xfAmount to member */ uint256 referralBonusGuns = xfAmount / 20; xfAmount += referralBonusGuns; /* Then a cumulative referrer bonus of 10% to referrer */ uint256 referrerBonusGuns = xfAmount / 10; _emitXfLobbyExit(enterDay, headIndex, xfAmount, referrerAddr); _mint(referrerAddr, referrerBonusGuns); } totalXfAmount += xfAmount; } while (++headIndex < endIndex); qRef.headIndex = uint40(headIndex); if (totalXfAmount != 0) { _mint(msg.sender, totalXfAmount); } } /** * @dev PUBLIC FACING: External helper to return multiple values of xfLobby[] with * a single call * @param beginDay First day of data range * @param endDay Last day (non-inclusive) of data range * @return Fixed array of values */ function xfLobbyRange(uint256 beginDay, uint256 endDay) external view returns (uint256[] memory list) { require( beginDay < endDay && endDay <= _currentDay(), "NUG: invalid range" ); list = new uint256[](endDay - beginDay); uint256 src = beginDay; uint256 dst = 0; do { list[dst++] = uint256(xfLobby[src++]); } while (src < endDay); return list; } /** * @dev PUBLIC FACING: Release 15% for NUI Drip from daily divs */ function xfFlush() external { GlobalsCache memory g; GlobalsCache memory gSnapshot; _globalsLoad(g, gSnapshot); require(address(this).balance != 0, "NUG: No value"); require(LAST_FLUSHED_DAY < _currentDay(), "NUG: Invalid day"); _dailyDataUpdateAuto(g); NUI_SHARE_ADDR.transfer((dailyData[LAST_FLUSHED_DAY].dayDividends * 15) / 100); LAST_FLUSHED_DAY++; _globalsSync(g, gSnapshot); } /** * @dev PUBLIC FACING: Return a current lobby member queue entry. * Only needed due to limitations of the standard ABI encoder. * @param memberAddr TRX address of the lobby member * @param enterDay * @param entryIndex * @return 1: Raw amount that was entered with; 2: Referring TRX addr (optional; 0x0 for no referrer) */ function xfLobbyEntry(address memberAddr, uint256 enterDay, uint256 entryIndex) external view returns (uint256 rawAmount, address referrerAddr) { XfLobbyEntryStore storage entry = xfLobbyMembers[enterDay][memberAddr].entries[entryIndex]; require(entry.rawAmount != 0, "NUG: Param invalid"); return (entry.rawAmount, entry.referrerAddr); } /** * @dev PUBLIC FACING: Return the lobby days that a user is in with a single call * @param memberAddr TRX address of the user * @return Bit vector of lobby day numbers */ function xfLobbyPendingDays(address memberAddr) external view returns (uint256[XF_LOBBY_DAY_WORDS] memory words) { uint256 day = _currentDay() + 1; while (day-- != 0) { if (xfLobbyMembers[day][memberAddr].tailIndex > xfLobbyMembers[day][memberAddr].headIndex) { words[day >> 8] |= 1 << (day & 255); } } return words; } function _waasLobby(uint256 enterDay) private returns (uint256 waasLobby) { /* * * 1000000000000 = 500000 * GUNS_PER_NUG / 50 */ if (enterDay > 0 && enterDay <= 50) { waasLobby = CLAIM_STARTING_AMOUNT - ((enterDay - 1) * 1000000000000); } else { waasLobby = CLAIM_LOWEST_AMOUNT; } return waasLobby; } function _emitXfLobbyExit( uint256 enterDay, uint256 entryIndex, uint256 xfAmount, address referrerAddr ) private { emit XfLobbyExit( block.timestamp, enterDay, entryIndex, xfAmount, referrerAddr ); } } contract NUG is TransformableToken { constructor() public { /* Initialize global shareRate to 1 */ globals.shareRate = uint40(1 * SHARE_RATE_SCALE); } function() external payable {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"amount","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"sender","type":"address"},{"name":"recipient","type":"address"},{"name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"stakeLists","outputs":[{"name":"stakeId","type":"uint40"},{"name":"stakedGuns","type":"uint72"},{"name":"stakeShares","type":"uint72"},{"name":"lockedDay","type":"uint16"},{"name":"stakedDays","type":"uint16"},{"name":"unlockedDay","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"memberAddr","type":"address"},{"name":"enterDay","type":"uint256"},{"name":"entryIndex","type":"uint256"}],"name":"xfLobbyEntry","outputs":[{"name":"rawAmount","type":"uint256"},{"name":"referrerAddr","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"stakerAddr","type":"address"}],"name":"stakeCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"stakeIndex","type":"uint256"},{"name":"stakeIdParam","type":"uint40"}],"name":"stakeEnd","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"allocatedSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"},{"name":"","type":"address"}],"name":"xfLobbyMembers","outputs":[{"name":"headIndex","type":"uint40"},{"name":"tailIndex","type":"uint40"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"memberAddr","type":"address"}],"name":"xfLobbyPendingDays","outputs":[{"name":"words","type":"uint256[2]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newStakedGuns","type":"uint256"},{"name":"newStakedDays","type":"uint256"}],"name":"stakeStart","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"currentDay","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"stakerAddr","type":"address"},{"name":"stakeIndex","type":"uint256"},{"name":"stakeIdParam","type":"uint40"}],"name":"stakeGoodAccounting","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"beginDay","type":"uint256"},{"name":"endDay","type":"uint256"}],"name":"dailyDataRange","outputs":[{"name":"_dayStakeSharesTotal","type":"uint256[]"},{"name":"_dayPayoutTotal","type":"uint256[]"},{"name":"_dayDividends","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"xfLobby","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"beforeDay","type":"uint256"}],"name":"dailyDataUpdate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"dailyData","outputs":[{"name":"dayPayoutTotal","type":"uint72"},{"name":"dayDividends","type":"uint256"},{"name":"dayStakeSharesTotal","type":"uint72"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"recipient","type":"address"},{"name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"globals","outputs":[{"name":"lockedGunsTotal","type":"uint72"},{"name":"nextStakeSharesTotal","type":"uint72"},{"name":"shareRate","type":"uint40"},{"name":"stakePenaltyTotal","type":"uint72"},{"name":"dailyDataCount","type":"uint16"},{"name":"stakeSharesTotal","type":"uint72"},{"name":"latestStakeId","type":"uint40"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"enterDay","type":"uint256"},{"name":"count","type":"uint256"}],"name":"xfLobbyExit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"referrerAddr","type":"address"}],"name":"xfLobbyEnter","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"xfFlush","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"globalInfo","outputs":[{"name":"","type":"uint256[10]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"beginDay","type":"uint256"},{"name":"endDay","type":"uint256"}],"name":"xfLobbyRange","outputs":[{"name":"list","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"timestamp","type":"uint256"},{"indexed":false,"name":"enterDay","type":"uint256"},{"indexed":true,"name":"entryIndex","type":"uint256"},{"indexed":true,"name":"rawAmount","type":"uint256"}],"name":"XfLobbyEnter","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"timestamp","type":"uint256"},{"indexed":false,"name":"enterDay","type":"uint256"},{"indexed":true,"name":"entryIndex","type":"uint256"},{"indexed":true,"name":"xfAmount","type":"uint256"},{"indexed":true,"name":"referrerAddr","type":"address"}],"name":"XfLobbyExit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"updaterAddr","type":"address"},{"indexed":false,"name":"timestamp","type":"uint256"},{"indexed":false,"name":"beginDay","type":"uint256"},{"indexed":false,"name":"endDay","type":"uint256"}],"name":"DailyDataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"stakeId","type":"uint40"},{"indexed":true,"name":"stakerAddr","type":"address"},{"indexed":false,"name":"stakedGuns","type":"uint256"},{"indexed":false,"name":"stakeShares","type":"uint256"},{"indexed":false,"name":"stakedDays","type":"uint256"}],"name":"StakeStart","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"stakeId","type":"uint40"},{"indexed":true,"name":"stakerAddr","type":"address"},{"indexed":true,"name":"senderAddr","type":"address"},{"indexed":false,"name":"stakedGuns","type":"uint256"},{"indexed":false,"name":"stakeShares","type":"uint256"},{"indexed":false,"name":"payout","type":"uint256"},{"indexed":false,"name":"penalty","type":"uint256"}],"name":"StakeGoodAccounting","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"stakeId","type":"uint40"},{"indexed":false,"name":"prevUnlocked","type":"uint40"},{"indexed":true,"name":"stakerAddr","type":"address"},{"indexed":false,"name":"lockedDay","type":"uint256"},{"indexed":false,"name":"servedDays","type":"uint256"},{"indexed":false,"name":"stakedGuns","type":"uint256"},{"indexed":false,"name":"stakeShares","type":"uint256"},{"indexed":false,"name":"dividends","type":"uint256"},{"indexed":false,"name":"payout","type":"uint256"},{"indexed":false,"name":"penalty","type":"uint256"},{"indexed":false,"name":"stakeReturn","type":"uint256"}],"name":"StakeEnd","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"stakeId","type":"uint40"},{"indexed":false,"name":"timestamp","type":"uint256"},{"indexed":false,"name":"newShareRate","type":"uint256"}],"name":"ShareRateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"}]
Contract Creation Code
608060405266071afd498d00006002556001600360006101000a81548160ff021916908360ff16021790555034801561003757600080fd5b506002546000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550620186a0600102600460000160126101000a81548164ffffffffff021916908364ffffffffff160217905550615279806100b86000396000f3fe6080604052600436106101e35760003560e01c806365cf71b211610102578063a9059cbb11610095578063dd62ed3e11610064578063dd62ed3e14610e5e578063e4df526514610ee3578063f04b5fa014610efa578063f57a1b3c14610f4d576101e3565b8063a9059cbb14610c91578063c312452514610d04578063cbb151d314610dd5578063ce7d1f7714610e1a576101e3565b80638f1c65c0116100d15780638f1c65c014610aca57806390de687114610b0557806395d89b4114610b8e578063a457c2d714610c1e576101e3565b806365cf71b2146108805780636a210a0e146108ec57806370a0823114610a1657806387a0f31c14610a7b576101e3565b8063343009a21161017a57806344203faf1161014957806344203faf146106f157806344f0de751461078357806352a438b8146108105780635c9302c914610855576101e3565b8063343009a2146105cc57806339509351146106185780633a70a5ca1461068b57806342966c68146106b6576101e3565b80632607443b116101b65780632607443b146103a65780632e60d1c41461048a578063313ce5671461053657806333060d9014610567576101e3565b806306fdde03146101e5578063095ea7b31461027557806318160ddd146102e857806323b872dd14610313575b005b3480156101f157600080fd5b506101fa610fe7565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561023a57808201518184015260208101905061021f565b50505050905090810190601f1680156102675780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561028157600080fd5b506102ce6004803603604081101561029857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611020565b604051808215151515815260200191505060405180910390f35b3480156102f457600080fd5b506102fd61103e565b6040518082815260200191505060405180910390f35b34801561031f57600080fd5b5061038c6004803603606081101561033657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611048565b604051808215151515815260200191505060405180910390f35b3480156103b257600080fd5b506103ff600480360360408110156103c957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611121565b604051808764ffffffffff1664ffffffffff1681526020018668ffffffffffffffffff1668ffffffffffffffffff1681526020018568ffffffffffffffffff1668ffffffffffffffffff1681526020018461ffff1661ffff1681526020018361ffff1661ffff1681526020018261ffff1661ffff168152602001965050505050505060405180910390f35b34801561049657600080fd5b506104ed600480360360608110156104ad57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291905050506111d8565b604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390f35b34801561054257600080fd5b5061054b611344565b604051808260ff1660ff16815260200191505060405180910390f35b34801561057357600080fd5b506105b66004803603602081101561058a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611349565b6040518082815260200191505060405180910390f35b3480156105d857600080fd5b50610616600480360360408110156105ef57600080fd5b8101908080359060200190929190803564ffffffffff169060200190929190505050611395565b005b34801561062457600080fd5b506106716004803603604081101561063b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611746565b604051808215151515815260200191505060405180910390f35b34801561069757600080fd5b506106a06117f9565b6040518082815260200191505060405180910390f35b3480156106c257600080fd5b506106ef600480360360208110156106d957600080fd5b810190808035906020019092919050505061182f565b005b3480156106fd57600080fd5b5061074a6004803603604081101561071457600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506118f0565b604051808364ffffffffff1664ffffffffff1681526020018264ffffffffff1664ffffffffff1681526020019250505060405180910390f35b34801561078f57600080fd5b506107d2600480360360208110156107a657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611943565b6040518082600260200280838360005b838110156107fd5780820151818401526020810190506107e2565b5050505090500191505060405180910390f35b34801561081c57600080fd5b506108536004803603604081101561083357600080fd5b810190808035906020019092919080359060200190929190505050611a7e565b005b34801561086157600080fd5b5061086a611b20565b6040518082815260200191505060405180910390f35b34801561088c57600080fd5b506108ea600480360360608110156108a357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803564ffffffffff169060200190929190505050611b2f565b005b3480156108f857600080fd5b5061092f6004803603604081101561090f57600080fd5b810190808035906020019092919080359060200190929190505050611f1a565b60405180806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561097a57808201518184015260208101905061095f565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156109bc5780820151818401526020810190506109a1565b50505050905001848103825285818151815260200191508051906020019060200280838360005b838110156109fe5780820151818401526020810190506109e3565b50505050905001965050505050505060405180910390f35b348015610a2257600080fd5b50610a6560048036036020811015610a3957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612156565b6040518082815260200191505060405180910390f35b348015610a8757600080fd5b50610ab460048036036020811015610a9e57600080fd5b810190808035906020019092919050505061219e565b6040518082815260200191505060405180910390f35b348015610ad657600080fd5b50610b0360048036036020811015610aed57600080fd5b81019080803590602001909291905050506121b6565b005b348015610b1157600080fd5b50610b3e60048036036020811015610b2857600080fd5b81019080803590602001909291905050506122e0565b604051808468ffffffffffffffffff1668ffffffffffffffffff1681526020018381526020018268ffffffffffffffffff1668ffffffffffffffffff168152602001935050505060405180910390f35b348015610b9a57600080fd5b50610ba3612334565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610be3578082015181840152602081019050610bc8565b50505050905090810190601f168015610c105780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610c2a57600080fd5b50610c7760048036036040811015610c4157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061236d565b604051808215151515815260200191505060405180910390f35b348015610c9d57600080fd5b50610cea60048036036040811015610cb457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061243a565b604051808215151515815260200191505060405180910390f35b348015610d1057600080fd5b50610d19612458565b604051808868ffffffffffffffffff1668ffffffffffffffffff1681526020018768ffffffffffffffffff1668ffffffffffffffffff1681526020018664ffffffffff1664ffffffffff1681526020018568ffffffffffffffffff1668ffffffffffffffffff1681526020018461ffff1661ffff1681526020018368ffffffffffffffffff1668ffffffffffffffffff1681526020018264ffffffffff1664ffffffffff16815260200197505050505050505060405180910390f35b348015610de157600080fd5b50610e1860048036036040811015610df857600080fd5b81019080803590602001909291908035906020019092919050505061250c565b005b610e5c60048036036020811015610e3057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612961565b005b348015610e6a57600080fd5b50610ecd60048036036040811015610e8157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612bbf565b6040518082815260200191505060405180910390f35b348015610eef57600080fd5b50610ef8612c46565b005b348015610f0657600080fd5b50610f0f612e55565b6040518082600a60200280838360005b83811015610f3a578082015181840152602081019050610f1f565b5050505090500191505060405180910390f35b348015610f5957600080fd5b50610f9060048036036040811015610f7057600080fd5b810190808035906020019092919080359060200190929190505050612fae565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610fd3578082015181840152602081019050610fb8565b505050509050019250505060405180910390f35b6040518060400160405280600381526020017f4e5547000000000000000000000000000000000000000000000000000000000081525081565b600061103461102d6130c1565b84846130c9565b6001905092915050565b6000600254905090565b60006110558484846132c0565b611116846110616130c1565b6111118560405180606001604052806028815260200161515960289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006110c76130c1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135769092919063ffffffff16565b6130c9565b600190509392505050565b6007602052816000526040600020818154811061113a57fe5b90600052602060002001600091509150508060000160009054906101000a900464ffffffffff16908060000160059054906101000a900468ffffffffffffffffff169080600001600e9054906101000a900468ffffffffffffffffff16908060000160179054906101000a900461ffff16908060000160199054906101000a900461ffff169080600001601b9054906101000a900461ffff16905086565b60008060006009600086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000858152602001908152602001600020905060008160000160009054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff1614156112e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4e55473a20506172616d20696e76616c6964000000000000000000000000000081525060200191505060405180910390fd5b8060000160009054906101000a90046bffffffffffffffffffffffff1681600001600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816bffffffffffffffffffffffff1691509250925050935093915050565b600881565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b61139d614f76565b6113a5614f76565b6113af8282613636565b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008180549050141561146d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e55473a20456d707479207374616b65206c697374000000000000000000000081525060200191505060405180910390fd5b808054905085106114e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4e55473a207374616b65496e64657820696e76616c696400000000000000000081525060200191505060405180910390fd5b6114ee614fc2565b61150e8287815481106114fd57fe5b906000526020600020018683613789565b61151784613911565b60008090506000808360a00151141590506000806000905060008090506000809050600080905087606001518b60e00151106115f657851561155f578760800151965061158b565b6115698b89613924565b87606001518b60e00151039650876080015187111561158a57876080015196505b5b6115968b898961394a565b80955081965082975083985084995050505050503373ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156115f0573d6000803e3d6000fd5b50611612565b87604001518b6020018181510391508181525050876020015194505b3373ffffffffffffffffffffffffffffffffffffffff168c64ffffffffff167f80bb257dd672adb291601517b3f5d31642fccf6d3db7a40983552a9baacbbabd8861165e576000611661565b60015b8b606001518b8d602001518e604001518a8c8b8f604051808a60ff1664ffffffffff168152602001898152602001888152602001878152602001868152602001858152602001848152602001838152602001828152602001995050505050505050505060405180910390a3600081141580156116db575085155b156116f157808b60600181815101915081815250505b6000851461170f576117033386613a45565b61170e8b8987613c00565b5b87602001518b600001818151039150818152505061172d898e613cbd565b6117378b8b613f0c565b50505050505050505050505050565b60006117ef6117536130c1565b846117ea85600160006117646130c1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546140e190919063ffffffff16565b6130c9565b6001905092915050565b6000600460000160009054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1661182961103e565b01905090565b806000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156118e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f45524332303a206e6f7420656e6f7567682062616c616e63652100000000000081525060200191505060405180910390fd5b6118ed3382614169565b50565b6009602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900464ffffffffff16908060000160059054906101000a900464ffffffffff16905082565b61194b614fff565b60006001611957614321565b0190505b6000818060019003925014611a75576009600082815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900464ffffffffff1664ffffffffff166009600083815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160059054906101000a900464ffffffffff1664ffffffffff161115611a705760ff81166001901b82600883901c60028110611a6057fe5b6020020181815117915081815250505b61195b565b81915050919050565b611a86614f76565b611a8e614f76565b611a988282613636565b6001831015611af2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061510e6025913960400191505060405180910390fd5b611afb82613911565b611b06828585614351565b611b103385614169565b611b1a8282613f0c565b50505050565b6000611b2a614321565b905090565b611b37614f76565b611b3f614f76565b611b498282613636565b6000600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490501415611c02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e55473a20456d707479207374616b65206c697374000000000000000000000081525060200191505060405180910390fd5b600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508410611cb9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4e55473a207374616b65496e64657820696e76616c696400000000000000000081525060200191505060405180910390fd5b6000600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208581548110611d0557fe5b906000526020600020019050611d19614fc2565b611d24828683613789565b80608001518160600151018460e001511015611da8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4e55473a205374616b65206e6f742066756c6c7920736572766564000000000081525060200191505060405180910390fd5b60008160a0015114611e22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4e55473a205374616b6520616c726561647920756e6c6f636b6564000000000081525060200191505060405180910390fd5b611e2b84613911565b611e358482613924565b600080600080611e4a8886876080015161394a565b9450945094509450503373ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff168a64ffffffffff167f0bff00790f1231cf0c26911db2d0c4e670b204ebb02d6a73d3fb5c995910705e8860200151896040015189886040518085815260200184815260200183815260200182815260200194505050505060405180910390a460008114611ef957808860600181815101915081815250505b611f038686614533565b611f0d8888613f0c565b5050505050505050505050565b60608060608385108015611f455750600460010160009054906101000a900461ffff1661ffff168411155b611fb7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4e55473a2072616e676520696e76616c6964000000000000000000000000000081525060200191505060405180910390fd5b848403604051908082528060200260200182016040528015611fe85781602001602082028038833980820191505090505b50925084840360405190808252806020026020018201604052801561201c5781602001602082028038833980820191505090505b5091508484036040519080825280602002602001820160405280156120505781602001602082028038833980820191505090505b509050600085905060008090505b6006600083815260200190815260200160002060020160009054906101000a900468ffffffffffffffffff1668ffffffffffffffffff168582815181106120a157fe5b6020026020010181815250506006600083815260200190815260200160002060000160009054906101000a900468ffffffffffffffffff1668ffffffffffffffffff168482806001019350815181106120f657fe5b602002602001018181525050600660008381526020019081526020016000206001015483828060010193508151811061212b57fe5b60200260200101818152505085826001019250821061205e5784848494509450945050509250925092565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60086020528060005260406000206000915090505481565b6121be614f76565b6121c6614f76565b6121d08282613636565b60018260e001511161224a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f4e55473a20546f6f206561726c7900000000000000000000000000000000000081525060200191505060405180910390fd5b600083146122c0578160e001518311156122af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806151336026913960400191505060405180910390fd5b6122bb8284600061462b565b6122d1565b6122d0828360e00151600061462b565b5b6122db8282613f0c565b505050565b60066020528060005260406000206000915090508060000160009054906101000a900468ffffffffffffffffff16908060010154908060020160009054906101000a900468ffffffffffffffffff16905083565b6040518060400160405280600381526020017f4e5547000000000000000000000000000000000000000000000000000000000081525081565b600061243061237a6130c1565b8461242b8560405180606001604052806025815260200161522060259139600160006123a46130c1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135769092919063ffffffff16565b6130c9565b6001905092915050565b600061244e6124476130c1565b84846132c0565b6001905092915050565b60048060000160009054906101000a900468ffffffffffffffffff16908060000160099054906101000a900468ffffffffffffffffff16908060000160129054906101000a900464ffffffffff16908060000160179054906101000a900468ffffffffffffffffff16908060010160009054906101000a900461ffff16908060010160029054906101000a900468ffffffffffffffffff169080600101600b9054906101000a900464ffffffffff16905087565b612514614321565b8210612588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f4e55473a20526f756e64206973206e6f7420636f6d706c65746500000000000081525060200191505060405180910390fd5b60006009600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000160009054906101000a900464ffffffffff1664ffffffffff16905060008084146126a457818360000160059054906101000a900464ffffffffff1664ffffffffff160384111561269a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4e55473a20636f756e7420696e76616c6964000000000000000000000000000081525060200191505060405180910390fd5b8382019050612739565b8260000160059054906101000a900464ffffffffff1664ffffffffff169050808210612738576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4e55473a20636f756e7420696e76616c6964000000000000000000000000000081525060200191505060405180910390fd5b5b60006127448661472d565b905060006008600088815260200190815260200160002054905060008090505b600086600101600087815260200190815260200160002060000160009054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff1690506000876001016000888152602001908152602001600020600001600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050876001016000888152602001908152602001600020600080820160006101000a8154906bffffffffffffffffffffffff021916905560008201600c6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550506000848387028161284f57fe5b049050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806128b857503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b156128ce576128c98b898385614770565b61290a565b6000601482816128da57fe5b04905080820191506000600a83816128ee57fe5b0490506128fd8d8b8587614770565b6129078482613a45565b50505b808401935050505083856001019550851061276457848660000160006101000a81548164ffffffffff021916908364ffffffffff16021790555060008114612957576129563382613a45565b5b5050505050505050565b600061296b614321565b9050600034905060008114156129e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4e55473a20416d6f756e7420726571756972656400000000000000000000000081525060200191505060405180910390fd5b60006009600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600001600581819054906101000a900464ffffffffff168092919060010191906101000a81548164ffffffffff021916908364ffffffffff16021790555064ffffffffff1690506040518060400160405280846bffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1681525082600101600083815260200190815260200160002060008201518160000160006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550602082015181600001600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555090505082600860008681526020019081526020016000206000828254019250508190555082817f683f950243ca541a09abd8157385ce15a23ac43a47b8d0306de2bdc20d0b9e094287604051808381526020018281526020019250505060405180910390a35050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612c4e614f76565b612c56614f76565b612c608282613636565b60003073ffffffffffffffffffffffffffffffffffffffff16311415612cee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f4e55473a204e6f2076616c75650000000000000000000000000000000000000081525060200191505060405180910390fd5b612cf6614321565b600360009054906101000a900460ff1660ff1610612d7c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f4e55473a20496e76616c6964206461790000000000000000000000000000000081525060200191505060405180910390fd5b612d8582613911565b73c8001ea490f97b1dd673f77074edf18338853ca073ffffffffffffffffffffffffffffffffffffffff166108fc6064600f60066000600360009054906101000a900460ff1660ff168152602001908152602001600020600101540281612de857fe5b049081150290604051600060405180830381858888f19350505050158015612e14573d6000803e3d6000fd5b506003600081819054906101000a900460ff168092919060010191906101000a81548160ff021916908360ff16021790555050612e518282613f0c565b5050565b612e5d615021565b604051806101400160405280600460000160009054906101000a900468ffffffffffffffffff1668ffffffffffffffffff168152602001600460000160099054906101000a900468ffffffffffffffffff1668ffffffffffffffffff168152602001600460000160129054906101000a900464ffffffffff1664ffffffffff168152602001600460000160179054906101000a900468ffffffffffffffffff1668ffffffffffffffffff168152602001600460010160009054906101000a900461ffff1661ffff168152602001600460010160029054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1681526020016004600101600b9054906101000a900464ffffffffff1664ffffffffff168152602001428152602001612f8661103e565b815260200160086000612f97614321565b815260200190815260200160002054815250905090565b60608183108015612fc65750612fc2614321565b8211155b613038576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4e55473a20696e76616c69642072616e6765000000000000000000000000000081525060200191505060405180910390fd5b8282036040519080825280602002602001820160405280156130695781602001602082028038833980820191505090505b509050600083905060008090505b60086000838060010194508152602001908152602001600020548382806001019350815181106130a357fe5b60200260200101818152505083821061307757829250505092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561314f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806151fc6024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806150c66022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613346576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806151a26025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061505f6023913960400191505060405180910390fd5b613437816040518060600160405280602681526020016150e8602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135769092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506134ca816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546140e190919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000838311158290613623576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156135e85780820151818401526020810190506135cd565b50505050905090810190601f1680156136155780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600460000160009054906101000a900468ffffffffffffffffff1668ffffffffffffffffff16826000018181525050600460000160099054906101000a900468ffffffffffffffffff1668ffffffffffffffffff16826020018181525050600460000160129054906101000a900464ffffffffff1664ffffffffff16826040018181525050600460000160179054906101000a900468ffffffffffffffffff1668ffffffffffffffffff16826060018181525050600460010160009054906101000a900461ffff1661ffff16826080018181525050600460010160029054906101000a900468ffffffffffffffffff1668ffffffffffffffffff168260a00181815250506004600101600b9054906101000a900464ffffffffff168260c0019064ffffffffff16908164ffffffffff1681525050613772614321565b8260e001818152505061378582826147ce565b5050565b8260000160009054906101000a900464ffffffffff1664ffffffffff168264ffffffffff1614613821576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4e55473a207374616b654964506172616d206e6f7420696e207374616b65000081525060200191505060405180910390fd5b8260000160009054906101000a900464ffffffffff16816000019064ffffffffff16908164ffffffffff16815250508260000160059054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1681602001818152505082600001600e9054906101000a900468ffffffffffffffffff1668ffffffffffffffffff168160400181815250508260000160179054906101000a900461ffff1661ffff168160600181815250508260000160199054906101000a900461ffff1661ffff1681608001818152505082600001601b9054906101000a900461ffff1661ffff168160a0018181525050505050565b613921818260e00151600161462b565b50565b80604001518260a00181815103915081815250508160e001518160a00181815250505050565b600080600080600086608001518610156139a9576139778888606001518960800151898b60400151614844565b80935081955050508387602001510194506139a28888604001518960600151898b606001510161491a565b9250613a05565b6139c38888604001518960600151898b60600151016149b3565b93506139df8888604001518960600151898b606001510161491a565b9250838760200151019450613a02876060015188608001518960a0015188614afb565b91505b60008214613a2b5784821115613a215784905060009450613a2a565b81905080850394505b5b848484848494509450945094509450939792965093509350565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613ae8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b613afd816002546140e190919063ffffffff16565b600281905550613b54816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546140e190919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b8160200151811115613cb8576000613c1c828460800151614b38565b905060008360400151620186a08385010281613c3457fe5b049050600160286001901b03811115613c5357600160286001901b0390505b8460400151811115613cb55780856040018181525050836000015164ffffffffff167faf62aa7dadbf7e5e54b91236b109372266fcf681cc74f199a41e14c242a3db3f4283604051808381526020018281526020019250505060405180910390a25b50505b505050565b600060018380549050039050808214613e5957828181548110613cdc57fe5b90600052602060002001838381548110613cf257fe5b906000526020600020016000820160009054906101000a900464ffffffffff168160000160006101000a81548164ffffffffff021916908364ffffffffff1602179055506000820160059054906101000a900468ffffffffffffffffff168160000160056101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff16021790555060008201600e9054906101000a900468ffffffffffffffffff1681600001600e6101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff1602179055506000820160179054906101000a900461ffff168160000160176101000a81548161ffff021916908361ffff1602179055506000820160199054906101000a900461ffff168160000160196101000a81548161ffff021916908361ffff16021790555060008201601b9054906101000a900461ffff1681600001601b6101000a81548161ffff021916908361ffff1602179055509050505b82805480613e6357fe5b60019003818190600052602060002001600080820160006101000a81549064ffffffffff02191690556000820160056101000a81549068ffffffffffffffffff021916905560008201600e6101000a81549068ffffffffffffffffff02191690556000820160176101000a81549061ffff02191690556000820160196101000a81549061ffff021916905560008201601b6101000a81549061ffff021916905550509055505050565b80600001518260000151141580613f2b57508060200151826020015114155b80613f3e57508060400151826040015114155b80613f5157508060600151826060015114155b15614017578160000151600460000160006101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff1602179055508160200151600460000160096101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff1602179055508160400151600460000160126101000a81548164ffffffffff021916908364ffffffffff1602179055508160600151600460000160176101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff1602179055505b8060800151826080015114158061403657508060a001518260a0015114155b8061405757508060c0015164ffffffffff168260c0015164ffffffffff1614155b156140dd578160800151600460010160006101000a81548161ffff021916908361ffff1602179055508160a00151600460010160026101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff1602179055508160c001516004600101600b6101000a81548164ffffffffff021916908364ffffffffff1602179055505b5050565b60008082840190508381101561415f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156141ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806151816021913960400191505060405180910390fd5b61425a816040518060600160405280602281526020016150a4602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135769092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506142b181600254614c2a90919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b6000635fc97c00421015614338576000905061434e565b62015180635fc97c0042038161434a57fe5b0490505b90565b60198111156143ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806150826022913960400191505060405180910390fd5b60006143b78383614b38565b905060008460400151620186a083860102816143cf57fe5b049050600081141561442c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260358152602001806151c76035913960400191505060405180910390fd5b600060018660e0015101905060008660c001805160010164ffffffffff16908164ffffffffff1681525090506144a4600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828886868a614c74565b3373ffffffffffffffffffffffffffffffffffffffff168164ffffffffff167fa75ea2f0baef0a6cfa36f61bc0cdc9b3a55ce8876892cf96f640208f65c799e988868960405180848152602001838152602001828152602001935050505060405180910390a3828760200181815101915081815250508587600001818151019150818152505050505050505050565b80600001518260000160006101000a81548164ffffffffff021916908364ffffffffff16021790555080602001518260000160056101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550806040015182600001600e6101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff16021790555080606001518260000160176101000a81548161ffff021916908361ffff16021790555080608001518260000160196101000a81548161ffff021916908361ffff1602179055508060a0015182600001601b6101000a81548161ffff021916908361ffff1602179055505050565b8183608001511061463b57614728565b614643615044565b836000015161465061103e565b0181600001818152505060008460800151905061466e858383614df2565b600085602001511461469a5784602001518560a001818151019150818152505060008560200181815250505b5b838160010191508110156146b9576146b4858383614df2565b61469b565b3373ffffffffffffffffffffffffffffffffffffffff167fe00f6f1c2b3ba17574be0a8136275368d74f37631cf36525a360b272fe21195b4287608001518460405180848152602001838152602001828152602001935050505060405180910390a28085608001818152505050505b505050565b6000808211801561473f575060328211155b1561475e5764e8d4a510006001830302655af3107a4000039050614768565b652d79883d200090505b809050919050565b8073ffffffffffffffffffffffffffffffffffffffff1682847ff8fa88708321411fd98e823a1eb882047c8dc276ba17a8b81722ed282c4560f74288604051808381526020018281526020019250505060405180910390a450505050565b816000015181600001818152505081602001518160200181815250508160400151816040018181525050816060015181606001818152505081608001518160800181815250508160a001518160a00181815250508160c001518160c0019064ffffffffff16908164ffffffffff16815250505050565b6000806000848701905060006002600188018161485d57fe5b049050605a81101561486e57605a90505b60008614156148995760006148848a878b614eb6565b90508181029350848494509450505050614910565b858110156148da57600081890190506148b48a878b846149b3565b935060006148c48b8884876149b3565b9050808501955085859550955050505050614910565b6148e689868a856149b3565b9350858114156148f857839250614907565b858185028161490357fe5b0492505b83839350935050505b9550959350505050565b6000808390505b828110156149a75760006006600083815260200190815260200160002060020160009054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1686606460556006600087815260200190815260200160002060010154028161498657fe5b04028161498f57fe5b04810190508083019250508080600101915050614921565b50809050949350505050565b60008060008490505b83811015614aee5760006006600083815260200190815260200160002060020160009054906101000a900468ffffffffffffffffff1668ffffffffffffffffff16876006600085815260200190815260200160002060000160009054906101000a900468ffffffffffffffffff1668ffffffffffffffffff160281614a3d57fe5b0490506004831015614a56578280600101935050614adb565b600260ff166006600084815260200190815260200160002060020160009054906101000a900468ffffffffffffffffff1668ffffffffffffffffff16886006600086815260200190815260200160002060000160009054906101000a900468ffffffffffffffffff1668ffffffffffffffffff160281614ad257fe5b04029050600092505b80840193505080806001019150506149bc565b5081915050949350505050565b6000806007600202858701019050808411614b1a576000915050614b30565b6007606402818503840281614b2b57fe5b049150505b949350505050565b600080600090506001831115614b9057606460c86014618e3081614b5857fe5b040281614b6157fe5b04831115614b8857606460c86014618e3081614b7957fe5b040281614b8257fe5b04614b8d565b600183035b90505b6000600860ff16600a0a626acfc002851115614bb857600860ff16600a0a626acfc002614bba565b845b90506014618e3081614bc857fe5b048102600a6064600860ff16600a0a626acfc0020281614be457fe5b048302019250600a6064600860ff16600a0a626acfc0020281614c0357fe5b046014618e3081614c1057fe5b040283860281614c1c57fe5b049250829250505092915050565b6000614c6c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613576565b905092915050565b856040518060c001604052808764ffffffffff1681526020018668ffffffffffffffffff1681526020018568ffffffffffffffffff1681526020018461ffff1681526020018361ffff168152602001600061ffff1681525090806001815401808255809150509060018203906000526020600020016000909192909190915060008201518160000160006101000a81548164ffffffffff021916908364ffffffffff16021790555060208201518160000160056101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600e6101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff16021790555060608201518160000160176101000a81548161ffff021916908361ffff16021790555060808201518160000160196101000a81548161ffff021916908361ffff16021790555060a082015181600001601b6101000a81548161ffff021916908361ffff160217905550505050505050505050565b614dfd838383614f26565b81602001516006600083815260200190815260200160002060000160006101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550600860008281526020019081526020016000205460066000838152602001908152602001600020600101819055508260a001516006600083815260200190815260200160002060020160006101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550505050565b6000614ec0614f76565b614eca85826147ce565b614ed2615044565b8560000151614edf61103e565b01816000018181525050614ef4828286614f26565b848260a00181815101915081815250508160a001518582602001510281614f1757fe5b04925082925050509392505050565b63041aa18961c35083600001510281614f3b57fe5b048260200181815250506000836060015114614f7157826060015182602001818151019150818152505060008360600181815250505b505050565b604051806101000160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600064ffffffffff168152602001600081525090565b6040518060c00160405280600064ffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518060400160405280600290602082028038833980820191505090505090565b604051806101400160405280600a90602082028038833980820191505090505090565b60405180604001604052806000815260200160008152509056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734e55473a204d617820616c6c6f776564207374616b696e6720646179733a2031383045524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654e55473a206e65775374616b656444617973206c6f776572207468616e206d696e696d756d4e55473a206265666f72654461792063616e6e6f7420626520696e207468652066757475726545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f20616464726573734e55473a206e65775374616b656447756e73206d757374206265206174206c65617374206d696e696d756d2073686172655261746545524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a723058203c0ae5e6cbd2048e452b0d2948aada211cfe1c29034996aa28137d11fe31bf1764736f6c634300050a0032
Deployed Bytecode
0x6080604052600436106101e35760003560e01c806365cf71b211610102578063a9059cbb11610095578063dd62ed3e11610064578063dd62ed3e14610e5e578063e4df526514610ee3578063f04b5fa014610efa578063f57a1b3c14610f4d576101e3565b8063a9059cbb14610c91578063c312452514610d04578063cbb151d314610dd5578063ce7d1f7714610e1a576101e3565b80638f1c65c0116100d15780638f1c65c014610aca57806390de687114610b0557806395d89b4114610b8e578063a457c2d714610c1e576101e3565b806365cf71b2146108805780636a210a0e146108ec57806370a0823114610a1657806387a0f31c14610a7b576101e3565b8063343009a21161017a57806344203faf1161014957806344203faf146106f157806344f0de751461078357806352a438b8146108105780635c9302c914610855576101e3565b8063343009a2146105cc57806339509351146106185780633a70a5ca1461068b57806342966c68146106b6576101e3565b80632607443b116101b65780632607443b146103a65780632e60d1c41461048a578063313ce5671461053657806333060d9014610567576101e3565b806306fdde03146101e5578063095ea7b31461027557806318160ddd146102e857806323b872dd14610313575b005b3480156101f157600080fd5b506101fa610fe7565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561023a57808201518184015260208101905061021f565b50505050905090810190601f1680156102675780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561028157600080fd5b506102ce6004803603604081101561029857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611020565b604051808215151515815260200191505060405180910390f35b3480156102f457600080fd5b506102fd61103e565b6040518082815260200191505060405180910390f35b34801561031f57600080fd5b5061038c6004803603606081101561033657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611048565b604051808215151515815260200191505060405180910390f35b3480156103b257600080fd5b506103ff600480360360408110156103c957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611121565b604051808764ffffffffff1664ffffffffff1681526020018668ffffffffffffffffff1668ffffffffffffffffff1681526020018568ffffffffffffffffff1668ffffffffffffffffff1681526020018461ffff1661ffff1681526020018361ffff1661ffff1681526020018261ffff1661ffff168152602001965050505050505060405180910390f35b34801561049657600080fd5b506104ed600480360360608110156104ad57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291905050506111d8565b604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390f35b34801561054257600080fd5b5061054b611344565b604051808260ff1660ff16815260200191505060405180910390f35b34801561057357600080fd5b506105b66004803603602081101561058a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611349565b6040518082815260200191505060405180910390f35b3480156105d857600080fd5b50610616600480360360408110156105ef57600080fd5b8101908080359060200190929190803564ffffffffff169060200190929190505050611395565b005b34801561062457600080fd5b506106716004803603604081101561063b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611746565b604051808215151515815260200191505060405180910390f35b34801561069757600080fd5b506106a06117f9565b6040518082815260200191505060405180910390f35b3480156106c257600080fd5b506106ef600480360360208110156106d957600080fd5b810190808035906020019092919050505061182f565b005b3480156106fd57600080fd5b5061074a6004803603604081101561071457600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506118f0565b604051808364ffffffffff1664ffffffffff1681526020018264ffffffffff1664ffffffffff1681526020019250505060405180910390f35b34801561078f57600080fd5b506107d2600480360360208110156107a657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611943565b6040518082600260200280838360005b838110156107fd5780820151818401526020810190506107e2565b5050505090500191505060405180910390f35b34801561081c57600080fd5b506108536004803603604081101561083357600080fd5b810190808035906020019092919080359060200190929190505050611a7e565b005b34801561086157600080fd5b5061086a611b20565b6040518082815260200191505060405180910390f35b34801561088c57600080fd5b506108ea600480360360608110156108a357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803564ffffffffff169060200190929190505050611b2f565b005b3480156108f857600080fd5b5061092f6004803603604081101561090f57600080fd5b810190808035906020019092919080359060200190929190505050611f1a565b60405180806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561097a57808201518184015260208101905061095f565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156109bc5780820151818401526020810190506109a1565b50505050905001848103825285818151815260200191508051906020019060200280838360005b838110156109fe5780820151818401526020810190506109e3565b50505050905001965050505050505060405180910390f35b348015610a2257600080fd5b50610a6560048036036020811015610a3957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612156565b6040518082815260200191505060405180910390f35b348015610a8757600080fd5b50610ab460048036036020811015610a9e57600080fd5b810190808035906020019092919050505061219e565b6040518082815260200191505060405180910390f35b348015610ad657600080fd5b50610b0360048036036020811015610aed57600080fd5b81019080803590602001909291905050506121b6565b005b348015610b1157600080fd5b50610b3e60048036036020811015610b2857600080fd5b81019080803590602001909291905050506122e0565b604051808468ffffffffffffffffff1668ffffffffffffffffff1681526020018381526020018268ffffffffffffffffff1668ffffffffffffffffff168152602001935050505060405180910390f35b348015610b9a57600080fd5b50610ba3612334565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610be3578082015181840152602081019050610bc8565b50505050905090810190601f168015610c105780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610c2a57600080fd5b50610c7760048036036040811015610c4157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061236d565b604051808215151515815260200191505060405180910390f35b348015610c9d57600080fd5b50610cea60048036036040811015610cb457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061243a565b604051808215151515815260200191505060405180910390f35b348015610d1057600080fd5b50610d19612458565b604051808868ffffffffffffffffff1668ffffffffffffffffff1681526020018768ffffffffffffffffff1668ffffffffffffffffff1681526020018664ffffffffff1664ffffffffff1681526020018568ffffffffffffffffff1668ffffffffffffffffff1681526020018461ffff1661ffff1681526020018368ffffffffffffffffff1668ffffffffffffffffff1681526020018264ffffffffff1664ffffffffff16815260200197505050505050505060405180910390f35b348015610de157600080fd5b50610e1860048036036040811015610df857600080fd5b81019080803590602001909291908035906020019092919050505061250c565b005b610e5c60048036036020811015610e3057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612961565b005b348015610e6a57600080fd5b50610ecd60048036036040811015610e8157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612bbf565b6040518082815260200191505060405180910390f35b348015610eef57600080fd5b50610ef8612c46565b005b348015610f0657600080fd5b50610f0f612e55565b6040518082600a60200280838360005b83811015610f3a578082015181840152602081019050610f1f565b5050505090500191505060405180910390f35b348015610f5957600080fd5b50610f9060048036036040811015610f7057600080fd5b810190808035906020019092919080359060200190929190505050612fae565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610fd3578082015181840152602081019050610fb8565b505050509050019250505060405180910390f35b6040518060400160405280600381526020017f4e5547000000000000000000000000000000000000000000000000000000000081525081565b600061103461102d6130c1565b84846130c9565b6001905092915050565b6000600254905090565b60006110558484846132c0565b611116846110616130c1565b6111118560405180606001604052806028815260200161515960289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006110c76130c1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135769092919063ffffffff16565b6130c9565b600190509392505050565b6007602052816000526040600020818154811061113a57fe5b90600052602060002001600091509150508060000160009054906101000a900464ffffffffff16908060000160059054906101000a900468ffffffffffffffffff169080600001600e9054906101000a900468ffffffffffffffffff16908060000160179054906101000a900461ffff16908060000160199054906101000a900461ffff169080600001601b9054906101000a900461ffff16905086565b60008060006009600086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001016000858152602001908152602001600020905060008160000160009054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff1614156112e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4e55473a20506172616d20696e76616c6964000000000000000000000000000081525060200191505060405180910390fd5b8060000160009054906101000a90046bffffffffffffffffffffffff1681600001600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816bffffffffffffffffffffffff1691509250925050935093915050565b600881565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b61139d614f76565b6113a5614f76565b6113af8282613636565b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008180549050141561146d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e55473a20456d707479207374616b65206c697374000000000000000000000081525060200191505060405180910390fd5b808054905085106114e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4e55473a207374616b65496e64657820696e76616c696400000000000000000081525060200191505060405180910390fd5b6114ee614fc2565b61150e8287815481106114fd57fe5b906000526020600020018683613789565b61151784613911565b60008090506000808360a00151141590506000806000905060008090506000809050600080905087606001518b60e00151106115f657851561155f578760800151965061158b565b6115698b89613924565b87606001518b60e00151039650876080015187111561158a57876080015196505b5b6115968b898961394a565b80955081965082975083985084995050505050503373ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156115f0573d6000803e3d6000fd5b50611612565b87604001518b6020018181510391508181525050876020015194505b3373ffffffffffffffffffffffffffffffffffffffff168c64ffffffffff167f80bb257dd672adb291601517b3f5d31642fccf6d3db7a40983552a9baacbbabd8861165e576000611661565b60015b8b606001518b8d602001518e604001518a8c8b8f604051808a60ff1664ffffffffff168152602001898152602001888152602001878152602001868152602001858152602001848152602001838152602001828152602001995050505050505050505060405180910390a3600081141580156116db575085155b156116f157808b60600181815101915081815250505b6000851461170f576117033386613a45565b61170e8b8987613c00565b5b87602001518b600001818151039150818152505061172d898e613cbd565b6117378b8b613f0c565b50505050505050505050505050565b60006117ef6117536130c1565b846117ea85600160006117646130c1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546140e190919063ffffffff16565b6130c9565b6001905092915050565b6000600460000160009054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1661182961103e565b01905090565b806000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156118e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f45524332303a206e6f7420656e6f7567682062616c616e63652100000000000081525060200191505060405180910390fd5b6118ed3382614169565b50565b6009602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900464ffffffffff16908060000160059054906101000a900464ffffffffff16905082565b61194b614fff565b60006001611957614321565b0190505b6000818060019003925014611a75576009600082815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900464ffffffffff1664ffffffffff166009600083815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160059054906101000a900464ffffffffff1664ffffffffff161115611a705760ff81166001901b82600883901c60028110611a6057fe5b6020020181815117915081815250505b61195b565b81915050919050565b611a86614f76565b611a8e614f76565b611a988282613636565b6001831015611af2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061510e6025913960400191505060405180910390fd5b611afb82613911565b611b06828585614351565b611b103385614169565b611b1a8282613f0c565b50505050565b6000611b2a614321565b905090565b611b37614f76565b611b3f614f76565b611b498282613636565b6000600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490501415611c02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e55473a20456d707479207374616b65206c697374000000000000000000000081525060200191505060405180910390fd5b600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508410611cb9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4e55473a207374616b65496e64657820696e76616c696400000000000000000081525060200191505060405180910390fd5b6000600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208581548110611d0557fe5b906000526020600020019050611d19614fc2565b611d24828683613789565b80608001518160600151018460e001511015611da8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4e55473a205374616b65206e6f742066756c6c7920736572766564000000000081525060200191505060405180910390fd5b60008160a0015114611e22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4e55473a205374616b6520616c726561647920756e6c6f636b6564000000000081525060200191505060405180910390fd5b611e2b84613911565b611e358482613924565b600080600080611e4a8886876080015161394a565b9450945094509450503373ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff168a64ffffffffff167f0bff00790f1231cf0c26911db2d0c4e670b204ebb02d6a73d3fb5c995910705e8860200151896040015189886040518085815260200184815260200183815260200182815260200194505050505060405180910390a460008114611ef957808860600181815101915081815250505b611f038686614533565b611f0d8888613f0c565b5050505050505050505050565b60608060608385108015611f455750600460010160009054906101000a900461ffff1661ffff168411155b611fb7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4e55473a2072616e676520696e76616c6964000000000000000000000000000081525060200191505060405180910390fd5b848403604051908082528060200260200182016040528015611fe85781602001602082028038833980820191505090505b50925084840360405190808252806020026020018201604052801561201c5781602001602082028038833980820191505090505b5091508484036040519080825280602002602001820160405280156120505781602001602082028038833980820191505090505b509050600085905060008090505b6006600083815260200190815260200160002060020160009054906101000a900468ffffffffffffffffff1668ffffffffffffffffff168582815181106120a157fe5b6020026020010181815250506006600083815260200190815260200160002060000160009054906101000a900468ffffffffffffffffff1668ffffffffffffffffff168482806001019350815181106120f657fe5b602002602001018181525050600660008381526020019081526020016000206001015483828060010193508151811061212b57fe5b60200260200101818152505085826001019250821061205e5784848494509450945050509250925092565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60086020528060005260406000206000915090505481565b6121be614f76565b6121c6614f76565b6121d08282613636565b60018260e001511161224a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f4e55473a20546f6f206561726c7900000000000000000000000000000000000081525060200191505060405180910390fd5b600083146122c0578160e001518311156122af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806151336026913960400191505060405180910390fd5b6122bb8284600061462b565b6122d1565b6122d0828360e00151600061462b565b5b6122db8282613f0c565b505050565b60066020528060005260406000206000915090508060000160009054906101000a900468ffffffffffffffffff16908060010154908060020160009054906101000a900468ffffffffffffffffff16905083565b6040518060400160405280600381526020017f4e5547000000000000000000000000000000000000000000000000000000000081525081565b600061243061237a6130c1565b8461242b8560405180606001604052806025815260200161522060259139600160006123a46130c1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135769092919063ffffffff16565b6130c9565b6001905092915050565b600061244e6124476130c1565b84846132c0565b6001905092915050565b60048060000160009054906101000a900468ffffffffffffffffff16908060000160099054906101000a900468ffffffffffffffffff16908060000160129054906101000a900464ffffffffff16908060000160179054906101000a900468ffffffffffffffffff16908060010160009054906101000a900461ffff16908060010160029054906101000a900468ffffffffffffffffff169080600101600b9054906101000a900464ffffffffff16905087565b612514614321565b8210612588576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f4e55473a20526f756e64206973206e6f7420636f6d706c65746500000000000081525060200191505060405180910390fd5b60006009600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000160009054906101000a900464ffffffffff1664ffffffffff16905060008084146126a457818360000160059054906101000a900464ffffffffff1664ffffffffff160384111561269a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4e55473a20636f756e7420696e76616c6964000000000000000000000000000081525060200191505060405180910390fd5b8382019050612739565b8260000160059054906101000a900464ffffffffff1664ffffffffff169050808210612738576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4e55473a20636f756e7420696e76616c6964000000000000000000000000000081525060200191505060405180910390fd5b5b60006127448661472d565b905060006008600088815260200190815260200160002054905060008090505b600086600101600087815260200190815260200160002060000160009054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff1690506000876001016000888152602001908152602001600020600001600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050876001016000888152602001908152602001600020600080820160006101000a8154906bffffffffffffffffffffffff021916905560008201600c6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550506000848387028161284f57fe5b049050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806128b857503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b156128ce576128c98b898385614770565b61290a565b6000601482816128da57fe5b04905080820191506000600a83816128ee57fe5b0490506128fd8d8b8587614770565b6129078482613a45565b50505b808401935050505083856001019550851061276457848660000160006101000a81548164ffffffffff021916908364ffffffffff16021790555060008114612957576129563382613a45565b5b5050505050505050565b600061296b614321565b9050600034905060008114156129e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4e55473a20416d6f756e7420726571756972656400000000000000000000000081525060200191505060405180910390fd5b60006009600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600001600581819054906101000a900464ffffffffff168092919060010191906101000a81548164ffffffffff021916908364ffffffffff16021790555064ffffffffff1690506040518060400160405280846bffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1681525082600101600083815260200190815260200160002060008201518160000160006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550602082015181600001600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555090505082600860008681526020019081526020016000206000828254019250508190555082817f683f950243ca541a09abd8157385ce15a23ac43a47b8d0306de2bdc20d0b9e094287604051808381526020018281526020019250505060405180910390a35050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612c4e614f76565b612c56614f76565b612c608282613636565b60003073ffffffffffffffffffffffffffffffffffffffff16311415612cee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f4e55473a204e6f2076616c75650000000000000000000000000000000000000081525060200191505060405180910390fd5b612cf6614321565b600360009054906101000a900460ff1660ff1610612d7c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f4e55473a20496e76616c6964206461790000000000000000000000000000000081525060200191505060405180910390fd5b612d8582613911565b73c8001ea490f97b1dd673f77074edf18338853ca073ffffffffffffffffffffffffffffffffffffffff166108fc6064600f60066000600360009054906101000a900460ff1660ff168152602001908152602001600020600101540281612de857fe5b049081150290604051600060405180830381858888f19350505050158015612e14573d6000803e3d6000fd5b506003600081819054906101000a900460ff168092919060010191906101000a81548160ff021916908360ff16021790555050612e518282613f0c565b5050565b612e5d615021565b604051806101400160405280600460000160009054906101000a900468ffffffffffffffffff1668ffffffffffffffffff168152602001600460000160099054906101000a900468ffffffffffffffffff1668ffffffffffffffffff168152602001600460000160129054906101000a900464ffffffffff1664ffffffffff168152602001600460000160179054906101000a900468ffffffffffffffffff1668ffffffffffffffffff168152602001600460010160009054906101000a900461ffff1661ffff168152602001600460010160029054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1681526020016004600101600b9054906101000a900464ffffffffff1664ffffffffff168152602001428152602001612f8661103e565b815260200160086000612f97614321565b815260200190815260200160002054815250905090565b60608183108015612fc65750612fc2614321565b8211155b613038576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4e55473a20696e76616c69642072616e6765000000000000000000000000000081525060200191505060405180910390fd5b8282036040519080825280602002602001820160405280156130695781602001602082028038833980820191505090505b509050600083905060008090505b60086000838060010194508152602001908152602001600020548382806001019350815181106130a357fe5b60200260200101818152505083821061307757829250505092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561314f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806151fc6024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806150c66022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613346576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806151a26025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061505f6023913960400191505060405180910390fd5b613437816040518060600160405280602681526020016150e8602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135769092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506134ca816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546140e190919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000838311158290613623576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156135e85780820151818401526020810190506135cd565b50505050905090810190601f1680156136155780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600460000160009054906101000a900468ffffffffffffffffff1668ffffffffffffffffff16826000018181525050600460000160099054906101000a900468ffffffffffffffffff1668ffffffffffffffffff16826020018181525050600460000160129054906101000a900464ffffffffff1664ffffffffff16826040018181525050600460000160179054906101000a900468ffffffffffffffffff1668ffffffffffffffffff16826060018181525050600460010160009054906101000a900461ffff1661ffff16826080018181525050600460010160029054906101000a900468ffffffffffffffffff1668ffffffffffffffffff168260a00181815250506004600101600b9054906101000a900464ffffffffff168260c0019064ffffffffff16908164ffffffffff1681525050613772614321565b8260e001818152505061378582826147ce565b5050565b8260000160009054906101000a900464ffffffffff1664ffffffffff168264ffffffffff1614613821576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4e55473a207374616b654964506172616d206e6f7420696e207374616b65000081525060200191505060405180910390fd5b8260000160009054906101000a900464ffffffffff16816000019064ffffffffff16908164ffffffffff16815250508260000160059054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1681602001818152505082600001600e9054906101000a900468ffffffffffffffffff1668ffffffffffffffffff168160400181815250508260000160179054906101000a900461ffff1661ffff168160600181815250508260000160199054906101000a900461ffff1661ffff1681608001818152505082600001601b9054906101000a900461ffff1661ffff168160a0018181525050505050565b613921818260e00151600161462b565b50565b80604001518260a00181815103915081815250508160e001518160a00181815250505050565b600080600080600086608001518610156139a9576139778888606001518960800151898b60400151614844565b80935081955050508387602001510194506139a28888604001518960600151898b606001510161491a565b9250613a05565b6139c38888604001518960600151898b60600151016149b3565b93506139df8888604001518960600151898b606001510161491a565b9250838760200151019450613a02876060015188608001518960a0015188614afb565b91505b60008214613a2b5784821115613a215784905060009450613a2a565b81905080850394505b5b848484848494509450945094509450939792965093509350565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613ae8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b613afd816002546140e190919063ffffffff16565b600281905550613b54816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546140e190919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b8160200151811115613cb8576000613c1c828460800151614b38565b905060008360400151620186a08385010281613c3457fe5b049050600160286001901b03811115613c5357600160286001901b0390505b8460400151811115613cb55780856040018181525050836000015164ffffffffff167faf62aa7dadbf7e5e54b91236b109372266fcf681cc74f199a41e14c242a3db3f4283604051808381526020018281526020019250505060405180910390a25b50505b505050565b600060018380549050039050808214613e5957828181548110613cdc57fe5b90600052602060002001838381548110613cf257fe5b906000526020600020016000820160009054906101000a900464ffffffffff168160000160006101000a81548164ffffffffff021916908364ffffffffff1602179055506000820160059054906101000a900468ffffffffffffffffff168160000160056101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff16021790555060008201600e9054906101000a900468ffffffffffffffffff1681600001600e6101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff1602179055506000820160179054906101000a900461ffff168160000160176101000a81548161ffff021916908361ffff1602179055506000820160199054906101000a900461ffff168160000160196101000a81548161ffff021916908361ffff16021790555060008201601b9054906101000a900461ffff1681600001601b6101000a81548161ffff021916908361ffff1602179055509050505b82805480613e6357fe5b60019003818190600052602060002001600080820160006101000a81549064ffffffffff02191690556000820160056101000a81549068ffffffffffffffffff021916905560008201600e6101000a81549068ffffffffffffffffff02191690556000820160176101000a81549061ffff02191690556000820160196101000a81549061ffff021916905560008201601b6101000a81549061ffff021916905550509055505050565b80600001518260000151141580613f2b57508060200151826020015114155b80613f3e57508060400151826040015114155b80613f5157508060600151826060015114155b15614017578160000151600460000160006101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff1602179055508160200151600460000160096101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff1602179055508160400151600460000160126101000a81548164ffffffffff021916908364ffffffffff1602179055508160600151600460000160176101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff1602179055505b8060800151826080015114158061403657508060a001518260a0015114155b8061405757508060c0015164ffffffffff168260c0015164ffffffffff1614155b156140dd578160800151600460010160006101000a81548161ffff021916908361ffff1602179055508160a00151600460010160026101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff1602179055508160c001516004600101600b6101000a81548164ffffffffff021916908364ffffffffff1602179055505b5050565b60008082840190508381101561415f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156141ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806151816021913960400191505060405180910390fd5b61425a816040518060600160405280602281526020016150a4602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546135769092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506142b181600254614c2a90919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b6000635fc97c00421015614338576000905061434e565b62015180635fc97c0042038161434a57fe5b0490505b90565b60198111156143ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806150826022913960400191505060405180910390fd5b60006143b78383614b38565b905060008460400151620186a083860102816143cf57fe5b049050600081141561442c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260358152602001806151c76035913960400191505060405180910390fd5b600060018660e0015101905060008660c001805160010164ffffffffff16908164ffffffffff1681525090506144a4600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828886868a614c74565b3373ffffffffffffffffffffffffffffffffffffffff168164ffffffffff167fa75ea2f0baef0a6cfa36f61bc0cdc9b3a55ce8876892cf96f640208f65c799e988868960405180848152602001838152602001828152602001935050505060405180910390a3828760200181815101915081815250508587600001818151019150818152505050505050505050565b80600001518260000160006101000a81548164ffffffffff021916908364ffffffffff16021790555080602001518260000160056101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550806040015182600001600e6101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff16021790555080606001518260000160176101000a81548161ffff021916908361ffff16021790555080608001518260000160196101000a81548161ffff021916908361ffff1602179055508060a0015182600001601b6101000a81548161ffff021916908361ffff1602179055505050565b8183608001511061463b57614728565b614643615044565b836000015161465061103e565b0181600001818152505060008460800151905061466e858383614df2565b600085602001511461469a5784602001518560a001818151019150818152505060008560200181815250505b5b838160010191508110156146b9576146b4858383614df2565b61469b565b3373ffffffffffffffffffffffffffffffffffffffff167fe00f6f1c2b3ba17574be0a8136275368d74f37631cf36525a360b272fe21195b4287608001518460405180848152602001838152602001828152602001935050505060405180910390a28085608001818152505050505b505050565b6000808211801561473f575060328211155b1561475e5764e8d4a510006001830302655af3107a4000039050614768565b652d79883d200090505b809050919050565b8073ffffffffffffffffffffffffffffffffffffffff1682847ff8fa88708321411fd98e823a1eb882047c8dc276ba17a8b81722ed282c4560f74288604051808381526020018281526020019250505060405180910390a450505050565b816000015181600001818152505081602001518160200181815250508160400151816040018181525050816060015181606001818152505081608001518160800181815250508160a001518160a00181815250508160c001518160c0019064ffffffffff16908164ffffffffff16815250505050565b6000806000848701905060006002600188018161485d57fe5b049050605a81101561486e57605a90505b60008614156148995760006148848a878b614eb6565b90508181029350848494509450505050614910565b858110156148da57600081890190506148b48a878b846149b3565b935060006148c48b8884876149b3565b9050808501955085859550955050505050614910565b6148e689868a856149b3565b9350858114156148f857839250614907565b858185028161490357fe5b0492505b83839350935050505b9550959350505050565b6000808390505b828110156149a75760006006600083815260200190815260200160002060020160009054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1686606460556006600087815260200190815260200160002060010154028161498657fe5b04028161498f57fe5b04810190508083019250508080600101915050614921565b50809050949350505050565b60008060008490505b83811015614aee5760006006600083815260200190815260200160002060020160009054906101000a900468ffffffffffffffffff1668ffffffffffffffffff16876006600085815260200190815260200160002060000160009054906101000a900468ffffffffffffffffff1668ffffffffffffffffff160281614a3d57fe5b0490506004831015614a56578280600101935050614adb565b600260ff166006600084815260200190815260200160002060020160009054906101000a900468ffffffffffffffffff1668ffffffffffffffffff16886006600086815260200190815260200160002060000160009054906101000a900468ffffffffffffffffff1668ffffffffffffffffff160281614ad257fe5b04029050600092505b80840193505080806001019150506149bc565b5081915050949350505050565b6000806007600202858701019050808411614b1a576000915050614b30565b6007606402818503840281614b2b57fe5b049150505b949350505050565b600080600090506001831115614b9057606460c86014618e3081614b5857fe5b040281614b6157fe5b04831115614b8857606460c86014618e3081614b7957fe5b040281614b8257fe5b04614b8d565b600183035b90505b6000600860ff16600a0a626acfc002851115614bb857600860ff16600a0a626acfc002614bba565b845b90506014618e3081614bc857fe5b048102600a6064600860ff16600a0a626acfc0020281614be457fe5b048302019250600a6064600860ff16600a0a626acfc0020281614c0357fe5b046014618e3081614c1057fe5b040283860281614c1c57fe5b049250829250505092915050565b6000614c6c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613576565b905092915050565b856040518060c001604052808764ffffffffff1681526020018668ffffffffffffffffff1681526020018568ffffffffffffffffff1681526020018461ffff1681526020018361ffff168152602001600061ffff1681525090806001815401808255809150509060018203906000526020600020016000909192909190915060008201518160000160006101000a81548164ffffffffff021916908364ffffffffff16021790555060208201518160000160056101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600e6101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff16021790555060608201518160000160176101000a81548161ffff021916908361ffff16021790555060808201518160000160196101000a81548161ffff021916908361ffff16021790555060a082015181600001601b6101000a81548161ffff021916908361ffff160217905550505050505050505050565b614dfd838383614f26565b81602001516006600083815260200190815260200160002060000160006101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550600860008281526020019081526020016000205460066000838152602001908152602001600020600101819055508260a001516006600083815260200190815260200160002060020160006101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550505050565b6000614ec0614f76565b614eca85826147ce565b614ed2615044565b8560000151614edf61103e565b01816000018181525050614ef4828286614f26565b848260a00181815101915081815250508160a001518582602001510281614f1757fe5b04925082925050509392505050565b63041aa18961c35083600001510281614f3b57fe5b048260200181815250506000836060015114614f7157826060015182602001818151019150818152505060008360600181815250505b505050565b604051806101000160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600064ffffffffff168152602001600081525090565b6040518060c00160405280600064ffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518060400160405280600290602082028038833980820191505090505090565b604051806101400160405280600a90602082028038833980820191505090505090565b60405180604001604052806000815260200160008152509056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734e55473a204d617820616c6c6f776564207374616b696e6720646179733a2031383045524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654e55473a206e65775374616b656444617973206c6f776572207468616e206d696e696d756d4e55473a206265666f72654461792063616e6e6f7420626520696e207468652066757475726545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f20616464726573734e55473a206e65775374616b656447756e73206d757374206265206174206c65617374206d696e696d756d2073686172655261746545524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a723058203c0ae5e6cbd2048e452b0d2948aada211cfe1c29034996aa28137d11fe31bf1764736f6c634300050a0032
Deployed Bytecode Sourcemap
62901:233:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19625:35;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19625:35:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;19625:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11487:152;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11487:152:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11487:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;10512:91;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10512:91:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12110:304;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12110:304:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12110:304:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;23502:50;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23502:50:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23502:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61027:406;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61027:406:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;61027:406:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19711:34;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19711:34:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;42573:159;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42573:159:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;42573:159:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39642:2781;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39642:2781:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39642:2781:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;12822:210;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12822:210:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12822:210:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;27222:156;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27222:156:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15482:166;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15482:166:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15482:166:0;;;;;;;;;;;;;;;;;:::i;:::-;;24023:79;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24023:79:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24023:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61644:438;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61644:438:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;61644:438:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;61644:438:0;;;;;;;;;;;;;;;;36605:633;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36605:633:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36605:633:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;27541:125;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27541:125:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;37606:1770;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37606:1770:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37606:1770:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25351:922;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25351:922:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25351:922:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;25351:922:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;25351:922:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;25351:922:0;;;;;;;;;;;;;;;;;;;;;10665:110;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10665:110:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;10665:110:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23974:42;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23974:42:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23974:42:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;24355:659;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24355:659:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24355:659:0;;;;;;;;;;;;;;;;;:::i;:::-;;22952:51;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22952:51:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22952:51:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19667:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19667:37:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;19667:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13534:261;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13534:261:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13534:261:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;10987:158;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10987:158:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;10987:158:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;22756:27;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22756:27:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57324:1939;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57324:1939:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;57324:1939:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;56436:646;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;56436:646:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;11207:134;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11207:134:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11207:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;60142:503;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60142:503:0;;;:::i;:::-;;26506:496;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26506:496:0;;;:::i;:::-;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;26506:496:0;;;;;;;;;;;;;;;;59546:501;;8:9:-1;5:2;;;30:1;27;20:12;5:2;59546:501:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;59546:501:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;59546:501:0;;;;;;;;;;;;;;;;;19625:35;;;;;;;;;;;;;;;;;;;:::o;11487:152::-;11553:4;11570:39;11579:12;:10;:12::i;:::-;11593:7;11602:6;11570:8;:39::i;:::-;11627:4;11620:11;;11487:152;;;;:::o;10512:91::-;10556:7;10583:12;;10576:19;;10512:91;:::o;12110:304::-;12199:4;12216:36;12226:6;12234:9;12245:6;12216:9;:36::i;:::-;12263:121;12272:6;12280:12;:10;:12::i;:::-;12294:89;12332:6;12294:89;;;;;;;;;;;;;;;;;:11;:19;12306:6;12294:19;;;;;;;;;;;;;;;:33;12314:12;:10;:12::i;:::-;12294:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;12263:8;:121::i;:::-;12402:4;12395:11;;12110:304;;;;;:::o;23502:50::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;61027:406::-;61157:17;61176:20;61214:31;61248:14;:24;61263:8;61248:24;;;;;;;;;;;:36;61273:10;61248:36;;;;;;;;;;;;;;;:44;;:56;61293:10;61248:56;;;;;;;;;;;61214:90;;61344:1;61325:5;:15;;;;;;;;;;;;:20;;;;61317:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61389:5;:15;;;;;;;;;;;;61406:5;:18;;;;;;;;;;;;61381:44;;;;;;;;;;61027:406;;;;;;:::o;19711:34::-;19744:1;19711:34;:::o;42573:159::-;42663:7;42695:10;:22;42706:10;42695:22;;;;;;;;;;;;;;;:29;;;;42688:36;;42573:159;;;:::o;39642:2781::-;39735:21;;:::i;:::-;39767:29;;:::i;:::-;39807:26;39820:1;39823:9;39807:12;:26::i;:::-;39846:33;39882:10;:22;39893:10;39882:22;;;;;;;;;;;;;;;39846:58;;40019:1;39996:12;:19;;;;:24;;39988:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40078:12;:19;;;;40065:10;:32;40057:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40168:20;;:::i;:::-;40199:54;40210:12;40223:10;40210:24;;;;;;;;;;;;;;;40236:12;40250:2;40199:10;:54::i;:::-;40319:23;40340:1;40319:20;:23::i;:::-;40355:18;40376:1;40355:22;;40390:17;40430:1;40411:2;:15;;;:20;;40390:42;;40443:19;40473:14;40490:1;40473:18;;40502:17;40522:1;40502:21;;40534:15;40552:1;40534:19;;40564:21;40588:1;40564:25;;40623:2;:13;;;40606:1;:13;;;:30;40602:858;;40657:12;40653:423;;;40802:2;:14;;;40789:27;;40653:423;;;40857:19;40870:1;40873:2;40857:12;:19::i;:::-;40926:2;:13;;;40910:1;:13;;;:29;40897:42;;40975:2;:14;;;40962:10;:27;40958:103;;;41027:2;:14;;;41014:27;;40958:103;40653:423;41151:36;41169:1;41172:2;41176:10;41151:17;:36::i;:::-;41092:95;;;;;;;;;;;;;;;;;;;;41204:10;:19;;:30;41224:9;41204:30;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41204:30:0;40602:858;;;41388:2;:15;;;41361:1;:23;;:42;;;;;;;;;;;41434:2;:14;;;41420:28;;40602:858;41563:10;41477:316;;41500:12;41477:316;;;41528:12;:20;;41547:1;41528:20;;;41543:1;41528:20;41588:2;:13;;;41616:10;41642:2;:14;;;41672:2;:15;;;41703:9;41727:6;41749:7;41771:11;41477:316;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41827:1;41810:13;:18;;:35;;;;;41833:12;41832:13;41810:35;41806:204;;;41985:13;41961:1;:20;;:37;;;;;;;;;;;41806:204;42100:1;42085:11;:16;42081:198;;42118:30;42124:10;42136:11;42118:5;:30::i;:::-;42231:36;42248:1;42251:2;42255:11;42231:16;:36::i;:::-;42081:198;42311:2;:14;;;42289:1;:18;;:36;;;;;;;;;;;42338:38;42351:12;42365:10;42338:12;:38::i;:::-;42389:26;42402:1;42405:9;42389:12;:26::i;:::-;39642:2781;;;;;;;;;;;;;:::o;12822:210::-;12902:4;12919:83;12928:12;:10;:12::i;:::-;12942:7;12951:50;12990:10;12951:11;:25;12963:12;:10;:12::i;:::-;12951:25;;;;;;;;;;;;;;;:34;12977:7;12951:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;12919:8;:83::i;:::-;13020:4;13013:11;;12822:210;;;;:::o;27222:156::-;27299:7;27347;:23;;;;;;;;;;;;27331:39;;:13;:11;:13::i;:::-;:39;27324:46;;27222:156;:::o;15482:166::-;15565:6;15540:9;:21;15550:10;15540:21;;;;;;;;;;;;;;;;:31;;15532:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15615:25;15621:10;15633:6;15615:5;:25::i;:::-;15482:166;:::o;24023:79::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;61644:438::-;61742:40;;:::i;:::-;61800:11;61830:1;61814:13;:11;:13::i;:::-;:17;61800:31;;61844:206;61860:1;61851:5;;;;;;;:10;61844:206;;61926:14;:19;61941:3;61926:19;;;;;;;;;;;:31;61946:10;61926:31;;;;;;;;;;;;;;;:41;;;;;;;;;;;;61882:85;;:14;:19;61897:3;61882:19;;;;;;;;;;;:31;61902:10;61882:31;;;;;;;;;;;;;;;:41;;;;;;;;;;;;:85;;;61878:161;;;62019:3;62013;:9;62007:1;:16;;61988:5;62001:1;61994:3;:8;;61988:15;;;;;;;;;;:35;;;;;;;;;;;61878:161;61844:206;;;62069:5;62062:12;;;61644:438;;;:::o;36605:633::-;36705:21;;:::i;:::-;36737:29;;:::i;:::-;36777:26;36790:1;36793:9;36777:12;:26::i;:::-;20586:1;36870:13;:31;;36862:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37009:23;37030:1;37009:20;:23::i;:::-;37045:44;37057:1;37060:13;37075;37045:11;:44::i;:::-;37159:32;37165:10;37177:13;37159:5;:32::i;:::-;37204:26;37217:1;37220:9;37204:12;:26::i;:::-;36605:633;;;;:::o;27541:125::-;27613:7;27645:13;:11;:13::i;:::-;27638:20;;27541:125;:::o;37606:1770::-;37730:21;;:::i;:::-;37762:29;;:::i;:::-;37802:26;37815:1;37818:9;37802:12;:26::i;:::-;37953:1;37920:10;:22;37931:10;37920:22;;;;;;;;;;;;;;;:29;;;;:34;;37912:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38012:10;:22;38023:10;38012:22;;;;;;;;;;;;;;;:29;;;;37999:10;:42;37991:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38082:24;38109:10;:22;38120:10;38109:22;;;;;;;;;;;;;;;38132:10;38109:34;;;;;;;;;;;;;;;38082:61;;38186:20;;:::i;:::-;38217:35;38228:5;38235:12;38249:2;38217:10;:35::i;:::-;38354:2;:14;;;38338:2;:13;;;:30;38321:1;:13;;;:47;;38313:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38482:1;38463:2;:15;;;:20;38455:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38581:23;38602:1;38581:20;:23::i;:::-;38659:19;38672:1;38675:2;38659:12;:19::i;:::-;38756:14;38772:17;38791:15;38808:21;38833:90;38865:1;38881:2;38898;:14;;;38833:17;:90::i;:::-;38753:170;;;;;;;;;39027:10;38941:209;;39002:10;38941:209;;38975:12;38941:209;;;39052:2;:14;;;39081:2;:15;;;39111:6;39132:7;38941:209;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39184:1;39167:13;:18;39163:88;;39226:13;39202:1;:20;;:37;;;;;;;;;;;39163:88;39306:23;39319:5;39326:2;39306:12;:23::i;:::-;39342:26;39355:1;39358:9;39342:12;:26::i;:::-;37606:1770;;;;;;;;;;;:::o;25351:922::-;25459:37;25498:32;25532:30;25599:6;25588:8;:17;:53;;;;;25619:7;:22;;;;;;;;;;;;25609:32;;:6;:32;;25588:53;25580:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25723:8;25714:6;:17;25700:32;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;25700:32:0;;;;25677:55;;25784:8;25775:6;:17;25761:32;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;25761:32:0;;;;25743:50;;25843:8;25834:6;:17;25820:32;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;25820:32:0;;;;25804:48;;25865:11;25879:8;25865:22;;25898:11;25912:1;25898:15;;25924:268;25978:9;:14;25988:3;25978:14;;;;;;;;;;;:34;;;;;;;;;;;;25970:43;;25942:20;25963:3;25942:25;;;;;;;;;;;;;:71;;;;;26061:9;:14;26071:3;26061:14;;;;;;;;;;;:29;;;;;;;;;;;;26053:38;;26028:15;26044:5;;;;;;26028:22;;;;;;;;;;;;;:63;;;;;26129:9;:14;26139:3;26129:14;;;;;;;;;;;:27;;;26106:13;26120:5;;;;;;26106:20;;;;;;;;;;;;;:50;;;;;26184:6;26176:5;;;;;;:14;25924:268;;26212:20;26234:15;26251:13;26204:61;;;;;;;;25351:922;;;;;:::o;10665:110::-;10722:7;10749:9;:18;10759:7;10749:18;;;;;;;;;;;;;;;;10742:25;;10665:110;;;:::o;23974:42::-;;;;;;;;;;;;;;;;;:::o;24355:659::-;24433:21;;:::i;:::-;24465:29;;:::i;:::-;24505:26;24518:1;24521:9;24505:12;:26::i;:::-;20125:1;24589;:13;;;:37;24581:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24675:1;24662:9;:14;24658:310;;24714:1;:13;;;24701:9;:26;;24693:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24787:37;24804:1;24807:9;24818:5;24787:16;:37::i;:::-;24658:310;;;24915:41;24932:1;24935;:13;;;24950:5;24915:16;:41::i;:::-;24658:310;24980:26;24993:1;24996:9;24980:12;:26::i;:::-;24355:659;;;:::o;22952:51::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;19667:37::-;;;;;;;;;;;;;;;;;;;:::o;13534:261::-;13619:4;13636:129;13645:12;:10;:12::i;:::-;13659:7;13668:96;13707:15;13668:96;;;;;;;;;;;;;;;;;:11;:25;13680:12;:10;:12::i;:::-;13668:25;;;;;;;;;;;;;;;:34;13694:7;13668:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;13636:8;:129::i;:::-;13783:4;13776:11;;13534:261;;;;:::o;10987:158::-;11056:4;11073:42;11083:12;:10;:12::i;:::-;11097:9;11108:6;11073:9;:42::i;:::-;11133:4;11126:11;;10987:158;;;;:::o;22756:27::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;57324:1939::-;57431:13;:11;:13::i;:::-;57420:8;:24;57412:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57488:30;57521:14;:24;57536:8;57521:24;;;;;;;;;;;:36;57546:10;57521:36;;;;;;;;;;;;;;;57488:69;;57570:17;57590:4;:14;;;;;;;;;;;;57570:34;;;;57615:16;57657:1;57648:5;:10;57644:276;;57709:9;57692:4;:14;;;;;;;;;;;;:26;;;57683:5;:35;;57675:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57779:5;57767:9;:17;57756:28;;57644:276;;;57828:4;:14;;;;;;;;;;;;57817:25;;;;57877:8;57865:9;:20;57857:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57644:276;57932:17;57952:20;57963:8;57952:10;:20::i;:::-;57932:40;;57983:16;58002:7;:17;58010:8;58002:17;;;;;;;;;;;;57983:36;;58030:21;58054:1;58030:25;;58068:1046;58086:17;58106:4;:12;;:23;58119:9;58106:23;;;;;;;;;;;:33;;;;;;;;;;;;58086:53;;;;58154:20;58177:4;:12;;:23;58190:9;58177:23;;;;;;;;;;;:36;;;;;;;;;;;;58154:59;;58237:4;:12;;:23;58250:9;58237:23;;;;;;;;;;;;58230:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58277:16;58320:8;58308:9;58296;:21;:32;;;;;;58277:51;;58373:1;58349:26;;:12;:26;;;:56;;;;58395:10;58379:26;;:12;:26;;;58349:56;58345:684;;;58478:61;58495:8;58505:9;58516:8;58526:12;58478:16;:61::i;:::-;58345:684;;;58646:25;58685:2;58674:8;:13;;;;;;58646:41;;58720:17;58708:29;;;;58833:25;58872:2;58861:8;:13;;;;;;58833:41;;58895:61;58912:8;58922:9;58933:8;58943:12;58895:16;:61::i;:::-;58975:38;58981:12;58995:17;58975:5;:38::i;:::-;58345:684;;;59062:8;59045:25;;;;58068:1046;;;59104:8;59090:11;;;;;;:22;58068:1046;;59150:9;59126:4;:14;;;:34;;;;;;;;;;;;;;;;;;59194:1;59177:13;:18;59173:83;;59212:32;59218:10;59230:13;59212:5;:32::i;:::-;59173:83;57324:1939;;;;;;;;:::o;56436:646::-;56531:16;56550:13;:11;:13::i;:::-;56531:32;;56576:17;56596:9;56576:29;;56637:1;56624:9;:14;;56616:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56676:30;56709:14;:24;56724:8;56709:24;;;;;;;;;;;:36;56734:10;56709:36;;;;;;;;;;;;;;;56676:69;;56758:18;56779:4;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56758:37;;;;56835:50;;;;;;;;56860:9;56835:50;;;;;;56872:12;56835:50;;;;;56808:4;:12;;:24;56821:10;56808:24;;;;;;;;;;;:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56919:9;56898:7;:17;56906:8;56898:17;;;;;;;;;;;;:30;;;;;;;;;;;57054:9;57028:10;56946:128;56973:15;57004:8;56946:128;;;;;;;;;;;;;;;;;;;;;;;;56436:646;;;;;:::o;11207:134::-;11279:7;11306:11;:18;11318:5;11306:18;;;;;;;;;;;;;;;:27;11325:7;11306:27;;;;;;;;;;;;;;;;11299:34;;11207:134;;;;:::o;60142:503::-;60195:21;;:::i;:::-;60227:29;;:::i;:::-;60267:26;60280:1;60283:9;60267:12;:26::i;:::-;60347:1;60330:4;60322:21;;;:26;;60314:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60406:13;:11;:13::i;:::-;60387:16;;;;;;;;;;;:32;;;60379:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60453:23;60474:1;60453:20;:23::i;:::-;19503:42;60489:23;;:78;60563:3;60557:2;60514:9;:27;60524:16;;;;;;;;;;;60514:27;;;;;;;;;;;;;:40;;;:45;60513:53;;;;;;60489:78;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;60489:78:0;60580:16;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60611:26;60624:1;60627:9;60611:12;:26::i;:::-;60142:503;;:::o;26506:496::-;26578:18;;:::i;:::-;26616:378;;;;;;;;26638:7;:23;;;;;;;;;;;;26616:378;;;;;;26676:7;:28;;;;;;;;;;;;26616:378;;;;;;26719:7;:17;;;;;;;;;;;;26616:378;;;;;;26751:7;:25;;;;;;;;;;;;26616:378;;;;;;26791:7;:22;;;;;;;;;;;;26616:378;;;;;;26828:7;:24;;;;;;;;;;;;26616:378;;;;;;26867:7;:21;;;;;;;;;;;;26616:378;;;;;;26903:15;26616:378;;;;26933:13;:11;:13::i;:::-;26616:378;;;;26961:7;:22;26969:13;:11;:13::i;:::-;26961:22;;;;;;;;;;;;26616:378;;;;;26506:496;:::o;59546:501::-;59652:21;59724:6;59713:8;:17;:44;;;;;59744:13;:11;:13::i;:::-;59734:6;:23;;59713:44;59691:112;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59846:8;59837:6;:17;59823:32;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;59823:32:0;;;;59816:39;;59868:11;59882:8;59868:22;;59901:11;59915:1;59901:15;;59927:89;59967:7;:14;59975:5;;;;;;59967:14;;;;;;;;;;;;59945:4;59950:5;;;;;;59945:11;;;;;;;;;;;;;:37;;;;;60008:6;60002:3;:12;59927:89;;60035:4;60028:11;;;;59546:501;;;;:::o;296:98::-;341:15;376:10;369:17;;296:98;:::o;16769:338::-;16880:1;16863:19;;:5;:19;;;;16855:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16961:1;16942:21;;:7;:21;;;;16934:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17045:6;17015:11;:18;17027:5;17015:18;;;;;;;;;;;;;;;:27;17034:7;17015:27;;;;;;;;;;;;;;;:36;;;;17083:7;17067:32;;17076:5;17067:32;;;17092:6;17067:32;;;;;;;;;;;;;;;;;;16769:338;;;:::o;14285:471::-;14401:1;14383:20;;:6;:20;;;;14375:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14485:1;14464:23;;:9;:23;;;;14456:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14560;14582:6;14560:71;;;;;;;;;;;;;;;;;:9;:17;14570:6;14560:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;14540:9;:17;14550:6;14540:17;;;;;;;;;;;;;;;:91;;;;14665:32;14690:6;14665:9;:20;14675:9;14665:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;14642:9;:20;14652:9;14642:20;;;;;;;;;;;;;;;:55;;;;14730:9;14713:35;;14722:6;14713:35;;;14741:6;14713:35;;;;;;;;;;;;;;;;;;14285:471;;;:::o;5188:192::-;5274:7;5307:1;5302;:6;;5310:12;5294:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;5294:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5334:9;5350:1;5346;:5;5334:17;;5371:1;5364:8;;;5188:192;;;;;:::o;28079:592::-;28224:7;:23;;;;;;;;;;;;28203:44;;:1;:18;;:44;;;;;28284:7;:28;;;;;;;;;;;;28258:54;;:1;:23;;:54;;;;;28338:7;:17;;;;;;;;;;;;28323:32;;:1;:12;;:32;;;;;28389:7;:25;;;;;;;;;;;;28366:48;;:1;:20;;:48;;;;;28445:7;:22;;;;;;;;;;;;28425:42;;:1;:17;;:42;;;;;28500:7;:24;;;;;;;;;;;;28478:46;;:1;:19;;:46;;;;;28554:7;:21;;;;;;;;;;;;28535:1;:16;;:40;;;;;;;;;;;28602:13;:11;:13::i;:::-;28586:1;:13;;:29;;;;;28628:35;28650:1;28653:9;28628:21;:35::i;:::-;28079:592;;:::o;30270:538::-;30490:5;:13;;;;;;;;;;;;30474:29;;:12;:29;;;30466:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30565:5;:13;;;;;;;;;;;;30551:2;:11;;:27;;;;;;;;;;;30606:5;:16;;;;;;;;;;;;30589:33;;:2;:14;;:33;;;;;30651:5;:17;;;;;;;;;;;;30633:35;;:2;:15;;:35;;;;;30695:5;:15;;;;;;;;;;;;30679:31;;:2;:13;;:31;;;;;30738:5;:16;;;;;;;;;;;;30721:33;;:2;:14;;:33;;;;;30783:5;:17;;;;;;;;;;;;30765:35;;:2;:15;;:35;;;;;30270:538;;;:::o;27936:135::-;28023:40;28040:1;28043;:13;;;28058:4;28023:16;:40::i;:::-;27936:135;:::o;49946:202::-;50083:2;:15;;;50060:1;:19;;:38;;;;;;;;;;;50127:1;:13;;;50109:2;:15;;:31;;;;;49946:202;;:::o;50156:1879::-;50297:19;50318:14;50334:17;50353:15;50370:21;50426:2;:14;;;50413:10;:27;50409:1138;;;50477:189;50522:1;50542:2;:13;;;50574:2;:14;;;50607:10;50636:2;:15;;;50477:26;:189::i;:::-;50457:209;;;;;;;;50712:6;50695:2;:14;;;:23;50681:37;;50747:172;50792:1;50812:2;:15;;;50846:2;:13;;;50894:10;50878:2;:13;;;:26;50747;:172::i;:::-;50735:184;;50409:1138;;;51012:164;51049:1;51069:2;:15;;;51103:2;:13;;;51151:10;51135:2;:13;;;:26;51012:18;:164::i;:::-;51003:173;;51205:172;51250:1;51270:2;:15;;;51304:2;:13;;;51352:10;51336:2;:13;;;:26;51205;:172::i;:::-;51193:184;;51425:6;51408:2;:14;;;:23;51394:37;;51458:77;51475:2;:13;;;51490:2;:14;;;51506:2;:15;;;51523:11;51458:16;:77::i;:::-;51448:87;;50409:1138;51572:1;51561:7;:12;51557:397;;51604:11;51594:7;:21;51590:353;;;51711:11;51695:27;;51755:1;51741:15;;51590:353;;;51873:7;51857:23;;51914:13;51899:28;;;;51590:353;51557:397;51972:11;51985:6;51993:9;52004:7;52013:13;51964:63;;;;;;;;;;50156:1879;;;;;;;;;:::o;15037:308::-;15132:1;15113:21;;:7;:21;;;;15105:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15198:24;15215:6;15198:12;;:16;;:24;;;;:::i;:::-;15183:12;:39;;;;15254:30;15277:6;15254:9;:18;15264:7;15254:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;15233:9;:18;15243:7;15233:18;;;;;;;;;;;;;;;:51;;;;15321:7;15300:37;;15317:1;15300:37;;;15330:6;15300:37;;;;;;;;;;;;;;;;;;15037:308;;:::o;54911:1281::-;55054:2;:14;;;55040:11;:28;55036:1149;;;55340:17;55360:49;55381:11;55394:2;:14;;;55360:20;:49::i;:::-;55340:69;;55424:20;55494:2;:15;;;21815:3;55462:9;55448:11;:23;55447:44;:62;;;;;;55424:85;;22000:1;21918:2;21971:1;:25;;21970:31;55530:12;:29;55526:370;;;22000:1;21918:2;21971:1;:25;;21970:31;55851:29;;55526:370;55931:1;:12;;;55916;:27;55912:262;;;55979:12;55964:1;:12;;:27;;;;;56055:2;:11;;;56017:141;;;56089:15;56127:12;56017:141;;;;;;;;;;;;;;;;;;;;;;;;55912:262;55036:1149;;;54911:1281;;;:::o;32265:647::-;32376:17;32418:1;32396:12;:19;;;;:23;32376:43;;32532:9;32518:10;:23;32514:177;;32656:12;32669:9;32656:23;;;;;;;;;;;;;;;32629:12;32642:10;32629:24;;;;;;;;;;;;;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32514:177;32886:12;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32265:647;;;:::o;29221:1041::-;29357:9;:26;;;29335:1;:18;;;:48;;:123;;;;29427:9;:31;;;29400:1;:23;;;:58;;29335:123;:176;;;;29491:9;:20;;;29475:1;:12;;;:36;;29335:176;:245;;;;29552:9;:28;;;29528:1;:20;;;:52;;29335:245;29331:533;;;29630:1;:18;;;29597:7;:23;;;:52;;;;;;;;;;;;;;;;;;29702:1;:23;;;29664:7;:28;;;:62;;;;;;;;;;;;;;;;;;29768:1;:12;;;29741:7;:17;;;:40;;;;;;;;;;;;;;;;;;29831:1;:20;;;29796:7;:25;;;:56;;;;;;;;;;;;;;;;;;29331:533;29899:9;:25;;;29878:1;:17;;;:46;;:113;;;;29964:9;:27;;;29941:1;:19;;;:50;;29878:113;:174;;;;30028:9;:24;;;30008:44;;:1;:16;;;:44;;;;29878:174;29874:381;;;30101:1;:17;;;30069:7;:22;;;:50;;;;;;;;;;;;;;;;;;30168:1;:19;;;30134:7;:24;;;:54;;;;;;;;;;;;;;;;;;30227:1;:16;;;30203:7;:21;;;:40;;;;;;;;;;;;;;;;;;29874:381;29221:1041;;:::o;4259:181::-;4317:7;4337:9;4353:1;4349;:5;4337:17;;4378:1;4373;:6;;4365:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4431:1;4424:8;;;4259:181;;;;:::o;15981:348::-;16076:1;16057:21;;:7;:21;;;;16049:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16150:68;16173:6;16150:68;;;;;;;;;;;;;;;;;:9;:18;16160:7;16150:18;;;;;;;;;;;;;;;;:22;;:68;;;;;:::i;:::-;16129:9;:18;16139:7;16129:18;;;;;;;;;;;;;;;:89;;;;16244:24;16261:6;16244:12;;:16;;:24;;;;:::i;:::-;16229:12;:39;;;;16310:1;16284:37;;16293:7;16284:37;;;16314:6;16284:37;;;;;;;;;;;;;;;;;;15981:348;;:::o;27674:254::-;27747:7;20031:10;27776:15;:29;27772:149;;;27829:1;27822:8;;;;27772:149;27903:6;20031:10;27870:15;:29;27869:40;;;;;;27862:47;;27674:254;;:::o;42932:1737::-;20639:2;43144:13;:31;;43136:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43227:17;43247:50;43268:13;43283;43247:20;:50::i;:::-;43227:70;;43308:22;43382:1;:12;;;21815:3;43350:9;43334:13;:25;43333:46;:61;;;;;;43308:86;;43508:1;43490:14;:19;;43482:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43912:20;43951:1;43935;:13;;;:17;43912:40;;43993:17;44015:1;:16;;44013:18;;;;;;;;;;;;;43993:38;;44042:194;44066:10;:22;44077:10;44066:22;;;;;;;;;;;;;;;44103:10;44128:13;44156:14;44185:12;44212:13;44042:9;:194::i;:::-;44305:10;44254:159;;44279:10;44254:159;;;44330:13;44359:14;44389:13;44254:159;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44533:14;44506:1;:23;;:41;;;;;;;;;;;44648:13;44626:1;:18;;:35;;;;;;;;;;;42932:1737;;;;;;;:::o;30816:401::-;30936:2;:11;;;30920:5;:13;;;:27;;;;;;;;;;;;;;;;;;30984:2;:14;;;30958:5;:16;;;:41;;;;;;;;;;;;;;;;;;31037:2;:15;;;31010:5;:17;;;:43;;;;;;;;;;;;;;;;;;31089:2;:13;;;31064:5;:15;;;:39;;;;;;;;;;;;;;;;;;31140:2;:14;;;31114:5;:16;;;:41;;;;;;;;;;;;;;;;;;31193:2;:15;;;31166:5;:17;;;:43;;;;;;;;;;;;;;;;;;30816:401;;:::o;35410:970::-;35555:9;35534:1;:17;;;:30;35530:107;;35619:7;;35530:107;35649:25;;:::i;:::-;35725:1;:18;;;35709:13;:11;:13::i;:::-;:34;35685:2;:21;;:58;;;;;35756:11;35770:1;:17;;;35756:31;;35800:35;35824:1;35827:2;35831:3;35800:23;:35::i;:::-;35961:1;35934;:23;;;:28;35930:149;;36002:1;:23;;;35979:1;:19;;:46;;;;;;;;;;;36066:1;36040;:23;;:27;;;;;35930:149;36091:88;36106:9;36098:5;;;;;;:17;36091:88;;;36132:35;36156:1;36159:2;36163:3;36132:23;:35::i;:::-;36091:88;;;36226:10;36196:132;;;36251:15;36281:1;:17;;;36314:3;36196:132;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36369:3;36349:1;:17;;:23;;;;;35410:970;;;;;;:::o;62094:448::-;62167:17;62289:1;62278:8;:12;:30;;;;;62306:2;62294:8;:14;;62278:30;62274:232;;;62416:13;62411:1;62400:8;:12;62399:30;20183:19;62374:56;62362:68;;62274:232;;;20257:18;62463:31;;62274:232;62525:9;62518:16;;62094:448;;;:::o;62550:344::-;62863:12;62735:151;;62840:8;62815:10;62735:151;62761:15;62792:8;62735:151;;;;;;;;;;;;;;;;;;;;;;;;62550:344;;;;:::o;28679:534::-;28841:1;:18;;;28812:9;:26;;:47;;;;;28904:1;:23;;;28870:9;:31;;:57;;;;;28961:1;:12;;;28938:9;:20;;:35;;;;;29015:1;:20;;;28984:9;:28;;:51;;;;;29074:1;:17;;;29046:9;:25;;:45;;;;;29132:1;:19;;;29102:9;:27;;:49;;;;;29189:1;:16;;;29162:9;:24;;:43;;;;;;;;;;;28679:534;;:::o;52043:2201::-;52298:14;52314:15;52347:20;52387:10;52370:14;:27;52347:50;;52479:19;52525:1;52520;52502:15;:19;52501:25;;;;;;52479:47;;20701:2;52541:11;:36;52537:105;;;20701:2;52594:36;;52537:105;52672:1;52658:10;:15;52654:309;;;52761:16;52780:62;52806:1;52809:16;52827:14;52780:25;:62::i;:::-;52761:81;;52878:11;52867:8;:22;52857:32;;52912:6;52920:7;52904:24;;;;;;;;;52654:309;52993:10;52979:11;:24;52975:723;;;53360:21;53401:11;53384:14;:28;53360:52;;53437:70;53456:1;53459:16;53477:14;53493:13;53437:18;:70::i;:::-;53427:80;;53524:13;53540:68;53559:1;53562:16;53580:13;53595:12;53540:18;:68::i;:::-;53524:84;;53642:5;53632:7;:15;53623:24;;53670:6;53678:7;53662:24;;;;;;;;;;52975:723;53761:69;53780:1;53783:16;53801:14;53817:12;53761:18;:69::i;:::-;53752:78;;53862:10;53847:11;:25;53843:359;;;53899:6;53889:16;;53843:359;;;54180:10;54166:11;54157:6;:20;:33;;;;;;54147:43;;53843:359;54220:6;54228:7;54212:24;;;;;;52043:2201;;;;;;;;;:::o;46313:648::-;46524:14;46563:11;46577:8;46563:22;;46558:370;46593:6;46587:3;:12;46558:370;;;46623:17;46846:9;:14;46856:3;46846:14;;;;;;;;;;;:34;;;;;;;;;;;;46769:111;;46814:16;46807:3;46801:2;46771:9;:14;46781:3;46771:14;;;;;;;;;;;:27;;;:32;46770:40;;;;;;46769:61;:111;;;;;;46756:124;;;;46907:9;46897:19;;;;46558:370;46601:5;;;;;;;46558:370;;;;46947:6;46940:13;;46313:648;;;;;;:::o;45064:898::-;45267:14;45299:15;45332:11;45346:8;45332:22;;45327:602;45362:6;45356:3;:12;45327:602;;;45392:17;45506:9;:14;45516:3;45506:14;;;;;;;;;;;:34;;;;;;;;;;;;45438:102;;45470:16;45438:9;:14;45448:3;45438:14;;;;;;;;;;;:29;;;;;;;;;;;;:48;;;:102;;;;;;45426:114;;45571:1;45561:7;:11;45557:325;;;45593:9;;;;;;;45557:325;;;22084:1;45714:122;;45783:9;:14;45793:3;45783:14;;;;;;;;;;;:34;;;;;;;;;;;;45715:102;;45747:16;45715:9;:14;45725:3;45715:14;;;;;;;;;;;:29;;;;;;;;;;;;:48;;;:102;;;;;;45714:122;45702:134;;45865:1;45855:11;;45557:325;45908:9;45898:19;;;;45327:602;45370:5;;;;;;;45327:602;;;;45948:6;45941:13;;;45064:898;;;;;;:::o;54252:651::-;54469:7;54550:22;20851:1;20764;20824:28;54592:15;54575:14;:32;:58;54550:83;;54668:14;54648:16;:34;54644:75;;54706:1;54699:8;;;;;54644:75;21002:1;20913:3;20975:28;54854:14;54835:16;:33;54817:14;:52;:78;;;;;;54810:85;;;54252:651;;;;;;;:::o;47151:2787::-;47276:17;49409:23;49435:1;49409:27;;49531:1;49515:13;:17;49511:132;;;21354:3;21205;21147:2;21247:9;:29;;;;;;21324:27;:33;;;;;;49567:13;:29;;:64;;21354:3;21205;21147:2;21247:9;:29;;;;;;21324:27;:33;;;;;;49567:64;;;49615:1;49599:13;:17;49567:64;49549:82;;49511:132;49655:24;19744:1;19855:17;;19849:2;:23;21549:7;21604:26;49682:13;:29;;:86;;19744:1;19855:17;;19849:2;:23;21549:7;21604:26;49682:86;;;49727:13;49682:86;49655:113;;21147:2;21247:9;:29;;;;;;49817:16;:22;21501:2;21684:3;19744:1;19855:17;;19849:2;:23;21549:7;21604:26;21669:18;:38;;;;;;49793:15;:21;:46;49781:58;;21501:2;21684:3;19744:1;19855:17;;19849:2;:23;21549:7;21604:26;21669:18;:38;;;;;;21147:2;21247:9;:29;;;;;;49891:9;49878;49862:13;:25;:39;;;;;;49850:51;;49921:9;49914:16;;;;47151:2787;;;;:::o;4715:136::-;4773:7;4800:43;4804:1;4807;4800:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;4793:50;;4715:136;;;;:::o;31225:568::-;31485:12;31517:257;;;;;;;;31546:10;31517:257;;;;;;31582:13;31517:257;;;;;;31622:14;31517:257;;;;;;31663:12;31517:257;;;;;;31702:13;31517:257;;;;;;31742:1;31517:257;;;;;31485:300;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;31485:300:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31225:568;;;;;;:::o;35042:360::-;35171:27;35187:1;35190:2;35194:3;35171:15;:27::i;:::-;35250:2;:15;;;35211:9;:14;35221:3;35211:14;;;;;;;;;;;:29;;;:55;;;;;;;;;;;;;;;;;;35307:7;:12;35315:3;35307:12;;;;;;;;;;;;35277:9;:14;35287:3;35277:14;;;;;;;;;;;:27;;:42;;;;35374:1;:19;;;35330:9;:14;35340:3;35330:14;;;;;;;;;;;:34;;;:64;;;;;;;;;;;;;;;;;;35042:360;;;:::o;33193:706::-;33340:14;33430:24;;:::i;:::-;33465:30;33487:1;33490:4;33465:21;:30::i;:::-;33508:25;;:::i;:::-;33584:1;:18;;;33568:13;:11;:13::i;:::-;:34;33544:2;:21;;:58;;;;;33615:30;33631:4;33637:2;33641:3;33615:15;:30::i;:::-;33768:16;33742:4;:22;;:42;;;;;;;;;;;33843:4;:22;;;33824:16;33806:2;:15;;;:34;:59;;;;;;33797:68;;33885:6;33878:13;;;;33193:706;;;;;:::o;33907:1127::-;34869:8;34861:5;34837:2;:21;;;:29;:40;;;;;;34818:2;:15;;:60;;;;;34919:1;34895;:20;;;:25;34891:136;;34956:1;:20;;;34937:2;:15;;:39;;;;;;;;;;;35014:1;34991;:20;;:24;;;;;34891:136;33907:1127;;;:::o;62901:233::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;62901:233:0;;;;:::o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;62901:233:0;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
bzzr://3c0ae5e6cbd2048e452b0d2948aada211cfe1c29034996aa28137d11fe31bf17
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.