Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 14 from a total of 14 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Exclude From Div... | 23014767 | 209 days ago | IN | 0 ETH | 0.00019076 | ||||
| Exclude From Fee... | 23014764 | 209 days ago | IN | 0 ETH | 0.00010711 | ||||
| Approve | 23014754 | 209 days ago | IN | 0 ETH | 0.0001049 | ||||
| Approve | 22990037 | 212 days ago | IN | 0 ETH | 0.00013615 | ||||
| Transfer | 22977795 | 214 days ago | IN | 0 ETH | 0.00060696 | ||||
| Transfer | 22968983 | 215 days ago | IN | 0 ETH | 0.00112197 | ||||
| Exclude From Fee... | 22961814 | 216 days ago | IN | 0 ETH | 0.00038217 | ||||
| Approve | 22961550 | 216 days ago | IN | 0 ETH | 0.00030367 | ||||
| Exclude From Fee... | 22961446 | 216 days ago | IN | 0 ETH | 0.00024071 | ||||
| Exclude From Div... | 22961409 | 216 days ago | IN | 0 ETH | 0.00033753 | ||||
| Approve | 22735492 | 248 days ago | IN | 0 ETH | 0.00003102 | ||||
| Approve | 22735488 | 248 days ago | IN | 0 ETH | 0.00005365 | ||||
| Exclude From Fee... | 22735477 | 248 days ago | IN | 0 ETH | 0.00005773 | ||||
| Exclude From Div... | 22735476 | 248 days ago | IN | 0 ETH | 0.00007775 |
Latest 2 internal transactions
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 22735408 | 248 days ago | 0.01 ETH | ||||
| 0x3d602d80 | 22735408 | 248 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0x2B61f30A...4e1489DE1 The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
DividendToken
Compiler Version
v0.8.16+commit.07a7930e
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2024-09-06
*/
// SPDX-License-Identifier: MIT
pragma solidity 0.8.16;
library SafeMath {
function add(uint256 a, uint256 b) internal pure returns (uint256) {
return a + b;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return a - b;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
return a * b;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}
function sub(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}
function div(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}
}
library SafeMathInt {
int256 private constant MIN_INT256 = int256(1) << 255;
int256 private constant MAX_INT256 = ~(int256(1) << 255);
function mul(int256 a, int256 b) internal pure returns (int256) {
int256 c = a * b;
require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
require((b == 0) || (c / b == a));
return c;
}
function div(int256 a, int256 b) internal pure returns (int256) {
require(b != -1 || a != MIN_INT256);
return a / b;
}
function sub(int256 a, int256 b) internal pure returns (int256) {
int256 c = a - b;
require((b >= 0 && c <= a) || (b < 0 && c > a));
return c;
}
function add(int256 a, int256 b) internal pure returns (int256) {
int256 c = a + b;
require((b >= 0 && c >= a) || (b < 0 && c < a));
return c;
}
function toUint256Safe(int256 a) internal pure returns (uint256) {
require(a >= 0);
return uint256(a);
}
}
library SafeMathUint {
function toInt256Safe(uint256 a) internal pure returns (int256) {
int256 b = int256(a);
require(b >= 0);
return b;
}
}
abstract contract Initializable {
bool private _initialized;
bool private _initializing;
modifier initializer() {
require(
_initializing || !_initialized,
"Initializable: contract is already initialized"
);
bool isTopLevelCall = !_initializing;
if (isTopLevelCall) {
_initializing = true;
_initialized = true;
}
_;
if (isTopLevelCall) {
_initializing = false;
}
}
}
abstract contract ContextUpgradeable is Initializable {
function __Context_init() internal initializer {
__Context_init_unchained();
}
function __Context_init_unchained() internal initializer {}
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
uint256[50] private __gap;
}
interface IERC20Upgradeable {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(
address recipient,
uint256 amount
) external returns (bool);
function allowance(
address owner,
address spender
) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
}
interface IERC20MetadataUpgradeable is IERC20Upgradeable {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
}
contract ERC20Upgradeable is
Initializable,
ContextUpgradeable,
IERC20Upgradeable,
IERC20MetadataUpgradeable
{
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
function __ERC20_init(
string memory name_,
string memory symbol_
) internal initializer {
__Context_init_unchained();
__ERC20_init_unchained(name_, symbol_);
}
function __ERC20_init_unchained(
string memory name_,
string memory symbol_
) internal initializer {
_name = name_;
_symbol = symbol_;
}
function name() public view virtual override returns (string memory) {
return _name;
}
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
function decimals() public view virtual override returns (uint8) {
return 18;
}
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
function balanceOf(
address account
) public view virtual override returns (uint256) {
return _balances[account];
}
function transfer(
address recipient,
uint256 amount
) public virtual override returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
function allowance(
address owner,
address spender
) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
function approve(
address spender,
uint256 amount
) public virtual override returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
function transferFrom(
address sender,
address recipient,
uint256 amount
) public virtual override returns (bool) {
_transfer(sender, recipient, amount);
uint256 currentAllowance = _allowances[sender][_msgSender()];
require(
currentAllowance >= amount,
"ERC20: transfer amount exceeds allowance"
);
unchecked {
_approve(sender, _msgSender(), currentAllowance - amount);
}
return true;
}
function increaseAllowance(
address spender,
uint256 addedValue
) public virtual returns (bool) {
_approve(
_msgSender(),
spender,
_allowances[_msgSender()][spender] + addedValue
);
return true;
}
function decreaseAllowance(
address spender,
uint256 subtractedValue
) public virtual returns (bool) {
uint256 currentAllowance = _allowances[_msgSender()][spender];
require(
currentAllowance >= subtractedValue,
"ERC20: decreased allowance below zero"
);
unchecked {
_approve(_msgSender(), spender, currentAllowance - subtractedValue);
}
return true;
}
function _transfer(
address sender,
address recipient,
uint256 amount
) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(sender, recipient, amount);
uint256 senderBalance = _balances[sender];
require(
senderBalance >= amount,
"ERC20: transfer amount exceeds balance"
);
unchecked {
_balances[sender] = senderBalance - amount;
}
_balances[recipient] += amount;
emit Transfer(sender, recipient, amount);
_afterTokenTransfer(sender, recipient, amount);
}
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply += amount;
_balances[account] += amount;
emit Transfer(address(0), account, amount);
_afterTokenTransfer(address(0), account, amount);
}
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
uint256 accountBalance = _balances[account];
require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
unchecked {
_balances[account] = accountBalance - amount;
}
_totalSupply -= amount;
emit Transfer(account, address(0), amount);
_afterTokenTransfer(account, address(0), amount);
}
function _approve(
address owner,
address spender,
uint256 amount
) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
function _beforeTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
function _afterTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
uint256[45] private __gap;
}
abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {
address private _owner;
event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
);
function __Ownable_init() internal initializer {
__Context_init_unchained();
__Ownable_init_unchained();
}
function __Ownable_init_unchained() internal initializer {
_setOwner(_msgSender());
}
function owner() public view virtual returns (address) {
return _owner;
}
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
function renounceOwnership() public virtual onlyOwner {
_setOwner(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(
newOwner != address(0),
"Ownable: new owner is the zero address"
);
_setOwner(newOwner);
}
function _setOwner(address newOwner) private {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
uint256[49] private __gap;
}
interface DividendPayingTokenInterface {
function dividendOf(address _owner) external view returns (uint256);
function withdrawDividend() external;
event DividendsDistributed(address indexed from, uint256 weiAmount);
event DividendWithdrawn(address indexed to, uint256 weiAmount);
}
interface DividendPayingTokenOptionalInterface {
function withdrawableDividendOf(
address _owner
) external view returns (uint256);
function withdrawnDividendOf(
address _owner
) external view returns (uint256);
function accumulativeDividendOf(
address _owner
) external view returns (uint256);
}
contract DividendPayingToken is
ERC20Upgradeable,
OwnableUpgradeable,
DividendPayingTokenInterface,
DividendPayingTokenOptionalInterface
{
using SafeMath for uint256;
using SafeMathUint for uint256;
using SafeMathInt for int256;
address public rewardToken;
uint256 internal constant magnitude = 2 ** 128;
uint256 internal magnifiedDividendPerShare;
mapping(address => int256) internal magnifiedDividendCorrections;
mapping(address => uint256) internal withdrawnDividends;
uint256 public totalDividendsDistributed;
function __DividendPayingToken_init(
address _rewardToken,
string memory _name,
string memory _symbol
) internal initializer {
__Ownable_init();
__ERC20_init(_name, _symbol);
rewardToken = _rewardToken;
}
function distributeCAKEDividends(uint256 amount) public onlyOwner {
require(totalSupply() > 0);
if (amount > 0) {
magnifiedDividendPerShare = magnifiedDividendPerShare.add(
(amount).mul(magnitude) / totalSupply()
);
emit DividendsDistributed(msg.sender, amount);
totalDividendsDistributed = totalDividendsDistributed.add(amount);
}
}
function withdrawDividend() public virtual override {
_withdrawDividendOfUser(payable(msg.sender));
}
function _withdrawDividendOfUser(
address payable user
) internal returns (uint256) {
uint256 _withdrawableDividend = withdrawableDividendOf(user);
if (_withdrawableDividend > 0) {
withdrawnDividends[user] = withdrawnDividends[user].add(
_withdrawableDividend
);
emit DividendWithdrawn(user, _withdrawableDividend);
bool success = IERC20(rewardToken).transfer(
user,
_withdrawableDividend
);
if (!success) {
withdrawnDividends[user] = withdrawnDividends[user].sub(
_withdrawableDividend
);
return 0;
}
return _withdrawableDividend;
}
return 0;
}
function dividendOf(address _owner) public view override returns (uint256) {
return withdrawableDividendOf(_owner);
}
function withdrawableDividendOf(
address _owner
) public view override returns (uint256) {
return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]);
}
function withdrawnDividendOf(
address _owner
) public view override returns (uint256) {
return withdrawnDividends[_owner];
}
function accumulativeDividendOf(
address _owner
) public view override returns (uint256) {
return
magnifiedDividendPerShare
.mul(balanceOf(_owner))
.toInt256Safe()
.add(magnifiedDividendCorrections[_owner])
.toUint256Safe() / magnitude;
}
function _transfer(
address from,
address to,
uint256 value
) internal virtual override {
require(false);
int256 _magCorrection = magnifiedDividendPerShare
.mul(value)
.toInt256Safe();
magnifiedDividendCorrections[from] = magnifiedDividendCorrections[from]
.add(_magCorrection);
magnifiedDividendCorrections[to] = magnifiedDividendCorrections[to].sub(
_magCorrection
);
}
function _mint(address account, uint256 value) internal override {
super._mint(account, value);
magnifiedDividendCorrections[account] = magnifiedDividendCorrections[
account
].sub((magnifiedDividendPerShare.mul(value)).toInt256Safe());
}
function _burn(address account, uint256 value) internal override {
super._burn(account, value);
magnifiedDividendCorrections[account] = magnifiedDividendCorrections[
account
].add((magnifiedDividendPerShare.mul(value)).toInt256Safe());
}
function _setBalance(address account, uint256 newBalance) internal {
uint256 currentBalance = balanceOf(account);
if (newBalance > currentBalance) {
uint256 mintAmount = newBalance.sub(currentBalance);
_mint(account, mintAmount);
} else if (newBalance < currentBalance) {
uint256 burnAmount = currentBalance.sub(newBalance);
_burn(account, burnAmount);
}
}
}
library IterableMapping {
struct Map {
address[] keys;
mapping(address => uint256) values;
mapping(address => uint256) indexOf;
mapping(address => bool) inserted;
}
function get(Map storage map, address key) public view returns (uint256) {
return map.values[key];
}
function getIndexOfKey(
Map storage map,
address key
) public view returns (int256) {
if (!map.inserted[key]) {
return -1;
}
return int256(map.indexOf[key]);
}
function getKeyAtIndex(
Map storage map,
uint256 index
) public view returns (address) {
return map.keys[index];
}
function size(Map storage map) public view returns (uint256) {
return map.keys.length;
}
function set(Map storage map, address key, uint256 val) public {
if (map.inserted[key]) {
map.values[key] = val;
} else {
map.inserted[key] = true;
map.values[key] = val;
map.indexOf[key] = map.keys.length;
map.keys.push(key);
}
}
function remove(Map storage map, address key) public {
if (!map.inserted[key]) {
return;
}
delete map.inserted[key];
delete map.values[key];
uint256 index = map.indexOf[key];
uint256 lastIndex = map.keys.length - 1;
address lastKey = map.keys[lastIndex];
map.indexOf[lastKey] = index;
delete map.indexOf[key];
map.keys[index] = lastKey;
map.keys.pop();
}
}
contract DividendTracker is OwnableUpgradeable, DividendPayingToken {
using SafeMath for uint256;
using SafeMathInt for int256;
using IterableMapping for IterableMapping.Map;
IterableMapping.Map private tokenHoldersMap;
uint256 public lastProcessedIndex;
mapping(address => bool) public excludedFromDividends;
mapping(address => uint256) public lastClaimTimes;
uint256 public claimWait;
uint256 public minimumTokenBalanceForDividends;
event ExcludeFromDividends(address indexed account);
event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);
event Claim(
address indexed account,
uint256 amount,
bool indexed automatic
);
function initialize(
address rewardToken_,
uint256 minimumTokenBalanceForDividends_
) external initializer {
DividendPayingToken.__DividendPayingToken_init(
rewardToken_,
"DividendTracker",
"DividendTracker"
);
claimWait = 3600;
minimumTokenBalanceForDividends = minimumTokenBalanceForDividends_;
}
function _transfer(address, address, uint256) internal pure override {
require(false, "DividendTracker transfers are not allowed");
}
function withdrawDividend() public pure override {
require(false, "DividendTracker withdrawDividend is disabled.");
}
function excludeFromDividends(address account) external onlyOwner {
require(!excludedFromDividends[account]);
excludedFromDividends[account] = true;
_setBalance(account, 0);
tokenHoldersMap.remove(account);
emit ExcludeFromDividends(account);
}
function isExcludedFromDividends(
address account
) public view returns (bool) {
return excludedFromDividends[account];
}
function updateClaimWait(uint256 newClaimWait) external onlyOwner {
require(
newClaimWait >= 3600 && newClaimWait <= 86400,
"ClaimWait must be between 1 to 24 hours"
);
require(
newClaimWait != claimWait,
"Cannot update newClaimWait to the same value"
);
emit ClaimWaitUpdated(newClaimWait, claimWait);
claimWait = newClaimWait;
}
function updateMinimumTokenBalanceForDividends(
uint256 amount
) external onlyOwner {
minimumTokenBalanceForDividends = amount;
}
function getLastProcessedIndex() external view returns (uint256) {
return lastProcessedIndex;
}
function getNumberOfTokenHolders() external view returns (uint256) {
return tokenHoldersMap.keys.length;
}
function getAccount(
address _account
)
public
view
returns (
address account,
int256 index,
int256 iterationsUntilProcessed,
uint256 withdrawableDividends,
uint256 totalDividends,
uint256 lastClaimTime,
uint256 nextClaimTime,
uint256 secondsUntilAutoClaimAvailable
)
{
account = _account;
index = tokenHoldersMap.getIndexOfKey(account);
iterationsUntilProcessed = -1;
if (index >= 0) {
if (uint256(index) > lastProcessedIndex) {
iterationsUntilProcessed = index.sub(
int256(lastProcessedIndex)
);
} else {
uint256 processesUntilEndOfArray = tokenHoldersMap.keys.length >
lastProcessedIndex
? tokenHoldersMap.keys.length.sub(lastProcessedIndex)
: 0;
iterationsUntilProcessed = index.add(
int256(processesUntilEndOfArray)
);
}
}
withdrawableDividends = withdrawableDividendOf(account);
totalDividends = accumulativeDividendOf(account);
lastClaimTime = lastClaimTimes[account];
nextClaimTime = lastClaimTime > 0 ? lastClaimTime.add(claimWait) : 0;
secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp
? nextClaimTime.sub(block.timestamp)
: 0;
}
function getAccountAtIndex(
uint256 index
)
public
view
returns (
address,
int256,
int256,
uint256,
uint256,
uint256,
uint256,
uint256
)
{
if (index >= tokenHoldersMap.size()) {
return (address(0), -1, -1, 0, 0, 0, 0, 0);
}
address account = tokenHoldersMap.getKeyAtIndex(index);
return getAccount(account);
}
function canAutoClaim(uint256 lastClaimTime) private view returns (bool) {
if (lastClaimTime > block.timestamp) {
return false;
}
return block.timestamp.sub(lastClaimTime) >= claimWait;
}
function setBalance(
address payable account,
uint256 newBalance
) external onlyOwner {
if (excludedFromDividends[account]) {
return;
}
if (newBalance >= minimumTokenBalanceForDividends) {
_setBalance(account, newBalance);
tokenHoldersMap.set(account, newBalance);
} else {
_setBalance(account, 0);
tokenHoldersMap.remove(account);
}
processAccount(account, true);
}
function process(uint256 gas) public returns (uint256, uint256, uint256) {
uint256 numberOfTokenHolders = tokenHoldersMap.keys.length;
if (numberOfTokenHolders == 0) {
return (0, 0, lastProcessedIndex);
}
uint256 _lastProcessedIndex = lastProcessedIndex;
uint256 gasUsed = 0;
uint256 gasLeft = gasleft();
uint256 iterations = 0;
uint256 claims = 0;
while (gasUsed < gas && iterations < numberOfTokenHolders) {
_lastProcessedIndex++;
if (_lastProcessedIndex >= tokenHoldersMap.keys.length) {
_lastProcessedIndex = 0;
}
address account = tokenHoldersMap.keys[_lastProcessedIndex];
if (canAutoClaim(lastClaimTimes[account])) {
if (processAccount(payable(account), true)) {
claims++;
}
}
iterations++;
uint256 newGasLeft = gasleft();
if (gasLeft > newGasLeft) {
gasUsed = gasUsed.add(gasLeft.sub(newGasLeft));
}
gasLeft = newGasLeft;
}
lastProcessedIndex = _lastProcessedIndex;
return (iterations, claims, lastProcessedIndex);
}
function processAccount(
address payable account,
bool automatic
) public onlyOwner returns (bool) {
uint256 amount = _withdrawDividendOfUser(account);
if (amount > 0) {
lastClaimTimes[account] = block.timestamp;
emit Claim(account, amount, automatic);
return true;
}
return false;
}
}
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(
address recipient,
uint256 amount
) external returns (bool);
function allowance(
address owner,
address spender
) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
}
interface IERC20Metadata is IERC20 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
}
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
contract ERC20 is Context, IERC20, IERC20Metadata {
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
uint8 private _decimals;
string private _name;
string private _symbol;
constructor(string memory name_, string memory symbol_, uint8 decimals_) {
_name = name_;
_symbol = symbol_;
_decimals = decimals_;
}
function name() public view virtual override returns (string memory) {
return _name;
}
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
function decimals() public view virtual override returns (uint8) {
return _decimals;
}
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
function balanceOf(
address account
) public view virtual override returns (uint256) {
return _balances[account];
}
function transfer(
address recipient,
uint256 amount
) public virtual override returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
function allowance(
address owner,
address spender
) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
function approve(
address spender,
uint256 amount
) public virtual override returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
function transferFrom(
address sender,
address recipient,
uint256 amount
) public virtual override returns (bool) {
_transfer(sender, recipient, amount);
uint256 currentAllowance = _allowances[sender][_msgSender()];
require(
currentAllowance >= amount,
"ERC20: transfer amount exceeds allowance"
);
unchecked {
_approve(sender, _msgSender(), currentAllowance - amount);
}
return true;
}
function increaseAllowance(
address spender,
uint256 addedValue
) public virtual returns (bool) {
_approve(
_msgSender(),
spender,
_allowances[_msgSender()][spender] + addedValue
);
return true;
}
function decreaseAllowance(
address spender,
uint256 subtractedValue
) public virtual returns (bool) {
uint256 currentAllowance = _allowances[_msgSender()][spender];
require(
currentAllowance >= subtractedValue,
"ERC20: decreased allowance below zero"
);
unchecked {
_approve(_msgSender(), spender, currentAllowance - subtractedValue);
}
return true;
}
function _transfer(
address sender,
address recipient,
uint256 amount
) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
uint256 senderBalance = _balances[sender];
require(
senderBalance >= amount,
"ERC20: transfer amount exceeds balance"
);
unchecked {
_balances[sender] = senderBalance - amount;
}
_balances[recipient] += amount;
emit Transfer(sender, recipient, amount);
}
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_totalSupply += amount;
_balances[account] += amount;
emit Transfer(address(0), account, amount);
}
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
uint256 accountBalance = _balances[account];
require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
unchecked {
_balances[account] = accountBalance - amount;
}
_totalSupply -= amount;
emit Transfer(account, address(0), amount);
}
function _approve(
address owner,
address spender,
uint256 amount
) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
}
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
);
constructor() {
_setOwner(_msgSender());
}
function owner() public view virtual returns (address) {
return _owner;
}
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
function renounceOwnership() public virtual onlyOwner {
_setOwner(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(
newOwner != address(0),
"Ownable: new owner is the zero address"
);
_setOwner(newOwner);
}
function _setOwner(address newOwner) private {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
library Clones {
function clone(address implementation) internal returns (address instance) {
assembly {
let ptr := mload(0x40)
mstore(
ptr,
0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000
)
mstore(add(ptr, 0x14), shl(0x60, implementation))
mstore(
add(ptr, 0x28),
0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000
)
instance := create(0, ptr, 0x37)
}
require(instance != address(0), "ERC1167: create failed");
}
}
interface IUniswapV2Factory {
function createPair(
address tokenA,
address tokenB
) external returns (address pair);
function getPair(
address tokenA,
address tokenB
) external view returns (address pair);
}
interface IUniswapV2Router01 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function WETC() external pure returns (address);
function WHT() external pure returns (address);
function WROSE() external pure returns (address);
function WAVAX() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint256 amountADesired,
uint256 amountBDesired,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline
) external returns (uint256 amountA, uint256 amountB, uint256 liquidity);
function addLiquidityETH(
address token,
uint256 amountTokenDesired,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
)
external
payable
returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);
function addLiquidityAVAX(
address token,
uint256 amountTokenDesired,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
)
external
payable
returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);
function addLiquidityETC(
address token,
uint256 amountTokenDesired,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
)
external
payable
returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);
function addLiquidityROSE(
address token,
uint256 amountTokenDesired,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
)
external
payable
returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);
}
interface IUniswapV2Router02 is IUniswapV2Router01 {
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external;
function swapExactTokensForETCSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external payable;
function swapExactTokensForAVAXSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external payable;
function swapExactTokensForROSESupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external;
}
abstract contract BaseToken {
event TokenCreated(
address indexed owner,
address indexed token,
string tokenType,
uint256 version
);
}
contract DividendToken is ERC20, Ownable, BaseToken {
uint256 public constant VERSION = 4;
IUniswapV2Router02 public uniswapV2Router;
bool private swapping;
DividendTracker public dividendTracker;
address public rewardToken;
uint256 public swapTokensAtAmount;
uint256 public tokenRewardsFee;
uint256 public liquidityFee;
uint256 public marketingFee;
uint256 public totalFees;
address public marketingWalletAddress;
uint256 public gasForProcessing;
mapping(address => bool) private _isExcludedFromFees;
mapping(address => bool) public automatedMarketMakerPairs;
event ExcludeFromFees(address indexed account);
event IncludeInFees(address indexed account);
event ExcludeMultipleAccountsFromFees(address[] accounts);
event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
event GasForProcessingUpdated(
uint256 indexed newValue,
uint256 indexed oldValue
);
event SwapAndLiquify(
uint256 tokensSwapped,
uint256 ethReceived,
uint256 tokensIntoLiqudity
);
event SendDividends(uint256 amount);
event ProcessedDividendTracker(
uint256 iterations,
uint256 claims,
uint256 lastProcessedIndex,
bool indexed automatic,
uint256 gas,
address indexed processor
);
event addLiquidityETH(uint256 eth, uint256 tokens, address receiver);
event transferTokens(uint256 _value, address receiver);
event SwapTokensAtAmountChanged(uint256 amount);
event UpdatedMarketingWallet(address account);
event UpdatedRewardsFee(uint256 amount);
event UpdatedLiquidityFee(uint256 amount);
event UpdatedMarketingFee(uint256 amount);
event SwapTokensForRewardFailed(uint256 amount);
event ProcessDividendTrackerFailed();
event SwapTokensForEthFailed(uint256 amount);
event AddLiquidityFailed(uint256 ethAmount);
modifier lockTheSwap() {
swapping = true;
_;
swapping = false;
}
constructor(
string memory name_,
string memory symbol_,
uint256 totalSupply_,
uint8 decimal_,
address dividendTrackerAddress_,
address[3] memory addrs,
uint256[3] memory feeSettings,
uint256 minimumTokenBalanceForDividends_,
address feeReceiver
) payable ERC20(name_, symbol_, decimal_) {
rewardToken = addrs[0];
marketingWalletAddress = addrs[2];
require(
marketingWalletAddress != address(0),
"marketingWalletAddress should not be the zero address"
);
uniswapV2Router = IUniswapV2Router02(addrs[1]);
address nativeCurrency = getNativeCurrency();
require(
nativeCurrency != rewardToken,
"The reward token cannot be the native token"
);
IUniswapV2Factory factory = IUniswapV2Factory(
uniswapV2Router.factory()
);
require(
factory.getPair(nativeCurrency, rewardToken) != address(0x0),
"reward token does not have a pair with the native currency"
);
tokenRewardsFee = feeSettings[0];
liquidityFee = feeSettings[1];
marketingFee = feeSettings[2];
updateFees();
swapTokensAtAmount = totalSupply_ / 1000;
gasForProcessing = 300000;
dividendTracker = DividendTracker(
payable(Clones.clone(dividendTrackerAddress_))
);
dividendTracker.initialize(
rewardToken,
minimumTokenBalanceForDividends_
);
_setAutomatedMarketMakerPair(
factory.createPair(address(this), nativeCurrency),
true
);
dividendTracker.excludeFromDividends(address(dividendTracker));
dividendTracker.excludeFromDividends(address(this));
dividendTracker.excludeFromDividends(owner());
dividendTracker.excludeFromDividends(address(0xdead));
dividendTracker.excludeFromDividends(address(uniswapV2Router));
_isExcludedFromFees[owner()] = true;
_isExcludedFromFees[marketingWalletAddress] = true;
_isExcludedFromFees[address(this)] = true;
_mint(owner(), totalSupply_);
emit TokenCreated(owner(), address(this), "dividendTracker", VERSION);
if (feeReceiver == address(0x0)) return;
payable(feeReceiver).transfer(address(this).balance);
}
function getNativeCurrency() internal view returns (address) {
if (block.chainid == 61) {
//etc
return uniswapV2Router.WETC();
} else if (block.chainid == 128) {
//heco chain
return uniswapV2Router.WHT();
} else if (block.chainid == 42262) {
//oasis
return uniswapV2Router.WROSE();
} else if (block.chainid == 43114 || block.chainid == 43113) {
//avalance
return uniswapV2Router.WAVAX();
} else {
return uniswapV2Router.WETH();
}
}
receive() external payable {}
function setSwapTokensAtAmount(uint256 amount) external onlyOwner {
require(
amount > totalSupply() / 10 ** 5 &&
amount <= totalSupply() / 10 ** 3,
"Amount must be between 0.001% - 0.1 of total supply"
);
swapTokensAtAmount = amount;
emit SwapTokensAtAmountChanged(amount);
}
function excludeFromFees(address account) external onlyOwner {
require(!_isExcludedFromFees[account], "Account is already excluded");
_isExcludedFromFees[account] = true;
emit ExcludeFromFees(account);
}
function includeInFees(address account) external onlyOwner {
require(_isExcludedFromFees[account], "Account is already included");
_isExcludedFromFees[account] = false;
emit IncludeInFees(account);
}
function excludeMultipleAccountsFromFees(
address[] calldata accounts
) external onlyOwner {
for (uint256 i = 0; i < accounts.length; i++) {
_isExcludedFromFees[accounts[i]] = true;
}
emit ExcludeMultipleAccountsFromFees(accounts);
}
function setMarketingWallet(address payable wallet) external onlyOwner {
require(wallet != address(0), "Can not be address(0).");
marketingWalletAddress = wallet;
emit UpdatedMarketingWallet(wallet);
}
function setTokenRewardsFee(uint256 value) external onlyOwner {
tokenRewardsFee = value;
updateFees();
emit UpdatedRewardsFee(value);
}
function setLiquidityFee(uint256 value) external onlyOwner {
liquidityFee = value;
updateFees();
emit UpdatedLiquidityFee(value);
}
function setMarketingFee(uint256 value) external onlyOwner {
marketingFee = value;
updateFees();
emit UpdatedMarketingFee(value);
}
function updateFees() internal {
totalFees = tokenRewardsFee + liquidityFee + marketingFee;
require(totalFees <= 20, "Total fees can not be over 20%.");
}
function _setAutomatedMarketMakerPair(address pair, bool value) private {
require(pair != address(0x0), "cannot mutate the address");
require(
automatedMarketMakerPairs[pair] != value,
"Pair is already set to this address."
);
automatedMarketMakerPairs[pair] = value;
if (value) {
dividendTracker.excludeFromDividends(pair);
}
emit SetAutomatedMarketMakerPair(pair, value);
}
function updateGasForProcessing(uint256 newValue) public onlyOwner {
require(
newValue >= 200000 && newValue <= 500000,
"GasForProcessing must be between 200,000 and 500,000."
);
require(
newValue != gasForProcessing,
"Cannot update gasForProcessing to same value."
);
emit GasForProcessingUpdated(newValue, gasForProcessing);
gasForProcessing = newValue;
}
function updateClaimWait(uint256 claimWait) external onlyOwner {
dividendTracker.updateClaimWait(claimWait);
}
function getClaimWait() external view returns (uint256) {
return dividendTracker.claimWait();
}
function updateMinimumTokenBalanceForDividends(
uint256 amount
) external onlyOwner {
dividendTracker.updateMinimumTokenBalanceForDividends(amount);
}
function getMinimumTokenBalanceForDividends()
external
view
returns (uint256)
{
return dividendTracker.minimumTokenBalanceForDividends();
}
function getTotalDividendsDistributed() external view returns (uint256) {
return dividendTracker.totalDividendsDistributed();
}
function isExcludedFromFees(address account) public view returns (bool) {
return _isExcludedFromFees[account];
}
function withdrawableDividendOf(
address account
) public view returns (uint256) {
return dividendTracker.withdrawableDividendOf(account);
}
function dividendTokenBalanceOf(
address account
) public view returns (uint256) {
return dividendTracker.balanceOf(account);
}
function excludeFromDividends(address account) external onlyOwner {
dividendTracker.excludeFromDividends(account);
}
function isExcludedFromDividends(
address account
) public view returns (bool) {
return dividendTracker.isExcludedFromDividends(account);
}
function getAccountDividendsInfo(
address account
)
external
view
returns (
address,
int256,
int256,
uint256,
uint256,
uint256,
uint256,
uint256
)
{
return dividendTracker.getAccount(account);
}
function getAccountDividendsInfoAtIndex(
uint256 index
)
external
view
returns (
address,
int256,
int256,
uint256,
uint256,
uint256,
uint256,
uint256
)
{
return dividendTracker.getAccountAtIndex(index);
}
function processDividendTracker(uint256 gas) external {
(
uint256 iterations,
uint256 claims,
uint256 lastProcessedIndex
) = dividendTracker.process(gas);
emit ProcessedDividendTracker(
iterations,
claims,
lastProcessedIndex,
false,
gas,
tx.origin
);
}
function claim() external {
dividendTracker.processAccount(payable(msg.sender), false);
}
function getLastProcessedIndex() external view returns (uint256) {
return dividendTracker.getLastProcessedIndex();
}
function getNumberOfDividendTokenHolders() external view returns (uint256) {
return dividendTracker.getNumberOfTokenHolders();
}
function _transfer(
address from,
address to,
uint256 amount
) internal override {
require(from != address(0), "Can not transfer from the zero address");
require(to != address(0), "Can not transfer to the zero address");
if (amount == 0) {
super._transfer(from, to, 0);
return;
}
bool localSwapping = swapping;
uint256 localTotalFees = totalFees;
bool canSwap = balanceOf(address(this)) >= swapTokensAtAmount;
if (
canSwap &&
!localSwapping &&
!automatedMarketMakerPairs[from] &&
from != owner() &&
to != owner() &&
localTotalFees > 0
) {
swap();
}
bool takeFee = !localSwapping &&
!_isExcludedFromFees[from] &&
!_isExcludedFromFees[to] &&
localTotalFees > 0;
if (takeFee) {
uint256 fees = (amount * localTotalFees) / 100;
amount = amount - fees;
super._transfer(from, address(this), fees);
}
super._transfer(from, to, amount);
try
dividendTracker.setBalance(payable(from), balanceOf(from))
{} catch {}
try dividendTracker.setBalance(payable(to), balanceOf(to)) {} catch {}
if (localSwapping) return;
try dividendTracker.process(gasForProcessing) returns (
uint256 iterations,
uint256 claims,
uint256 lastProcessedIndex
) {
emit ProcessedDividendTracker(
iterations,
claims,
lastProcessedIndex,
true,
gasForProcessing,
tx.origin
);
} catch {
emit ProcessDividendTrackerFailed();
}
}
function swap() private lockTheSwap {
uint256 amount = swapTokensAtAmount;
uint256 localTotalFees = totalFees;
uint256 swapTokens = (amount * liquidityFee) / localTotalFees;
if (swapTokens > 0) swapAndLiquify(swapTokens);
uint256 marketingTokens = (amount * marketingFee) / localTotalFees;
uint256 dividendTokens = amount - marketingTokens - swapTokens;
uint256 totalTokens = marketingTokens + dividendTokens;
uint256 swappedAmount = swapTokensForReward(totalTokens);
uint256 marketingShare = (swappedAmount * marketingTokens) /
totalTokens;
if (marketingShare > 0)
IERC20(rewardToken).transfer(
marketingWalletAddress,
marketingShare
);
if (tokenRewardsFee > 0) swapAndSendDividends();
}
function swapAndLiquify(uint256 tokens) private {
uint256 half = tokens / 2;
uint256 otherHalf = tokens - half;
uint256 initialBalance = address(this).balance;
swapTokensForEth(half);
uint256 newBalance = address(this).balance - initialBalance;
if (newBalance == 0) return;
addLiquidity(otherHalf, newBalance);
emit SwapAndLiquify(half, newBalance, otherHalf);
}
function swapTokensForEth(uint256 tokenAmount) private {
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = getNativeCurrency();
_approve(address(this), address(uniswapV2Router), tokenAmount);
if (block.chainid == 61) {
//etc
try
uniswapV2Router
.swapExactTokensForETCSupportingFeeOnTransferTokens(
tokenAmount,
0,
path,
address(this),
block.timestamp
)
{} catch {
emit SwapTokensForEthFailed(tokenAmount);
}
} else if (block.chainid == 42262) {
//oasis
try
uniswapV2Router
.swapExactTokensForROSESupportingFeeOnTransferTokens(
tokenAmount,
0,
path,
address(this),
block.timestamp
)
{} catch {
emit SwapTokensForEthFailed(tokenAmount);
}
} else if (block.chainid == 43114 || block.chainid == 43113) {
//avalance
try
uniswapV2Router
.swapExactTokensForAVAXSupportingFeeOnTransferTokens(
tokenAmount,
0,
path,
address(this),
block.timestamp
)
{} catch {
emit SwapTokensForEthFailed(tokenAmount);
}
} else {
try
uniswapV2Router
.swapExactTokensForETHSupportingFeeOnTransferTokens(
tokenAmount,
0,
path,
address(this),
block.timestamp
)
{} catch {
emit SwapTokensForEthFailed(tokenAmount);
}
}
}
function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
_approve(address(this), address(uniswapV2Router), tokenAmount);
if (block.chainid == 61) {
try
uniswapV2Router.addLiquidityETC{value: ethAmount}(
address(this),
tokenAmount,
0,
0,
address(0xdead),
block.timestamp
)
{} catch {
emit AddLiquidityFailed(ethAmount);
}
} else if (block.chainid == 42262) {
try
uniswapV2Router.addLiquidityROSE{value: ethAmount}(
address(this),
tokenAmount,
0,
0,
address(0xdead),
block.timestamp
)
{} catch {
emit AddLiquidityFailed(ethAmount);
}
} else if (block.chainid == 43114 || block.chainid == 43113) {
try
uniswapV2Router.addLiquidityAVAX{value: ethAmount}(
address(this),
tokenAmount,
0,
0,
address(0xdead),
block.timestamp
)
{} catch {
emit AddLiquidityFailed(ethAmount);
}
} else {
try
uniswapV2Router.addLiquidityETH{value: ethAmount}(
address(this),
tokenAmount,
0,
0,
address(0xdead),
block.timestamp
)
{} catch {
emit AddLiquidityFailed(ethAmount);
}
}
}
function swapTokensForReward(
uint256 tokenAmount
) private returns (uint256) {
address[] memory path = new address[](3);
path[0] = address(this);
path[1] = getNativeCurrency();
path[2] = rewardToken;
_approve(address(this), address(uniswapV2Router), tokenAmount);
IERC20 localRewardToken = IERC20(rewardToken);
uint256 balance = localRewardToken.balanceOf(address(this));
try
uniswapV2Router
.swapExactTokensForTokensSupportingFeeOnTransferTokens(
tokenAmount,
0,
path,
address(this),
block.timestamp
)
{
return localRewardToken.balanceOf(address(this)) - balance;
} catch {
emit SwapTokensForRewardFailed(tokenAmount);
return 0;
}
}
function swapAndSendDividends() private {
IERC20 localRewardToken = IERC20(rewardToken);
uint256 dividends = localRewardToken.balanceOf(address(this));
if (dividends == 0) return;
bool success = localRewardToken.transfer(
address(dividendTracker),
dividends
);
if (success) {
dividendTracker.distributeCAKEDividends(dividends);
emit SendDividends(dividends);
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint256","name":"totalSupply_","type":"uint256"},{"internalType":"uint8","name":"decimal_","type":"uint8"},{"internalType":"address","name":"dividendTrackerAddress_","type":"address"},{"internalType":"address[3]","name":"addrs","type":"address[3]"},{"internalType":"uint256[3]","name":"feeSettings","type":"uint256[3]"},{"internalType":"uint256","name":"minimumTokenBalanceForDividends_","type":"uint256"},{"internalType":"address","name":"feeReceiver","type":"address"}],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"}],"name":"AddLiquidityFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"ExcludeMultipleAccountsFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"GasForProcessingUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"IncludeInFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[],"name":"ProcessDividendTrackerFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SwapTokensAtAmountChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SwapTokensForEthFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SwapTokensForRewardFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"string","name":"tokenType","type":"string"},{"indexed":false,"internalType":"uint256","name":"version","type":"uint256"}],"name":"TokenCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UpdatedLiquidityFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UpdatedMarketingFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"UpdatedMarketingWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UpdatedRewardsFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"eth","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokens","type":"uint256"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"}],"name":"addLiquidityETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"}],"name":"transferTokens","type":"event"},{"inputs":[],"name":"VERSION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract DividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"excludeMultipleAccountsFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountDividendsInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountDividendsInfoAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinimumTokenBalanceForDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromDividends","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWalletAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setLiquidityFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setMarketingFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"wallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setTokenRewardsFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"updateMinimumTokenBalanceForDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
0x6080604052604051620045a9380380620045a9833981016040819052620000269162000fc9565b88888760046200003784826200113e565b5060056200004683826200113e565b506003805460ff191660ff92909216919091179055506200007090506200006a3390565b620007f0565b8351600980546001600160a01b03199081166001600160a01b03938416179091556040860151600f8054909216921691821790556200011c5760405162461bcd60e51b815260206004820152603560248201527f6d61726b6574696e6757616c6c6574416464726573732073686f756c64206e6f60448201527f7420626520746865207a65726f2061646472657373000000000000000000000060648201526084015b60405180910390fd5b8360016020020151600780546001600160a01b0319166001600160a01b0390921691909117905560006200014f62000842565b6009549091506001600160a01b0390811690821603620001c65760405162461bcd60e51b815260206004820152602b60248201527f5468652072657761726420746f6b656e2063616e6e6f7420626520746865206e60448201526a30ba34bb32903a37b5b2b760a91b606482015260840162000113565b6007546040805163c45a015560e01b815290516000926001600160a01b03169163c45a01559160048083019260209291908290030181865afa15801562000211573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023791906200120a565b60095460405163e6a4390560e01b81526001600160a01b03858116600483015291821660248201529192506000919083169063e6a4390590604401602060405180830381865afa15801562000290573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002b691906200120a565b6001600160a01b031603620003345760405162461bcd60e51b815260206004820152603a60248201527f72657761726420746f6b656e20646f6573206e6f74206861766520612070616960448201527f72207769746820746865206e61746976652063757272656e6379000000000000606482015260840162000113565b8451600b556020850151600c556040850151600d556200035362000a47565b620003616103e88a6200122f565b600a55620493e0601055620003828762000ac1602090811b620019a617901c565b600880546001600160a01b0319166001600160a01b0392831690811790915560095460405163cd6dc68760e01b815292166004830152602482018690529063cd6dc68790604401600060405180830381600087803b158015620003e457600080fd5b505af1158015620003f9573d6000803e3d6000fd5b50506040516364e329cb60e11b81523060048201526001600160a01b0385811660248301526200047f93508416915063c9c65396906044016020604051808303816000875af115801562000451573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200047791906200120a565b600162000b70565b60085460405163031e79db60e41b81526001600160a01b0390911660048201819052906331e79db090602401600060405180830381600087803b158015620004c657600080fd5b505af1158015620004db573d6000803e3d6000fd5b505060085460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200052557600080fd5b505af11580156200053a573d6000803e3d6000fd5b50506008546001600160a01b031691506331e79db09050620005646006546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015620005a657600080fd5b505af1158015620005bb573d6000803e3d6000fd5b505060085460405163031e79db60e41b815261dead60048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200060757600080fd5b505af11580156200061c573d6000803e3d6000fd5b505060085460075460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b1580156200066a57600080fd5b505af11580156200067f573d6000803e3d6000fd5b505050506001601160006200069962000d1260201b60201c565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055600f5490911681526011909252808220805484166001908117909155308352912080549092161790556200070e620007076006546001600160a01b031690565b8a62000d21565b30620007226006546001600160a01b031690565b6001600160a01b03167f989c950f789dd53617d32eabbd91a779b5ac03cd8caeb147f73c8c11739d0fb160046040516200078891906040808252600f908201526e3234bb34b232b7322a3930b1b5b2b960891b6060820152602081019190915260800190565b60405180910390a36001600160a01b038316620007a7575050620007e1565b6040516001600160a01b038416904780156108fc02916000818181858888f19350505050158015620007dd573d6000803e3d6000fd5b5050505b5050505050505050506200127a565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600046603d03620008cc57600760009054906101000a90046001600160a01b03166001600160a01b031663977ebc0d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620008a1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620008c791906200120a565b905090565b466080036200092957600760009054906101000a90046001600160a01b03166001600160a01b0316635cb485926040518163ffffffff1660e01b8152600401602060405180830381865afa158015620008a1573d6000803e3d6000fd5b4661a516036200098757600760009054906101000a90046001600160a01b03166001600160a01b03166331b2cc456040518163ffffffff1660e01b8152600401602060405180830381865afa158015620008a1573d6000803e3d6000fd5b4661a86a14806200099957504661a869145b15620009f357600760009054906101000a90046001600160a01b03166001600160a01b03166373b295c26040518163ffffffff1660e01b8152600401602060405180830381865afa158015620008a1573d6000803e3d6000fd5b600760009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620008a1573d6000803e3d6000fd5b600d54600c54600b5462000a5c919062001252565b62000a68919062001252565b600e8190556014101562000abf5760405162461bcd60e51b815260206004820152601f60248201527f546f74616c20666565732063616e206e6f74206265206f766572203230252e00604482015260640162000113565b565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f09150506001600160a01b03811662000b6b5760405162461bcd60e51b815260206004820152601660248201527f455243313136373a20637265617465206661696c656400000000000000000000604482015260640162000113565b919050565b6001600160a01b03821662000bc85760405162461bcd60e51b815260206004820152601960248201527f63616e6e6f74206d757461746520746865206164647265737300000000000000604482015260640162000113565b6001600160a01b03821660009081526012602052604090205481151560ff90911615150362000c465760405162461bcd60e51b8152602060048201526024808201527f5061697220697320616c72656164792073657420746f2074686973206164647260448201526332b9b99760e11b606482015260840162000113565b6001600160a01b0382166000908152601260205260409020805460ff1916821580159190911790915562000cd65760085460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b15801562000cbc57600080fd5b505af115801562000cd1573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6006546001600160a01b031690565b6001600160a01b03821662000d795760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000113565b806002600082825462000d8d919062001252565b90915550506001600160a01b0382166000908152602081905260408120805483929062000dbc90849062001252565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b038111828210171562000e415762000e4162000e06565b60405290565b604051601f8201601f191681016001600160401b038111828210171562000e725762000e7262000e06565b604052919050565b600082601f83011262000e8c57600080fd5b81516001600160401b0381111562000ea85762000ea862000e06565b602062000ebe601f8301601f1916820162000e47565b828152858284870101111562000ed357600080fd5b60005b8381101562000ef357858101830151828201840152820162000ed6565b506000928101909101919091529392505050565b80516001600160a01b038116811462000b6b57600080fd5b600082601f83011262000f3157600080fd5b62000f3b62000e1c565b80606084018581111562000f4e57600080fd5b845b8181101562000f735762000f648162000f07565b84526020938401930162000f50565b509095945050505050565b600082601f83011262000f9057600080fd5b62000f9a62000e1c565b80606084018581111562000fad57600080fd5b845b8181101562000f7357805184526020938401930162000faf565b60008060008060008060008060006101a08a8c03121562000fe957600080fd5b89516001600160401b03808211156200100157600080fd5b6200100f8d838e0162000e7a565b9a5060208c01519150808211156200102657600080fd5b50620010358c828d0162000e7a565b98505060408a0151965060608a015160ff811681146200105457600080fd5b95506200106460808b0162000f07565b9450620010758b60a08c0162000f1f565b9350620010878b6101008c0162000f7e565b92506101608a01519150620010a06101808b0162000f07565b90509295985092959850929598565b600181811c90821680620010c457607f821691505b602082108103620010e557634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200113957600081815260208120601f850160051c81016020861015620011145750805b601f850160051c820191505b81811015620011355782815560010162001120565b5050505b505050565b81516001600160401b038111156200115a576200115a62000e06565b62001172816200116b8454620010af565b84620010eb565b602080601f831160018114620011aa5760008415620011915750858301515b600019600386901b1c1916600185901b17855562001135565b600085815260208120601f198616915b82811015620011db57888601518255948401946001909101908401620011ba565b5085821015620011fa5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156200121d57600080fd5b620012288262000f07565b9392505050565b6000826200124d57634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156200127457634e487b7160e01b600052601160045260246000fd5b92915050565b61331f806200128a6000396000f3fe6080604052600436106102e85760003560e01c8063715018a611610190578063bdd4f29f116100dc578063e708a0f911610095578063f27fd2541161006f578063f27fd25414610922578063f2fde38b14610942578063f7c618c114610962578063ffa1ad741461098257600080fd5b8063e708a0f9146108d7578063e7841ec0146108ed578063e98030c71461090257600080fd5b8063bdd4f29f14610806578063c705c5691461081b578063d158272d1461083b578063dd62ed3e1461085b578063e2f45605146108a1578063e57f14e1146108b757600080fd5b8063a26579ad11610149578063a9059cbb11610123578063a9059cbb14610731578063ad56c13c14610751578063afa4f3b2146107b6578063b62496f5146107d657600080fd5b8063a26579ad146106dc578063a457c2d7146106f1578063a8b9d2401461071157600080fd5b8063715018a614610648578063871c128d1461065d5780638da5cb5b1461067d57806395d89b411461069b57806398118cb4146106b05780639c1b8af5146106c657600080fd5b806331e79db01161024f5780635d098b38116102085780636843cd84116101e25780636843cd84146105bc5780636b67c4df146105dc578063700bb191146105f257806370a082311461061257600080fd5b80635d098b3814610567578063625e764c1461058757806364b0f653146105a757600080fd5b806331e79db014610499578063357bf15c146104b957806339509351146104d95780634e71d92d146104f95780634ed080c71461050e5780634fbee1931461052e57600080fd5b806316a2f82a116102a157806316a2f82a146103ed57806318160ddd1461040d57806323b872dd146104225780632c1f52161461044257806330bb4cff14610462578063313ce5671461047757600080fd5b806306fdde03146102f4578063095ea7b31461031f5780630c43c79b1461034f5780630dcb2e891461037157806313114a9d146103915780631694505e146103b557600080fd5b366102ef57005b600080fd5b34801561030057600080fd5b50610309610997565b6040516103169190612e29565b60405180910390f35b34801561032b57600080fd5b5061033f61033a366004612e8c565b610a29565b6040519015158152602001610316565b34801561035b57600080fd5b5061036f61036a366004612eb8565b610a40565b005b34801561037d57600080fd5b5061036f61038c366004612f2d565b610b23565b34801561039d57600080fd5b506103a7600e5481565b604051908152602001610316565b3480156103c157600080fd5b506007546103d5906001600160a01b031681565b6040516001600160a01b039091168152602001610316565b3480156103f957600080fd5b5061036f610408366004612f46565b610baf565b34801561041957600080fd5b506002546103a7565b34801561042e57600080fd5b5061033f61043d366004612f6a565b610c8a565b34801561044e57600080fd5b506008546103d5906001600160a01b031681565b34801561046e57600080fd5b506103a7610d34565b34801561048357600080fd5b5060035460405160ff9091168152602001610316565b3480156104a557600080fd5b5061036f6104b4366004612f46565b610da7565b3480156104c557600080fd5b5061036f6104d4366004612f2d565b610e03565b3480156104e557600080fd5b5061033f6104f4366004612e8c565b610e71565b34801561050557600080fd5b5061036f610ead565b34801561051a57600080fd5b5061036f610529366004612f2d565b610f25565b34801561053a57600080fd5b5061033f610549366004612f46565b6001600160a01b031660009081526011602052604090205460ff1690565b34801561057357600080fd5b5061036f610582366004612f46565b610f8c565b34801561059357600080fd5b5061036f6105a2366004612f2d565b611053565b3480156105b357600080fd5b506103a76110ba565b3480156105c857600080fd5b506103a76105d7366004612f46565b611104565b3480156105e857600080fd5b506103a7600d5481565b3480156105fe57600080fd5b5061036f61060d366004612f2d565b611174565b34801561061e57600080fd5b506103a761062d366004612f46565b6001600160a01b031660009081526020819052604090205490565b34801561065457600080fd5b5061036f611247565b34801561066957600080fd5b5061036f610678366004612f2d565b61127d565b34801561068957600080fd5b506006546001600160a01b03166103d5565b3480156106a757600080fd5b506103096113c1565b3480156106bc57600080fd5b506103a7600c5481565b3480156106d257600080fd5b506103a760105481565b3480156106e857600080fd5b506103a76113d0565b3480156106fd57600080fd5b5061033f61070c366004612e8c565b61141a565b34801561071d57600080fd5b506103a761072c366004612f46565b6114b3565b34801561073d57600080fd5b5061033f61074c366004612e8c565b6114e6565b34801561075d57600080fd5b5061077161076c366004612f46565b6114f3565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610316565b3480156107c257600080fd5b5061036f6107d1366004612f2d565b61158e565b3480156107e257600080fd5b5061033f6107f1366004612f46565b60126020526000908152604090205460ff1681565b34801561081257600080fd5b506103a761168f565b34801561082757600080fd5b5061033f610836366004612f46565b6116d9565b34801561084757600080fd5b50600f546103d5906001600160a01b031681565b34801561086757600080fd5b506103a7610876366004612fab565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156108ad57600080fd5b506103a7600a5481565b3480156108c357600080fd5b5061036f6108d2366004612f46565b611748565b3480156108e357600080fd5b506103a7600b5481565b3480156108f957600080fd5b506103a7611827565b34801561090e57600080fd5b5061036f61091d366004612f2d565b611871565b34801561092e57600080fd5b5061077161093d366004612f2d565b6118cc565b34801561094e57600080fd5b5061036f61095d366004612f46565b61190e565b34801561096e57600080fd5b506009546103d5906001600160a01b031681565b34801561098e57600080fd5b506103a7600481565b6060600480546109a690612fe4565b80601f01602080910402602001604051908101604052809291908181526020018280546109d290612fe4565b8015610a1f5780601f106109f457610100808354040283529160200191610a1f565b820191906000526020600020905b815481529060010190602001808311610a0257829003601f168201915b5050505050905090565b6000610a36338484611a43565b5060015b92915050565b6006546001600160a01b03163314610a735760405162461bcd60e51b8152600401610a6a9061301e565b60405180910390fd5b60005b81811015610ae557600160116000858585818110610a9657610a96613053565b9050602002016020810190610aab9190612f46565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610add8161307f565b915050610a76565b507f6f058e77d614a1061fc197c99cdde12f5fa414c92529bbe8f48b02f8d9f4f95d8282604051610b17929190613098565b60405180910390a15050565b6006546001600160a01b03163314610b4d5760405162461bcd60e51b8152600401610a6a9061301e565b600854604051630dcb2e8960e01b8152600481018390526001600160a01b0390911690630dcb2e89906024015b600060405180830381600087803b158015610b9457600080fd5b505af1158015610ba8573d6000803e3d6000fd5b5050505050565b6006546001600160a01b03163314610bd95760405162461bcd60e51b8152600401610a6a9061301e565b6001600160a01b03811660009081526011602052604090205460ff16610c415760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920696e636c7564656400000000006044820152606401610a6a565b6001600160a01b038116600081815260116020526040808220805460ff19169055517f346f6c42af1ce4b7d7951f3fa40a2fb1e78c80ab0f3d76fb4f9fec269d568f0d9190a250565b6000610c97848484611b67565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610d1c5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610a6a565b610d298533858403611a43565b506001949350505050565b600854604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015610d7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da291906130e6565b905090565b6006546001600160a01b03163314610dd15760405162461bcd60e51b8152600401610a6a9061301e565b60085460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401610b7a565b6006546001600160a01b03163314610e2d5760405162461bcd60e51b8152600401610a6a9061301e565b600c819055610e3a611fb1565b6040518181527ff91a7bbc3276631cb45f432b8425041c8795bb95eb23b6d42563ab069d7e9866906020015b60405180910390a150565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610a36918590610ea89086906130ff565b611a43565b60085460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af1158015610efe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f229190613112565b50565b6006546001600160a01b03163314610f4f5760405162461bcd60e51b8152600401610a6a9061301e565b600b819055610f5c611fb1565b6040518181527f5e4ad315852b8b3ea1a115ab1691a776e82a2e27b4a61e64784ed7234baab08490602001610e66565b6006546001600160a01b03163314610fb65760405162461bcd60e51b8152600401610a6a9061301e565b6001600160a01b0381166110055760405162461bcd60e51b815260206004820152601660248201527521b0b7103737ba1031329030b2323932b9b99418149760511b6044820152606401610a6a565b600f80546001600160a01b0319166001600160a01b0383169081179091556040519081527f2026f0b479f097ea9d4c74dac26e5271ba4d59931603970da5458ea8aa3dcf3790602001610e66565b6006546001600160a01b0316331461107d5760405162461bcd60e51b8152600401610a6a9061301e565b600d81905561108a611fb1565b6040518181527fd510ab151e54f53b78268de0ceedb200e8e654485dd3737841958f97d7b7432290602001610e66565b600854604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015610d7e573d6000803e3d6000fd5b6008546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa158015611150573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3a91906130e6565b6008546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af11580156111c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111eb9190613134565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a98906080015b60405180910390a350505050565b6006546001600160a01b031633146112715760405162461bcd60e51b8152600401610a6a9061301e565b61127b6000612023565b565b6006546001600160a01b031633146112a75760405162461bcd60e51b8152600401610a6a9061301e565b62030d4081101580156112bd57506207a1208111155b6113275760405162461bcd60e51b815260206004820152603560248201527f476173466f7250726f63657373696e67206d757374206265206265747765656e60448201527410191818161818181030b732101a9818161818181760591b6064820152608401610a6a565b601054810361138e5760405162461bcd60e51b815260206004820152602d60248201527f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460448201526c379039b0b6b2903b30b63ab29760991b6064820152608401610a6a565b60105460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601055565b6060600580546109a690612fe4565b60085460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec9160048083019260209291908290030181865afa158015610d7e573d6000803e3d6000fd5b3360009081526001602090815260408083206001600160a01b03861684529091528120548281101561149c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610a6a565b6114a93385858403611a43565b5060019392505050565b6008546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611133565b6000610a36338484611b67565b60085460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b61010060405180830381865afa15801561154f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115739190613162565b97509750975097509750975097509750919395975091939597565b6006546001600160a01b031633146115b85760405162461bcd60e51b8152600401610a6a9061301e565b620186a06115c560025490565b6115cf91906131cc565b811180156115f257506103e86115e460025490565b6115ee91906131cc565b8111155b61165a5760405162461bcd60e51b815260206004820152603360248201527f416d6f756e74206d757374206265206265747765656e20302e30303125202d20604482015272302e31206f6620746f74616c20737570706c7960681b6064820152608401610a6a565b600a8190556040518181527fcba17309eff0b14bb89cad72aef8b308a23d698dfff957e2255d17bbc03620bd90602001610e66565b60085460408051632f842d8560e21b815290516000926001600160a01b03169163be10b6149160048083019260209291908290030181865afa158015610d7e573d6000803e3d6000fd5b60085460405163c705c56960e01b81526001600160a01b038381166004830152600092169063c705c56990602401602060405180830381865afa158015611724573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3a9190613112565b6006546001600160a01b031633146117725760405162461bcd60e51b8152600401610a6a9061301e565b6001600160a01b03811660009081526011602052604090205460ff16156117db5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610a6a565b6001600160a01b038116600081815260116020526040808220805460ff19166001179055517f57a00f76b5f242fb1e04b0b514a6974665a5b07bce45e39f36dabff4a042d9369190a250565b6008546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015610d7e573d6000803e3d6000fd5b6006546001600160a01b0316331461189b5760405162461bcd60e51b8152600401610a6a9061301e565b60085460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c790602401610b7a565b600854604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd90602401611531565b6006546001600160a01b031633146119385760405162461bcd60e51b8152600401610a6a9061301e565b6001600160a01b03811661199d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a6a565b610f2281612023565b6000604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528260601b60148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f09150506001600160a01b038116611a3e5760405162461bcd60e51b8152602060048201526016602482015275115490cc4c4d8dce8818dc99585d194819985a5b195960521b6044820152606401610a6a565b919050565b6001600160a01b038316611aa55760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a6a565b6001600160a01b038216611b065760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a6a565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611bcc5760405162461bcd60e51b815260206004820152602660248201527f43616e206e6f74207472616e736665722066726f6d20746865207a65726f206160448201526564647265737360d01b6064820152608401610a6a565b6001600160a01b038216611c2e5760405162461bcd60e51b8152602060048201526024808201527f43616e206e6f74207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a6a565b80600003611c4757611c4283836000612075565b505050565b600754600e54600a5430600090815260208190526040812054600160a01b90940460ff1693909111159050808015611c7d575082155b8015611ca257506001600160a01b03861660009081526012602052604090205460ff16155b8015611cbc57506006546001600160a01b03878116911614155b8015611cd657506006546001600160a01b03868116911614155b8015611ce25750600082115b15611cef57611cef612236565b600083158015611d1857506001600160a01b03871660009081526011602052604090205460ff16155b8015611d3d57506001600160a01b03861660009081526011602052604090205460ff16155b8015611d495750600083115b90508015611d845760006064611d5f85886131ee565b611d6991906131cc565b9050611d75818761320d565b9550611d82883083612075565b505b611d8f878787612075565b6008546001600160a01b031663e30443bc88611dc0816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611e0657600080fd5b505af1925050508015611e17575060015b506008546001600160a01b031663e30443bc87611e49816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611e8f57600080fd5b505af1925050508015611ea0575060015b508315611eb05750505050505050565b6008546010546040516001624d3b8760e01b031981526001600160a01b039092169163ffb2c47991611ee89160040190815260200190565b6060604051808303816000875af1925050508015611f23575060408051601f3d908101601f19168201909252611f2091810190613134565b60015b611f55576040517f9f8178618ceec57eb04628a16f844488204f65990aba7dc48fb616826a62b68490600090a1611fa8565b601054604080518581526020810185905280820184905260608101929092525132916001917fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989181900360800190a35050505b50505050505050565b600d54600c54600b54611fc491906130ff565b611fce91906130ff565b600e8190556014101561127b5760405162461bcd60e51b815260206004820152601f60248201527f546f74616c20666565732063616e206e6f74206265206f766572203230252e006044820152606401610a6a565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0383166120d95760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a6a565b6001600160a01b03821661213b5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a6a565b6001600160a01b038316600090815260208190526040902054818110156121b35760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610a6a565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906121ea9084906130ff565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161123991815260200190565b6007805460ff60a01b1916600160a01b179055600a54600e54600c54600090829061226190856131ee565b61226b91906131cc565b9050801561227c5761227c8161238e565b600082600d548561228d91906131ee565b61229791906131cc565b90506000826122a6838761320d565b6122b0919061320d565b905060006122be82846130ff565b905060006122cb82612424565b90506000826122da86846131ee565b6122e491906131cc565b9050801561236757600954600f5460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810184905291169063a9059cbb906044016020604051808303816000875af1158015612341573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123659190613112565b505b600b541561237757612377612685565b50506007805460ff60a01b19169055505050505050565b600061239b6002836131cc565b905060006123a9828461320d565b9050476123b583612821565b60006123c1824761320d565b9050806000036123d2575050505050565b6123dc8382612a8b565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b6040805160038082526080820190925260009182919060208201606080368337019050509050308160008151811061245e5761245e613053565b60200260200101906001600160a01b031690816001600160a01b031681525050612486612c35565b8160018151811061249957612499613053565b6001600160a01b0392831660209182029290920101526009548251911690829060029081106124ca576124ca613053565b6001600160a01b0392831660209182029290920101526007546124f09130911685611a43565b6009546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa15801561253d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256191906130e6565b600754604051635c11d79560e01b81529192506001600160a01b031690635c11d7959061259b908890600090889030904290600401613220565b600060405180830381600087803b1580156125b557600080fd5b505af19250505080156125c6575060015b612608576040518581527f6e233b23828ee5086bc82fa3f17f7da81d04c8c664fe9b7e3c77c2384f980e159060200160405180910390a1506000949350505050565b6040516370a0823160e01b815230600482015281906001600160a01b038416906370a0823190602401602060405180830381865afa15801561264e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061267291906130e6565b61267c919061320d565b95945050505050565b6009546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa1580156126d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126f691906130e6565b905080600003612704575050565b60085460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905260009184169063a9059cbb906044016020604051808303816000875af1158015612759573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061277d9190613112565b90508015611c425760085460405163ba72a95560e01b8152600481018490526001600160a01b039091169063ba72a95590602401600060405180830381600087803b1580156127cb57600080fd5b505af11580156127df573d6000803e3d6000fd5b505050507fb0cc2628d6d644cf6be9d8110e142297ac910d6d8026d795a99f272fd9ad60b18260405161281491815260200190565b60405180910390a1505050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061285657612856613053565b60200260200101906001600160a01b031690816001600160a01b03168152505061287e612c35565b8160018151811061289157612891613053565b6001600160a01b0392831660209182029290920101526007546128b79130911684611a43565b46603d0361296257600754604051634d1bf6a960e01b81526001600160a01b0390911690634d1bf6a9906128f8908590600090869030904290600401613220565b600060405180830381600087803b15801561291257600080fd5b505af1925050508015612923575060015b61295e576040518281527ff312a8cf41139222bcba78888c1a115141181d71dc3cab51c2cd2e19acb05fcf9060200160405180910390a15050565b5050565b4661a516036129a45760075460405163104d379560e11b81526001600160a01b039091169063209a6f2a906128f8908590600090869030904290600401613220565b4661a86a14806129b557504661a869145b156129f357600754604051633b158ab160e11b81526001600160a01b039091169063762b1562906128f8908590600090869030904290600401613220565b60075460405163791ac94760e01b81526001600160a01b039091169063791ac94790612a2c908590600090869030904290600401613220565b600060405180830381600087803b158015612a4657600080fd5b505af1925050508015612a57575060015b61295e576040518281527ff312a8cf41139222bcba78888c1a115141181d71dc3cab51c2cd2e19acb05fcf90602001610b17565b600754612aa39030906001600160a01b031684611a43565b46603d03612b59576007546040516386eaa82f60e01b81526001600160a01b03909116906386eaa82f908390612aea9030908790600090819061dead904290600401613291565b60606040518083038185885af193505050508015612b25575060408051601f3d908101601f19168201909252612b2291810190613134565b60015b610ba8576040518181527f3555a24d19cf49a4082c02c08a1e71c39d44902f57b8d44cf9fcfe8b14928c6590602001610b17565b4661a51603612ba1576007546040516330dd9c0760e21b81526001600160a01b039091169063c376701c908390612aea9030908790600090819061dead904290600401613291565b4661a86a1480612bb257504661a869145b15612bf657600754604051637c8d9fb960e11b81526001600160a01b039091169063f91b3f72908390612aea9030908790600090819061dead904290600401613291565b60075460405163f305d71960e01b81526001600160a01b039091169063f305d719908390612aea9030908790600090819061dead904290600401613291565b600046603d03612cb657600760009054906101000a90046001600160a01b03166001600160a01b031663977ebc0d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da291906132cc565b46608003612d1157600760009054906101000a90046001600160a01b03166001600160a01b0316635cb485926040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c92573d6000803e3d6000fd5b4661a51603612d6d57600760009054906101000a90046001600160a01b03166001600160a01b03166331b2cc456040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c92573d6000803e3d6000fd5b4661a86a1480612d7e57504661a869145b15612dd657600760009054906101000a90046001600160a01b03166001600160a01b03166373b295c26040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c92573d6000803e3d6000fd5b600760009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c92573d6000803e3d6000fd5b600060208083528351808285015260005b81811015612e5657858101830151858201604001528201612e3a565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610f2257600080fd5b60008060408385031215612e9f57600080fd5b8235612eaa81612e77565b946020939093013593505050565b60008060208385031215612ecb57600080fd5b823567ffffffffffffffff80821115612ee357600080fd5b818501915085601f830112612ef757600080fd5b813581811115612f0657600080fd5b8660208260051b8501011115612f1b57600080fd5b60209290920196919550909350505050565b600060208284031215612f3f57600080fd5b5035919050565b600060208284031215612f5857600080fd5b8135612f6381612e77565b9392505050565b600080600060608486031215612f7f57600080fd5b8335612f8a81612e77565b92506020840135612f9a81612e77565b929592945050506040919091013590565b60008060408385031215612fbe57600080fd5b8235612fc981612e77565b91506020830135612fd981612e77565b809150509250929050565b600181811c90821680612ff857607f821691505b60208210810361301857634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161309157613091613069565b5060010190565b60208082528181018390526000908460408401835b868110156130db5782356130c081612e77565b6001600160a01b0316825291830191908301906001016130ad565b509695505050505050565b6000602082840312156130f857600080fd5b5051919050565b80820180821115610a3a57610a3a613069565b60006020828403121561312457600080fd5b81518015158114612f6357600080fd5b60008060006060848603121561314957600080fd5b8351925060208401519150604084015190509250925092565b600080600080600080600080610100898b03121561317f57600080fd5b885161318a81612e77565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b6000826131e957634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561320857613208613069565b500290565b81810381811115610a3a57610a3a613069565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156132705784516001600160a01b03168352938301939183019160010161324b565b50506001600160a01b03969096166060850152505050608001529392505050565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b6000602082840312156132de57600080fd5b8151612f6381612e7756fea2646970667358221220055b9bd6c0f83fcd647e0918ed95a503fcf450855bfa2dbec127237ca8fce12964736f6c6343000810003300000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000001b5d15b7f788bf7fcad8c00000000000000000000000000000000000000000000000000000000000000000000012000000000000000000000000687d7a1a6ff81974ed101557b98030d77e905a0d000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000739e6f4a483741e22b4cdfb78df40dccc6cb931f00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000001a784379d99db420000000000000000000000000000001717afbe81bb09cbd283f18474349efe2c27dced000000000000000000000000000000000000000000000000000000000000000a466f727442616e616e6100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000542616e616e000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102e85760003560e01c8063715018a611610190578063bdd4f29f116100dc578063e708a0f911610095578063f27fd2541161006f578063f27fd25414610922578063f2fde38b14610942578063f7c618c114610962578063ffa1ad741461098257600080fd5b8063e708a0f9146108d7578063e7841ec0146108ed578063e98030c71461090257600080fd5b8063bdd4f29f14610806578063c705c5691461081b578063d158272d1461083b578063dd62ed3e1461085b578063e2f45605146108a1578063e57f14e1146108b757600080fd5b8063a26579ad11610149578063a9059cbb11610123578063a9059cbb14610731578063ad56c13c14610751578063afa4f3b2146107b6578063b62496f5146107d657600080fd5b8063a26579ad146106dc578063a457c2d7146106f1578063a8b9d2401461071157600080fd5b8063715018a614610648578063871c128d1461065d5780638da5cb5b1461067d57806395d89b411461069b57806398118cb4146106b05780639c1b8af5146106c657600080fd5b806331e79db01161024f5780635d098b38116102085780636843cd84116101e25780636843cd84146105bc5780636b67c4df146105dc578063700bb191146105f257806370a082311461061257600080fd5b80635d098b3814610567578063625e764c1461058757806364b0f653146105a757600080fd5b806331e79db014610499578063357bf15c146104b957806339509351146104d95780634e71d92d146104f95780634ed080c71461050e5780634fbee1931461052e57600080fd5b806316a2f82a116102a157806316a2f82a146103ed57806318160ddd1461040d57806323b872dd146104225780632c1f52161461044257806330bb4cff14610462578063313ce5671461047757600080fd5b806306fdde03146102f4578063095ea7b31461031f5780630c43c79b1461034f5780630dcb2e891461037157806313114a9d146103915780631694505e146103b557600080fd5b366102ef57005b600080fd5b34801561030057600080fd5b50610309610997565b6040516103169190612e29565b60405180910390f35b34801561032b57600080fd5b5061033f61033a366004612e8c565b610a29565b6040519015158152602001610316565b34801561035b57600080fd5b5061036f61036a366004612eb8565b610a40565b005b34801561037d57600080fd5b5061036f61038c366004612f2d565b610b23565b34801561039d57600080fd5b506103a7600e5481565b604051908152602001610316565b3480156103c157600080fd5b506007546103d5906001600160a01b031681565b6040516001600160a01b039091168152602001610316565b3480156103f957600080fd5b5061036f610408366004612f46565b610baf565b34801561041957600080fd5b506002546103a7565b34801561042e57600080fd5b5061033f61043d366004612f6a565b610c8a565b34801561044e57600080fd5b506008546103d5906001600160a01b031681565b34801561046e57600080fd5b506103a7610d34565b34801561048357600080fd5b5060035460405160ff9091168152602001610316565b3480156104a557600080fd5b5061036f6104b4366004612f46565b610da7565b3480156104c557600080fd5b5061036f6104d4366004612f2d565b610e03565b3480156104e557600080fd5b5061033f6104f4366004612e8c565b610e71565b34801561050557600080fd5b5061036f610ead565b34801561051a57600080fd5b5061036f610529366004612f2d565b610f25565b34801561053a57600080fd5b5061033f610549366004612f46565b6001600160a01b031660009081526011602052604090205460ff1690565b34801561057357600080fd5b5061036f610582366004612f46565b610f8c565b34801561059357600080fd5b5061036f6105a2366004612f2d565b611053565b3480156105b357600080fd5b506103a76110ba565b3480156105c857600080fd5b506103a76105d7366004612f46565b611104565b3480156105e857600080fd5b506103a7600d5481565b3480156105fe57600080fd5b5061036f61060d366004612f2d565b611174565b34801561061e57600080fd5b506103a761062d366004612f46565b6001600160a01b031660009081526020819052604090205490565b34801561065457600080fd5b5061036f611247565b34801561066957600080fd5b5061036f610678366004612f2d565b61127d565b34801561068957600080fd5b506006546001600160a01b03166103d5565b3480156106a757600080fd5b506103096113c1565b3480156106bc57600080fd5b506103a7600c5481565b3480156106d257600080fd5b506103a760105481565b3480156106e857600080fd5b506103a76113d0565b3480156106fd57600080fd5b5061033f61070c366004612e8c565b61141a565b34801561071d57600080fd5b506103a761072c366004612f46565b6114b3565b34801561073d57600080fd5b5061033f61074c366004612e8c565b6114e6565b34801561075d57600080fd5b5061077161076c366004612f46565b6114f3565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610316565b3480156107c257600080fd5b5061036f6107d1366004612f2d565b61158e565b3480156107e257600080fd5b5061033f6107f1366004612f46565b60126020526000908152604090205460ff1681565b34801561081257600080fd5b506103a761168f565b34801561082757600080fd5b5061033f610836366004612f46565b6116d9565b34801561084757600080fd5b50600f546103d5906001600160a01b031681565b34801561086757600080fd5b506103a7610876366004612fab565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156108ad57600080fd5b506103a7600a5481565b3480156108c357600080fd5b5061036f6108d2366004612f46565b611748565b3480156108e357600080fd5b506103a7600b5481565b3480156108f957600080fd5b506103a7611827565b34801561090e57600080fd5b5061036f61091d366004612f2d565b611871565b34801561092e57600080fd5b5061077161093d366004612f2d565b6118cc565b34801561094e57600080fd5b5061036f61095d366004612f46565b61190e565b34801561096e57600080fd5b506009546103d5906001600160a01b031681565b34801561098e57600080fd5b506103a7600481565b6060600480546109a690612fe4565b80601f01602080910402602001604051908101604052809291908181526020018280546109d290612fe4565b8015610a1f5780601f106109f457610100808354040283529160200191610a1f565b820191906000526020600020905b815481529060010190602001808311610a0257829003601f168201915b5050505050905090565b6000610a36338484611a43565b5060015b92915050565b6006546001600160a01b03163314610a735760405162461bcd60e51b8152600401610a6a9061301e565b60405180910390fd5b60005b81811015610ae557600160116000858585818110610a9657610a96613053565b9050602002016020810190610aab9190612f46565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610add8161307f565b915050610a76565b507f6f058e77d614a1061fc197c99cdde12f5fa414c92529bbe8f48b02f8d9f4f95d8282604051610b17929190613098565b60405180910390a15050565b6006546001600160a01b03163314610b4d5760405162461bcd60e51b8152600401610a6a9061301e565b600854604051630dcb2e8960e01b8152600481018390526001600160a01b0390911690630dcb2e89906024015b600060405180830381600087803b158015610b9457600080fd5b505af1158015610ba8573d6000803e3d6000fd5b5050505050565b6006546001600160a01b03163314610bd95760405162461bcd60e51b8152600401610a6a9061301e565b6001600160a01b03811660009081526011602052604090205460ff16610c415760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c726561647920696e636c7564656400000000006044820152606401610a6a565b6001600160a01b038116600081815260116020526040808220805460ff19169055517f346f6c42af1ce4b7d7951f3fa40a2fb1e78c80ab0f3d76fb4f9fec269d568f0d9190a250565b6000610c97848484611b67565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610d1c5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610a6a565b610d298533858403611a43565b506001949350505050565b600854604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015610d7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da291906130e6565b905090565b6006546001600160a01b03163314610dd15760405162461bcd60e51b8152600401610a6a9061301e565b60085460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401610b7a565b6006546001600160a01b03163314610e2d5760405162461bcd60e51b8152600401610a6a9061301e565b600c819055610e3a611fb1565b6040518181527ff91a7bbc3276631cb45f432b8425041c8795bb95eb23b6d42563ab069d7e9866906020015b60405180910390a150565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610a36918590610ea89086906130ff565b611a43565b60085460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af1158015610efe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f229190613112565b50565b6006546001600160a01b03163314610f4f5760405162461bcd60e51b8152600401610a6a9061301e565b600b819055610f5c611fb1565b6040518181527f5e4ad315852b8b3ea1a115ab1691a776e82a2e27b4a61e64784ed7234baab08490602001610e66565b6006546001600160a01b03163314610fb65760405162461bcd60e51b8152600401610a6a9061301e565b6001600160a01b0381166110055760405162461bcd60e51b815260206004820152601660248201527521b0b7103737ba1031329030b2323932b9b99418149760511b6044820152606401610a6a565b600f80546001600160a01b0319166001600160a01b0383169081179091556040519081527f2026f0b479f097ea9d4c74dac26e5271ba4d59931603970da5458ea8aa3dcf3790602001610e66565b6006546001600160a01b0316331461107d5760405162461bcd60e51b8152600401610a6a9061301e565b600d81905561108a611fb1565b6040518181527fd510ab151e54f53b78268de0ceedb200e8e654485dd3737841958f97d7b7432290602001610e66565b600854604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015610d7e573d6000803e3d6000fd5b6008546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa158015611150573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3a91906130e6565b6008546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af11580156111c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111eb9190613134565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a98906080015b60405180910390a350505050565b6006546001600160a01b031633146112715760405162461bcd60e51b8152600401610a6a9061301e565b61127b6000612023565b565b6006546001600160a01b031633146112a75760405162461bcd60e51b8152600401610a6a9061301e565b62030d4081101580156112bd57506207a1208111155b6113275760405162461bcd60e51b815260206004820152603560248201527f476173466f7250726f63657373696e67206d757374206265206265747765656e60448201527410191818161818181030b732101a9818161818181760591b6064820152608401610a6a565b601054810361138e5760405162461bcd60e51b815260206004820152602d60248201527f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460448201526c379039b0b6b2903b30b63ab29760991b6064820152608401610a6a565b60105460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601055565b6060600580546109a690612fe4565b60085460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec9160048083019260209291908290030181865afa158015610d7e573d6000803e3d6000fd5b3360009081526001602090815260408083206001600160a01b03861684529091528120548281101561149c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610a6a565b6114a93385858403611a43565b5060019392505050565b6008546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611133565b6000610a36338484611b67565b60085460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b61010060405180830381865afa15801561154f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115739190613162565b97509750975097509750975097509750919395975091939597565b6006546001600160a01b031633146115b85760405162461bcd60e51b8152600401610a6a9061301e565b620186a06115c560025490565b6115cf91906131cc565b811180156115f257506103e86115e460025490565b6115ee91906131cc565b8111155b61165a5760405162461bcd60e51b815260206004820152603360248201527f416d6f756e74206d757374206265206265747765656e20302e30303125202d20604482015272302e31206f6620746f74616c20737570706c7960681b6064820152608401610a6a565b600a8190556040518181527fcba17309eff0b14bb89cad72aef8b308a23d698dfff957e2255d17bbc03620bd90602001610e66565b60085460408051632f842d8560e21b815290516000926001600160a01b03169163be10b6149160048083019260209291908290030181865afa158015610d7e573d6000803e3d6000fd5b60085460405163c705c56960e01b81526001600160a01b038381166004830152600092169063c705c56990602401602060405180830381865afa158015611724573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3a9190613112565b6006546001600160a01b031633146117725760405162461bcd60e51b8152600401610a6a9061301e565b6001600160a01b03811660009081526011602052604090205460ff16156117db5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610a6a565b6001600160a01b038116600081815260116020526040808220805460ff19166001179055517f57a00f76b5f242fb1e04b0b514a6974665a5b07bce45e39f36dabff4a042d9369190a250565b6008546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015610d7e573d6000803e3d6000fd5b6006546001600160a01b0316331461189b5760405162461bcd60e51b8152600401610a6a9061301e565b60085460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c790602401610b7a565b600854604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd90602401611531565b6006546001600160a01b031633146119385760405162461bcd60e51b8152600401610a6a9061301e565b6001600160a01b03811661199d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a6a565b610f2281612023565b6000604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528260601b60148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f09150506001600160a01b038116611a3e5760405162461bcd60e51b8152602060048201526016602482015275115490cc4c4d8dce8818dc99585d194819985a5b195960521b6044820152606401610a6a565b919050565b6001600160a01b038316611aa55760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a6a565b6001600160a01b038216611b065760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a6a565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611bcc5760405162461bcd60e51b815260206004820152602660248201527f43616e206e6f74207472616e736665722066726f6d20746865207a65726f206160448201526564647265737360d01b6064820152608401610a6a565b6001600160a01b038216611c2e5760405162461bcd60e51b8152602060048201526024808201527f43616e206e6f74207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a6a565b80600003611c4757611c4283836000612075565b505050565b600754600e54600a5430600090815260208190526040812054600160a01b90940460ff1693909111159050808015611c7d575082155b8015611ca257506001600160a01b03861660009081526012602052604090205460ff16155b8015611cbc57506006546001600160a01b03878116911614155b8015611cd657506006546001600160a01b03868116911614155b8015611ce25750600082115b15611cef57611cef612236565b600083158015611d1857506001600160a01b03871660009081526011602052604090205460ff16155b8015611d3d57506001600160a01b03861660009081526011602052604090205460ff16155b8015611d495750600083115b90508015611d845760006064611d5f85886131ee565b611d6991906131cc565b9050611d75818761320d565b9550611d82883083612075565b505b611d8f878787612075565b6008546001600160a01b031663e30443bc88611dc0816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611e0657600080fd5b505af1925050508015611e17575060015b506008546001600160a01b031663e30443bc87611e49816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611e8f57600080fd5b505af1925050508015611ea0575060015b508315611eb05750505050505050565b6008546010546040516001624d3b8760e01b031981526001600160a01b039092169163ffb2c47991611ee89160040190815260200190565b6060604051808303816000875af1925050508015611f23575060408051601f3d908101601f19168201909252611f2091810190613134565b60015b611f55576040517f9f8178618ceec57eb04628a16f844488204f65990aba7dc48fb616826a62b68490600090a1611fa8565b601054604080518581526020810185905280820184905260608101929092525132916001917fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989181900360800190a35050505b50505050505050565b600d54600c54600b54611fc491906130ff565b611fce91906130ff565b600e8190556014101561127b5760405162461bcd60e51b815260206004820152601f60248201527f546f74616c20666565732063616e206e6f74206265206f766572203230252e006044820152606401610a6a565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0383166120d95760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a6a565b6001600160a01b03821661213b5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a6a565b6001600160a01b038316600090815260208190526040902054818110156121b35760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610a6a565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906121ea9084906130ff565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161123991815260200190565b6007805460ff60a01b1916600160a01b179055600a54600e54600c54600090829061226190856131ee565b61226b91906131cc565b9050801561227c5761227c8161238e565b600082600d548561228d91906131ee565b61229791906131cc565b90506000826122a6838761320d565b6122b0919061320d565b905060006122be82846130ff565b905060006122cb82612424565b90506000826122da86846131ee565b6122e491906131cc565b9050801561236757600954600f5460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810184905291169063a9059cbb906044016020604051808303816000875af1158015612341573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123659190613112565b505b600b541561237757612377612685565b50506007805460ff60a01b19169055505050505050565b600061239b6002836131cc565b905060006123a9828461320d565b9050476123b583612821565b60006123c1824761320d565b9050806000036123d2575050505050565b6123dc8382612a8b565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b6040805160038082526080820190925260009182919060208201606080368337019050509050308160008151811061245e5761245e613053565b60200260200101906001600160a01b031690816001600160a01b031681525050612486612c35565b8160018151811061249957612499613053565b6001600160a01b0392831660209182029290920101526009548251911690829060029081106124ca576124ca613053565b6001600160a01b0392831660209182029290920101526007546124f09130911685611a43565b6009546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa15801561253d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256191906130e6565b600754604051635c11d79560e01b81529192506001600160a01b031690635c11d7959061259b908890600090889030904290600401613220565b600060405180830381600087803b1580156125b557600080fd5b505af19250505080156125c6575060015b612608576040518581527f6e233b23828ee5086bc82fa3f17f7da81d04c8c664fe9b7e3c77c2384f980e159060200160405180910390a1506000949350505050565b6040516370a0823160e01b815230600482015281906001600160a01b038416906370a0823190602401602060405180830381865afa15801561264e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061267291906130e6565b61267c919061320d565b95945050505050565b6009546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa1580156126d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126f691906130e6565b905080600003612704575050565b60085460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905260009184169063a9059cbb906044016020604051808303816000875af1158015612759573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061277d9190613112565b90508015611c425760085460405163ba72a95560e01b8152600481018490526001600160a01b039091169063ba72a95590602401600060405180830381600087803b1580156127cb57600080fd5b505af11580156127df573d6000803e3d6000fd5b505050507fb0cc2628d6d644cf6be9d8110e142297ac910d6d8026d795a99f272fd9ad60b18260405161281491815260200190565b60405180910390a1505050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061285657612856613053565b60200260200101906001600160a01b031690816001600160a01b03168152505061287e612c35565b8160018151811061289157612891613053565b6001600160a01b0392831660209182029290920101526007546128b79130911684611a43565b46603d0361296257600754604051634d1bf6a960e01b81526001600160a01b0390911690634d1bf6a9906128f8908590600090869030904290600401613220565b600060405180830381600087803b15801561291257600080fd5b505af1925050508015612923575060015b61295e576040518281527ff312a8cf41139222bcba78888c1a115141181d71dc3cab51c2cd2e19acb05fcf9060200160405180910390a15050565b5050565b4661a516036129a45760075460405163104d379560e11b81526001600160a01b039091169063209a6f2a906128f8908590600090869030904290600401613220565b4661a86a14806129b557504661a869145b156129f357600754604051633b158ab160e11b81526001600160a01b039091169063762b1562906128f8908590600090869030904290600401613220565b60075460405163791ac94760e01b81526001600160a01b039091169063791ac94790612a2c908590600090869030904290600401613220565b600060405180830381600087803b158015612a4657600080fd5b505af1925050508015612a57575060015b61295e576040518281527ff312a8cf41139222bcba78888c1a115141181d71dc3cab51c2cd2e19acb05fcf90602001610b17565b600754612aa39030906001600160a01b031684611a43565b46603d03612b59576007546040516386eaa82f60e01b81526001600160a01b03909116906386eaa82f908390612aea9030908790600090819061dead904290600401613291565b60606040518083038185885af193505050508015612b25575060408051601f3d908101601f19168201909252612b2291810190613134565b60015b610ba8576040518181527f3555a24d19cf49a4082c02c08a1e71c39d44902f57b8d44cf9fcfe8b14928c6590602001610b17565b4661a51603612ba1576007546040516330dd9c0760e21b81526001600160a01b039091169063c376701c908390612aea9030908790600090819061dead904290600401613291565b4661a86a1480612bb257504661a869145b15612bf657600754604051637c8d9fb960e11b81526001600160a01b039091169063f91b3f72908390612aea9030908790600090819061dead904290600401613291565b60075460405163f305d71960e01b81526001600160a01b039091169063f305d719908390612aea9030908790600090819061dead904290600401613291565b600046603d03612cb657600760009054906101000a90046001600160a01b03166001600160a01b031663977ebc0d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da291906132cc565b46608003612d1157600760009054906101000a90046001600160a01b03166001600160a01b0316635cb485926040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c92573d6000803e3d6000fd5b4661a51603612d6d57600760009054906101000a90046001600160a01b03166001600160a01b03166331b2cc456040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c92573d6000803e3d6000fd5b4661a86a1480612d7e57504661a869145b15612dd657600760009054906101000a90046001600160a01b03166001600160a01b03166373b295c26040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c92573d6000803e3d6000fd5b600760009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c92573d6000803e3d6000fd5b600060208083528351808285015260005b81811015612e5657858101830151858201604001528201612e3a565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610f2257600080fd5b60008060408385031215612e9f57600080fd5b8235612eaa81612e77565b946020939093013593505050565b60008060208385031215612ecb57600080fd5b823567ffffffffffffffff80821115612ee357600080fd5b818501915085601f830112612ef757600080fd5b813581811115612f0657600080fd5b8660208260051b8501011115612f1b57600080fd5b60209290920196919550909350505050565b600060208284031215612f3f57600080fd5b5035919050565b600060208284031215612f5857600080fd5b8135612f6381612e77565b9392505050565b600080600060608486031215612f7f57600080fd5b8335612f8a81612e77565b92506020840135612f9a81612e77565b929592945050506040919091013590565b60008060408385031215612fbe57600080fd5b8235612fc981612e77565b91506020830135612fd981612e77565b809150509250929050565b600181811c90821680612ff857607f821691505b60208210810361301857634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161309157613091613069565b5060010190565b60208082528181018390526000908460408401835b868110156130db5782356130c081612e77565b6001600160a01b0316825291830191908301906001016130ad565b509695505050505050565b6000602082840312156130f857600080fd5b5051919050565b80820180821115610a3a57610a3a613069565b60006020828403121561312457600080fd5b81518015158114612f6357600080fd5b60008060006060848603121561314957600080fd5b8351925060208401519150604084015190509250925092565b600080600080600080600080610100898b03121561317f57600080fd5b885161318a81612e77565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b6000826131e957634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561320857613208613069565b500290565b81810381811115610a3a57610a3a613069565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156132705784516001600160a01b03168352938301939183019160010161324b565b50506001600160a01b03969096166060850152505050608001529392505050565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b6000602082840312156132de57600080fd5b8151612f6381612e7756fea2646970667358221220055b9bd6c0f83fcd647e0918ed95a503fcf450855bfa2dbec127237ca8fce12964736f6c63430008100033
Deployed Bytecode Sourcemap
37112:20373:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27482:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28469:194;;;;;;;;;;-1:-1:-1;28469:194:0;;;;;:::i;:::-;;:::i;:::-;;;1188:14:1;;1181:22;1163:41;;1151:2;1136:18;28469:194:0;1023:187:1;43249:294:0;;;;;;;;;;-1:-1:-1;43249:294:0;;;;;:::i;:::-;;:::i;:::-;;45737:178;;;;;;;;;;-1:-1:-1;45737:178:0;;;;;:::i;:::-;;:::i;37524:24::-;;;;;;;;;;;;;;;;;;;2166:25:1;;;2154:2;2139:18;37524:24:0;2020:177:1;37215:41:0;;;;;;;;;;-1:-1:-1;37215:41:0;;;;-1:-1:-1;;;;;37215:41:0;;;;;;-1:-1:-1;;;;;2393:32:1;;;2375:51;;2363:2;2348:18;37215:41:0;2202:230:1;43006:235:0;;;;;;;;;;-1:-1:-1;43006:235:0;;;;;:::i;:::-;;:::i;27810:108::-;;;;;;;;;;-1:-1:-1;27898:12:0;;27810:108;;28671:529;;;;;;;;;;-1:-1:-1;28671:529:0;;;;;:::i;:::-;;:::i;37295:38::-;;;;;;;;;;-1:-1:-1;37295:38:0;;;;-1:-1:-1;;;;;37295:38:0;;;46116:141;;;;;;;;;;;;;:::i;27702:100::-;;;;;;;;;;-1:-1:-1;27785:9:0;;27702:100;;27785:9;;;;3524:36:1;;3512:2;3497:18;27702:100:0;3382:184:1;46738:130:0;;;;;;;;;;-1:-1:-1;46738:130:0;;;;;:::i;:::-;;:::i;43975:167::-;;;;;;;;;;-1:-1:-1;43975:167:0;;;;;:::i;:::-;;:::i;29208:290::-;;;;;;;;;;-1:-1:-1;29208:290:0;;;;;:::i;:::-;;:::i;48229:103::-;;;;;;;;;;;;;:::i;43796:171::-;;;;;;;;;;-1:-1:-1;43796:171:0;;;;;:::i;:::-;;:::i;46265:126::-;;;;;;;;;;-1:-1:-1;46265:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;46355:28:0;46331:4;46355:28;;;:19;:28;;;;;;;;;46265:126;43551:237;;;;;;;;;;-1:-1:-1;43551:237:0;;;;;:::i;:::-;;:::i;44150:167::-;;;;;;;;;;-1:-1:-1;44150:167:0;;;;;:::i;:::-;;:::i;48478:142::-;;;;;;;;;;;;;:::i;46575:155::-;;;;;;;;;;-1:-1:-1;46575:155:0;;;;;:::i;:::-;;:::i;37490:27::-;;;;;;;;;;;;;;;;47811:410;;;;;;;;;;-1:-1:-1;47811:410:0;;;;;:::i;:::-;;:::i;27926:143::-;;;;;;;;;;-1:-1:-1;27926:143:0;;;;;:::i;:::-;-1:-1:-1;;;;;28043:18:0;28016:7;28043:18;;;;;;;;;;;;27926:143;32274:94;;;;;;;;;;;;;:::i;45008:472::-;;;;;;;;;;-1:-1:-1;45008:472:0;;;;;:::i;:::-;;:::i;32051:87::-;;;;;;;;;;-1:-1:-1;32124:6:0;;-1:-1:-1;;;;;32124:6:0;32051:87;;27590:104;;;;;;;;;;;;;:::i;37456:27::-;;;;;;;;;;;;;;;;37603:31;;;;;;;;;;;;;;;;45620:109;;;;;;;;;;;;;:::i;29506:475::-;;;;;;;;;;-1:-1:-1;29506:475:0;;;;;:::i;:::-;;:::i;46399:168::-;;;;;;;;;;-1:-1:-1;46399:168:0;;;;;:::i;:::-;;:::i;28077:200::-;;;;;;;;;;-1:-1:-1;28077:200:0;;;;;:::i;:::-;;:::i;47051:367::-;;;;;;;;;;-1:-1:-1;47051:367:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4396:32:1;;;4378:51;;4460:2;4445:18;;4438:34;;;;4488:18;;;4481:34;;;;4546:2;4531:18;;4524:34;;;;4589:3;4574:19;;4567:35;4416:3;4618:19;;4611:35;4677:3;4662:19;;4655:35;4721:3;4706:19;;4699:35;4365:3;4350:19;47051:367:0;4039:701:1;42390:361:0;;;;;;;;;;-1:-1:-1;42390:361:0;;;;;:::i;:::-;;:::i;37704:57::-;;;;;;;;;;-1:-1:-1;37704:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;45923:185;;;;;;;;;;;;;:::i;46876:167::-;;;;;;;;;;-1:-1:-1;46876:167:0;;;;;:::i;:::-;;:::i;37557:37::-;;;;;;;;;;-1:-1:-1;37557:37:0;;;;-1:-1:-1;;;;;37557:37:0;;;28285:176;;;;;;;;;;-1:-1:-1;28285:176:0;;;;;:::i;:::-;-1:-1:-1;;;;;28426:18:0;;;28399:7;28426:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;28285:176;37377:33;;;;;;;;;;;;;;;;42759:239;;;;;;;;;;-1:-1:-1;42759:239:0;;;;;:::i;:::-;;:::i;37419:30::-;;;;;;;;;;;;;;;;48340:130;;;;;;;;;;;;;:::i;45488:124::-;;;;;;;;;;-1:-1:-1;45488:124:0;;;;;:::i;:::-;;:::i;47426:377::-;;;;;;;;;;-1:-1:-1;47426:377:0;;;;;:::i;:::-;;:::i;32376:229::-;;;;;;;;;;-1:-1:-1;32376:229:0;;;;;:::i;:::-;;:::i;37342:26::-;;;;;;;;;;-1:-1:-1;37342:26:0;;;;-1:-1:-1;;;;;37342:26:0;;;37171:35;;;;;;;;;;;;37205:1;37171:35;;27482:100;27536:13;27569:5;27562:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27482:100;:::o;28469:194::-;28577:4;28594:39;26865:10;28617:7;28626:6;28594:8;:39::i;:::-;-1:-1:-1;28651:4:0;28469:194;;;;;:::o;43249:294::-;32124:6;;-1:-1:-1;;;;;32124:6:0;26865:10;32186:23;32178:68;;;;-1:-1:-1;;;32178:68:0;;;;;;;:::i;:::-;;;;;;;;;43370:9:::1;43365:112;43385:19:::0;;::::1;43365:112;;;43461:4;43426:19;:32;43446:8;;43455:1;43446:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;43426:32:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;43426:32:0;:39;;-1:-1:-1;;43426:39:0::1;::::0;::::1;;::::0;;;::::1;::::0;;43406:3;::::1;::::0;::::1;:::i;:::-;;;;43365:112;;;;43494:41;43526:8;;43494:41;;;;;;;:::i;:::-;;;;;;;;43249:294:::0;;:::o;45737:178::-;32124:6;;-1:-1:-1;;;;;32124:6:0;26865:10;32186:23;32178:68;;;;-1:-1:-1;;;32178:68:0;;;;;;;:::i;:::-;45846:15:::1;::::0;:61:::1;::::0;-1:-1:-1;;;45846:61:0;;::::1;::::0;::::1;2166:25:1::0;;;-1:-1:-1;;;;;45846:15:0;;::::1;::::0;:53:::1;::::0;2139:18:1;;45846:61:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;45737:178:::0;:::o;43006:235::-;32124:6;;-1:-1:-1;;;;;32124:6:0;26865:10;32186:23;32178:68;;;;-1:-1:-1;;;32178:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43084:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;::::1;;43076:68;;;::::0;-1:-1:-1;;;43076:68:0;;7200:2:1;43076:68:0::1;::::0;::::1;7182:21:1::0;7239:2;7219:18;;;7212:30;7278:29;7258:18;;;7251:57;7325:18;;43076:68:0::1;6998:351:1::0;43076:68:0::1;-1:-1:-1::0;;;;;43157:28:0;::::1;43188:5;43157:28:::0;;;:19:::1;:28;::::0;;;;;:36;;-1:-1:-1;;43157:36:0::1;::::0;;43211:22;::::1;::::0;43188:5;43211:22:::1;43006:235:::0;:::o;28671:529::-;28811:4;28828:36;28838:6;28846:9;28857:6;28828:9;:36::i;:::-;-1:-1:-1;;;;;28904:19:0;;28877:24;28904:19;;;:11;:19;;;;;;;;26865:10;28904:33;;;;;;;;28970:26;;;;28948:116;;;;-1:-1:-1;;;28948:116:0;;7556:2:1;28948:116:0;;;7538:21:1;7595:2;7575:18;;;7568:30;7634:34;7614:18;;;7607:62;-1:-1:-1;;;7685:18:1;;;7678:38;7733:19;;28948:116:0;7354:404:1;28948:116:0;29100:57;29109:6;26865:10;29150:6;29131:16;:25;29100:8;:57::i;:::-;-1:-1:-1;29188:4:0;;28671:529;-1:-1:-1;;;;28671:529:0:o;46116:141::-;46206:15;;:43;;;-1:-1:-1;;;46206:43:0;;;;46179:7;;-1:-1:-1;;;;;46206:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46199:50;;46116:141;:::o;46738:130::-;32124:6;;-1:-1:-1;;;;;32124:6:0;26865:10;32186:23;32178:68;;;;-1:-1:-1;;;32178:68:0;;;;;;;:::i;:::-;46815:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;46815:45:0;;-1:-1:-1;;;;;2393:32:1;;;46815:45:0::1;::::0;::::1;2375:51:1::0;46815:15:0;;::::1;::::0;:36:::1;::::0;2348:18:1;;46815:45:0::1;2202:230:1::0;43975:167:0;32124:6;;-1:-1:-1;;;;;32124:6:0;26865:10;32186:23;32178:68;;;;-1:-1:-1;;;32178:68:0;;;;;;;:::i;:::-;44045:12:::1;:20:::0;;;44078:12:::1;:10;:12::i;:::-;44108:26;::::0;2166:25:1;;;44108:26:0::1;::::0;2154:2:1;2139:18;44108:26:0::1;;;;;;;;43975:167:::0;:::o;29208:290::-;26865:10;29321:4;29410:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;29410:34:0;;;;;;;;;;29321:4;;29338:130;;29388:7;;29410:47;;29447:10;;29410:47;:::i;:::-;29338:8;:130::i;48229:103::-;48266:15;;:58;;-1:-1:-1;;;48266:58:0;;48305:10;48266:58;;;8266:51:1;48266:15:0;8333:18:1;;;8326:50;-1:-1:-1;;;;;48266:15:0;;;;:30;;8239:18:1;;48266:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;48229:103::o;43796:171::-;32124:6;;-1:-1:-1;;;;;32124:6:0;26865:10;32186:23;32178:68;;;;-1:-1:-1;;;32178:68:0;;;;;;;:::i;:::-;43869:15:::1;:23:::0;;;43905:12:::1;:10;:12::i;:::-;43935:24;::::0;2166:25:1;;;43935:24:0::1;::::0;2154:2:1;2139:18;43935:24:0::1;2020:177:1::0;43551:237:0;32124:6;;-1:-1:-1;;;;;32124:6:0;26865:10;32186:23;32178:68;;;;-1:-1:-1;;;32178:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43641:20:0;::::1;43633:55;;;::::0;-1:-1:-1;;;43633:55:0;;8871:2:1;43633:55:0::1;::::0;::::1;8853:21:1::0;8910:2;8890:18;;;8883:30;-1:-1:-1;;;8929:18:1;;;8922:52;8991:18;;43633:55:0::1;8669:346:1::0;43633:55:0::1;43701:22;:31:::0;;-1:-1:-1;;;;;;43701:31:0::1;-1:-1:-1::0;;;;;43701:31:0;::::1;::::0;;::::1;::::0;;;43750:30:::1;::::0;2375:51:1;;;43750:30:0::1;::::0;2363:2:1;2348:18;43750:30:0::1;2202:230:1::0;44150:167:0;32124:6;;-1:-1:-1;;;;;32124:6:0;26865:10;32186:23;32178:68;;;;-1:-1:-1;;;32178:68:0;;;;;;;:::i;:::-;44220:12:::1;:20:::0;;;44253:12:::1;:10;:12::i;:::-;44283:26;::::0;2166:25:1;;;44283:26:0::1;::::0;2154:2:1;2139:18;44283:26:0::1;2020:177:1::0;48478:142:0;48571:15;;:41;;;-1:-1:-1;;;48571:41:0;;;;48544:7;;-1:-1:-1;;;;;48571:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;;;;;46575:155;46688:15;;:34;;-1:-1:-1;;;46688:34:0;;-1:-1:-1;;;;;2393:32:1;;;46688:34:0;;;2375:51:1;46661:7:0;;46688:15;;:25;;2348:18:1;;46688:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;47811:410::-;47993:15;;:28;;-1:-1:-1;;;;;;47993:28:0;;;;;2166:25:1;;;47891:18:0;;;;;;-1:-1:-1;;;;;47993:15:0;;:23;;2139:18:1;;47993:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48037:176;;;9778:25:1;;;9834:2;9819:18;;9812:34;;;9862:18;;;9855:34;;;9920:2;9905:18;;9898:34;;;47876:145:0;;-1:-1:-1;47876:145:0;;-1:-1:-1;47876:145:0;-1:-1:-1;48193:9:0;;48155:5;;48037:176;;9765:3:1;9750:19;48037:176:0;;;;;;;;47865:356;;;47811:410;:::o;32274:94::-;32124:6;;-1:-1:-1;;;;;32124:6:0;26865:10;32186:23;32178:68;;;;-1:-1:-1;;;32178:68:0;;;;;;;:::i;:::-;32339:21:::1;32357:1;32339:9;:21::i;:::-;32274:94::o:0;45008:472::-;32124:6;;-1:-1:-1;;;;;32124:6:0;26865:10;32186:23;32178:68;;;;-1:-1:-1;;;32178:68:0;;;;;;;:::i;:::-;45120:6:::1;45108:8;:18;;:40;;;;;45142:6;45130:8;:18;;45108:40;45086:143;;;::::0;-1:-1:-1;;;45086:143:0;;10145:2:1;45086:143:0::1;::::0;::::1;10127:21:1::0;10184:2;10164:18;;;10157:30;10223:34;10203:18;;;10196:62;-1:-1:-1;;;10274:18:1;;;10267:51;10335:19;;45086:143:0::1;9943:417:1::0;45086:143:0::1;45274:16;;45262:8;:28:::0;45240:123:::1;;;::::0;-1:-1:-1;;;45240:123:0;;10567:2:1;45240:123:0::1;::::0;::::1;10549:21:1::0;10606:2;10586:18;;;10579:30;10645:34;10625:18;;;10618:62;-1:-1:-1;;;10696:18:1;;;10689:43;10749:19;;45240:123:0::1;10365:409:1::0;45240:123:0::1;45415:16;::::0;45381:51:::1;::::0;45405:8;;45381:51:::1;::::0;;;::::1;45445:16;:27:::0;45008:472::o;27590:104::-;27646:13;27679:7;27672:14;;;;;:::i;45620:109::-;45694:15;;:27;;;-1:-1:-1;;;45694:27:0;;;;45667:7;;-1:-1:-1;;;;;45694:15:0;;:25;;:27;;;;;;;;;;;;;;:15;:27;;;;;;;;;;;;;;29506:475;26865:10;29624:4;29668:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;29668:34:0;;;;;;;;;;29735:35;;;;29713:122;;;;-1:-1:-1;;;29713:122:0;;10981:2:1;29713:122:0;;;10963:21:1;11020:2;11000:18;;;10993:30;11059:34;11039:18;;;11032:62;-1:-1:-1;;;11110:18:1;;;11103:35;11155:19;;29713:122:0;10779:401:1;29713:122:0;29871:67;26865:10;29894:7;29922:15;29903:16;:34;29871:8;:67::i;:::-;-1:-1:-1;29969:4:0;;29506:475;-1:-1:-1;;;29506:475:0:o;46399:168::-;46512:15;;:47;;-1:-1:-1;;;46512:47:0;;-1:-1:-1;;;;;2393:32:1;;;46512:47:0;;;2375:51:1;46485:7:0;;46512:15;;:38;;2348:18:1;;46512:47:0;2202:230:1;28077:200:0;28188:4;28205:42;26865:10;28229:9;28240:6;28205:9;:42::i;47051:367::-;47375:15;;:35;;-1:-1:-1;;;47375:35:0;;-1:-1:-1;;;;;2393:32:1;;;47375:35:0;;;2375:51:1;47181:7:0;;;;;;;;;;;;;;;;47375:15;;;:26;;2348:18:1;;47375:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47368:42;;;;;;;;;;;;;;;;47051:367;;;;;;;;;:::o;42390:361::-;32124:6;;-1:-1:-1;;;;;32124:6:0;26865:10;32186:23;32178:68;;;;-1:-1:-1;;;32178:68:0;;;;;;;:::i;:::-;42514:7:::1;42498:13;27898:12:::0;;;27810:108;42498:13:::1;:23;;;;:::i;:::-;42489:6;:32;:86;;;;;42568:7;42552:13;27898:12:::0;;;27810:108;42552:13:::1;:23;;;;:::i;:::-;42542:6;:33;;42489:86;42467:187;;;::::0;-1:-1:-1;;;42467:187:0;;12295:2:1;42467:187:0::1;::::0;::::1;12277:21:1::0;12334:2;12314:18;;;12307:30;12373:34;12353:18;;;12346:62;-1:-1:-1;;;12424:18:1;;;12417:49;12483:19;;42467:187:0::1;12093:415:1::0;42467:187:0::1;42665:18;:27:::0;;;42710:33:::1;::::0;2166:25:1;;;42710:33:0::1;::::0;2154:2:1;2139:18;42710:33:0::1;2020:177:1::0;45923:185:0;46051:15;;:49;;;-1:-1:-1;;;46051:49:0;;;;46019:7;;-1:-1:-1;;;;;46051:15:0;;:47;;:49;;;;;;;;;;;;;;:15;:49;;;;;;;;;;;;;;46876:167;46987:15;;:48;;-1:-1:-1;;;46987:48:0;;-1:-1:-1;;;;;2393:32:1;;;46987:48:0;;;2375:51:1;46963:4:0;;46987:15;;:39;;2348:18:1;;46987:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;42759:239::-;32124:6;;-1:-1:-1;;;;;32124:6:0;26865:10;32186:23;32178:68;;;;-1:-1:-1;;;32178:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42840:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;::::1;;42839:29;42831:69;;;::::0;-1:-1:-1;;;42831:69:0;;12715:2:1;42831:69:0::1;::::0;::::1;12697:21:1::0;12754:2;12734:18;;;12727:30;12793:29;12773:18;;;12766:57;12840:18;;42831:69:0::1;12513:351:1::0;42831:69:0::1;-1:-1:-1::0;;;;;42913:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;:35;;-1:-1:-1;;42913:35:0::1;42944:4;42913:35;::::0;;42966:24;::::1;::::0;42913:28;42966:24:::1;42759:239:::0;:::o;48340:130::-;48423:15;;:39;;;-1:-1:-1;;;48423:39:0;;;;48396:7;;-1:-1:-1;;;;;48423:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;45488:124;32124:6;;-1:-1:-1;;;;;32124:6:0;26865:10;32186:23;32178:68;;;;-1:-1:-1;;;32178:68:0;;;;;;;:::i;:::-;45562:15:::1;::::0;:42:::1;::::0;-1:-1:-1;;;45562:42:0;;::::1;::::0;::::1;2166:25:1::0;;;-1:-1:-1;;;;;45562:15:0;;::::1;::::0;:31:::1;::::0;2139:18:1;;45562:42:0::1;2020:177:1::0;47426:377:0;47755:15;;:40;;-1:-1:-1;;;47755:40:0;;;;;2166:25:1;;;47561:7:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47755:15:0;;;;:33;;2139:18:1;;47755:40:0;2020:177:1;32376:229:0;32124:6;;-1:-1:-1;;;;;32124:6:0;26865:10;32186:23;32178:68;;;;-1:-1:-1;;;32178:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32479:22:0;::::1;32457:110;;;::::0;-1:-1:-1;;;32457:110:0;;13071:2:1;32457:110:0::1;::::0;::::1;13053:21:1::0;13110:2;13090:18;;;13083:30;13149:34;13129:18;;;13122:62;-1:-1:-1;;;13200:18:1;;;13193:36;13246:19;;32457:110:0::1;12869:402:1::0;32457:110:0::1;32578:19;32588:8;32578:9;:19::i;32815:622::-:0;32872:16;32942:4;32936:11;-1:-1:-1;;;32986:3:0;32961:128;33136:14;33130:4;33126:25;33119:4;33114:3;33110:14;33103:49;-1:-1:-1;;;33200:4:0;33195:3;33191:14;33166:139;33346:4;33341:3;33338:1;33331:20;33319:32;-1:-1:-1;;;;;;;33380:22:0;;33372:57;;;;-1:-1:-1;;;33372:57:0;;13478:2:1;33372:57:0;;;13460:21:1;13517:2;13497:18;;;13490:30;-1:-1:-1;;;13536:18:1;;;13529:52;13598:18;;33372:57:0;13276:346:1;33372:57:0;32815:622;;;:::o;31408:380::-;-1:-1:-1;;;;;31544:19:0;;31536:68;;;;-1:-1:-1;;;31536:68:0;;13829:2:1;31536:68:0;;;13811:21:1;13868:2;13848:18;;;13841:30;13907:34;13887:18;;;13880:62;-1:-1:-1;;;13958:18:1;;;13951:34;14002:19;;31536:68:0;13627:400:1;31536:68:0;-1:-1:-1;;;;;31623:21:0;;31615:68;;;;-1:-1:-1;;;31615:68:0;;14234:2:1;31615:68:0;;;14216:21:1;14273:2;14253:18;;;14246:30;14312:34;14292:18;;;14285:62;-1:-1:-1;;;14363:18:1;;;14356:32;14405:19;;31615:68:0;14032:398:1;31615:68:0;-1:-1:-1;;;;;31696:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;31748:32;;2166:25:1;;;31748:32:0;;2139:18:1;31748:32:0;;;;;;;31408:380;;;:::o;48628:1929::-;-1:-1:-1;;;;;48760:18:0;;48752:69;;;;-1:-1:-1;;;48752:69:0;;14637:2:1;48752:69:0;;;14619:21:1;14676:2;14656:18;;;14649:30;14715:34;14695:18;;;14688:62;-1:-1:-1;;;14766:18:1;;;14759:36;14812:19;;48752:69:0;14435:402:1;48752:69:0;-1:-1:-1;;;;;48840:16:0;;48832:65;;;;-1:-1:-1;;;48832:65:0;;15044:2:1;48832:65:0;;;15026:21:1;15083:2;15063:18;;;15056:30;15122:34;15102:18;;;15095:62;-1:-1:-1;;;15173:18:1;;;15166:34;15217:19;;48832:65:0;14842:400:1;48832:65:0;48914:6;48924:1;48914:11;48910:93;;48942:28;48958:4;48964:2;48968:1;48942:15;:28::i;:::-;48628:1929;;;:::o;48910:93::-;49036:8;;49080:9;;49145:18;;49135:4;49015:18;28043;;;;;;;;;;;-1:-1:-1;;;49036:8:0;;;;;;49015:18;;-1:-1:-1;49117:46:0;49102:61;;49194:7;:38;;;;;49219:13;49218:14;49194:38;:87;;;;-1:-1:-1;;;;;;49250:31:0;;;;;;:25;:31;;;;;;;;49249:32;49194:87;:119;;;;-1:-1:-1;32124:6:0;;-1:-1:-1;;;;;49298:15:0;;;32124:6;;49298:15;;49194:119;:149;;;;-1:-1:-1;32124:6:0;;-1:-1:-1;;;;;49330:13:0;;;32124:6;;49330:13;;49194:149;:184;;;;;49377:1;49360:14;:18;49194:184;49176:247;;;49405:6;:4;:6::i;:::-;49435:12;49451:13;49450:14;:57;;;;-1:-1:-1;;;;;;49482:25:0;;;;;;:19;:25;;;;;;;;49481:26;49450:57;:98;;;;-1:-1:-1;;;;;;49525:23:0;;;;;;:19;:23;;;;;;;;49524:24;49450:98;:133;;;;;49582:1;49565:14;:18;49450:133;49435:148;;49600:7;49596:184;;;49624:12;49667:3;49640:23;49649:14;49640:6;:23;:::i;:::-;49639:31;;;;:::i;:::-;49624:46;-1:-1:-1;49696:13:0;49624:46;49696:6;:13;:::i;:::-;49687:22;;49726:42;49742:4;49756;49763;49726:15;:42::i;:::-;49609:171;49596:184;49792:33;49808:4;49814:2;49818:6;49792:15;:33::i;:::-;49855:15;;-1:-1:-1;;;;;49855:15:0;:26;49890:4;49897:15;49890:4;-1:-1:-1;;;;;28043:18:0;28016:7;28043:18;;;;;;;;;;;;27926:143;49897:15;49855:58;;-1:-1:-1;;;;;;49855:58:0;;;;;;;-1:-1:-1;;;;;15761:32:1;;;49855:58:0;;;15743:51:1;15810:18;;;15803:34;15716:18;;49855:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49838:96;49948:15;;-1:-1:-1;;;;;49948:15:0;:26;49983:2;49988:13;49983:2;-1:-1:-1;;;;;28043:18:0;28016:7;28043:18;;;;;;;;;;;;27926:143;49988:13;49948:54;;-1:-1:-1;;;;;;49948:54:0;;;;;;;-1:-1:-1;;;;;15761:32:1;;;49948:54:0;;;15743:51:1;15810:18;;;15803:34;15716:18;;49948:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49944:70;50030:13;50026:26;;;50045:7;;;;48628:1929;;;:::o;50026:26::-;50068:15;;50092:16;;50068:41;;-1:-1:-1;;;;;;50068:41:0;;-1:-1:-1;;;;;50068:15:0;;;;:23;;:41;;;;2166:25:1;;;2154:2;2139:18;;2020:177;50068:41:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50068:41:0;;;;;;;;-1:-1:-1;;50068:41:0;;;;;;;;;;;;:::i;:::-;;;50064:486;;50508:30;;;;;;;50064:486;;;50410:16;;50253:216;;;9778:25:1;;;9834:2;9819:18;;9812:34;;;9862:18;;;9855:34;;;9920:2;9905:18;;9898:34;;;;50253:216:0;50445:9;;50387:4;;50253:216;;;;;9765:3:1;50253:216:0;;;50110:371;;;50064:486;48741:1816;;;;48628:1929;;;:::o;44325:179::-;44412:12;;44397;;44379:15;;:30;;;;:::i;:::-;:45;;;;:::i;:::-;44367:9;:57;;;44458:2;-1:-1:-1;44445:15:0;44437:59;;;;-1:-1:-1;;;44437:59:0;;16050:2:1;44437:59:0;;;16032:21:1;16089:2;16069:18;;;16062:30;16128:33;16108:18;;;16101:61;16179:18;;44437:59:0;15848:355:1;32613:173:0;32688:6;;;-1:-1:-1;;;;;32705:17:0;;;-1:-1:-1;;;;;;32705:17:0;;;;;;;32738:40;;32688:6;;;32705:17;32688:6;;32738:40;;32669:16;;32738:40;32658:128;32613:173;:::o;29989:651::-;-1:-1:-1;;;;;30129:20:0;;30121:70;;;;-1:-1:-1;;;30121:70:0;;16410:2:1;30121:70:0;;;16392:21:1;16449:2;16429:18;;;16422:30;16488:34;16468:18;;;16461:62;-1:-1:-1;;;16539:18:1;;;16532:35;16584:19;;30121:70:0;16208:401:1;30121:70:0;-1:-1:-1;;;;;30210:23:0;;30202:71;;;;-1:-1:-1;;;30202:71:0;;16816:2:1;30202:71:0;;;16798:21:1;16855:2;16835:18;;;16828:30;16894:34;16874:18;;;16867:62;-1:-1:-1;;;16945:18:1;;;16938:33;16988:19;;30202:71:0;16614:399:1;30202:71:0;-1:-1:-1;;;;;30310:17:0;;30286:21;30310:17;;;;;;;;;;;30360:23;;;;30338:111;;;;-1:-1:-1;;;30338:111:0;;17220:2:1;30338:111:0;;;17202:21:1;17259:2;17239:18;;;17232:30;17298:34;17278:18;;;17271:62;-1:-1:-1;;;17349:18:1;;;17342:36;17395:19;;30338:111:0;17018:402:1;30338:111:0;-1:-1:-1;;;;;30485:17:0;;;:9;:17;;;;;;;;;;;30505:22;;;30485:42;;30549:20;;;;;;;;:30;;30521:6;;30485:9;30549:30;;30521:6;;30549:30;:::i;:::-;;;;;;;;30614:9;-1:-1:-1;;;;;30597:35:0;30606:6;-1:-1:-1;;;;;30597:35:0;;30625:6;30597:35;;;;2166:25:1;;2154:2;2139:18;;2020:177;50565:885:0;39168:8;:15;;-1:-1:-1;;;;39168:15:0;-1:-1:-1;;;39168:15:0;;;50629:18:::1;::::0;50685:9:::1;::::0;50738:12:::1;::::0;39168:15;;50685:9;;50729:21:::1;::::0;50629:18;50729:21:::1;:::i;:::-;50728:40;;;;:::i;:::-;50707:61:::0;-1:-1:-1;50785:14:0;;50781:46:::1;;50801:26;50816:10;50801:14;:26::i;:::-;50840:23;50892:14;50876:12;;50867:6;:21;;;;:::i;:::-;50866:40;;;;:::i;:::-;50840:66:::0;-1:-1:-1;50919:22:0::1;50971:10:::0;50944:24:::1;50840:66:::0;50944:6;:24:::1;:::i;:::-;:37;;;;:::i;:::-;50919:62:::0;-1:-1:-1;50994:19:0::1;51016:32;50919:62:::0;51016:15;:32:::1;:::i;:::-;50994:54;;51061:21;51085:32;51105:11;51085:19;:32::i;:::-;51061:56:::0;-1:-1:-1;51130:22:0::1;51204:11:::0;51156:31:::1;51172:15:::0;51061:56;51156:31:::1;:::i;:::-;51155:60;;;;:::i;:::-;51130:85:::0;-1:-1:-1;51232:18:0;;51228:154:::1;;51272:11;::::0;51312:22:::1;::::0;51265:117:::1;::::0;-1:-1:-1;;;51265:117:0;;-1:-1:-1;;;;;51312:22:0;;::::1;51265:117;::::0;::::1;15743:51:1::0;15810:18;;;15803:34;;;51272:11:0;::::1;::::0;51265:28:::1;::::0;15716:18:1;;51265:117:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;51228:154;51399:15;::::0;:19;51395:47:::1;;51420:22;:20;:22::i;:::-;-1:-1:-1::0;;39206:8:0;:16;;-1:-1:-1;;;;39206:16:0;;;-1:-1:-1;;;;;;50565:885:0:o;51458:451::-;51517:12;51532:10;51541:1;51532:6;:10;:::i;:::-;51517:25;-1:-1:-1;51553:17:0;51573:13;51517:25;51573:6;:13;:::i;:::-;51553:33;-1:-1:-1;51624:21:0;51658:22;51675:4;51658:16;:22::i;:::-;51693:18;51714:38;51738:14;51714:21;:38;:::i;:::-;51693:59;;51769:10;51783:1;51769:15;51765:28;;51786:7;;;;51458:451;:::o;51765:28::-;51805:35;51818:9;51829:10;51805:12;:35::i;:::-;51858:43;;;17906:25:1;;;17962:2;17947:18;;17940:34;;;17990:18;;;17983:34;;;51858:43:0;;17894:2:1;17879:18;51858:43:0;;;;;;;51506:403;;;;51458:451;:::o;56033:951::-;56160:16;;;56174:1;56160:16;;;;;;;;;56116:7;;;;56160:16;;;;;;;;;;;-1:-1:-1;56160:16:0;56136:40;;56205:4;56187;56192:1;56187:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;56187:23:0;;;-1:-1:-1;;;;;56187:23:0;;;;;56231:19;:17;:19::i;:::-;56221:4;56226:1;56221:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;56221:29:0;;;:7;;;;;;;;;:29;56271:11;;56261:7;;56271:11;;;56261:4;;56266:1;;56261:7;;;;;;:::i;:::-;-1:-1:-1;;;;;56261:21:0;;;:7;;;;;;;;;:21;56327:15;;56295:62;;56312:4;;56327:15;56345:11;56295:8;:62::i;:::-;56403:11;;56446:41;;-1:-1:-1;;;56446:41:0;;56481:4;56446:41;;;2375:51:1;-1:-1:-1;;;;;56403:11:0;;;;56370:23;;56403:11;;56446:26;;2348:18:1;;56446:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56517:15;;:265;;-1:-1:-1;;;56517:265:0;;56428:59;;-1:-1:-1;;;;;;56517:15:0;;:87;;:265;;56627:11;;56517:15;;56685:4;;56720;;56748:15;;56517:265;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56500:477;;56904:38;;2166:25:1;;;56904:38:0;;2154:2:1;2139:18;56904:38:0;;;;;;;-1:-1:-1;56964:1:0;;56033:951;-1:-1:-1;;;;56033:951:0:o;56500:477::-;56814:41;;-1:-1:-1;;;56814:41:0;;56849:4;56814:41;;;2375:51:1;56858:7:0;;-1:-1:-1;;;;;56814:26:0;;;;;2348:18:1;;56814:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;;;;:::i;:::-;56807:58;56033:951;-1:-1:-1;;;;;56033:951:0:o;56992:490::-;57076:11;;57121:41;;-1:-1:-1;;;57121:41:0;;57156:4;57121:41;;;2375:51:1;-1:-1:-1;;;;;57076:11:0;;;;57043:23;;57076:11;;57121:26;;2348:18:1;;57121:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57101:61;;57179:9;57192:1;57179:14;57175:27;;57195:7;;56992:490::o;57175:27::-;57277:15;;57229:99;;-1:-1:-1;;;57229:99:0;;-1:-1:-1;;;;;57277:15:0;;;57229:99;;;15743:51:1;15810:18;;;15803:34;;;57214:12:0;;57229:25;;;;;15716:18:1;;57229:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57214:114;;57345:7;57341:134;;;57369:15;;:50;;-1:-1:-1;;;57369:50:0;;;;;2166:25:1;;;-1:-1:-1;;;;;57369:15:0;;;;:39;;2139:18:1;;57369:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57439:24;57453:9;57439:24;;;;2166:25:1;;2154:2;2139:18;;2020:177;57439:24:0;;;;;;;;57032:450;;;56992:490::o;51917:2206::-;52007:16;;;52021:1;52007:16;;;;;;;;51983:21;;52007:16;;;;;;;;;;-1:-1:-1;52007:16:0;51983:40;;52052:4;52034;52039:1;52034:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;52034:23:0;;;-1:-1:-1;;;;;52034:23:0;;;;;52078:19;:17;:19::i;:::-;52068:4;52073:1;52068:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;52068:29:0;;;:7;;;;;;;;;:29;52142:15;;52110:62;;52127:4;;52142:15;52160:11;52110:8;:62::i;:::-;52189:13;52206:2;52189:19;52185:1931;;52265:15;;:290;;-1:-1:-1;;;52265:290:0;;-1:-1:-1;;;;;52265:15:0;;;;:88;;:290;;52380:11;;52265:15;;52446:4;;52485;;52517:15;;52265:290;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52244:409;;52602:35;;2166:25:1;;;52602:35:0;;2154:2:1;2139:18;52602:35:0;;;;;;;51972:2151;51917:2206;:::o;52244:409::-;51972:2151;51917:2206;:::o;52185:1931::-;52674:13;52691:5;52674:22;52670:1446;;52755:15;;:291;;-1:-1:-1;;;52755:291:0;;-1:-1:-1;;;;;52755:15:0;;;;:89;;:291;;52871:11;;52755:15;;52937:4;;52976;;53008:15;;52755:291;;;:::i;52670:1446::-;53165:13;53182:5;53165:22;:48;;;;53191:13;53208:5;53191:22;53165:48;53161:955;;;53275:15;;:291;;-1:-1:-1;;;53275:291:0;;-1:-1:-1;;;;;53275:15:0;;;;:89;;:291;;53391:11;;53275:15;;53457:4;;53496;;53528:15;;53275:291;;;:::i;53161:955::-;53717:15;;:290;;-1:-1:-1;;;53717:290:0;;-1:-1:-1;;;;;53717:15:0;;;;:88;;:290;;53832:11;;53717:15;;53898:4;;53937;;53969:15;;53717:290;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53696:409;;54054:35;;2166:25:1;;;54054:35:0;;2154:2:1;2139:18;54054:35:0;2020:177:1;54131:1894:0;54244:15;;54212:62;;54229:4;;-1:-1:-1;;;;;54244:15:0;54262:11;54212:8;:62::i;:::-;54291:13;54308:2;54291:19;54287:1731;;54348:15;;:262;;-1:-1:-1;;;54348:262:0;;-1:-1:-1;;;;;54348:15:0;;;;:31;;54387:9;;54348:262;;54428:4;;54456:11;;54348:15;;;;54546:6;;54576:15;;54348:262;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54348:262:0;;;;;;;;-1:-1:-1;;54348:262:0;;;;;;;;;;;;:::i;:::-;;;54327:375;;54657:29;;2166:25:1;;;54657:29:0;;2154:2:1;2139:18;54657:29:0;2020:177:1;54287:1731:0;54723:13;54740:5;54723:22;54719:1299;;54783:15;;:263;;-1:-1:-1;;;54783:263:0;;-1:-1:-1;;;;;54783:15:0;;;;:32;;54823:9;;54783:263;;54864:4;;54892:11;;54783:15;;;;54982:6;;55012:15;;54783:263;;;:::i;54719:1299::-;55159:13;55176:5;55159:22;:48;;;;55185:13;55202:5;55185:22;55159:48;55155:863;;;55245:15;;:263;;-1:-1:-1;;;55245:263:0;;-1:-1:-1;;;;;55245:15:0;;;;:32;;55285:9;;55245:263;;55326:4;;55354:11;;55245:15;;;;55444:6;;55474:15;;55245:263;;;:::i;55155:863::-;55653:15;;:262;;-1:-1:-1;;;55653:262:0;;-1:-1:-1;;;;;55653:15:0;;;;:31;;55692:9;;55653:262;;55733:4;;55761:11;;55653:15;;;;55851:6;;55881:15;;55653:262;;;:::i;41738:607::-;41790:7;41814:13;41831:2;41814:19;41810:528;;41876:15;;;;;;;;;-1:-1:-1;;;;;41876:15:0;-1:-1:-1;;;;;41876:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;41810:528::-;41920:13;41937:3;41920:20;41916:422;;41990:15;;;;;;;;;-1:-1:-1;;;;;41990:15:0;-1:-1:-1;;;;;41990:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41916:422;42033:13;42050:5;42033:22;42029:309;;42100:15;;;;;;;;;-1:-1:-1;;;;;42100:15:0;-1:-1:-1;;;;;42100:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42029:309;42145:13;42162:5;42145:22;:48;;;;42171:13;42188:5;42171:22;42145:48;42141:197;;;42241:15;;;;;;;;;-1:-1:-1;;;;;42241:15:0;-1:-1:-1;;;;;42241:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42141:197;42304:15;;;;;;;;;-1:-1:-1;;;;;42304:15:0;-1:-1:-1;;;;;42304:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:548:1;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:131::-;-1:-1:-1;;;;;642:31:1;;632:42;;622:70;;688:1;685;678:12;703:315;771:6;779;832:2;820:9;811:7;807:23;803:32;800:52;;;848:1;845;838:12;800:52;887:9;874:23;906:31;931:5;906:31;:::i;:::-;956:5;1008:2;993:18;;;;980:32;;-1:-1:-1;;;703:315:1:o;1215:615::-;1301:6;1309;1362:2;1350:9;1341:7;1337:23;1333:32;1330:52;;;1378:1;1375;1368:12;1330:52;1418:9;1405:23;1447:18;1488:2;1480:6;1477:14;1474:34;;;1504:1;1501;1494:12;1474:34;1542:6;1531:9;1527:22;1517:32;;1587:7;1580:4;1576:2;1572:13;1568:27;1558:55;;1609:1;1606;1599:12;1558:55;1649:2;1636:16;1675:2;1667:6;1664:14;1661:34;;;1691:1;1688;1681:12;1661:34;1744:7;1739:2;1729:6;1726:1;1722:14;1718:2;1714:23;1710:32;1707:45;1704:65;;;1765:1;1762;1755:12;1704:65;1796:2;1788:11;;;;;1818:6;;-1:-1:-1;1215:615:1;;-1:-1:-1;;;;1215:615:1:o;1835:180::-;1894:6;1947:2;1935:9;1926:7;1922:23;1918:32;1915:52;;;1963:1;1960;1953:12;1915:52;-1:-1:-1;1986:23:1;;1835:180;-1:-1:-1;1835:180:1:o;2437:247::-;2496:6;2549:2;2537:9;2528:7;2524:23;2520:32;2517:52;;;2565:1;2562;2555:12;2517:52;2604:9;2591:23;2623:31;2648:5;2623:31;:::i;:::-;2673:5;2437:247;-1:-1:-1;;;2437:247:1:o;2689:456::-;2766:6;2774;2782;2835:2;2823:9;2814:7;2810:23;2806:32;2803:52;;;2851:1;2848;2841:12;2803:52;2890:9;2877:23;2909:31;2934:5;2909:31;:::i;:::-;2959:5;-1:-1:-1;3016:2:1;3001:18;;2988:32;3029:33;2988:32;3029:33;:::i;:::-;2689:456;;3081:7;;-1:-1:-1;;;3135:2:1;3120:18;;;;3107:32;;2689:456::o;4745:388::-;4813:6;4821;4874:2;4862:9;4853:7;4849:23;4845:32;4842:52;;;4890:1;4887;4880:12;4842:52;4929:9;4916:23;4948:31;4973:5;4948:31;:::i;:::-;4998:5;-1:-1:-1;5055:2:1;5040:18;;5027:32;5068:33;5027:32;5068:33;:::i;:::-;5120:7;5110:17;;;4745:388;;;;;:::o;5138:380::-;5217:1;5213:12;;;;5260;;;5281:61;;5335:4;5327:6;5323:17;5313:27;;5281:61;5388:2;5380:6;5377:14;5357:18;5354:38;5351:161;;5434:10;5429:3;5425:20;5422:1;5415:31;5469:4;5466:1;5459:15;5497:4;5494:1;5487:15;5351:161;;5138:380;;;:::o;5523:356::-;5725:2;5707:21;;;5744:18;;;5737:30;5803:34;5798:2;5783:18;;5776:62;5870:2;5855:18;;5523:356::o;5884:127::-;5945:10;5940:3;5936:20;5933:1;5926:31;5976:4;5973:1;5966:15;6000:4;5997:1;5990:15;6016:127;6077:10;6072:3;6068:20;6065:1;6058:31;6108:4;6105:1;6098:15;6132:4;6129:1;6122:15;6148:135;6187:3;6208:17;;;6205:43;;6228:18;;:::i;:::-;-1:-1:-1;6275:1:1;6264:13;;6148:135::o;6288:705::-;6469:2;6521:21;;;6494:18;;;6577:22;;;6440:4;;6656:6;6630:2;6615:18;;6440:4;6690:277;6704:6;6701:1;6698:13;6690:277;;;6779:6;6766:20;6799:31;6824:5;6799:31;:::i;:::-;-1:-1:-1;;;;;6855:31:1;6843:44;;6942:15;;;;6907:12;;;;6883:1;6719:9;6690:277;;;-1:-1:-1;6984:3:1;6288:705;-1:-1:-1;;;;;;6288:705:1:o;7763:184::-;7833:6;7886:2;7874:9;7865:7;7861:23;7857:32;7854:52;;;7902:1;7899;7892:12;7854:52;-1:-1:-1;7925:16:1;;7763:184;-1:-1:-1;7763:184:1:o;7952:125::-;8017:9;;;8038:10;;;8035:36;;;8051:18;;:::i;8387:277::-;8454:6;8507:2;8495:9;8486:7;8482:23;8478:32;8475:52;;;8523:1;8520;8513:12;8475:52;8555:9;8549:16;8608:5;8601:13;8594:21;8587:5;8584:32;8574:60;;8630:1;8627;8620:12;9236:306;9324:6;9332;9340;9393:2;9381:9;9372:7;9368:23;9364:32;9361:52;;;9409:1;9406;9399:12;9361:52;9438:9;9432:16;9422:26;;9488:2;9477:9;9473:18;9467:25;9457:35;;9532:2;9521:9;9517:18;9511:25;9501:35;;9236:306;;;;;:::o;11185:681::-;11316:6;11324;11332;11340;11348;11356;11364;11372;11425:3;11413:9;11404:7;11400:23;11396:33;11393:53;;;11442:1;11439;11432:12;11393:53;11474:9;11468:16;11493:31;11518:5;11493:31;:::i;:::-;11543:5;11533:15;;;11588:2;11577:9;11573:18;11567:25;11557:35;;11632:2;11621:9;11617:18;11611:25;11601:35;;11676:2;11665:9;11661:18;11655:25;11645:35;;11720:3;11709:9;11705:19;11699:26;11689:36;;11765:3;11754:9;11750:19;11744:26;11734:36;;11810:3;11799:9;11795:19;11789:26;11779:36;;11855:3;11844:9;11840:19;11834:26;11824:36;;11185:681;;;;;;;;;;;:::o;11871:217::-;11911:1;11937;11927:132;;11981:10;11976:3;11972:20;11969:1;11962:31;12016:4;12013:1;12006:15;12044:4;12041:1;12034:15;11927:132;-1:-1:-1;12073:9:1;;11871:217::o;15247:168::-;15287:7;15353:1;15349;15345:6;15341:14;15338:1;15335:21;15330:1;15323:9;15316:17;15312:45;15309:71;;;15360:18;;:::i;:::-;-1:-1:-1;15400:9:1;;15247:168::o;15420:128::-;15487:9;;;15508:11;;;15505:37;;;15522:18;;:::i;18160:980::-;18422:4;18470:3;18459:9;18455:19;18501:6;18490:9;18483:25;18527:2;18565:6;18560:2;18549:9;18545:18;18538:34;18608:3;18603:2;18592:9;18588:18;18581:31;18632:6;18667;18661:13;18698:6;18690;18683:22;18736:3;18725:9;18721:19;18714:26;;18775:2;18767:6;18763:15;18749:29;;18796:1;18806:195;18820:6;18817:1;18814:13;18806:195;;;18885:13;;-1:-1:-1;;;;;18881:39:1;18869:52;;18976:15;;;;18941:12;;;;18917:1;18835:9;18806:195;;;-1:-1:-1;;;;;;;19057:32:1;;;;19052:2;19037:18;;19030:60;-1:-1:-1;;;19121:3:1;19106:19;19099:35;19018:3;18160:980;-1:-1:-1;;;18160:980:1:o;19145:607::-;-1:-1:-1;;;;;19504:15:1;;;19486:34;;19551:2;19536:18;;19529:34;;;;19594:2;19579:18;;19572:34;;;;19637:2;19622:18;;19615:34;;;;19686:15;;;19680:3;19665:19;;19658:44;19466:3;19718:19;;19711:35;;;;19435:3;19420:19;;19145:607::o;19757:251::-;19827:6;19880:2;19868:9;19859:7;19855:23;19851:32;19848:52;;;19896:1;19893;19886:12;19848:52;19928:9;19922:16;19947:31;19972:5;19947:31;:::i
Swarm Source
ipfs://055b9bd6c0f83fcd647e0918ed95a503fcf450855bfa2dbec127237ca8fce129
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.