Source Code
Latest 25 from a total of 91 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Swap Eth To Toke... | 11615211 | 1879 days ago | IN | 10 ETH | 0.01791465 | ||||
| Swap Eth To Toke... | 11615188 | 1879 days ago | IN | 10 ETH | 0.02220825 | ||||
| Transfer | 11614990 | 1879 days ago | IN | 3 ETH | 0.01195992 | ||||
| Swap Eth To Toke... | 11614988 | 1879 days ago | IN | 2.745 ETH | 0.01443641 | ||||
| Transfer | 11614595 | 1879 days ago | IN | 0.51 ETH | 0.0116263 | ||||
| Swap Eth To Toke... | 11614168 | 1879 days ago | IN | 1.25 ETH | 0.01747049 | ||||
| Swap Eth To Toke... | 11614022 | 1879 days ago | IN | 10 ETH | 0.0088833 | ||||
| Swap Eth To Toke... | 11614019 | 1879 days ago | IN | 10 ETH | 0.00905506 | ||||
| Swap Eth To Toke... | 11614016 | 1879 days ago | IN | 3 ETH | 0.00740075 | ||||
| Swap Eth To Toke... | 11614016 | 1879 days ago | IN | 10 ETH | 0.00839471 | ||||
| Swap Eth To Toke... | 11614015 | 1879 days ago | IN | 10 ETH | 0.00839471 | ||||
| Swap Eth To Toke... | 11614013 | 1879 days ago | IN | 10 ETH | 0.0088833 | ||||
| Swap Eth To Toke... | 11614010 | 1879 days ago | IN | 10 ETH | 0.0088833 | ||||
| Swap Eth To Toke... | 11612967 | 1880 days ago | IN | 1 ETH | 0.01065996 | ||||
| Swap Eth To Toke... | 11612939 | 1880 days ago | IN | 1 ETH | 0.01702632 | ||||
| Swap Eth To Toke... | 11612470 | 1880 days ago | IN | 1 ETH | 0.00877126 | ||||
| Swap Eth To Toke... | 11612409 | 1880 days ago | IN | 2 ETH | 0.013473 | ||||
| Swap Eth To Toke... | 11608493 | 1880 days ago | IN | 7 ETH | 0.01909909 | ||||
| Swap Eth To Toke... | 11608333 | 1880 days ago | IN | 10 ETH | 0.01850687 | ||||
| Swap Eth To Toke... | 11608328 | 1880 days ago | IN | 8.8 ETH | 0.01726842 | ||||
| Swap Eth To Toke... | 11607922 | 1880 days ago | IN | 0.49999999 ETH | 0.01699432 | ||||
| Update Whitelist... | 11606793 | 1880 days ago | IN | 0 ETH | 0.0124808 | ||||
| Swap Eth To Toke... | 11605414 | 1881 days ago | IN | 1.01111 ETH | 0.01391717 | ||||
| Swap Eth To Toke... | 11602334 | 1881 days ago | IN | 1.2 ETH | 0.016164 | ||||
| Swap Eth To Toke... | 11602257 | 1881 days ago | IN | 3 ETH | 0.02450162 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| - | 11615211 | 1879 days ago | 10 ETH | ||||
| - | 11615188 | 1879 days ago | 10 ETH | ||||
| - | 11614990 | 1879 days ago | 3 ETH | ||||
| - | 11614988 | 1879 days ago | 2.745 ETH | ||||
| - | 11614595 | 1879 days ago | 0.51 ETH | ||||
| - | 11614168 | 1879 days ago | 1.25 ETH | ||||
| - | 11614022 | 1879 days ago | 10 ETH | ||||
| - | 11614019 | 1879 days ago | 10 ETH | ||||
| - | 11614016 | 1879 days ago | 3 ETH | ||||
| - | 11614016 | 1879 days ago | 10 ETH | ||||
| - | 11614015 | 1879 days ago | 10 ETH | ||||
| - | 11614013 | 1879 days ago | 10 ETH | ||||
| - | 11614010 | 1879 days ago | 10 ETH | ||||
| - | 11612967 | 1880 days ago | 1 ETH | ||||
| - | 11612939 | 1880 days ago | 1 ETH | ||||
| - | 11612470 | 1880 days ago | 1 ETH | ||||
| - | 11612409 | 1880 days ago | 2 ETH | ||||
| - | 11608493 | 1880 days ago | 7 ETH | ||||
| - | 11608333 | 1880 days ago | 10 ETH | ||||
| - | 11608328 | 1880 days ago | 8.8 ETH | ||||
| - | 11607922 | 1880 days ago | 0.49999999 ETH | ||||
| - | 11605414 | 1881 days ago | 1.01111 ETH | ||||
| - | 11602334 | 1881 days ago | 1.2 ETH | ||||
| - | 11602257 | 1881 days ago | 3 ETH | ||||
| - | 11602216 | 1881 days ago | 5 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
SeedSwap
Compiler Version
v0.5.11+commit.22be8592
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2021-01-03
*/
// File: @openzeppelin/contracts/GSN/Context.sol
pragma solidity ^0.5.0;
/*
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with GSN meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
contract Context {
// Empty internal constructor, to prevent people from mistakenly deploying
// an instance of this contract, which should be used via inheritance.
constructor () internal { }
// solhint-disable-previous-line no-empty-blocks
function _msgSender() internal view returns (address payable) {
return msg.sender;
}
function _msgData() internal view returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
// File: @openzeppelin/contracts/ownership/Ownable.sol
pragma solidity ^0.5.0;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor () internal {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(isOwner(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Returns true if the caller is the current owner.
*/
function isOwner() public view returns (bool) {
return _msgSender() == _owner;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public onlyOwner {
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
*/
function _transferOwnership(address newOwner) internal {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
// File: @openzeppelin/contracts/access/Roles.sol
pragma solidity ^0.5.0;
/**
* @title Roles
* @dev Library for managing addresses assigned to a Role.
*/
library Roles {
struct Role {
mapping (address => bool) bearer;
}
/**
* @dev Give an account access to this role.
*/
function add(Role storage role, address account) internal {
require(!has(role, account), "Roles: account already has role");
role.bearer[account] = true;
}
/**
* @dev Remove an account's access to this role.
*/
function remove(Role storage role, address account) internal {
require(has(role, account), "Roles: account does not have role");
role.bearer[account] = false;
}
/**
* @dev Check if an account has this role.
* @return bool
*/
function has(Role storage role, address account) internal view returns (bool) {
require(account != address(0), "Roles: account is the zero address");
return role.bearer[account];
}
}
// File: @openzeppelin/contracts/access/roles/WhitelistAdminRole.sol
pragma solidity ^0.5.0;
/**
* @title WhitelistAdminRole
* @dev WhitelistAdmins are responsible for assigning and removing Whitelisted accounts.
*/
contract WhitelistAdminRole is Context {
using Roles for Roles.Role;
event WhitelistAdminAdded(address indexed account);
event WhitelistAdminRemoved(address indexed account);
Roles.Role private _whitelistAdmins;
constructor () internal {
_addWhitelistAdmin(_msgSender());
}
modifier onlyWhitelistAdmin() {
require(isWhitelistAdmin(_msgSender()), "WhitelistAdminRole: caller does not have the WhitelistAdmin role");
_;
}
function isWhitelistAdmin(address account) public view returns (bool) {
return _whitelistAdmins.has(account);
}
function addWhitelistAdmin(address account) public onlyWhitelistAdmin {
_addWhitelistAdmin(account);
}
function renounceWhitelistAdmin() public {
_removeWhitelistAdmin(_msgSender());
}
function _addWhitelistAdmin(address account) internal {
_whitelistAdmins.add(account);
emit WhitelistAdminAdded(account);
}
function _removeWhitelistAdmin(address account) internal {
_whitelistAdmins.remove(account);
emit WhitelistAdminRemoved(account);
}
}
// File: @openzeppelin/contracts/access/roles/WhitelistedRole.sol
pragma solidity ^0.5.0;
/**
* @title WhitelistedRole
* @dev Whitelisted accounts have been approved by a WhitelistAdmin to perform certain actions (e.g. participate in a
* crowdsale). This role is special in that the only accounts that can add it are WhitelistAdmins (who can also remove
* it), and not Whitelisteds themselves.
*/
contract WhitelistedRole is Context, WhitelistAdminRole {
using Roles for Roles.Role;
event WhitelistedAdded(address indexed account);
event WhitelistedRemoved(address indexed account);
Roles.Role private _whitelisteds;
modifier onlyWhitelisted() {
require(isWhitelisted(_msgSender()), "WhitelistedRole: caller does not have the Whitelisted role");
_;
}
function isWhitelisted(address account) public view returns (bool) {
return _whitelisteds.has(account);
}
function addWhitelisted(address account) public onlyWhitelistAdmin {
_addWhitelisted(account);
}
function removeWhitelisted(address account) public onlyWhitelistAdmin {
_removeWhitelisted(account);
}
function renounceWhitelisted() public {
_removeWhitelisted(_msgSender());
}
function _addWhitelisted(address account) internal {
_whitelisteds.add(account);
emit WhitelistedAdded(account);
}
function _removeWhitelisted(address account) internal {
_whitelisteds.remove(account);
emit WhitelistedRemoved(account);
}
}
// File: contracts/whitelist/WhitelistExtension.sol
pragma solidity 0.5.11;
/// @dev Extension of WhitelistedRole to allow add multiple whitelisted admins or accounts
/// in a single transaction
/// also added Pausable
contract WhitelistExtension is Ownable, WhitelistedRole {
event Paused(address account);
event Unpaused(address account);
bool private _paused;
modifier whenNotPaused() {
require(!_paused, "paused");
_;
}
modifier whenPaused() {
require(_paused, "not paused");
_;
}
constructor() public {
_paused = false;
}
function pause() public onlyWhitelistAdmin whenNotPaused {
_paused = true;
emit Paused(msg.sender);
}
function unpause() public onlyWhitelistAdmin whenPaused {
_paused = false;
emit Unpaused(msg.sender);
}
/// @dev update whitelisted admins
/// only owner can update this list
function updateWhitelistedAdmins(
address[] calldata admins,
bool isAdd
)
external onlyOwner
{
for(uint256 i = 0; i < admins.length; i++) {
if (isAdd) {
if (!isWhitelistAdmin(admins[i])) _addWhitelistAdmin(admins[i]);
} else {
if (isWhitelistAdmin(admins[i])) _removeWhitelistAdmin(admins[i]);
}
}
}
/// @dev update whitelisted addresses
/// only whitelisted admins can call this function
function updateWhitelistedUsers(
address[] calldata users,
bool isAdd
)
external onlyWhitelistAdmin
{
for(uint256 i = 0; i < users.length; i++) {
if (isAdd) {
if (!isWhitelisted(users[i])) _addWhitelisted(users[i]);
} else {
if (isWhitelisted(users[i])) _removeWhitelisted(users[i]);
}
}
}
function isPaused() external view returns (bool) {
return _paused;
}
}
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
pragma solidity ^0.5.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP. Does not include
* the optional functions; to access them see {ERC20Detailed}.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
// File: @openzeppelin/contracts/math/SafeMath.sol
pragma solidity ^0.5.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
* - Subtraction cannot overflow.
*
* _Available since v2.4.0._
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*
* _Available since v2.4.0._
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
// Solidity only automatically asserts when dividing by 0
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*
* _Available since v2.4.0._
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
// File: @openzeppelin/contracts/utils/Address.sol
pragma solidity ^0.5.5;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// According to EIP-1052, 0x0 is the value returned for not-yet created accounts
// and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
// for accounts without code, i.e. `keccak256('')`
bytes32 codehash;
bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
// solhint-disable-next-line no-inline-assembly
assembly { codehash := extcodehash(account) }
return (codehash != accountHash && codehash != 0x0);
}
/**
* @dev Converts an `address` into `address payable`. Note that this is
* simply a type cast: the actual underlying value is not changed.
*
* _Available since v2.4.0._
*/
function toPayable(address account) internal pure returns (address payable) {
return address(uint160(account));
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*
* _Available since v2.4.0._
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-call-value
(bool success, ) = recipient.call.value(amount)("");
require(success, "Address: unable to send value, recipient may have reverted");
}
}
// File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol
pragma solidity ^0.5.0;
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using SafeMath for uint256;
using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
function safeApprove(IERC20 token, address spender, uint256 value) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
// solhint-disable-next-line max-line-length
require((value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).add(value);
callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves.
// A Solidity high level call has three parts:
// 1. The target address is checked to verify it contains contract code
// 2. The call itself is made, and success asserted
// 3. The return value is decoded, which in turn checks the size of the returned data.
// solhint-disable-next-line max-line-length
require(address(token).isContract(), "SafeERC20: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = address(token).call(data);
require(success, "SafeERC20: low-level call failed");
if (returndata.length > 0) { // Return data is optional
// solhint-disable-next-line max-line-length
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
// File: @openzeppelin/contracts/utils/ReentrancyGuard.sol
pragma solidity ^0.5.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*
* _Since v2.5.0:_ this module is now much more gas efficient, given net gas
* metering changes introduced in the Istanbul hardfork.
*/
contract ReentrancyGuard {
bool private _notEntered;
constructor () internal {
// Storing an initial non-zero value makes deployment a bit more
// expensive, but in exchange the refund on every call to nonReentrant
// will be lower in amount. Since refunds are capped to a percetange of
// the total transaction's gas, it is best to keep them low in cases
// like this one, to increase the likelihood of the full refund coming
// into effect.
_notEntered = true;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and make it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
// On the first call to nonReentrant, _notEntered will be true
require(_notEntered, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_notEntered = false;
_;
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_notEntered = true;
}
}
// File: @openzeppelin/contracts/crowdsale/Crowdsale.sol
pragma solidity ^0.5.0;
/**
* @title Crowdsale
* @dev Crowdsale is a base contract for managing a token crowdsale,
* allowing investors to purchase tokens with ether. This contract implements
* such functionality in its most fundamental form and can be extended to provide additional
* functionality and/or custom behavior.
* The external interface represents the basic interface for purchasing tokens, and conforms
* the base architecture for crowdsales. It is *not* intended to be modified / overridden.
* The internal interface conforms the extensible and modifiable surface of crowdsales. Override
* the methods to add functionality. Consider using 'super' where appropriate to concatenate
* behavior.
*/
contract Crowdsale is Context, ReentrancyGuard {
using SafeMath for uint256;
using SafeERC20 for IERC20;
// The token being sold
IERC20 private _token;
// Address where funds are collected
address payable private _wallet;
// How many token units a buyer gets per wei.
// The rate is the conversion between wei and the smallest and indivisible token unit.
// So, if you are using a rate of 1 with a ERC20Detailed token with 3 decimals called TOK
// 1 wei will give you 1 unit, or 0.001 TOK.
uint256 private _rate;
// Amount of wei raised
uint256 private _weiRaised;
/**
* Event for token purchase logging
* @param purchaser who paid for the tokens
* @param beneficiary who got the tokens
* @param value weis paid for purchase
* @param amount amount of tokens purchased
*/
event TokensPurchased(address indexed purchaser, address indexed beneficiary, uint256 value, uint256 amount);
/**
* @param rate Number of token units a buyer gets per wei
* @dev The rate is the conversion between wei and the smallest and indivisible
* token unit. So, if you are using a rate of 1 with a ERC20Detailed token
* with 3 decimals called TOK, 1 wei will give you 1 unit, or 0.001 TOK.
* @param wallet Address where collected funds will be forwarded to
* @param token Address of the token being sold
*/
constructor (uint256 rate, address payable wallet, IERC20 token) public {
require(rate > 0, "Crowdsale: rate is 0");
require(wallet != address(0), "Crowdsale: wallet is the zero address");
require(address(token) != address(0), "Crowdsale: token is the zero address");
_rate = rate;
_wallet = wallet;
_token = token;
}
/**
* @dev fallback function ***DO NOT OVERRIDE***
* Note that other contracts will transfer funds with a base gas stipend
* of 2300, which is not enough to call buyTokens. Consider calling
* buyTokens directly when purchasing tokens from a contract.
*/
function () external payable {
buyTokens(_msgSender());
}
/**
* @return the token being sold.
*/
function token() public view returns (IERC20) {
return _token;
}
/**
* @return the address where funds are collected.
*/
function wallet() public view returns (address payable) {
return _wallet;
}
/**
* @return the number of token units a buyer gets per wei.
*/
function rate() public view returns (uint256) {
return _rate;
}
/**
* @return the amount of wei raised.
*/
function weiRaised() public view returns (uint256) {
return _weiRaised;
}
/**
* @dev low level token purchase ***DO NOT OVERRIDE***
* This function has a non-reentrancy guard, so it shouldn't be called by
* another `nonReentrant` function.
* @param beneficiary Recipient of the token purchase
*/
function buyTokens(address beneficiary) public nonReentrant payable {
uint256 weiAmount = msg.value;
_preValidatePurchase(beneficiary, weiAmount);
// calculate token amount to be created
uint256 tokens = _getTokenAmount(weiAmount);
// update state
_weiRaised = _weiRaised.add(weiAmount);
_processPurchase(beneficiary, tokens);
emit TokensPurchased(_msgSender(), beneficiary, weiAmount, tokens);
_updatePurchasingState(beneficiary, weiAmount);
_forwardFunds();
_postValidatePurchase(beneficiary, weiAmount);
}
/**
* @dev Validation of an incoming purchase. Use require statements to revert state when conditions are not met.
* Use `super` in contracts that inherit from Crowdsale to extend their validations.
* Example from CappedCrowdsale.sol's _preValidatePurchase method:
* super._preValidatePurchase(beneficiary, weiAmount);
* require(weiRaised().add(weiAmount) <= cap);
* @param beneficiary Address performing the token purchase
* @param weiAmount Value in wei involved in the purchase
*/
function _preValidatePurchase(address beneficiary, uint256 weiAmount) internal view {
require(beneficiary != address(0), "Crowdsale: beneficiary is the zero address");
require(weiAmount != 0, "Crowdsale: weiAmount is 0");
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
}
/**
* @dev Validation of an executed purchase. Observe state and use revert statements to undo rollback when valid
* conditions are not met.
* @param beneficiary Address performing the token purchase
* @param weiAmount Value in wei involved in the purchase
*/
function _postValidatePurchase(address beneficiary, uint256 weiAmount) internal view {
// solhint-disable-previous-line no-empty-blocks
}
/**
* @dev Source of tokens. Override this method to modify the way in which the crowdsale ultimately gets and sends
* its tokens.
* @param beneficiary Address performing the token purchase
* @param tokenAmount Number of tokens to be emitted
*/
function _deliverTokens(address beneficiary, uint256 tokenAmount) internal {
_token.safeTransfer(beneficiary, tokenAmount);
}
/**
* @dev Executed when a purchase has been validated and is ready to be executed. Doesn't necessarily emit/send
* tokens.
* @param beneficiary Address receiving the tokens
* @param tokenAmount Number of tokens to be purchased
*/
function _processPurchase(address beneficiary, uint256 tokenAmount) internal {
_deliverTokens(beneficiary, tokenAmount);
}
/**
* @dev Override for extensions that require an internal state to check for validity (current user contributions,
* etc.)
* @param beneficiary Address receiving the tokens
* @param weiAmount Value in wei involved in the purchase
*/
function _updatePurchasingState(address beneficiary, uint256 weiAmount) internal {
// solhint-disable-previous-line no-empty-blocks
}
/**
* @dev Override to extend the way in which ether is converted to tokens.
* @param weiAmount Value in wei to be converted into tokens
* @return Number of tokens that can be purchased with the specified _weiAmount
*/
function _getTokenAmount(uint256 weiAmount) internal view returns (uint256) {
return weiAmount.mul(_rate);
}
/**
* @dev Determines how ETH is stored/forwarded on purchases.
*/
function _forwardFunds() internal {
_wallet.transfer(msg.value);
}
}
// File: @openzeppelin/contracts/crowdsale/validation/TimedCrowdsale.sol
pragma solidity ^0.5.0;
/**
* @title TimedCrowdsale
* @dev Crowdsale accepting contributions only within a time frame.
*/
contract TimedCrowdsale is Crowdsale {
using SafeMath for uint256;
uint256 private _openingTime;
uint256 private _closingTime;
/**
* Event for crowdsale extending
* @param newClosingTime new closing time
* @param prevClosingTime old closing time
*/
event TimedCrowdsaleExtended(uint256 prevClosingTime, uint256 newClosingTime);
/**
* @dev Reverts if not in crowdsale time range.
*/
modifier onlyWhileOpen {
require(isOpen(), "TimedCrowdsale: not open");
_;
}
/**
* @dev Constructor, takes crowdsale opening and closing times.
* @param openingTime Crowdsale opening time
* @param closingTime Crowdsale closing time
*/
constructor (uint256 openingTime, uint256 closingTime) public {
// solhint-disable-next-line not-rely-on-time
require(openingTime >= block.timestamp, "TimedCrowdsale: opening time is before current time");
// solhint-disable-next-line max-line-length
require(closingTime > openingTime, "TimedCrowdsale: opening time is not before closing time");
_openingTime = openingTime;
_closingTime = closingTime;
}
/**
* @return the crowdsale opening time.
*/
function openingTime() public view returns (uint256) {
return _openingTime;
}
/**
* @return the crowdsale closing time.
*/
function closingTime() public view returns (uint256) {
return _closingTime;
}
/**
* @return true if the crowdsale is open, false otherwise.
*/
function isOpen() public view returns (bool) {
// solhint-disable-next-line not-rely-on-time
return block.timestamp >= _openingTime && block.timestamp <= _closingTime;
}
/**
* @dev Checks whether the period in which the crowdsale is open has already elapsed.
* @return Whether crowdsale period has elapsed
*/
function hasClosed() public view returns (bool) {
// solhint-disable-next-line not-rely-on-time
return block.timestamp > _closingTime;
}
/**
* @dev Extend parent behavior requiring to be within contributing period.
* @param beneficiary Token purchaser
* @param weiAmount Amount of wei contributed
*/
function _preValidatePurchase(address beneficiary, uint256 weiAmount) internal onlyWhileOpen view {
super._preValidatePurchase(beneficiary, weiAmount);
}
/**
* @dev Extend crowdsale.
* @param newClosingTime Crowdsale closing time
*/
function _extendTime(uint256 newClosingTime) internal {
require(!hasClosed(), "TimedCrowdsale: already closed");
// solhint-disable-next-line max-line-length
require(newClosingTime > _closingTime, "TimedCrowdsale: new closing time is before current closing time");
emit TimedCrowdsaleExtended(_closingTime, newClosingTime);
_closingTime = newClosingTime;
}
}
// File: @openzeppelin/contracts/crowdsale/distribution/FinalizableCrowdsale.sol
pragma solidity ^0.5.0;
/**
* @title FinalizableCrowdsale
* @dev Extension of TimedCrowdsale with a one-off finalization action, where one
* can do extra work after finishing.
*/
contract FinalizableCrowdsale is TimedCrowdsale {
using SafeMath for uint256;
bool private _finalized;
event CrowdsaleFinalized();
constructor () internal {
_finalized = false;
}
/**
* @return true if the crowdsale is finalized, false otherwise.
*/
function finalized() public view returns (bool) {
return _finalized;
}
/**
* @dev Must be called after crowdsale ends, to do some extra finalization
* work. Calls the contract's finalization function.
*/
function finalize() public {
require(!_finalized, "FinalizableCrowdsale: already finalized");
require(hasClosed(), "FinalizableCrowdsale: not closed");
_finalized = true;
_finalization();
emit CrowdsaleFinalized();
}
/**
* @dev Can be overridden to add finalization logic. The overriding function
* should call super._finalization() to ensure the chain of finalization is
* executed entirely.
*/
function _finalization() internal {
// solhint-disable-previous-line no-empty-blocks
}
}
// File: contracts/SeedSwap.sol
pragma solidity 0.5.11;
/// @dev SeedSwap contract for presale TEA token
/// Some notations:
/// dAmount - distributed token amount
/// uAmount - undistributed token amount
/// tAmount - token amount
/// eAmount - eth amount
contract SeedSwap is WhitelistExtension, ReentrancyGuard {
using SafeERC20 for IERC20;
using SafeMath for uint256;
using SafeMath for uint80;
IERC20 public constant ETH_ADDRESS = IERC20(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE);
uint256 public constant MAX_UINT_80 = 2**79 - 1;
uint256 public constant HARD_CAP = 320 ether;
uint256 public constant MIN_INDIVIDUAL_CAP = 1 ether;
uint256 public constant MAX_INDIVIDUAL_CAP = 10 ether;
// user can call to distribute tokens after WITHDRAWAL_DEADLINE + saleEndTime
uint256 public constant WITHDRAWAL_DEADLINE = 180 days;
uint256 public constant SAFE_DISTRIBUTE_NUMBER = 150; // safe to distribute to 150 users at once
uint256 public constant DISTRIBUTE_PERIOD_UNIT = 1 days;
IERC20 public saleToken;
uint256 public saleStartTime = 1609693200; // 00:00:00, 4 Jan 2021 GMT+7
uint256 public saleEndTime = 1610384340; // 23:59:00, 11 Jan 2021 GMT+7
uint256 public saleRate = 25000; // 1 eth = 25,000 token
// address to receive eth of presale, default owner
address payable public ethRecipient;
// total eth and token amounts that all users have swapped
struct TotalSwappedData {
uint128 eAmount;
uint128 tAmount;
}
TotalSwappedData public totalData;
uint256 public totalDistributedToken = 0;
struct SwapData {
address user;
uint80 eAmount; // eth amount
uint80 tAmount; // token amount
uint80 dAmount; // distributed token amount
uint16 daysID;
}
// all swaps that are made by users
SwapData[] public listSwaps;
// list indices of user's swaps in listSwaps array
mapping(address => uint256[]) public userSwapData;
mapping(address => address) public userTokenRecipient;
event SwappedEthToTea(
address indexed trader,
uint256 indexed ethAmount,
uint256 indexed teaAmount,
uint256 blockTimestamp,
uint16 daysID
);
event UpdateSaleTimes(
uint256 indexed newStartTime,
uint256 newEndTime
);
event UpdateSaleRate(uint256 indexed newSaleRate);
event UpdateEthRecipient(address indexed newRecipient);
event Distributed(
address indexed user,
address indexed recipient,
uint256 dAmount,
uint256 indexed percentage,
uint256 timestamp
);
event SelfWithdrawToken(
address indexed sender,
address indexed recipient,
uint256 indexed dAmount,
uint256 timestamp
);
event EmergencyOwnerWithdraw(
address indexed sender,
IERC20 indexed token,
uint256 amount
);
event UpdatedTokenRecipient(
address user,
address recipient
);
modifier whenNotStarted() {
require(block.timestamp < saleStartTime, "already started");
_;
}
modifier whenNotEnded() {
require(block.timestamp <= saleEndTime, "already ended");
_;
}
modifier whenEnded() {
require(block.timestamp > saleEndTime, "not ended yet");
_;
}
modifier onlyValidPercentage(uint256 percentage) {
require(0 < percentage && percentage <= 100, "percentage out of range");
_;
}
/// @dev Conditions:
/// 1. sale must be in progress
/// 2. hard cap is not reached yet
/// 3. user's total swapped eth amount is within individual caps
/// 4. user is whitelisted
/// 5. if total eth amount after the swap is higher than hard cap, still allow
/// Note: _paused is checked independently.
modifier onlyCanSwap(uint256 ethAmount) {
require(ethAmount > 0, "onlyCanSwap: amount is 0");
// check sale is in progress
uint256 timestamp = block.timestamp;
require(timestamp >= saleStartTime, "onlyCanSwap: not started yet");
require(timestamp <= saleEndTime, "onlyCanSwap: already ended");
// check hardcap is not reached
require(totalData.eAmount < HARD_CAP, "onlyCanSwap: HARD_CAP reached");
address sender = msg.sender;
// check whitelisted
require(isWhitelisted(sender), "onlyCanSwap: sender is not whitelisted");
// check total user's swap eth amount is within individual cap
(uint80 userEthAmount, ,) = _getUserSwappedAmount(sender);
uint256 totalEthAmount = ethAmount.add(uint256(userEthAmount));
require(
totalEthAmount >= MIN_INDIVIDUAL_CAP,
"onlyCanSwap: eth amount is lower than min individual cap"
);
require(
totalEthAmount <= MAX_INDIVIDUAL_CAP,
"onlyCapSwap: max individual cap reached"
);
_;
}
constructor(address payable _owner, IERC20 _token) public {
require(_token != IERC20(0), "constructor: invalid token");
// (safe) check timestamp
// assert(block.timestamp < saleStartTime);
assert(saleStartTime < saleEndTime);
saleToken = _token;
ethRecipient = _owner;
// add owner as whitelisted admin and transfer ownership if needed
if (msg.sender != _owner) {
_addWhitelistAdmin(_owner);
transferOwnership(_owner);
}
}
function () external payable {
swapEthToToken();
}
/// ================ UPDATE DEFAULT DATA ====================
/// @dev the owner can update start and end times when it is not yet started
function updateSaleTimes(uint256 _newStartTime, uint256 _newEndTime)
external whenNotStarted onlyOwner
{
if (_newStartTime != 0) saleStartTime = _newStartTime;
if (_newEndTime != 0) saleEndTime = _newEndTime;
require(saleStartTime < saleEndTime, "Times: invalid start and end time");
require(block.timestamp < saleStartTime, "Times: invalid start time");
emit UpdateSaleTimes(saleStartTime, saleEndTime);
}
/// @dev the owner can update the sale rate whenever the sale is not ended yet
function updateSaleRate(uint256 _newsaleRate)
external whenNotEnded onlyOwner
{
require(
_newsaleRate < MAX_UINT_80 / MAX_INDIVIDUAL_CAP,
"Rates: new rate is out of range"
);
// safe check rate not different more than 50% than the current rate
require(_newsaleRate >= saleRate / 2, "Rates: new rate too low");
require(_newsaleRate <= saleRate * 3 / 2, "Rates: new rate too high");
saleRate = _newsaleRate;
emit UpdateSaleRate(_newsaleRate);
}
/// @dev the owner can update the recipient of eth any time
function updateEthRecipientAddress(address payable _newRecipient)
external onlyOwner
{
require(_newRecipient != address(0), "Receipient: invalid eth recipient address");
ethRecipient = _newRecipient;
emit UpdateEthRecipient(_newRecipient);
}
/// ================ SWAP ETH TO TEA TOKEN ====================
/// @dev user can call this function to swap eth to TEA token
/// or just deposit eth directly to the contract
function swapEthToToken()
public payable
nonReentrant
whenNotPaused
onlyCanSwap(msg.value)
returns (uint256 tokenAmount)
{
address sender = msg.sender;
uint256 ethAmount = msg.value;
tokenAmount = _getTokenAmount(ethAmount);
// should pass the check that presale has started, so no underflow here
uint256 daysID = (block.timestamp - saleStartTime) / DISTRIBUTE_PERIOD_UNIT;
assert(daysID < 2**16); // should have only few days for presale
// record new swap
SwapData memory _swapData = SwapData({
user: sender,
eAmount: uint80(ethAmount),
tAmount: uint80(tokenAmount),
dAmount: uint80(0),
daysID: uint16(daysID)
});
listSwaps.push(_swapData);
// update user swap data
userSwapData[sender].push(listSwaps.length - 1);
// update total swap eth and token amounts
TotalSwappedData memory swappedData = totalData;
totalData = TotalSwappedData({
eAmount: swappedData.eAmount + uint128(ethAmount),
tAmount: swappedData.tAmount + uint128(tokenAmount)
});
// transfer eth to recipient
ethRecipient.transfer(ethAmount);
emit SwappedEthToTea(sender, ethAmount, tokenAmount, block.timestamp, uint16(daysID));
}
/// ================ DISTRIBUTE TOKENS ====================
/// @dev admin can call this function to perform distribute to all eligible swaps
/// @param percentage percentage of undistributed amount will be distributed
/// @param daysID only distribute for swaps that were made at that day from start
function distributeAll(uint256 percentage, uint16 daysID)
external onlyWhitelistAdmin whenEnded whenNotPaused onlyValidPercentage(percentage)
returns (uint256 totalAmount)
{
for(uint256 i = 0; i < listSwaps.length; i++) {
if (listSwaps[i].daysID == daysID) {
totalAmount += _distributedToken(i, percentage);
}
}
totalDistributedToken = totalDistributedToken.add(totalAmount);
}
/// @dev admin can also use this function to distribute by batch,
/// in case distributeAll can be out of gas
/// @param percentage percentage of undistributed amount will be distributed
/// @param ids list of ids in the listSwaps to be distributed
function distributeBatch(uint256 percentage, uint256[] calldata ids)
external onlyWhitelistAdmin whenEnded whenNotPaused onlyValidPercentage(percentage)
returns (uint256 totalAmount)
{
uint256 len = listSwaps.length;
for(uint256 i = 0; i < ids.length; i++) {
require(ids[i] < len, "Distribute: invalid id");
// safe prevent duplicated ids in 1 batch
if (i > 0) require(ids[i - 1] < ids[i], "Distribute: indices are not in order");
totalAmount += _distributedToken(ids[i], percentage);
}
totalDistributedToken = totalDistributedToken.add(totalAmount);
}
/// ================ EMERGENCY FOR USER AND OWNER ====================
/// @dev in case after WITHDRAWAL_DEADLINE from end sale time
/// user can call this function to claim all of their tokens
/// also update user's swap records
function selfWithdrawToken() external returns (uint256 tokenAmount) {
require(
block.timestamp > WITHDRAWAL_DEADLINE + saleEndTime,
"Emergency: not open for emergency withdrawal"
);
address sender = msg.sender;
(, uint80 tAmount, uint80 dAmount) = _getUserSwappedAmount(sender);
tokenAmount = tAmount.sub(dAmount);
require(tokenAmount > 0, "Emergency: user has claimed all tokens");
require(
tokenAmount <= saleToken.balanceOf(address(this)),
"Emergency: not enough token to distribute"
);
// update each user's record
uint256[] memory ids = userSwapData[sender];
for(uint256 i = 0; i < ids.length; i++) {
// safe check
assert(listSwaps[ids[i]].user == sender);
// update distributed amount for each swap data
listSwaps[ids[i]].dAmount = listSwaps[ids[i]].tAmount;
}
totalDistributedToken = totalDistributedToken.add(tokenAmount);
// transfer token to user
address recipient = _transferToken(sender, tokenAmount);
emit SelfWithdrawToken(sender, recipient, tokenAmount, block.timestamp);
}
/// @dev emergency to allow owner withdraw eth or tokens inside the contract
/// in case anything happens
function emergencyOwnerWithdraw(IERC20 token, uint256 amount) external onlyOwner {
if (token == ETH_ADDRESS) {
// whenever someone transfer eth to this contract
// it will either to the swap or revert
// so there should be no eth inside the contract
msg.sender.transfer(amount);
} else {
token.safeTransfer(msg.sender, amount);
}
emit EmergencyOwnerWithdraw(msg.sender, token, amount);
}
/// @dev only in case user has lost their wallet, or wrongly send eth from third party platforms
function updateUserTokenRecipient(address user, address recipient) external onlyOwner {
require(recipient != address(0), "invalid recipient");
userTokenRecipient[user] = recipient;
emit UpdatedTokenRecipient(user, recipient);
}
/// ================ GETTERS ====================
function getNumberSwaps() external view returns (uint256) {
return listSwaps.length;
}
function getAllSwaps()
external view
returns (
address[] memory users,
uint80[] memory ethAmounts,
uint80[] memory tokenAmounts,
uint80[] memory distributedAmounts,
uint16[] memory daysIDs
)
{
uint256 len = listSwaps.length;
users = new address[](len);
ethAmounts = new uint80[](len);
tokenAmounts = new uint80[](len);
distributedAmounts = new uint80[](len);
daysIDs = new uint16[](len);
for(uint256 i = 0; i < len; i++) {
SwapData memory data = listSwaps[i];
users[i] = data.user;
ethAmounts[i] = data.eAmount;
tokenAmounts[i] = data.tAmount;
distributedAmounts[i] = data.dAmount;
daysIDs[i] = data.daysID;
}
}
/// @dev return full details data of a user
function getUserSwapData(address user)
external view
returns (
address tokenRecipient,
uint256 totalEthAmount,
uint80 totalTokenAmount,
uint80 distributedAmount,
uint80 remainingAmount,
uint80[] memory ethAmounts,
uint80[] memory tokenAmounts,
uint80[] memory distributedAmounts,
uint16[] memory daysIDs
)
{
tokenRecipient = _getRecipient(user);
(totalEthAmount, totalTokenAmount, distributedAmount) = _getUserSwappedAmount(user);
remainingAmount = totalTokenAmount - distributedAmount;
// record of all user's swaps
uint256[] memory swapDataIDs = userSwapData[user];
ethAmounts = new uint80[](swapDataIDs.length);
tokenAmounts = new uint80[](swapDataIDs.length);
distributedAmounts = new uint80[](swapDataIDs.length);
daysIDs = new uint16[](swapDataIDs.length);
for(uint256 i = 0; i < swapDataIDs.length; i++) {
ethAmounts[i] = listSwaps[swapDataIDs[i]].eAmount;
tokenAmounts[i] = listSwaps[swapDataIDs[i]].tAmount;
distributedAmounts[i] = listSwaps[swapDataIDs[i]].dAmount;
daysIDs[i] = listSwaps[swapDataIDs[i]].daysID;
}
}
function getData()
external view
returns(
uint256 _startTime,
uint256 _endTime,
uint256 _rate,
address _ethRecipient,
uint128 _tAmount,
uint128 _eAmount,
uint256 _hardcap
)
{
_startTime = saleStartTime;
_endTime = saleEndTime;
_rate = saleRate;
_ethRecipient = ethRecipient;
_tAmount = totalData.tAmount;
_eAmount = totalData.eAmount;
_hardcap = HARD_CAP;
}
/// @dev returns list of users and distributed amounts if user calls distributeAll function
/// in case anything is wrong, it will fail and not return anything
/// @param percentage percentage of undistributed amount will be distributed
/// @param daysID only distribute for swaps that were made at daysID from start
function estimateDistributedAllData(
uint80 percentage,
uint16 daysID
)
external view
whenEnded
whenNotPaused
onlyValidPercentage(percentage)
returns(
bool isSafe,
uint256 totalUsers,
uint256 totalDistributingAmount,
uint256[] memory selectedIds,
address[] memory users,
address[] memory recipients,
uint80[] memory distributingAmounts,
uint16[] memory daysIDs
)
{
// count number of data that can be distributed
totalUsers = 0;
for(uint256 i = 0; i < listSwaps.length; i++) {
if (listSwaps[i].daysID == daysID && listSwaps[i].tAmount > listSwaps[i].dAmount) {
totalUsers += 1;
}
}
// return data that will be used to distribute
selectedIds = new uint256[](totalUsers);
users = new address[](totalUsers);
recipients = new address[](totalUsers);
distributingAmounts = new uint80[](totalUsers);
daysIDs = new uint16[](totalUsers);
uint256 counter = 0;
for(uint256 i = 0; i < listSwaps.length; i++) {
SwapData memory data = listSwaps[i];
if (listSwaps[i].daysID == daysID && listSwaps[i].tAmount > listSwaps[i].dAmount) {
selectedIds[counter] = i;
users[counter] = data.user;
recipients[counter] = _getRecipient(data.user);
// don't need to use SafeMath here
distributingAmounts[counter] = data.tAmount * percentage / 100;
require(
distributingAmounts[counter] + data.dAmount <= data.tAmount,
"Estimate: total distribute more than 100%"
);
daysIDs[counter] = listSwaps[i].daysID;
totalDistributingAmount += distributingAmounts[counter];
counter += 1;
}
}
require(
totalDistributingAmount <= saleToken.balanceOf(address(this)),
"Estimate: not enough token balance"
);
isSafe = totalUsers <= SAFE_DISTRIBUTE_NUMBER;
}
/// @dev returns list of users and distributed amounts if user calls distributeBatch function
/// in case anything is wrong, it will fail and not return anything
/// @param percentage percentage of undistributed amount will be distributed
/// @param ids list indices to distribute in listSwaps
/// ids must be in asc order
function estimateDistributedBatchData(
uint80 percentage,
uint256[] calldata ids
)
external view
whenEnded
whenNotPaused
onlyValidPercentage(percentage)
returns(
bool isSafe,
uint256 totalUsers,
uint256 totalDistributingAmount,
uint256[] memory selectedIds,
address[] memory users,
address[] memory recipients,
uint80[] memory distributingAmounts,
uint16[] memory daysIDs
)
{
totalUsers = 0;
for(uint256 i = 0; i < ids.length; i++) {
require(ids[i] < listSwaps.length, "Estimate: id out of range");
if (i > 0) require(ids[i] > ids[i - 1], "Estimate: duplicated ids");
// has undistributed amount
if (listSwaps[i].tAmount > listSwaps[i].dAmount) totalUsers += 1;
}
// return data that will be used to distribute
selectedIds = new uint256[](totalUsers);
users = new address[](totalUsers);
recipients = new address[](totalUsers);
distributingAmounts = new uint80[](totalUsers);
daysIDs = new uint16[](totalUsers);
uint256 counter = 0;
for(uint256 i = 0; i < ids.length; i++) {
if (listSwaps[i].tAmount <= listSwaps[i].dAmount) continue;
SwapData memory data = listSwaps[ids[i]];
selectedIds[counter] = ids[i];
users[counter] = data.user;
recipients[counter] = _getRecipient(data.user);
// don't need to use SafeMath here
distributingAmounts[counter] = data.tAmount * percentage / 100;
require(
distributingAmounts[counter] + data.dAmount <= data.tAmount,
"Estimate: total distribute more than 100%"
);
totalDistributingAmount += distributingAmounts[counter];
daysIDs[counter] = listSwaps[i].daysID;
counter += 1;
}
require(
totalDistributingAmount <= saleToken.balanceOf(address(this)),
"Estimate: not enough token balance"
);
isSafe = totalUsers <= SAFE_DISTRIBUTE_NUMBER;
}
/// @dev calculate amount token to distribute and send to user
function _distributedToken(uint256 id, uint256 percentage)
internal
returns (uint256 distributingAmount)
{
SwapData memory data = listSwaps[id];
distributingAmount = uint256(data.tAmount).mul(percentage).div(100);
require(
distributingAmount.add(data.dAmount) <= data.tAmount,
"Distribute: total distribute more than 100%"
);
// percentage > 0, data.tAmount > 0
assert (distributingAmount > 0);
require(
distributingAmount <= saleToken.balanceOf(address(this)),
"Distribute: not enough token to distribute"
);
// no overflow, so don't need to use SafeMath here
listSwaps[id].dAmount += uint80(distributingAmount);
// send token to user's wallet
address recipient = _transferToken(data.user, distributingAmount);
emit Distributed(data.user, recipient, distributingAmount, percentage, block.timestamp);
}
function _transferToken(address user, uint256 amount) internal returns (address recipient) {
recipient = _getRecipient(user);
// safe check
assert(recipient != address(0));
saleToken.safeTransfer(recipient, amount);
}
function _getRecipient(address user) internal view returns(address recipient) {
recipient = userTokenRecipient[user];
if (recipient == address(0)) {
recipient = user;
}
}
/// @dev return received tokenAmount given ethAmount
/// note that token decimals is 18
function _getTokenAmount(uint256 ethAmount) internal view returns (uint256) {
return ethAmount.mul(saleRate);
}
function _getUserSwappedAmount(address sender)
internal view returns(
uint80 eAmount,
uint80 tAmount,
uint80 dAmount
)
{
uint256[] memory ids = userSwapData[sender];
for(uint256 i = 0; i < ids.length; i++) {
SwapData memory data = listSwaps[ids[i]];
eAmount += data.eAmount;
tAmount += data.tAmount;
dAmount += data.dAmount;
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"constant":false,"inputs":[],"name":"selfWithdrawToken","outputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_newStartTime","type":"uint256"},{"internalType":"uint256","name":"_newEndTime","type":"uint256"}],"name":"updateSaleTimes","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addWhitelisted","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalData","outputs":[{"internalType":"uint128","name":"eAmount","type":"uint128"},{"internalType":"uint128","name":"tAmount","type":"uint128"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_INDIVIDUAL_CAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"saleStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeWhitelisted","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userTokenRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"HARD_CAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getData","outputs":[{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_endTime","type":"uint256"},{"internalType":"uint256","name":"_rate","type":"uint256"},{"internalType":"address","name":"_ethRecipient","type":"address"},{"internalType":"uint128","name":"_tAmount","type":"uint128"},{"internalType":"uint128","name":"_eAmount","type":"uint128"},{"internalType":"uint256","name":"_hardcap","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"saleRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userSwapData","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceWhitelistAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"_newRecipient","type":"address"}],"name":"updateEthRecipientAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ethRecipient","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"admins","type":"address[]"},{"internalType":"bool","name":"isAdd","type":"bool"}],"name":"updateWhitelistedAdmins","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addWhitelistAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"DISTRIBUTE_PERIOD_UNIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"swapEthToToken","outputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"recipient","type":"address"}],"name":"updateUserTokenRecipient","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_newsaleRate","type":"uint256"}],"name":"updateSaleRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint80","name":"percentage","type":"uint80"},{"internalType":"uint16","name":"daysID","type":"uint16"}],"name":"estimateDistributedAllData","outputs":[{"internalType":"bool","name":"isSafe","type":"bool"},{"internalType":"uint256","name":"totalUsers","type":"uint256"},{"internalType":"uint256","name":"totalDistributingAmount","type":"uint256"},{"internalType":"uint256[]","name":"selectedIds","type":"uint256[]"},{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint80[]","name":"distributingAmounts","type":"uint80[]"},{"internalType":"uint16[]","name":"daysIDs","type":"uint16[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"WITHDRAWAL_DEADLINE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"bool","name":"isAdd","type":"bool"}],"name":"updateWhitelistedUsers","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint80","name":"percentage","type":"uint80"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"estimateDistributedBatchData","outputs":[{"internalType":"bool","name":"isSafe","type":"bool"},{"internalType":"uint256","name":"totalUsers","type":"uint256"},{"internalType":"uint256","name":"totalDistributingAmount","type":"uint256"},{"internalType":"uint256[]","name":"selectedIds","type":"uint256[]"},{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint80[]","name":"distributingAmounts","type":"uint80[]"},{"internalType":"uint16[]","name":"daysIDs","type":"uint16[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ETH_ADDRESS","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"emergencyOwnerWithdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_UINT_80","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"listSwaps","outputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint80","name":"eAmount","type":"uint80"},{"internalType":"uint80","name":"tAmount","type":"uint80"},{"internalType":"uint80","name":"dAmount","type":"uint80"},{"internalType":"uint16","name":"daysID","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isWhitelistAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"distributeBatch","outputs":[{"internalType":"uint256","name":"totalAmount","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceWhitelisted","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getAllSwaps","outputs":[{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"uint80[]","name":"ethAmounts","type":"uint80[]"},{"internalType":"uint80[]","name":"tokenAmounts","type":"uint80[]"},{"internalType":"uint80[]","name":"distributedAmounts","type":"uint80[]"},{"internalType":"uint16[]","name":"daysIDs","type":"uint16[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getNumberSwaps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalDistributedToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserSwapData","outputs":[{"internalType":"address","name":"tokenRecipient","type":"address"},{"internalType":"uint256","name":"totalEthAmount","type":"uint256"},{"internalType":"uint80","name":"totalTokenAmount","type":"uint80"},{"internalType":"uint80","name":"distributedAmount","type":"uint80"},{"internalType":"uint80","name":"remainingAmount","type":"uint80"},{"internalType":"uint80[]","name":"ethAmounts","type":"uint80[]"},{"internalType":"uint80[]","name":"tokenAmounts","type":"uint80[]"},{"internalType":"uint80[]","name":"distributedAmounts","type":"uint80[]"},{"internalType":"uint16[]","name":"daysIDs","type":"uint16[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"saleToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"saleEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"SAFE_DISTRIBUTE_NUMBER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"},{"internalType":"uint16","name":"daysID","type":"uint16"}],"name":"distributeAll","outputs":[{"internalType":"uint256","name":"totalAmount","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"MIN_INDIVIDUAL_CAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_owner","type":"address"},{"internalType":"contract IERC20","name":"_token","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"trader","type":"address"},{"indexed":true,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"teaAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blockTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint16","name":"daysID","type":"uint16"}],"name":"SwappedEthToTea","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newStartTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newEndTime","type":"uint256"}],"name":"UpdateSaleTimes","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newSaleRate","type":"uint256"}],"name":"UpdateSaleRate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newRecipient","type":"address"}],"name":"UpdateEthRecipient","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"dAmount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"percentage","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Distributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":true,"internalType":"uint256","name":"dAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"SelfWithdrawToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyOwnerWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"}],"name":"UpdatedTokenRecipient","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistedAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistedRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistAdminAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistAdminRemoved","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"}]Contract Creation Code
6080604052635ff1f810600455635ffc83d46005556161a860065560006009553480156200002c57600080fd5b506040516200531f3803806200531f833981810160405260408110156200005257600080fd5b5080516020909101516000620000706001600160e01b03620001d916565b600080546001600160a01b0319166001600160a01b038316908117825560405192935091600080516020620052dd833981519152908290a350620000cf620000c06001600160e01b03620001d916565b6001600160e01b03620001dd16565b6003805461ffff19166101001790556001600160a01b0381166200015457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f636f6e7374727563746f723a20696e76616c696420746f6b656e000000000000604482015290519081900360640190fd5b600554600454106200016257fe5b600380546001600160a01b03808416620100000262010000600160b01b031990921691909117909155600780549184166001600160a01b0319909216821790553314620001d157620001bd826001600160e01b03620001dd16565b620001d1826001600160e01b036200022f16565b5050620004c9565b3390565b620001f8816001620002c560201b620046bf1790919060201c565b6040516001600160a01b038216907f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129990600090a250565b620002426001600160e01b036200036c16565b620002ae57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b620002c2816001600160e01b036200039b16565b50565b620002da82826001600160e01b036200044616565b156200034757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b600080546001600160a01b03166200038c6001600160e01b03620001d916565b6001600160a01b031614905090565b6001600160a01b038116620003fc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180620052b76026913960400191505060405180910390fd5b600080546040516001600160a01b0380851693921691600080516020620052dd83398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b038216620004a9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180620052fd6022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b614dde80620004d96000396000f3fe6080604052600436106102ae5760003560e01c80638da5cb5b11610175578063bb5f747b116100dc578063e7ad320911610095578063f2fde38b1161006f578063f2fde38b14610f29578063f7ea117e14610f5c578063f8a9799f14610f71578063fcab30a514610fa5576102ae565b8063e7ad320914610d62578063e985e36714610eff578063ed338ff114610f14576102ae565b8063bb5f747b14610af1578063bbbd92a114610b24578063d6cd947314610ba6578063d6cfeae014610bbb578063d90a77a014610d38578063deaa931114610d4d576102ae565b8063a15754441161012e578063a15754441461097f578063a734f06e14610a0a578063ab2563d914610a1f578063b187bd2614610a58578063b400510614610a6d578063b88356db14610a82576102ae565b80638da5cb5b146106db5780638f32d59b146106f0578063910d85741461070557806396594bf01461072f5780639958c052146108ed5780639aebde6e14610902576102ae565b806340557cf111610219578063715018a6116101d2578063715018a6146106265780637362d9c81461063b57806373845fed1461066e57806375c9f3ac1461068357806382182ab91461068b5780638456cb59146106c6576102ae565b806340557cf1146104fe5780634c4506fb146105135780634c5a628c1461054c578063513c29b514610561578063581379fd146105945780636bbaab78146105a9576102ae565b8063291d95491161026b578063291d9549146103aa57806330114a65146103dd5780633a03171c1461042c5780633af32abf146104415780633bc5de30146104885780633f4ba83a146104e9576102ae565b806307a3dff6146102b957806309d8ef27146102e057806310154bad146103125780631042620b14610345578063137df7e3146103805780631cbaee2d14610395575b6102b6610fba565b50005b3480156102c557600080fd5b506102ce61167d565b60408051918252519081900360200190f35b3480156102ec57600080fd5b506103106004803603604081101561030357600080fd5b50803590602001356119db565b005b34801561031e57600080fd5b506103106004803603602081101561033557600080fd5b50356001600160a01b0316611b56565b34801561035157600080fd5b5061035a611bad565b604080516001600160801b03938416815291909216602082015281519081900390910190f35b34801561038c57600080fd5b506102ce611bc7565b3480156103a157600080fd5b506102ce611bd3565b3480156103b657600080fd5b50610310600480360360208110156103cd57600080fd5b50356001600160a01b0316611bd9565b3480156103e957600080fd5b506104106004803603602081101561040057600080fd5b50356001600160a01b0316611c28565b604080516001600160a01b039092168252519081900360200190f35b34801561043857600080fd5b506102ce611c43565b34801561044d57600080fd5b506104746004803603602081101561046457600080fd5b50356001600160a01b0316611c50565b604080519115158252519081900360200190f35b34801561049457600080fd5b5061049d611c6b565b604080519788526020880196909652868601949094526001600160a01b0390921660608601526001600160801b0390811660808601521660a084015260c0830152519081900360e00190f35b3480156104f557600080fd5b50610310611cae565b34801561050a57600080fd5b506102ce611d77565b34801561051f57600080fd5b506102ce6004803603604081101561053657600080fd5b506001600160a01b038135169060200135611d7d565b34801561055857600080fd5b50610310611dab565b34801561056d57600080fd5b506103106004803603602081101561058457600080fd5b50356001600160a01b0316611dbd565b3480156105a057600080fd5b50610410611e93565b3480156105b557600080fd5b50610310600480360360408110156105cc57600080fd5b810190602081018135600160201b8111156105e657600080fd5b8201836020820111156105f857600080fd5b803590602001918460208302840111600160201b8311171561061957600080fd5b9193509150351515611ea2565b34801561063257600080fd5b50610310611f91565b34801561064757600080fd5b506103106004803603602081101561065e57600080fd5b50356001600160a01b0316612022565b34801561067a57600080fd5b506102ce612071565b6102ce610fba565b34801561069757600080fd5b50610310600480360360408110156106ae57600080fd5b506001600160a01b0381358116916020013516612078565b3480156106d257600080fd5b5061031061217b565b3480156106e757600080fd5b50610410612244565b3480156106fc57600080fd5b50610474612253565b34801561071157600080fd5b506103106004803603602081101561072857600080fd5b5035612277565b34801561073b57600080fd5b5061076c6004803603604081101561075257600080fd5b5080356001600160501b0316906020013561ffff16612453565b6040518089151515158152602001888152602001878152602001806020018060200180602001806020018060200186810386528b818151815260200191508051906020019060200280838360005b838110156107d25781810151838201526020016107ba565b5050505090500186810385528a818151815260200191508051906020019060200280838360005b838110156108115781810151838201526020016107f9565b50505050905001868103845289818151815260200191508051906020019060200280838360005b83811015610850578181015183820152602001610838565b50505050905001868103835288818151815260200191508051906020019060200280838360005b8381101561088f578181015183820152602001610877565b50505050905001868103825287818151815260200191508051906020019060200280838360005b838110156108ce5781810151838201526020016108b6565b505050509050019d505050505050505050505050505060405180910390f35b3480156108f957600080fd5b506102ce612aae565b34801561090e57600080fd5b506103106004803603604081101561092557600080fd5b810190602081018135600160201b81111561093f57600080fd5b82018360208201111561095157600080fd5b803590602001918460208302840111600160201b8311171561097257600080fd5b9193509150351515612ab5565b34801561098b57600080fd5b5061076c600480360360408110156109a257600080fd5b6001600160501b038235169190810190604081016020820135600160201b8111156109cc57600080fd5b8201836020820111156109de57600080fd5b803590602001918460208302840111600160201b831117156109ff57600080fd5b509092509050612b9d565b348015610a1657600080fd5b50610410613291565b348015610a2b57600080fd5b5061031060048036036040811015610a4257600080fd5b506001600160a01b0381351690602001356132a9565b348015610a6457600080fd5b506104746133a6565b348015610a7957600080fd5b506102ce6133af565b348015610a8e57600080fd5b50610aac60048036036020811015610aa557600080fd5b50356133bd565b604080516001600160a01b0390961686526001600160501b039485166020870152928416858401529216606084015261ffff9091166080830152519081900360a00190f35b348015610afd57600080fd5b5061047460048036036020811015610b1457600080fd5b50356001600160a01b031661341a565b348015610b3057600080fd5b506102ce60048036036040811015610b4757600080fd5b81359190810190604081016020820135600160201b811115610b6857600080fd5b820183602082011115610b7a57600080fd5b803590602001918460208302840111600160201b83111715610b9b57600080fd5b50909250905061342d565b348015610bb257600080fd5b5061031061367a565b348015610bc757600080fd5b50610bd061368a565b60405180806020018060200180602001806020018060200186810386528b818151815260200191508051906020019060200280838360005b83811015610c20578181015183820152602001610c08565b5050505090500186810385528a818151815260200191508051906020019060200280838360005b83811015610c5f578181015183820152602001610c47565b50505050905001868103845289818151815260200191508051906020019060200280838360005b83811015610c9e578181015183820152602001610c86565b50505050905001868103835288818151815260200191508051906020019060200280838360005b83811015610cdd578181015183820152602001610cc5565b50505050905001868103825287818151815260200191508051906020019060200280838360005b83811015610d1c578181015183820152602001610d04565b505050509050019a505050505050505050505060405180910390f35b348015610d4457600080fd5b506102ce61390a565b348015610d5957600080fd5b506102ce613910565b348015610d6e57600080fd5b50610d9560048036036020811015610d8557600080fd5b50356001600160a01b0316613916565b604051808a6001600160a01b03166001600160a01b03168152602001898152602001886001600160501b03166001600160501b03168152602001876001600160501b03166001600160501b03168152602001866001600160501b03166001600160501b0316815260200180602001806020018060200180602001858103855289818151815260200191508051906020019060200280838360005b83811015610e47578181015183820152602001610e2f565b50505050905001858103845288818151815260200191508051906020019060200280838360005b83811015610e86578181015183820152602001610e6e565b50505050905001858103835287818151815260200191508051906020019060200280838360005b83811015610ec5578181015183820152602001610ead565b50505050919091018681038352875181528751602091820192508189019102808383600083156108ce5781810151838201526020016108b6565b348015610f0b57600080fd5b50610410613c46565b348015610f2057600080fd5b506102ce613c5b565b348015610f3557600080fd5b5061031060048036036020811015610f4c57600080fd5b50356001600160a01b0316613c61565b348015610f6857600080fd5b506102ce613cb1565b348015610f7d57600080fd5b506102ce60048036036040811015610f9457600080fd5b508035906020013561ffff16613cb6565b348015610fb157600080fd5b506102ce613e5b565b600354600090610100900460ff16611019576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6003805461ff0019811690915560ff1615611064576040805162461bcd60e51b81526020600482015260066024820152651c185d5cd95960d21b604482015290519081900360640190fd5b34600081116110ba576040805162461bcd60e51b815260206004820152601860248201527f6f6e6c7943616e537761703a20616d6f756e7420697320300000000000000000604482015290519081900360640190fd5b6004544290811015611113576040805162461bcd60e51b815260206004820152601c60248201527f6f6e6c7943616e537761703a206e6f7420737461727465642079657400000000604482015290519081900360640190fd5b60055481111561116a576040805162461bcd60e51b815260206004820152601a60248201527f6f6e6c7943616e537761703a20616c726561647920656e646564000000000000604482015290519081900360640190fd5b600854681158e460913d0000006001600160801b03909116106111d4576040805162461bcd60e51b815260206004820152601d60248201527f6f6e6c7943616e537761703a20484152445f4341502072656163686564000000604482015290519081900360640190fd5b336111de81611c50565b6112195760405162461bcd60e51b8152600401808060200182810382526026815260200180614b636026913960400191505060405180910390fd5b600061122482613e67565b5090915060009050611245856001600160501b03841663ffffffff613fa116565b9050670de0b6b3a764000081101561128e5760405162461bcd60e51b8152600401808060200182810382526038815260200180614aae6038913960400191505060405180910390fd5b678ac7230489e800008111156112d55760405162461bcd60e51b8152600401808060200182810382526027815260200180614b106027913960400191505060405180910390fd5b33346112e081614004565b97506000620151806004544203816112f457fe5b04905062010000811061130357fe5b61130b614a42565b6040518060a00160405280856001600160a01b03168152602001846001600160501b031681526020018b6001600160501b0316815260200160006001600160501b031681526020018361ffff168152509050600a819080600181540180825580915050906001820390600052602060002090600202016000909192909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a8154816001600160501b0302191690836001600160501b0316021790555060408201518160010160006101000a8154816001600160501b0302191690836001600160501b03160217905550606082015181600101600a6101000a8154816001600160501b0302191690836001600160501b0316021790555060808201518160010160146101000a81548161ffff021916908361ffff160217905550505050600b6000856001600160a01b03166001600160a01b031681526020019081526020016000206001600a805490500390806001815401808255809150509060018203906000526020600020016000909192909190915055506114c4614a70565b60086040518060400160405290816000820160009054906101000a90046001600160801b03166001600160801b03166001600160801b031681526020016000820160109054906101000a90046001600160801b03166001600160801b03166001600160801b03168152505090506040518060400160405280858360000151016001600160801b031681526020018c8360200151016001600160801b0316815250600860008201518160000160006101000a8154816001600160801b0302191690836001600160801b0316021790555060208201518160000160106101000a8154816001600160801b0302191690836001600160801b03160217905550905050600760009054906101000a90046001600160a01b03166001600160a01b03166108fc859081150290604051600060405180830381858888f19350505050158015611611573d6000803e3d6000fd5b506040805142815261ffff8516602082015281518d9287926001600160a01b038a16927fce7f9e282ca905d50d4b0dbd5a9bd39be4b478b375eee78b9c0cab43d2b6c2d7929181900390910190a450506003805461ff0019166101001790555096979650505050505050565b600060055462ed4e000142116116c45760405162461bcd60e51b815260040180806020018281038252602c815260200180614b37602c913960400191505060405180910390fd5b336000806116d183613e67565b92509250506116fb816001600160501b0316836001600160501b031661401b90919063ffffffff16565b93506000841161173c5760405162461bcd60e51b8152600401808060200182810382526026815260200180614d316026913960400191505060405180910390fd5b600354604080516370a0823160e01b81523060048201529051620100009092046001600160a01b0316916370a0823191602480820192602092909190829003018186803b15801561178c57600080fd5b505afa1580156117a0573d6000803e3d6000fd5b505050506040513d60208110156117b657600080fd5b50518411156117f65760405162461bcd60e51b8152600401808060200182810382526029815260200180614c866029913960400191505060405180910390fd5b6001600160a01b0383166000908152600b602090815260409182902080548351818402810184019094528084526060939283018282801561185657602002820191906000526020600020905b815481526020019060010190808311611842575b50939450600093505050505b815181101561196257846001600160a01b0316600a83838151811061188357fe5b60200260200101518154811061189557fe5b60009182526020909120600290910201546001600160a01b0316146118b657fe5b600a8282815181106118c457fe5b6020026020010151815481106118d657fe5b906000526020600020906002020160010160009054906101000a90046001600160501b0316600a83838151811061190957fe5b60200260200101518154811061191b57fe5b600091825260209091206001600290920201810180546001600160501b0393909316600160501b0269ffffffffffffffffffff60501b199093169290921790915501611862565b50600954611976908663ffffffff613fa116565b6009556000611985858761405d565b905085816001600160a01b0316866001600160a01b03167f8d5228190eaad79dd916bfe0c2462ea700d324a3d15a0c0c469f683623727696426040518082815260200191505060405180910390a4505050505090565b6004544210611a23576040805162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e481cdd185c9d1959608a1b604482015290519081900360640190fd5b611a2b612253565b611a6a576040805162461bcd60e51b81526020600482018190526024820152600080516020614caf833981519152604482015290519081900360640190fd5b8115611a765760048290555b8015611a825760058190555b60055460045410611ac45760405162461bcd60e51b8152600401808060200182810382526021815260200180614bdd6021913960400191505060405180910390fd5b6004544210611b1a576040805162461bcd60e51b815260206004820152601960248201527f54696d65733a20696e76616c69642073746172742074696d6500000000000000604482015290519081900360640190fd5b60045460055460408051918252517fe2331e5ffb2f5fd0dc1c33ed1f19473937ab3d7692ad6941fb871d1c9f0b31729181900360200190a25050565b611b66611b61614097565b61341a565b611ba15760405162461bcd60e51b8152600401808060200182810382526040815260200180614cf16040913960400191505060405180910390fd5b611baa8161409b565b50565b6008546001600160801b0380821691600160801b90041682565b678ac7230489e8000081565b60045481565b611be4611b61614097565b611c1f5760405162461bcd60e51b8152600401808060200182810382526040815260200180614cf16040913960400191505060405180910390fd5b611baa816140e3565b600c602052600090815260409020546001600160a01b031681565b681158e460913d00000081565b6000611c6360028363ffffffff61412b16565b90505b919050565b6004546005546006546007546008549394929391926001600160a01b03909116916001600160801b03600160801b8204811692911690681158e460913d00000090565b611cb9611b61614097565b611cf45760405162461bcd60e51b8152600401808060200182810382526040815260200180614cf16040913960400191505060405180910390fd5b60035460ff16611d38576040805162461bcd60e51b815260206004820152600a6024820152691b9bdd081c185d5cd95960b21b604482015290519081900360640190fd5b6003805460ff191690556040805133815290517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa9181900360200190a1565b60065481565b600b6020528160005260406000208181548110611d9657fe5b90600052602060002001600091509150505481565b611dbb611db6614097565b614192565b565b611dc5612253565b611e04576040805162461bcd60e51b81526020600482018190526024820152600080516020614caf833981519152604482015290519081900360640190fd5b6001600160a01b038116611e495760405162461bcd60e51b8152600401808060200182810382526029815260200180614bb46029913960400191505060405180910390fd5b600780546001600160a01b0319166001600160a01b0383169081179091556040517f3c5b62e7cef2021e2a59efbfc33361add9228cfee8b0064c3eaa9760139d82de90600090a250565b6007546001600160a01b031681565b611eaa612253565b611ee9576040805162461bcd60e51b81526020600482018190526024820152600080516020614caf833981519152604482015290519081900360640190fd5b60005b82811015611f8b578115611f4b57611f1e848483818110611f0957fe5b905060200201356001600160a01b031661341a565b611f4657611f46848483818110611f3157fe5b905060200201356001600160a01b03166141da565b611f83565b611f5a848483818110611f0957fe5b15611f8357611f83848483818110611f6e57fe5b905060200201356001600160a01b0316614192565b600101611eec565b50505050565b611f99612253565b611fd8576040805162461bcd60e51b81526020600482018190526024820152600080516020614caf833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b61202d611b61614097565b6120685760405162461bcd60e51b8152600401808060200182810382526040815260200180614cf16040913960400191505060405180910390fd5b611baa816141da565b6201518081565b612080612253565b6120bf576040805162461bcd60e51b81526020600482018190526024820152600080516020614caf833981519152604482015290519081900360640190fd5b6001600160a01b03811661210e576040805162461bcd60e51b81526020600482015260116024820152701a5b9d985b1a59081c9958da5c1a595b9d607a1b604482015290519081900360640190fd5b6001600160a01b038281166000818152600c602090815260409182902080546001600160a01b0319169486169485179055815192835282019290925281517f4027eea0ac4a1ffbd8dfa5e66eda275369da16dfbd663619527fc5672a1f9b33929181900390910190a15050565b612186611b61614097565b6121c15760405162461bcd60e51b8152600401808060200182810382526040815260200180614cf16040913960400191505060405180910390fd5b60035460ff1615612202576040805162461bcd60e51b81526020600482015260066024820152651c185d5cd95960d21b604482015290519081900360640190fd5b6003805460ff191660011790556040805133815290517f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2589181900360200190a1565b6000546001600160a01b031690565b600080546001600160a01b0316612268614097565b6001600160a01b031614905090565b6005544211156122be576040805162461bcd60e51b815260206004820152600d60248201526c185b1c9958591e48195b991959609a1b604482015290519081900360640190fd5b6122c6612253565b612305576040805162461bcd60e51b81526020600482018190526024820152600080516020614caf833981519152604482015290519081900360640190fd5b61ec1e811061235b576040805162461bcd60e51b815260206004820152601f60248201527f52617465733a206e65772072617465206973206f7574206f662072616e676500604482015290519081900360640190fd5b60026006548161236757fe5b048110156123bc576040805162461bcd60e51b815260206004820152601760248201527f52617465733a206e6577207261746520746f6f206c6f77000000000000000000604482015290519081900360640190fd5b6002600654600302816123cb57fe5b04811115612420576040805162461bcd60e51b815260206004820152601860248201527f52617465733a206e6577207261746520746f6f20686967680000000000000000604482015290519081900360640190fd5b600681905560405181907fde562f638edf235c4ffcf362f566cf6c0fd778b9ea2997e4b4566aed51018a4f90600090a250565b6000806000606080606080606060055442116124a6576040805162461bcd60e51b815260206004820152600d60248201526c1b9bdd08195b991959081e595d609a1b604482015290519081900360640190fd5b60035460ff16156124e7576040805162461bcd60e51b81526020600482015260066024820152651c185d5cd95960d21b604482015290519081900360640190fd5b896001600160501b0316806000108015612502575060648111155b61254d576040805162461bcd60e51b815260206004820152601760248201527670657263656e74616765206f7574206f662072616e676560481b604482015290519081900360640190fd5b60009750875b600a54811015612611578a61ffff16600a828154811061256f57fe5b6000918252602090912060029091020160010154600160a01b900461ffff161480156125fd5750600a81815481106125a357fe5b9060005260206000209060020201600101600a9054906101000a90046001600160501b03166001600160501b0316600a82815481106125de57fe5b60009182526020909120600160029092020101546001600160501b0316115b15612609576001890198505b600101612553565b508760405190808252806020026020018201604052801561263c578160200160208202803883390190505b50955087604051908082528060200260200182016040528015612669578160200160208202803883390190505b50945087604051908082528060200260200182016040528015612696578160200160208202803883390190505b509350876040519080825280602002602001820160405280156126c3578160200160208202803883390190505b509250876040519080825280602002602001820160405280156126f0578160200160208202803883390190505b5091506000805b600a548110156129dd57612709614a42565b600a828154811061271657fe5b60009182526020918290206040805160a081018252600290930290910180546001600160a01b03811684526001600160501b03600160a01b9182900481169585019590955260019091015480851692840192909252600160501b8204909316606083015261ffff92900482166080820152600a8054919350918f1691908490811061279d57fe5b6000918252602090912060029091020160010154600160a01b900461ffff1614801561282b5750600a82815481106127d157fe5b9060005260206000209060020201600101600a9054906101000a90046001600160501b03166001600160501b0316600a838154811061280c57fe5b60009182526020909120600160029092020101546001600160501b0316115b156129d4578189848151811061283d57fe5b602002602001018181525050806000015188848151811061285a57fe5b6001600160a01b0390921660209283029190910190910152805161287d90614222565b87848151811061288957fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060648e8260400151026001600160501b0316816128c257fe5b048684815181106128cf57fe5b60200260200101906001600160501b031690816001600160501b03168152505080604001516001600160501b0316816060015187858151811061290e57fe5b6020026020010151016001600160501b0316111561295d5760405162461bcd60e51b8152600401808060200182810382526029815260200180614d576029913960400191505060405180910390fd5b600a828154811061296a57fe5b906000526020600020906002020160010160149054906101000a900461ffff1685848151811061299657fe5b602002602001019061ffff16908161ffff16815250508583815181106129b857fe5b60200260200101516001600160501b03168a0199506001830192505b506001016126f7565b50600354604080516370a0823160e01b81523060048201529051620100009092046001600160a01b0316916370a0823191602480820192602092909190829003018186803b158015612a2e57600080fd5b505afa158015612a42573d6000803e3d6000fd5b505050506040513d6020811015612a5857600080fd5b5051881115612a985760405162461bcd60e51b8152600401808060200182810382526022815260200180614c226022913960400191505060405180910390fd5b6096891115995050509295985092959890939650565b62ed4e0081565b612ac0611b61614097565b612afb5760405162461bcd60e51b8152600401808060200182810382526040815260200180614cf16040913960400191505060405180910390fd5b60005b82811015611f8b578115612b5d57612b30848483818110612b1b57fe5b905060200201356001600160a01b0316611c50565b612b5857612b58848483818110612b4357fe5b905060200201356001600160a01b031661409b565b612b95565b612b6c848483818110612b1b57fe5b15612b9557612b95848483818110612b8057fe5b905060200201356001600160a01b03166140e3565b600101612afe565b600080600060608060608060606005544211612bf0576040805162461bcd60e51b815260206004820152600d60248201526c1b9bdd08195b991959081e595d609a1b604482015290519081900360640190fd5b60035460ff1615612c31576040805162461bcd60e51b81526020600482015260066024820152651c185d5cd95960d21b604482015290519081900360640190fd5b8a6001600160501b0316806000108015612c4c575060648111155b612c97576040805162461bcd60e51b815260206004820152601760248201527670657263656e74616765206f7574206f662072616e676560481b604482015290519081900360640190fd5b60009750875b8a811015612e0857600a548c8c83818110612cb457fe5b9050602002013510612d0d576040805162461bcd60e51b815260206004820152601960248201527f457374696d6174653a206964206f7574206f662072616e676500000000000000604482015290519081900360640190fd5b8015612d8e578b8b60018303818110612d2257fe5b905060200201358c8c83818110612d3557fe5b9050602002013511612d8e576040805162461bcd60e51b815260206004820152601860248201527f457374696d6174653a206475706c696361746564206964730000000000000000604482015290519081900360640190fd5b600a8181548110612d9b57fe5b9060005260206000209060020201600101600a9054906101000a90046001600160501b03166001600160501b0316600a8281548110612dd657fe5b60009182526020909120600160029092020101546001600160501b03161115612e00576001890198505b600101612c9d565b5087604051908082528060200260200182016040528015612e33578160200160208202803883390190505b50955087604051908082528060200260200182016040528015612e60578160200160208202803883390190505b50945087604051908082528060200260200182016040528015612e8d578160200160208202803883390190505b50935087604051908082528060200260200182016040528015612eba578160200160208202803883390190505b50925087604051908082528060200260200182016040528015612ee7578160200160208202803883390190505b5091506000805b8b8110156131c057600a8181548110612f0357fe5b9060005260206000209060020201600101600a9054906101000a90046001600160501b03166001600160501b0316600a8281548110612f3e57fe5b60009182526020909120600160029092020101546001600160501b031611612f65576131b8565b612f6d614a42565b600a8e8e84818110612f7b57fe5b9050602002013581548110612f8c57fe5b60009182526020918290206040805160a081018252600290930290910180546001600160a01b03811684526001600160501b03600160a01b9182900481169585019590955260019091015480851692840192909252600160501b8204909316606083015261ffff92900491909116608082015290508d8d8381811061300d57fe5b9050602002013589848151811061302057fe5b602002602001018181525050806000015188848151811061303d57fe5b6001600160a01b0390921660209283029190910190910152805161306090614222565b87848151811061306c57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060648f8260400151026001600160501b0316816130a557fe5b048684815181106130b257fe5b60200260200101906001600160501b031690816001600160501b03168152505080604001516001600160501b031681606001518785815181106130f157fe5b6020026020010151016001600160501b031611156131405760405162461bcd60e51b8152600401808060200182810382526029815260200180614d576029913960400191505060405180910390fd5b85838151811061314c57fe5b60200260200101516001600160501b03168a019950600a828154811061316e57fe5b906000526020600020906002020160010160149054906101000a900461ffff1685848151811061319a57fe5b602002602001019061ffff16908161ffff1681525050600183019250505b600101612eee565b50600354604080516370a0823160e01b81523060048201529051620100009092046001600160a01b0316916370a0823191602480820192602092909190829003018186803b15801561321157600080fd5b505afa158015613225573d6000803e3d6000fd5b505050506040513d602081101561323b57600080fd5b505188111561327b5760405162461bcd60e51b8152600401808060200182810382526022815260200180614c226022913960400191505060405180910390fd5b6096891115995050509397509397509397509397565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b6132b1612253565b6132f0576040805162461bcd60e51b81526020600482018190526024820152600080516020614caf833981519152604482015290519081900360640190fd5b6001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561334857604051339082156108fc029083906000818181858888f19350505050158015613342573d6000803e3d6000fd5b50613362565b6133626001600160a01b038316338363ffffffff61424616565b6040805182815290516001600160a01b0384169133917f9117c7ad7b6f1ba1aaa09bb1c4350c446991835f0f87371dd264c1f9f2c6e8f89181900360200190a35050565b60035460ff1690565b697fffffffffffffffffff81565b600a81815481106133ca57fe5b6000918252602090912060029091020180546001909101546001600160a01b0382169250600160a01b918290046001600160501b039081169281831692600160501b8104909216910461ffff1685565b6000611c6360018363ffffffff61412b16565b600061343a611b61614097565b6134755760405162461bcd60e51b8152600401808060200182810382526040815260200180614cf16040913960400191505060405180910390fd5b60055442116134bb576040805162461bcd60e51b815260206004820152600d60248201526c1b9bdd08195b991959081e595d609a1b604482015290519081900360640190fd5b60035460ff16156134fc576040805162461bcd60e51b81526020600482015260066024820152651c185d5cd95960d21b604482015290519081900360640190fd5b8380600010801561350e575060648111155b613559576040805162461bcd60e51b815260206004820152601760248201527670657263656e74616765206f7574206f662072616e676560481b604482015290519081900360640190fd5b600a5460005b84811015613659578186868381811061357457fe5b90506020020135106135c6576040805162461bcd60e51b8152602060048201526016602482015275111a5cdd1c9a589d5d194e881a5b9d985b1a59081a5960521b604482015290519081900360640190fd5b8015613631578585828181106135d857fe5b905060200201358686600184038181106135ee57fe5b90506020020135106136315760405162461bcd60e51b8152600401808060200182810382526024815260200180614bfe6024913960400191505060405180910390fd5b61364d86868381811061364057fe5b905060200201358861429d565b9093019260010161355f565b5060095461366d908463ffffffff613fa116565b6009555090949350505050565b611dbb613685614097565b6140e3565b60608060608060606000600a805490509050806040519080825280602002602001820160405280156136c6578160200160208202803883390190505b509550806040519080825280602002602001820160405280156136f3578160200160208202803883390190505b50945080604051908082528060200260200182016040528015613720578160200160208202803883390190505b5093508060405190808252806020026020018201604052801561374d578160200160208202803883390190505b5092508060405190808252806020026020018201604052801561377a578160200160208202803883390190505b50915060005b8181101561390157613790614a42565b600a828154811061379d57fe5b60009182526020918290206040805160a08101825260029390930290910180546001600160a01b038116808552600160a01b918290046001600160501b039081169686019690965260019092015480861693850193909352600160501b8304909416606084015292900461ffff166080820152895190925089908490811061382157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050806020015187838151811061385257fe5b60200260200101906001600160501b031690816001600160501b031681525050806040015186838151811061388357fe5b60200260200101906001600160501b031690816001600160501b03168152505080606001518583815181106138b457fe5b60200260200101906001600160501b031690816001600160501b03168152505080608001518483815181106138e557fe5b61ffff9092166020928302919091019091015250600101613780565b50509091929394565b600a5490565b60095481565b600080600080600060608060608061392d8a614222565b98506139388a613e67565b6001600160a01b038d166000908152600b602090815260409182902080548351818402810184019094528084526001600160501b039096169d50939b50919950898b0398506060939092918301828280156139b257602002820191906000526020600020905b81548152602001906001019080831161399e575b5050505050905080516040519080825280602002602001820160405280156139e4578160200160208202803883390190505b5094508051604051908082528060200260200182016040528015613a12578160200160208202803883390190505b5093508051604051908082528060200260200182016040528015613a40578160200160208202803883390190505b5092508051604051908082528060200260200182016040528015613a6e578160200160208202803883390190505b50915060005b8151811015613c3757600a828281518110613a8b57fe5b602002602001015181548110613a9d57fe5b906000526020600020906002020160000160149054906101000a90046001600160501b0316868281518110613ace57fe5b60200260200101906001600160501b031690816001600160501b031681525050600a828281518110613afc57fe5b602002602001015181548110613b0e57fe5b906000526020600020906002020160010160009054906101000a90046001600160501b0316858281518110613b3f57fe5b60200260200101906001600160501b031690816001600160501b031681525050600a828281518110613b6d57fe5b602002602001015181548110613b7f57fe5b9060005260206000209060020201600101600a9054906101000a90046001600160501b0316848281518110613bb057fe5b60200260200101906001600160501b031690816001600160501b031681525050600a828281518110613bde57fe5b602002602001015181548110613bf057fe5b906000526020600020906002020160010160149054906101000a900461ffff16838281518110613c1c57fe5b61ffff90921660209283029190910190910152600101613a74565b50509193959799909294969850565b6003546201000090046001600160a01b031681565b60055481565b613c69612253565b613ca8576040805162461bcd60e51b81526020600482018190526024820152600080516020614caf833981519152604482015290519081900360640190fd5b611baa8161452f565b609681565b6000613cc3611b61614097565b613cfe5760405162461bcd60e51b8152600401808060200182810382526040815260200180614cf16040913960400191505060405180910390fd5b6005544211613d44576040805162461bcd60e51b815260206004820152600d60248201526c1b9bdd08195b991959081e595d609a1b604482015290519081900360640190fd5b60035460ff1615613d85576040805162461bcd60e51b81526020600482015260066024820152651c185d5cd95960d21b604482015290519081900360640190fd5b82806000108015613d97575060648111155b613de2576040805162461bcd60e51b815260206004820152601760248201527670657263656e74616765206f7574206f662072616e676560481b604482015290519081900360640190fd5b60005b600a54811015613e3d578361ffff16600a8281548110613e0157fe5b6000918252602090912060029091020160010154600160a01b900461ffff161415613e3557613e30818661429d565b830192505b600101613de5565b50600954613e51908363ffffffff613fa116565b6009555092915050565b670de0b6b3a764000081565b6001600160a01b0381166000908152600b6020908152604080832080548251818502810185019093528083528493849360609390929091830182828015613ecd57602002820191906000526020600020905b815481526020019060010190808311613eb9575b50939450600093505050505b8151811015613f9857613eea614a42565b600a838381518110613ef857fe5b602002602001015181548110613f0a57fe5b60009182526020918290206040805160a08101825260029390930290910180546001600160a01b0381168452600160a01b908190046001600160501b03908116958501869052600192830154808216948601859052600160501b81049091166060860181905291900461ffff1660809094019390935298909201979690910195940193919091019050613ed9565b50509193909250565b600082820183811015613ffb576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b6000611c63600654836145cf90919063ffffffff16565b6000613ffb83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614628565b600061406883614222565b90506001600160a01b03811661407a57fe5b600354613ffe906201000090046001600160a01b03168284614246565b3390565b6140ac60028263ffffffff6146bf16565b6040516001600160a01b038216907fee1504a83b6d4a361f4c1dc78ab59bfa30d6a3b6612c403e86bb01ef2984295f90600090a250565b6140f460028263ffffffff61474016565b6040516001600160a01b038216907f270d9b30cf5b0793bbfd54c9d5b94aeb49462b8148399000265144a8722da6b690600090a250565b60006001600160a01b0382166141725760405162461bcd60e51b8152600401808060200182810382526022815260200180614ccf6022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b6141a360018263ffffffff61474016565b6040516001600160a01b038216907f0a8eb35e5ca14b3d6f28e4abf2f128dbab231a58b56e89beb5d636115001e16590600090a250565b6141eb60018263ffffffff6146bf16565b6040516001600160a01b038216907f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129990600090a250565b6001600160a01b038082166000908152600c60205260409020541680611c66575090565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526142989084906147a7565b505050565b60006142a7614a42565b600a84815481106142b457fe5b60009182526020918290206040805160a081018252600290930290910180546001600160a01b03811684526001600160501b03600160a01b91829004811695850195909552600190910154808516928401839052600160501b8104909416606084015261ffff9304929092166080820152915061434a9060649061433e908663ffffffff6145cf16565b9063ffffffff61495f16565b915080604001516001600160501b031661437a82606001516001600160501b031684613fa190919063ffffffff16565b11156143b75760405162461bcd60e51b815260040180806020018281038252602b815260200180614b89602b913960400191505060405180910390fd5b600082116143c157fe5b600354604080516370a0823160e01b81523060048201529051620100009092046001600160a01b0316916370a0823191602480820192602092909190829003018186803b15801561441157600080fd5b505afa158015614425573d6000803e3d6000fd5b505050506040513d602081101561443b57600080fd5b505182111561447b5760405162461bcd60e51b815260040180806020018281038252602a815260200180614ae6602a913960400191505060405180910390fd5b81600a858154811061448957fe5b60009182526020822060016002909202010180546001600160501b03600160501b80830482169095011690930269ffffffffffffffffffff60501b199093169290921790915581516144db908461405d565b825160408051868152426020820152815193945087936001600160a01b038087169416927f2e0af9fd06c112bbfcb6770377b964ccb18691b6217ca6c8054c6337b0a7cc9c928290030190a4505092915050565b6001600160a01b0381166145745760405162461bcd60e51b8152600401808060200182810382526026815260200180614a886026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000826145de57506000613ffe565b828202828482816145eb57fe5b0414613ffb5760405162461bcd60e51b8152600401808060200182810382526021815260200180614c656021913960400191505060405180910390fd5b600081848411156146b75760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561467c578181015183820152602001614664565b50505050905090810190601f1680156146a95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6146c9828261412b565b1561471b576040805162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b61474a828261412b565b6147855760405162461bcd60e51b8152600401808060200182810382526021815260200180614c446021913960400191505060405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b6147b9826001600160a01b03166149a1565b61480a576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106148485780518252601f199092019160209182019101614829565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146148aa576040519150601f19603f3d011682016040523d82523d6000602084013e6148af565b606091505b509150915081614906576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115611f8b5780806020019051602081101561492257600080fd5b5051611f8b5760405162461bcd60e51b815260040180806020018281038252602a815260200180614d80602a913960400191505060405180910390fd5b6000613ffb83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506149dd565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906149d557508115155b949350505050565b60008183614a2c5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561467c578181015183820152602001614664565b506000838581614a3857fe5b0495945050505050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915290565b60408051808201909152600080825260208201529056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573736f6e6c7943616e537761703a2065746820616d6f756e74206973206c6f776572207468616e206d696e20696e646976696475616c20636170446973747269627574653a206e6f7420656e6f75676820746f6b656e20746f20646973747269627574656f6e6c79436170537761703a206d617820696e646976696475616c206361702072656163686564456d657267656e63793a206e6f74206f70656e20666f7220656d657267656e6379207769746864726177616c6f6e6c7943616e537761703a2073656e646572206973206e6f742077686974656c6973746564446973747269627574653a20746f74616c2064697374726962757465206d6f7265207468616e203130302552656365697069656e743a20696e76616c69642065746820726563697069656e74206164647265737354696d65733a20696e76616c696420737461727420616e6420656e642074696d65446973747269627574653a20696e646963657320617265206e6f7420696e206f72646572457374696d6174653a206e6f7420656e6f75676820746f6b656e2062616c616e6365526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77456d657267656e63793a206e6f7420656e6f75676820746f6b656e20746f20646973747269627574654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572526f6c65733a206163636f756e7420697320746865207a65726f206164647265737357686974656c69737441646d696e526f6c653a2063616c6c657220646f6573206e6f742068617665207468652057686974656c69737441646d696e20726f6c65456d657267656e63793a20757365722068617320636c61696d656420616c6c20746f6b656e73457374696d6174653a20746f74616c2064697374726962757465206d6f7265207468616e20313030255361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a265627a7a72315820a2ef811f4003c66ef0fb0aae7509e5f9676d3367cbf9a65f0fb39b0c15bebd1164736f6c634300050b00324f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573738be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0526f6c65733a206163636f756e7420697320746865207a65726f2061646472657373000000000000000000000000b99f4471f4a16b4467de2be3d5472698966918af00000000000000000000000077a7527776530bf416b6b59bf357a49f1ce1d3da
Deployed Bytecode
0x6080604052600436106102ae5760003560e01c80638da5cb5b11610175578063bb5f747b116100dc578063e7ad320911610095578063f2fde38b1161006f578063f2fde38b14610f29578063f7ea117e14610f5c578063f8a9799f14610f71578063fcab30a514610fa5576102ae565b8063e7ad320914610d62578063e985e36714610eff578063ed338ff114610f14576102ae565b8063bb5f747b14610af1578063bbbd92a114610b24578063d6cd947314610ba6578063d6cfeae014610bbb578063d90a77a014610d38578063deaa931114610d4d576102ae565b8063a15754441161012e578063a15754441461097f578063a734f06e14610a0a578063ab2563d914610a1f578063b187bd2614610a58578063b400510614610a6d578063b88356db14610a82576102ae565b80638da5cb5b146106db5780638f32d59b146106f0578063910d85741461070557806396594bf01461072f5780639958c052146108ed5780639aebde6e14610902576102ae565b806340557cf111610219578063715018a6116101d2578063715018a6146106265780637362d9c81461063b57806373845fed1461066e57806375c9f3ac1461068357806382182ab91461068b5780638456cb59146106c6576102ae565b806340557cf1146104fe5780634c4506fb146105135780634c5a628c1461054c578063513c29b514610561578063581379fd146105945780636bbaab78146105a9576102ae565b8063291d95491161026b578063291d9549146103aa57806330114a65146103dd5780633a03171c1461042c5780633af32abf146104415780633bc5de30146104885780633f4ba83a146104e9576102ae565b806307a3dff6146102b957806309d8ef27146102e057806310154bad146103125780631042620b14610345578063137df7e3146103805780631cbaee2d14610395575b6102b6610fba565b50005b3480156102c557600080fd5b506102ce61167d565b60408051918252519081900360200190f35b3480156102ec57600080fd5b506103106004803603604081101561030357600080fd5b50803590602001356119db565b005b34801561031e57600080fd5b506103106004803603602081101561033557600080fd5b50356001600160a01b0316611b56565b34801561035157600080fd5b5061035a611bad565b604080516001600160801b03938416815291909216602082015281519081900390910190f35b34801561038c57600080fd5b506102ce611bc7565b3480156103a157600080fd5b506102ce611bd3565b3480156103b657600080fd5b50610310600480360360208110156103cd57600080fd5b50356001600160a01b0316611bd9565b3480156103e957600080fd5b506104106004803603602081101561040057600080fd5b50356001600160a01b0316611c28565b604080516001600160a01b039092168252519081900360200190f35b34801561043857600080fd5b506102ce611c43565b34801561044d57600080fd5b506104746004803603602081101561046457600080fd5b50356001600160a01b0316611c50565b604080519115158252519081900360200190f35b34801561049457600080fd5b5061049d611c6b565b604080519788526020880196909652868601949094526001600160a01b0390921660608601526001600160801b0390811660808601521660a084015260c0830152519081900360e00190f35b3480156104f557600080fd5b50610310611cae565b34801561050a57600080fd5b506102ce611d77565b34801561051f57600080fd5b506102ce6004803603604081101561053657600080fd5b506001600160a01b038135169060200135611d7d565b34801561055857600080fd5b50610310611dab565b34801561056d57600080fd5b506103106004803603602081101561058457600080fd5b50356001600160a01b0316611dbd565b3480156105a057600080fd5b50610410611e93565b3480156105b557600080fd5b50610310600480360360408110156105cc57600080fd5b810190602081018135600160201b8111156105e657600080fd5b8201836020820111156105f857600080fd5b803590602001918460208302840111600160201b8311171561061957600080fd5b9193509150351515611ea2565b34801561063257600080fd5b50610310611f91565b34801561064757600080fd5b506103106004803603602081101561065e57600080fd5b50356001600160a01b0316612022565b34801561067a57600080fd5b506102ce612071565b6102ce610fba565b34801561069757600080fd5b50610310600480360360408110156106ae57600080fd5b506001600160a01b0381358116916020013516612078565b3480156106d257600080fd5b5061031061217b565b3480156106e757600080fd5b50610410612244565b3480156106fc57600080fd5b50610474612253565b34801561071157600080fd5b506103106004803603602081101561072857600080fd5b5035612277565b34801561073b57600080fd5b5061076c6004803603604081101561075257600080fd5b5080356001600160501b0316906020013561ffff16612453565b6040518089151515158152602001888152602001878152602001806020018060200180602001806020018060200186810386528b818151815260200191508051906020019060200280838360005b838110156107d25781810151838201526020016107ba565b5050505090500186810385528a818151815260200191508051906020019060200280838360005b838110156108115781810151838201526020016107f9565b50505050905001868103845289818151815260200191508051906020019060200280838360005b83811015610850578181015183820152602001610838565b50505050905001868103835288818151815260200191508051906020019060200280838360005b8381101561088f578181015183820152602001610877565b50505050905001868103825287818151815260200191508051906020019060200280838360005b838110156108ce5781810151838201526020016108b6565b505050509050019d505050505050505050505050505060405180910390f35b3480156108f957600080fd5b506102ce612aae565b34801561090e57600080fd5b506103106004803603604081101561092557600080fd5b810190602081018135600160201b81111561093f57600080fd5b82018360208201111561095157600080fd5b803590602001918460208302840111600160201b8311171561097257600080fd5b9193509150351515612ab5565b34801561098b57600080fd5b5061076c600480360360408110156109a257600080fd5b6001600160501b038235169190810190604081016020820135600160201b8111156109cc57600080fd5b8201836020820111156109de57600080fd5b803590602001918460208302840111600160201b831117156109ff57600080fd5b509092509050612b9d565b348015610a1657600080fd5b50610410613291565b348015610a2b57600080fd5b5061031060048036036040811015610a4257600080fd5b506001600160a01b0381351690602001356132a9565b348015610a6457600080fd5b506104746133a6565b348015610a7957600080fd5b506102ce6133af565b348015610a8e57600080fd5b50610aac60048036036020811015610aa557600080fd5b50356133bd565b604080516001600160a01b0390961686526001600160501b039485166020870152928416858401529216606084015261ffff9091166080830152519081900360a00190f35b348015610afd57600080fd5b5061047460048036036020811015610b1457600080fd5b50356001600160a01b031661341a565b348015610b3057600080fd5b506102ce60048036036040811015610b4757600080fd5b81359190810190604081016020820135600160201b811115610b6857600080fd5b820183602082011115610b7a57600080fd5b803590602001918460208302840111600160201b83111715610b9b57600080fd5b50909250905061342d565b348015610bb257600080fd5b5061031061367a565b348015610bc757600080fd5b50610bd061368a565b60405180806020018060200180602001806020018060200186810386528b818151815260200191508051906020019060200280838360005b83811015610c20578181015183820152602001610c08565b5050505090500186810385528a818151815260200191508051906020019060200280838360005b83811015610c5f578181015183820152602001610c47565b50505050905001868103845289818151815260200191508051906020019060200280838360005b83811015610c9e578181015183820152602001610c86565b50505050905001868103835288818151815260200191508051906020019060200280838360005b83811015610cdd578181015183820152602001610cc5565b50505050905001868103825287818151815260200191508051906020019060200280838360005b83811015610d1c578181015183820152602001610d04565b505050509050019a505050505050505050505060405180910390f35b348015610d4457600080fd5b506102ce61390a565b348015610d5957600080fd5b506102ce613910565b348015610d6e57600080fd5b50610d9560048036036020811015610d8557600080fd5b50356001600160a01b0316613916565b604051808a6001600160a01b03166001600160a01b03168152602001898152602001886001600160501b03166001600160501b03168152602001876001600160501b03166001600160501b03168152602001866001600160501b03166001600160501b0316815260200180602001806020018060200180602001858103855289818151815260200191508051906020019060200280838360005b83811015610e47578181015183820152602001610e2f565b50505050905001858103845288818151815260200191508051906020019060200280838360005b83811015610e86578181015183820152602001610e6e565b50505050905001858103835287818151815260200191508051906020019060200280838360005b83811015610ec5578181015183820152602001610ead565b50505050919091018681038352875181528751602091820192508189019102808383600083156108ce5781810151838201526020016108b6565b348015610f0b57600080fd5b50610410613c46565b348015610f2057600080fd5b506102ce613c5b565b348015610f3557600080fd5b5061031060048036036020811015610f4c57600080fd5b50356001600160a01b0316613c61565b348015610f6857600080fd5b506102ce613cb1565b348015610f7d57600080fd5b506102ce60048036036040811015610f9457600080fd5b508035906020013561ffff16613cb6565b348015610fb157600080fd5b506102ce613e5b565b600354600090610100900460ff16611019576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6003805461ff0019811690915560ff1615611064576040805162461bcd60e51b81526020600482015260066024820152651c185d5cd95960d21b604482015290519081900360640190fd5b34600081116110ba576040805162461bcd60e51b815260206004820152601860248201527f6f6e6c7943616e537761703a20616d6f756e7420697320300000000000000000604482015290519081900360640190fd5b6004544290811015611113576040805162461bcd60e51b815260206004820152601c60248201527f6f6e6c7943616e537761703a206e6f7420737461727465642079657400000000604482015290519081900360640190fd5b60055481111561116a576040805162461bcd60e51b815260206004820152601a60248201527f6f6e6c7943616e537761703a20616c726561647920656e646564000000000000604482015290519081900360640190fd5b600854681158e460913d0000006001600160801b03909116106111d4576040805162461bcd60e51b815260206004820152601d60248201527f6f6e6c7943616e537761703a20484152445f4341502072656163686564000000604482015290519081900360640190fd5b336111de81611c50565b6112195760405162461bcd60e51b8152600401808060200182810382526026815260200180614b636026913960400191505060405180910390fd5b600061122482613e67565b5090915060009050611245856001600160501b03841663ffffffff613fa116565b9050670de0b6b3a764000081101561128e5760405162461bcd60e51b8152600401808060200182810382526038815260200180614aae6038913960400191505060405180910390fd5b678ac7230489e800008111156112d55760405162461bcd60e51b8152600401808060200182810382526027815260200180614b106027913960400191505060405180910390fd5b33346112e081614004565b97506000620151806004544203816112f457fe5b04905062010000811061130357fe5b61130b614a42565b6040518060a00160405280856001600160a01b03168152602001846001600160501b031681526020018b6001600160501b0316815260200160006001600160501b031681526020018361ffff168152509050600a819080600181540180825580915050906001820390600052602060002090600202016000909192909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a8154816001600160501b0302191690836001600160501b0316021790555060408201518160010160006101000a8154816001600160501b0302191690836001600160501b03160217905550606082015181600101600a6101000a8154816001600160501b0302191690836001600160501b0316021790555060808201518160010160146101000a81548161ffff021916908361ffff160217905550505050600b6000856001600160a01b03166001600160a01b031681526020019081526020016000206001600a805490500390806001815401808255809150509060018203906000526020600020016000909192909190915055506114c4614a70565b60086040518060400160405290816000820160009054906101000a90046001600160801b03166001600160801b03166001600160801b031681526020016000820160109054906101000a90046001600160801b03166001600160801b03166001600160801b03168152505090506040518060400160405280858360000151016001600160801b031681526020018c8360200151016001600160801b0316815250600860008201518160000160006101000a8154816001600160801b0302191690836001600160801b0316021790555060208201518160000160106101000a8154816001600160801b0302191690836001600160801b03160217905550905050600760009054906101000a90046001600160a01b03166001600160a01b03166108fc859081150290604051600060405180830381858888f19350505050158015611611573d6000803e3d6000fd5b506040805142815261ffff8516602082015281518d9287926001600160a01b038a16927fce7f9e282ca905d50d4b0dbd5a9bd39be4b478b375eee78b9c0cab43d2b6c2d7929181900390910190a450506003805461ff0019166101001790555096979650505050505050565b600060055462ed4e000142116116c45760405162461bcd60e51b815260040180806020018281038252602c815260200180614b37602c913960400191505060405180910390fd5b336000806116d183613e67565b92509250506116fb816001600160501b0316836001600160501b031661401b90919063ffffffff16565b93506000841161173c5760405162461bcd60e51b8152600401808060200182810382526026815260200180614d316026913960400191505060405180910390fd5b600354604080516370a0823160e01b81523060048201529051620100009092046001600160a01b0316916370a0823191602480820192602092909190829003018186803b15801561178c57600080fd5b505afa1580156117a0573d6000803e3d6000fd5b505050506040513d60208110156117b657600080fd5b50518411156117f65760405162461bcd60e51b8152600401808060200182810382526029815260200180614c866029913960400191505060405180910390fd5b6001600160a01b0383166000908152600b602090815260409182902080548351818402810184019094528084526060939283018282801561185657602002820191906000526020600020905b815481526020019060010190808311611842575b50939450600093505050505b815181101561196257846001600160a01b0316600a83838151811061188357fe5b60200260200101518154811061189557fe5b60009182526020909120600290910201546001600160a01b0316146118b657fe5b600a8282815181106118c457fe5b6020026020010151815481106118d657fe5b906000526020600020906002020160010160009054906101000a90046001600160501b0316600a83838151811061190957fe5b60200260200101518154811061191b57fe5b600091825260209091206001600290920201810180546001600160501b0393909316600160501b0269ffffffffffffffffffff60501b199093169290921790915501611862565b50600954611976908663ffffffff613fa116565b6009556000611985858761405d565b905085816001600160a01b0316866001600160a01b03167f8d5228190eaad79dd916bfe0c2462ea700d324a3d15a0c0c469f683623727696426040518082815260200191505060405180910390a4505050505090565b6004544210611a23576040805162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e481cdd185c9d1959608a1b604482015290519081900360640190fd5b611a2b612253565b611a6a576040805162461bcd60e51b81526020600482018190526024820152600080516020614caf833981519152604482015290519081900360640190fd5b8115611a765760048290555b8015611a825760058190555b60055460045410611ac45760405162461bcd60e51b8152600401808060200182810382526021815260200180614bdd6021913960400191505060405180910390fd5b6004544210611b1a576040805162461bcd60e51b815260206004820152601960248201527f54696d65733a20696e76616c69642073746172742074696d6500000000000000604482015290519081900360640190fd5b60045460055460408051918252517fe2331e5ffb2f5fd0dc1c33ed1f19473937ab3d7692ad6941fb871d1c9f0b31729181900360200190a25050565b611b66611b61614097565b61341a565b611ba15760405162461bcd60e51b8152600401808060200182810382526040815260200180614cf16040913960400191505060405180910390fd5b611baa8161409b565b50565b6008546001600160801b0380821691600160801b90041682565b678ac7230489e8000081565b60045481565b611be4611b61614097565b611c1f5760405162461bcd60e51b8152600401808060200182810382526040815260200180614cf16040913960400191505060405180910390fd5b611baa816140e3565b600c602052600090815260409020546001600160a01b031681565b681158e460913d00000081565b6000611c6360028363ffffffff61412b16565b90505b919050565b6004546005546006546007546008549394929391926001600160a01b03909116916001600160801b03600160801b8204811692911690681158e460913d00000090565b611cb9611b61614097565b611cf45760405162461bcd60e51b8152600401808060200182810382526040815260200180614cf16040913960400191505060405180910390fd5b60035460ff16611d38576040805162461bcd60e51b815260206004820152600a6024820152691b9bdd081c185d5cd95960b21b604482015290519081900360640190fd5b6003805460ff191690556040805133815290517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa9181900360200190a1565b60065481565b600b6020528160005260406000208181548110611d9657fe5b90600052602060002001600091509150505481565b611dbb611db6614097565b614192565b565b611dc5612253565b611e04576040805162461bcd60e51b81526020600482018190526024820152600080516020614caf833981519152604482015290519081900360640190fd5b6001600160a01b038116611e495760405162461bcd60e51b8152600401808060200182810382526029815260200180614bb46029913960400191505060405180910390fd5b600780546001600160a01b0319166001600160a01b0383169081179091556040517f3c5b62e7cef2021e2a59efbfc33361add9228cfee8b0064c3eaa9760139d82de90600090a250565b6007546001600160a01b031681565b611eaa612253565b611ee9576040805162461bcd60e51b81526020600482018190526024820152600080516020614caf833981519152604482015290519081900360640190fd5b60005b82811015611f8b578115611f4b57611f1e848483818110611f0957fe5b905060200201356001600160a01b031661341a565b611f4657611f46848483818110611f3157fe5b905060200201356001600160a01b03166141da565b611f83565b611f5a848483818110611f0957fe5b15611f8357611f83848483818110611f6e57fe5b905060200201356001600160a01b0316614192565b600101611eec565b50505050565b611f99612253565b611fd8576040805162461bcd60e51b81526020600482018190526024820152600080516020614caf833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b61202d611b61614097565b6120685760405162461bcd60e51b8152600401808060200182810382526040815260200180614cf16040913960400191505060405180910390fd5b611baa816141da565b6201518081565b612080612253565b6120bf576040805162461bcd60e51b81526020600482018190526024820152600080516020614caf833981519152604482015290519081900360640190fd5b6001600160a01b03811661210e576040805162461bcd60e51b81526020600482015260116024820152701a5b9d985b1a59081c9958da5c1a595b9d607a1b604482015290519081900360640190fd5b6001600160a01b038281166000818152600c602090815260409182902080546001600160a01b0319169486169485179055815192835282019290925281517f4027eea0ac4a1ffbd8dfa5e66eda275369da16dfbd663619527fc5672a1f9b33929181900390910190a15050565b612186611b61614097565b6121c15760405162461bcd60e51b8152600401808060200182810382526040815260200180614cf16040913960400191505060405180910390fd5b60035460ff1615612202576040805162461bcd60e51b81526020600482015260066024820152651c185d5cd95960d21b604482015290519081900360640190fd5b6003805460ff191660011790556040805133815290517f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2589181900360200190a1565b6000546001600160a01b031690565b600080546001600160a01b0316612268614097565b6001600160a01b031614905090565b6005544211156122be576040805162461bcd60e51b815260206004820152600d60248201526c185b1c9958591e48195b991959609a1b604482015290519081900360640190fd5b6122c6612253565b612305576040805162461bcd60e51b81526020600482018190526024820152600080516020614caf833981519152604482015290519081900360640190fd5b61ec1e811061235b576040805162461bcd60e51b815260206004820152601f60248201527f52617465733a206e65772072617465206973206f7574206f662072616e676500604482015290519081900360640190fd5b60026006548161236757fe5b048110156123bc576040805162461bcd60e51b815260206004820152601760248201527f52617465733a206e6577207261746520746f6f206c6f77000000000000000000604482015290519081900360640190fd5b6002600654600302816123cb57fe5b04811115612420576040805162461bcd60e51b815260206004820152601860248201527f52617465733a206e6577207261746520746f6f20686967680000000000000000604482015290519081900360640190fd5b600681905560405181907fde562f638edf235c4ffcf362f566cf6c0fd778b9ea2997e4b4566aed51018a4f90600090a250565b6000806000606080606080606060055442116124a6576040805162461bcd60e51b815260206004820152600d60248201526c1b9bdd08195b991959081e595d609a1b604482015290519081900360640190fd5b60035460ff16156124e7576040805162461bcd60e51b81526020600482015260066024820152651c185d5cd95960d21b604482015290519081900360640190fd5b896001600160501b0316806000108015612502575060648111155b61254d576040805162461bcd60e51b815260206004820152601760248201527670657263656e74616765206f7574206f662072616e676560481b604482015290519081900360640190fd5b60009750875b600a54811015612611578a61ffff16600a828154811061256f57fe5b6000918252602090912060029091020160010154600160a01b900461ffff161480156125fd5750600a81815481106125a357fe5b9060005260206000209060020201600101600a9054906101000a90046001600160501b03166001600160501b0316600a82815481106125de57fe5b60009182526020909120600160029092020101546001600160501b0316115b15612609576001890198505b600101612553565b508760405190808252806020026020018201604052801561263c578160200160208202803883390190505b50955087604051908082528060200260200182016040528015612669578160200160208202803883390190505b50945087604051908082528060200260200182016040528015612696578160200160208202803883390190505b509350876040519080825280602002602001820160405280156126c3578160200160208202803883390190505b509250876040519080825280602002602001820160405280156126f0578160200160208202803883390190505b5091506000805b600a548110156129dd57612709614a42565b600a828154811061271657fe5b60009182526020918290206040805160a081018252600290930290910180546001600160a01b03811684526001600160501b03600160a01b9182900481169585019590955260019091015480851692840192909252600160501b8204909316606083015261ffff92900482166080820152600a8054919350918f1691908490811061279d57fe5b6000918252602090912060029091020160010154600160a01b900461ffff1614801561282b5750600a82815481106127d157fe5b9060005260206000209060020201600101600a9054906101000a90046001600160501b03166001600160501b0316600a838154811061280c57fe5b60009182526020909120600160029092020101546001600160501b0316115b156129d4578189848151811061283d57fe5b602002602001018181525050806000015188848151811061285a57fe5b6001600160a01b0390921660209283029190910190910152805161287d90614222565b87848151811061288957fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060648e8260400151026001600160501b0316816128c257fe5b048684815181106128cf57fe5b60200260200101906001600160501b031690816001600160501b03168152505080604001516001600160501b0316816060015187858151811061290e57fe5b6020026020010151016001600160501b0316111561295d5760405162461bcd60e51b8152600401808060200182810382526029815260200180614d576029913960400191505060405180910390fd5b600a828154811061296a57fe5b906000526020600020906002020160010160149054906101000a900461ffff1685848151811061299657fe5b602002602001019061ffff16908161ffff16815250508583815181106129b857fe5b60200260200101516001600160501b03168a0199506001830192505b506001016126f7565b50600354604080516370a0823160e01b81523060048201529051620100009092046001600160a01b0316916370a0823191602480820192602092909190829003018186803b158015612a2e57600080fd5b505afa158015612a42573d6000803e3d6000fd5b505050506040513d6020811015612a5857600080fd5b5051881115612a985760405162461bcd60e51b8152600401808060200182810382526022815260200180614c226022913960400191505060405180910390fd5b6096891115995050509295985092959890939650565b62ed4e0081565b612ac0611b61614097565b612afb5760405162461bcd60e51b8152600401808060200182810382526040815260200180614cf16040913960400191505060405180910390fd5b60005b82811015611f8b578115612b5d57612b30848483818110612b1b57fe5b905060200201356001600160a01b0316611c50565b612b5857612b58848483818110612b4357fe5b905060200201356001600160a01b031661409b565b612b95565b612b6c848483818110612b1b57fe5b15612b9557612b95848483818110612b8057fe5b905060200201356001600160a01b03166140e3565b600101612afe565b600080600060608060608060606005544211612bf0576040805162461bcd60e51b815260206004820152600d60248201526c1b9bdd08195b991959081e595d609a1b604482015290519081900360640190fd5b60035460ff1615612c31576040805162461bcd60e51b81526020600482015260066024820152651c185d5cd95960d21b604482015290519081900360640190fd5b8a6001600160501b0316806000108015612c4c575060648111155b612c97576040805162461bcd60e51b815260206004820152601760248201527670657263656e74616765206f7574206f662072616e676560481b604482015290519081900360640190fd5b60009750875b8a811015612e0857600a548c8c83818110612cb457fe5b9050602002013510612d0d576040805162461bcd60e51b815260206004820152601960248201527f457374696d6174653a206964206f7574206f662072616e676500000000000000604482015290519081900360640190fd5b8015612d8e578b8b60018303818110612d2257fe5b905060200201358c8c83818110612d3557fe5b9050602002013511612d8e576040805162461bcd60e51b815260206004820152601860248201527f457374696d6174653a206475706c696361746564206964730000000000000000604482015290519081900360640190fd5b600a8181548110612d9b57fe5b9060005260206000209060020201600101600a9054906101000a90046001600160501b03166001600160501b0316600a8281548110612dd657fe5b60009182526020909120600160029092020101546001600160501b03161115612e00576001890198505b600101612c9d565b5087604051908082528060200260200182016040528015612e33578160200160208202803883390190505b50955087604051908082528060200260200182016040528015612e60578160200160208202803883390190505b50945087604051908082528060200260200182016040528015612e8d578160200160208202803883390190505b50935087604051908082528060200260200182016040528015612eba578160200160208202803883390190505b50925087604051908082528060200260200182016040528015612ee7578160200160208202803883390190505b5091506000805b8b8110156131c057600a8181548110612f0357fe5b9060005260206000209060020201600101600a9054906101000a90046001600160501b03166001600160501b0316600a8281548110612f3e57fe5b60009182526020909120600160029092020101546001600160501b031611612f65576131b8565b612f6d614a42565b600a8e8e84818110612f7b57fe5b9050602002013581548110612f8c57fe5b60009182526020918290206040805160a081018252600290930290910180546001600160a01b03811684526001600160501b03600160a01b9182900481169585019590955260019091015480851692840192909252600160501b8204909316606083015261ffff92900491909116608082015290508d8d8381811061300d57fe5b9050602002013589848151811061302057fe5b602002602001018181525050806000015188848151811061303d57fe5b6001600160a01b0390921660209283029190910190910152805161306090614222565b87848151811061306c57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060648f8260400151026001600160501b0316816130a557fe5b048684815181106130b257fe5b60200260200101906001600160501b031690816001600160501b03168152505080604001516001600160501b031681606001518785815181106130f157fe5b6020026020010151016001600160501b031611156131405760405162461bcd60e51b8152600401808060200182810382526029815260200180614d576029913960400191505060405180910390fd5b85838151811061314c57fe5b60200260200101516001600160501b03168a019950600a828154811061316e57fe5b906000526020600020906002020160010160149054906101000a900461ffff1685848151811061319a57fe5b602002602001019061ffff16908161ffff1681525050600183019250505b600101612eee565b50600354604080516370a0823160e01b81523060048201529051620100009092046001600160a01b0316916370a0823191602480820192602092909190829003018186803b15801561321157600080fd5b505afa158015613225573d6000803e3d6000fd5b505050506040513d602081101561323b57600080fd5b505188111561327b5760405162461bcd60e51b8152600401808060200182810382526022815260200180614c226022913960400191505060405180910390fd5b6096891115995050509397509397509397509397565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b6132b1612253565b6132f0576040805162461bcd60e51b81526020600482018190526024820152600080516020614caf833981519152604482015290519081900360640190fd5b6001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561334857604051339082156108fc029083906000818181858888f19350505050158015613342573d6000803e3d6000fd5b50613362565b6133626001600160a01b038316338363ffffffff61424616565b6040805182815290516001600160a01b0384169133917f9117c7ad7b6f1ba1aaa09bb1c4350c446991835f0f87371dd264c1f9f2c6e8f89181900360200190a35050565b60035460ff1690565b697fffffffffffffffffff81565b600a81815481106133ca57fe5b6000918252602090912060029091020180546001909101546001600160a01b0382169250600160a01b918290046001600160501b039081169281831692600160501b8104909216910461ffff1685565b6000611c6360018363ffffffff61412b16565b600061343a611b61614097565b6134755760405162461bcd60e51b8152600401808060200182810382526040815260200180614cf16040913960400191505060405180910390fd5b60055442116134bb576040805162461bcd60e51b815260206004820152600d60248201526c1b9bdd08195b991959081e595d609a1b604482015290519081900360640190fd5b60035460ff16156134fc576040805162461bcd60e51b81526020600482015260066024820152651c185d5cd95960d21b604482015290519081900360640190fd5b8380600010801561350e575060648111155b613559576040805162461bcd60e51b815260206004820152601760248201527670657263656e74616765206f7574206f662072616e676560481b604482015290519081900360640190fd5b600a5460005b84811015613659578186868381811061357457fe5b90506020020135106135c6576040805162461bcd60e51b8152602060048201526016602482015275111a5cdd1c9a589d5d194e881a5b9d985b1a59081a5960521b604482015290519081900360640190fd5b8015613631578585828181106135d857fe5b905060200201358686600184038181106135ee57fe5b90506020020135106136315760405162461bcd60e51b8152600401808060200182810382526024815260200180614bfe6024913960400191505060405180910390fd5b61364d86868381811061364057fe5b905060200201358861429d565b9093019260010161355f565b5060095461366d908463ffffffff613fa116565b6009555090949350505050565b611dbb613685614097565b6140e3565b60608060608060606000600a805490509050806040519080825280602002602001820160405280156136c6578160200160208202803883390190505b509550806040519080825280602002602001820160405280156136f3578160200160208202803883390190505b50945080604051908082528060200260200182016040528015613720578160200160208202803883390190505b5093508060405190808252806020026020018201604052801561374d578160200160208202803883390190505b5092508060405190808252806020026020018201604052801561377a578160200160208202803883390190505b50915060005b8181101561390157613790614a42565b600a828154811061379d57fe5b60009182526020918290206040805160a08101825260029390930290910180546001600160a01b038116808552600160a01b918290046001600160501b039081169686019690965260019092015480861693850193909352600160501b8304909416606084015292900461ffff166080820152895190925089908490811061382157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050806020015187838151811061385257fe5b60200260200101906001600160501b031690816001600160501b031681525050806040015186838151811061388357fe5b60200260200101906001600160501b031690816001600160501b03168152505080606001518583815181106138b457fe5b60200260200101906001600160501b031690816001600160501b03168152505080608001518483815181106138e557fe5b61ffff9092166020928302919091019091015250600101613780565b50509091929394565b600a5490565b60095481565b600080600080600060608060608061392d8a614222565b98506139388a613e67565b6001600160a01b038d166000908152600b602090815260409182902080548351818402810184019094528084526001600160501b039096169d50939b50919950898b0398506060939092918301828280156139b257602002820191906000526020600020905b81548152602001906001019080831161399e575b5050505050905080516040519080825280602002602001820160405280156139e4578160200160208202803883390190505b5094508051604051908082528060200260200182016040528015613a12578160200160208202803883390190505b5093508051604051908082528060200260200182016040528015613a40578160200160208202803883390190505b5092508051604051908082528060200260200182016040528015613a6e578160200160208202803883390190505b50915060005b8151811015613c3757600a828281518110613a8b57fe5b602002602001015181548110613a9d57fe5b906000526020600020906002020160000160149054906101000a90046001600160501b0316868281518110613ace57fe5b60200260200101906001600160501b031690816001600160501b031681525050600a828281518110613afc57fe5b602002602001015181548110613b0e57fe5b906000526020600020906002020160010160009054906101000a90046001600160501b0316858281518110613b3f57fe5b60200260200101906001600160501b031690816001600160501b031681525050600a828281518110613b6d57fe5b602002602001015181548110613b7f57fe5b9060005260206000209060020201600101600a9054906101000a90046001600160501b0316848281518110613bb057fe5b60200260200101906001600160501b031690816001600160501b031681525050600a828281518110613bde57fe5b602002602001015181548110613bf057fe5b906000526020600020906002020160010160149054906101000a900461ffff16838281518110613c1c57fe5b61ffff90921660209283029190910190910152600101613a74565b50509193959799909294969850565b6003546201000090046001600160a01b031681565b60055481565b613c69612253565b613ca8576040805162461bcd60e51b81526020600482018190526024820152600080516020614caf833981519152604482015290519081900360640190fd5b611baa8161452f565b609681565b6000613cc3611b61614097565b613cfe5760405162461bcd60e51b8152600401808060200182810382526040815260200180614cf16040913960400191505060405180910390fd5b6005544211613d44576040805162461bcd60e51b815260206004820152600d60248201526c1b9bdd08195b991959081e595d609a1b604482015290519081900360640190fd5b60035460ff1615613d85576040805162461bcd60e51b81526020600482015260066024820152651c185d5cd95960d21b604482015290519081900360640190fd5b82806000108015613d97575060648111155b613de2576040805162461bcd60e51b815260206004820152601760248201527670657263656e74616765206f7574206f662072616e676560481b604482015290519081900360640190fd5b60005b600a54811015613e3d578361ffff16600a8281548110613e0157fe5b6000918252602090912060029091020160010154600160a01b900461ffff161415613e3557613e30818661429d565b830192505b600101613de5565b50600954613e51908363ffffffff613fa116565b6009555092915050565b670de0b6b3a764000081565b6001600160a01b0381166000908152600b6020908152604080832080548251818502810185019093528083528493849360609390929091830182828015613ecd57602002820191906000526020600020905b815481526020019060010190808311613eb9575b50939450600093505050505b8151811015613f9857613eea614a42565b600a838381518110613ef857fe5b602002602001015181548110613f0a57fe5b60009182526020918290206040805160a08101825260029390930290910180546001600160a01b0381168452600160a01b908190046001600160501b03908116958501869052600192830154808216948601859052600160501b81049091166060860181905291900461ffff1660809094019390935298909201979690910195940193919091019050613ed9565b50509193909250565b600082820183811015613ffb576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b6000611c63600654836145cf90919063ffffffff16565b6000613ffb83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614628565b600061406883614222565b90506001600160a01b03811661407a57fe5b600354613ffe906201000090046001600160a01b03168284614246565b3390565b6140ac60028263ffffffff6146bf16565b6040516001600160a01b038216907fee1504a83b6d4a361f4c1dc78ab59bfa30d6a3b6612c403e86bb01ef2984295f90600090a250565b6140f460028263ffffffff61474016565b6040516001600160a01b038216907f270d9b30cf5b0793bbfd54c9d5b94aeb49462b8148399000265144a8722da6b690600090a250565b60006001600160a01b0382166141725760405162461bcd60e51b8152600401808060200182810382526022815260200180614ccf6022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b6141a360018263ffffffff61474016565b6040516001600160a01b038216907f0a8eb35e5ca14b3d6f28e4abf2f128dbab231a58b56e89beb5d636115001e16590600090a250565b6141eb60018263ffffffff6146bf16565b6040516001600160a01b038216907f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129990600090a250565b6001600160a01b038082166000908152600c60205260409020541680611c66575090565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526142989084906147a7565b505050565b60006142a7614a42565b600a84815481106142b457fe5b60009182526020918290206040805160a081018252600290930290910180546001600160a01b03811684526001600160501b03600160a01b91829004811695850195909552600190910154808516928401839052600160501b8104909416606084015261ffff9304929092166080820152915061434a9060649061433e908663ffffffff6145cf16565b9063ffffffff61495f16565b915080604001516001600160501b031661437a82606001516001600160501b031684613fa190919063ffffffff16565b11156143b75760405162461bcd60e51b815260040180806020018281038252602b815260200180614b89602b913960400191505060405180910390fd5b600082116143c157fe5b600354604080516370a0823160e01b81523060048201529051620100009092046001600160a01b0316916370a0823191602480820192602092909190829003018186803b15801561441157600080fd5b505afa158015614425573d6000803e3d6000fd5b505050506040513d602081101561443b57600080fd5b505182111561447b5760405162461bcd60e51b815260040180806020018281038252602a815260200180614ae6602a913960400191505060405180910390fd5b81600a858154811061448957fe5b60009182526020822060016002909202010180546001600160501b03600160501b80830482169095011690930269ffffffffffffffffffff60501b199093169290921790915581516144db908461405d565b825160408051868152426020820152815193945087936001600160a01b038087169416927f2e0af9fd06c112bbfcb6770377b964ccb18691b6217ca6c8054c6337b0a7cc9c928290030190a4505092915050565b6001600160a01b0381166145745760405162461bcd60e51b8152600401808060200182810382526026815260200180614a886026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000826145de57506000613ffe565b828202828482816145eb57fe5b0414613ffb5760405162461bcd60e51b8152600401808060200182810382526021815260200180614c656021913960400191505060405180910390fd5b600081848411156146b75760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561467c578181015183820152602001614664565b50505050905090810190601f1680156146a95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6146c9828261412b565b1561471b576040805162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b61474a828261412b565b6147855760405162461bcd60e51b8152600401808060200182810382526021815260200180614c446021913960400191505060405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b6147b9826001600160a01b03166149a1565b61480a576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106148485780518252601f199092019160209182019101614829565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146148aa576040519150601f19603f3d011682016040523d82523d6000602084013e6148af565b606091505b509150915081614906576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115611f8b5780806020019051602081101561492257600080fd5b5051611f8b5760405162461bcd60e51b815260040180806020018281038252602a815260200180614d80602a913960400191505060405180910390fd5b6000613ffb83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506149dd565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906149d557508115155b949350505050565b60008183614a2c5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561467c578181015183820152602001614664565b506000838581614a3857fe5b0495945050505050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915290565b60408051808201909152600080825260208201529056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573736f6e6c7943616e537761703a2065746820616d6f756e74206973206c6f776572207468616e206d696e20696e646976696475616c20636170446973747269627574653a206e6f7420656e6f75676820746f6b656e20746f20646973747269627574656f6e6c79436170537761703a206d617820696e646976696475616c206361702072656163686564456d657267656e63793a206e6f74206f70656e20666f7220656d657267656e6379207769746864726177616c6f6e6c7943616e537761703a2073656e646572206973206e6f742077686974656c6973746564446973747269627574653a20746f74616c2064697374726962757465206d6f7265207468616e203130302552656365697069656e743a20696e76616c69642065746820726563697069656e74206164647265737354696d65733a20696e76616c696420737461727420616e6420656e642074696d65446973747269627574653a20696e646963657320617265206e6f7420696e206f72646572457374696d6174653a206e6f7420656e6f75676820746f6b656e2062616c616e6365526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77456d657267656e63793a206e6f7420656e6f75676820746f6b656e20746f20646973747269627574654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572526f6c65733a206163636f756e7420697320746865207a65726f206164647265737357686974656c69737441646d696e526f6c653a2063616c6c657220646f6573206e6f742068617665207468652057686974656c69737441646d696e20726f6c65456d657267656e63793a20757365722068617320636c61696d656420616c6c20746f6b656e73457374696d6174653a20746f74616c2064697374726962757465206d6f7265207468616e20313030255361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a265627a7a72315820a2ef811f4003c66ef0fb0aae7509e5f9676d3367cbf9a65f0fb39b0c15bebd1164736f6c634300050b0032
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b99f4471f4a16b4467de2be3d5472698966918af00000000000000000000000077a7527776530bf416b6b59bf357a49f1ce1d3da
-----Decoded View---------------
Arg [0] : _owner (address): 0xB99F4471F4A16b4467DE2BE3d5472698966918aF
Arg [1] : _token (address): 0x77a7527776530Bf416B6B59Bf357a49F1ce1d3DA
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000b99f4471f4a16b4467de2be3d5472698966918af
Arg [1] : 00000000000000000000000077a7527776530bf416b6b59bf357a49f1ce1d3da
Deployed Bytecode Sourcemap
40211:23472:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45655:16;:14;:16::i;:::-;;40211:23472;50949:1243;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50949:1243:0;;;:::i;:::-;;;;;;;;;;;;;;;;45838:470;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45838:470:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45838:470:0;;;;;;;:::i;:::-;;7154:110;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7154:110:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7154:110:0;-1:-1:-1;;;;;7154:110:0;;:::i;41522:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41522:33:0;;;:::i;:::-;;;;-1:-1:-1;;;;;41522:33:0;;;;;;;;;;;;;;;;;;;;;;;;40634:53;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40634:53:0;;;:::i;41035:41::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41035:41:0;;;:::i;7272:116::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7272:116:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7272:116:0;-1:-1:-1;;;;;7272:116:0;;:::i;42012:53::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42012:53:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42012:53:0;-1:-1:-1;;;;;42012:53:0;;:::i;:::-;;;;-1:-1:-1;;;;;42012:53:0;;;;;;;;;;;;;;40524:44;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40524:44:0;;;:::i;7027:119::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7027:119:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7027:119:0;-1:-1:-1;;;;;7027:119:0;;:::i;:::-;;;;;;;;;;;;;;;;;;55615:548;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55615:548:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;55615:548:0;;;;;;;-1:-1:-1;;;;;55615:548:0;;;;;;;;;;;;;;;;;;;;;;;;;8571:126;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8571:126:0;;;:::i;41194:31::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41194:31:0;;;:::i;41956:49::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41956:49:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;41956:49:0;;;;;;;;:::i;5774:95::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5774:95:0;;;:::i;47025:287::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47025:287:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47025:287:0;-1:-1:-1;;;;;47025:287:0;;:::i;41326:35::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41326:35:0;;;:::i;8786:432::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8786:432:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;8786:432:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;8786:432:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;8786:432:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;8786:432:0;;-1:-1:-1;8786:432:0;-1:-1:-1;8786:432:0;;;;:::i;2963:140::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2963:140:0;;;:::i;5650:116::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5650:116:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5650:116:0;-1:-1:-1;;;;;5650:116:0;;:::i;40940:55::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40940:55:0;;;:::i;47510:1423::-;;;:::i;52919:259::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52919:259:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;52919:259:0;;;;;;;;;;:::i;8439:124::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8439:124:0;;;:::i;2152:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2152:79:0;;;:::i;2518:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2518:94:0;;;:::i;46400:552::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46400:552:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46400:552:0;;:::i;56508:2271::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56508:2271:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56508:2271:0;;-1:-1:-1;;;;;56508:2271:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;56508:2271:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;56508:2271:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;56508:2271:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;56508:2271:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;56508:2271:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;40777:54;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40777:54:0;;;:::i;9325:423::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9325:423:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;9325:423:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;9325:423:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;9325:423:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;9325:423:0;;-1:-1:-1;9325:423:0;-1:-1:-1;9325:423:0;;;;:::i;59135:2268::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;59135:2268:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;59135:2268:0;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;59135:2268:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;59135:2268:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;59135:2268:0;;-1:-1:-1;59135:2268:0;-1:-1:-1;59135:2268:0;:::i;40375:88::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40375:88:0;;;:::i;52316:493::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52316:493:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;52316:493:0;;;;;;;;:::i;9756:82::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9756:82:0;;;:::i;40470:47::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40470:47:0;;;:::i;41864:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41864:27:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41864:27:0;;:::i;:::-;;;;-1:-1:-1;;;;;41864:27:0;;;;;-1:-1:-1;;;;;41864:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5517:125;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5517:125:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5517:125:0;-1:-1:-1;;;;;5517:125:0;;:::i;50021:668::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50021:668:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;50021:668:0;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;50021:668:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;50021:668:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;50021:668:0;;-1:-1:-1;50021:668:0;-1:-1:-1;50021:668:0;:::i;7396:89::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7396:89:0;;;:::i;53349:865::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53349:865:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;53349:865:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;53349:865:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;53349:865:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;53349:865:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;53349:865:0;;;;;;;;;;;;;;;;;;;;;;;;;53241:100;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53241:100:0;;;:::i;41562:40::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41562:40:0;;;:::i;54271:1336::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54271:1336:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54271:1336:0;-1:-1:-1;;;;;54271:1336:0;;:::i;:::-;;;;;-1:-1:-1;;;;;54271:1336:0;-1:-1:-1;;;;;54271:1336:0;;;;;;;;;;;-1:-1:-1;;;;;54271:1336:0;-1:-1:-1;;;;;54271:1336:0;;;;;;-1:-1:-1;;;;;54271:1336:0;-1:-1:-1;;;;;54271:1336:0;;;;;;-1:-1:-1;;;;;54271:1336:0;-1:-1:-1;;;;;54271:1336:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;54271:1336:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;54271:1336:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;-1:-1;;;;54271:1336:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54271:1336:0;;;;;;;;23:1:-1;27:10;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;41004:24:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41004:24:0;;;:::i;41114:39::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41114:39:0;;;:::i;3258:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3258:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3258:109:0;-1:-1:-1;;;;;3258:109:0;;:::i;40838:52::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40838:52:0;;;:::i;49264:475::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49264:475:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49264:475:0;;;;;;;;;:::i;40575:52::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40575:52:0;;;:::i;47510:1423::-;27168:11;;47655:19;;27168:11;;;;;27160:55;;;;;-1:-1:-1;;;27160:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;27293:11;:19;;-1:-1:-1;;27293:19:0;;;;;;8239:7;8238:8;8230:27;;;;;-1:-1:-1;;;8230:27:0;;;;;;;;;;;;-1:-1:-1;;;8230:27:0;;;;;;;;;;;;;;;47626:9;43999:1;43987:9;:13;43979:50;;;;;-1:-1:-1;;;43979:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;44145:13;;44098:15;;44132:26;;;44124:67;;;;;-1:-1:-1;;;44124:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;44223:11;;44210:9;:24;;44202:63;;;;;-1:-1:-1;;;44202:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;44325:9;:17;40559:9;-1:-1:-1;;;;;44325:17:0;;;:28;44317:70;;;;;-1:-1:-1;;;44317:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;44415:10;44474:21;44415:10;44474:13;:21::i;:::-;44466:72;;;;-1:-1:-1;;;44466:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44622:20;44649:29;44671:6;44649:21;:29::i;:::-;-1:-1:-1;44621:57:0;;-1:-1:-1;44689:22:0;;-1:-1:-1;44714:37:0;:9;-1:-1:-1;;;;;44728:22:0;;44714:37;:13;:37;:::i;:::-;44689:62;;40620:7;44784:14;:36;;44762:142;;;;-1:-1:-1;;;44762:142:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40679:8;44937:14;:36;;44915:125;;;;-1:-1:-1;;;44915:125:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47709:10;47750:9;47784:26;47750:9;47784:15;:26::i;:::-;47770:40;;47904:14;40989:6;47940:13;;47922:15;:31;47921:58;;;;;;47904:75;;48006:5;47997:6;:14;47990:22;;;;48092:25;;:::i;:::-;48120:202;;;;;;;;48150:6;-1:-1:-1;;;;;48120:202:0;;;;;48187:9;-1:-1:-1;;;;;48120:202:0;;;;;48228:11;-1:-1:-1;;;;;48120:202:0;;;;;48271:1;-1:-1:-1;;;;;48120:202:0;;;;;48303:6;48120:202;;;;;48092:230;;48333:9;48348;48333:25;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;48333:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48333:25:0;;;;;-1:-1:-1;;;;;48333:25:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48333:25:0;;;;;-1:-1:-1;;;;;48333:25:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48333:25:0;;;;;-1:-1:-1;;;;;48333:25:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48333:25:0;;;;;-1:-1:-1;;;;;48333:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48403:12;:20;48416:6;-1:-1:-1;;;;;48403:20:0;-1:-1:-1;;;;;48403:20:0;;;;;;;;;;;;48448:1;48429:9;:16;;;;:20;48403:47;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;48403:47:0;;;;;;;;;;;;;;;;;;;;;;48515:35;;:::i;:::-;48553:9;48515:47;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48515:47:0;-1:-1:-1;;;;;48515:47:0;-1:-1:-1;;;;;48515:47:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48515:47:0;-1:-1:-1;;;;;48515:47:0;-1:-1:-1;;;;;48515:47:0;;;;;;;48585:159;;;;;;;;48656:9;48626:11;:19;;;:40;-1:-1:-1;;;;;48585:159:0;;;;;48720:11;48690;:19;;;:42;-1:-1:-1;;;;;48585:159:0;;;;48573:9;:171;;;;;;;;;;;;;-1:-1:-1;;;;;48573:171:0;;;;;-1:-1:-1;;;;;48573:171:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48573:171:0;;;;;-1:-1:-1;;;;;48573:171:0;;;;;;;;;48795:12;;;;;;;;;-1:-1:-1;;;;;48795:12:0;-1:-1:-1;;;;;48795:21:0;:32;48817:9;48795:32;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;48845:80:0;;;48893:15;48845:80;;;;;;;;;;;48880:11;;48869:9;;-1:-1:-1;;;;;48845:80:0;;;;;;;;;;;;;;-1:-1:-1;;27473:11:0;:18;;-1:-1:-1;;27473:18:0;;;;;-1:-1:-1;47510:1423:0;;;-1:-1:-1;;;;;;;47510:1423:0:o;50949:1243::-;50996:19;51090:11;;40823:8;51068:33;51050:15;:51;51028:145;;;;-1:-1:-1;;;51028:145:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51201:10;51184:14;;51259:29;51201:10;51259:21;:29::i;:::-;51222:66;;;;;51313:20;51325:7;-1:-1:-1;;;;;51313:20:0;:7;-1:-1:-1;;;;;51313:11:0;;;:20;;;;:::i;:::-;51299:34;;51366:1;51352:11;:15;51344:66;;;;-1:-1:-1;;;51344:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51458:9;;:34;;;-1:-1:-1;;;51458:34:0;;51486:4;51458:34;;;;;;:9;;;;-1:-1:-1;;;;;51458:9:0;;:19;;:34;;;;;;;;;;;;;;;:9;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;51458:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51458:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51458:34:0;51443:49;;;51421:140;;;;-1:-1:-1;;;51421:140:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51635:20:0;;;;;;:12;:20;;;;;;;;;51612:43;;;;;;;;;;;;;;;;;:20;;:43;;;51635:20;51612:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51612:43:0;;-1:-1:-1;51670:9:0;;-1:-1:-1;;;;51666:263:0;51689:3;:10;51685:1;:14;51666:263;;;51781:6;-1:-1:-1;;;;;51755:32:0;:9;51765:3;51769:1;51765:6;;;;;;;;;;;;;;51755:17;;;;;;;;;;;;;;;;;;;;;:22;-1:-1:-1;;;;;51755:22:0;:32;51748:40;;;;51892:9;51902:3;51906:1;51902:6;;;;;;;;;;;;;;51892:17;;;;;;;;;;;;;;;;;;:25;;;;;;;;;;-1:-1:-1;;;;;51892:25:0;51864:9;51874:3;51878:1;51874:6;;;;;;;;;;;;;;51864:17;;;;;;;;;;;;;;;;:25;:17;;;;;:25;;:53;;-1:-1:-1;;;;;51864:53:0;;;;-1:-1:-1;;;51864:53:0;-1:-1:-1;;;;51864:53:0;;;;;;;;;;51701:3;51666:263;;;-1:-1:-1;51963:21:0;;:38;;51989:11;51963:38;:25;:38;:::i;:::-;51939:21;:62;52047:17;52067:35;52082:6;52090:11;52067:14;:35::i;:::-;52047:55;;52155:11;52144:9;-1:-1:-1;;;;;52118:66:0;52136:6;-1:-1:-1;;;;;52118:66:0;;52168:15;52118:66;;;;;;;;;;;;;;;;;;50949:1243;;;;;;:::o;45838:470::-;43136:13;;43118:15;:31;43110:59;;;;;-1:-1:-1;;;43110:59:0;;;;;;;;;;;;-1:-1:-1;;;43110:59:0;;;;;;;;;;;;;;;2364:9;:7;:9::i;:::-;2356:54;;;;;-1:-1:-1;;;2356:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2356:54:0;;;;;;;;;;;;;;;45970:18;;45966:53;;45990:13;:29;;;45966:53;46034:16;;46030:47;;46052:11;:25;;;46030:47;46112:11;;46096:13;;:27;46088:73;;;;-1:-1:-1;;;46088:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46198:13;;46180:15;:31;46172:69;;;;;-1:-1:-1;;;46172:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;46273:13;;46288:11;;46257:43;;;;;;;;;;;;;;;;45838:470;;:::o;7154:110::-;5390:30;5407:12;:10;:12::i;:::-;5390:16;:30::i;:::-;5382:107;;;;-1:-1:-1;;;5382:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7232:24;7248:7;7232:15;:24::i;:::-;7154:110;:::o;41522:33::-;;;-1:-1:-1;;;;;41522:33:0;;;;-1:-1:-1;;;41522:33:0;;;;:::o;40634:53::-;40679:8;40634:53;:::o;41035:41::-;;;;:::o;7272:116::-;5390:30;5407:12;:10;:12::i;5390:30::-;5382:107;;;;-1:-1:-1;;;5382:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7353:27;7372:7;7353:18;:27::i;42012:53::-;;;;;;;;;;;;-1:-1:-1;;;;;42012:53:0;;:::o;40524:44::-;40559:9;40524:44;:::o;7027:119::-;7088:4;7112:26;:13;7130:7;7112:26;:17;:26;:::i;:::-;7105:33;;7027:119;;;;:::o;55615:548::-;55935:13;;55970:11;;56000:8;;56035:12;;56069:9;:17;55935:13;;55970:11;;56000:8;;-1:-1:-1;;;;;56035:12:0;;;;-1:-1:-1;;;;;;;;56069:17:0;;;;;56108;;;40559:9;;55615:548::o;8571:126::-;5390:30;5407:12;:10;:12::i;5390:30::-;5382:107;;;;-1:-1:-1;;;5382:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8326:7;;;;8318:30;;;;;-1:-1:-1;;;8318:30:0;;;;;;;;;;;;-1:-1:-1;;;8318:30:0;;;;;;;;;;;;;;;8638:7;:15;;-1:-1:-1;;8638:15:0;;;8669:20;;;8678:10;8669:20;;;;;;;;;;;;;8571:126::o;41194:31::-;;;;:::o;41956:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5774:95::-;5826:35;5848:12;:10;:12::i;:::-;5826:21;:35::i;:::-;5774:95::o;47025:287::-;2364:9;:7;:9::i;:::-;2356:54;;;;;-1:-1:-1;;;2356:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2356:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;47143:27:0;;47135:81;;;;-1:-1:-1;;;47135:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47227:12;:28;;-1:-1:-1;;;;;;47227:28:0;-1:-1:-1;;;;;47227:28:0;;;;;;;;47271:33;;;;-1:-1:-1;;47271:33:0;47025:287;:::o;41326:35::-;;;-1:-1:-1;;;;;41326:35:0;;:::o;8786:432::-;2364:9;:7;:9::i;:::-;2356:54;;;;;-1:-1:-1;;;2356:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2356:54:0;;;;;;;;;;;;;;;8931:9;8927:284;8946:17;;;8927:284;;;8989:5;8985:215;;;9020:27;9037:6;;9044:1;9037:9;;;;;;;;;;;;;-1:-1:-1;;;;;9037:9:0;9020:16;:27::i;:::-;9015:63;;9049:29;9068:6;;9075:1;9068:9;;;;;;;;;;;;;-1:-1:-1;;;;;9068:9:0;9049:18;:29::i;:::-;8985:215;;;9123:27;9140:6;;9147:1;9140:9;;;;;;9123:27;9119:65;;;9152:32;9174:6;;9181:1;9174:9;;;;;;;;;;;;;-1:-1:-1;;;;;9174:9:0;9152:21;:32::i;:::-;8965:3;;8927:284;;;;8786:432;;;:::o;2963:140::-;2364:9;:7;:9::i;:::-;2356:54;;;;;-1:-1:-1;;;2356:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2356:54:0;;;;;;;;;;;;;;;3062:1;3046:6;;3025:40;;-1:-1:-1;;;;;3046:6:0;;;;3025:40;;3062:1;;3025:40;3093:1;3076:19;;-1:-1:-1;;;;;;3076:19:0;;;2963:140::o;5650:116::-;5390:30;5407:12;:10;:12::i;5390:30::-;5382:107;;;;-1:-1:-1;;;5382:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5731:27;5750:7;5731:18;:27::i;40940:55::-;40989:6;40940:55;:::o;52919:259::-;2364:9;:7;:9::i;:::-;2356:54;;;;;-1:-1:-1;;;2356:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2356:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;53024:23:0;;53016:53;;;;;-1:-1:-1;;;53016:53:0;;;;;;;;;;;;-1:-1:-1;;;53016:53:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;53080:24:0;;;;;;;:18;:24;;;;;;;;;:36;;-1:-1:-1;;;;;;53080:36:0;;;;;;;;;53132:38;;;;;;;;;;;;;;;;;;;;;;;;52919:259;;:::o;8439:124::-;5390:30;5407:12;:10;:12::i;5390:30::-;5382:107;;;;-1:-1:-1;;;5382:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8239:7;;;;8238:8;8230:27;;;;;-1:-1:-1;;;8230:27:0;;;;;;;;;;;;-1:-1:-1;;;8230:27:0;;;;;;;;;;;;;;;8507:7;:14;;-1:-1:-1;;8507:14:0;8517:4;8507:14;;;8537:18;;;8544:10;8537:18;;;;;;;;;;;;;8439:124::o;2152:79::-;2190:7;2217:6;-1:-1:-1;;;;;2217:6:0;2152:79;:::o;2518:94::-;2558:4;2598:6;;-1:-1:-1;;;;;2598:6:0;2582:12;:10;:12::i;:::-;-1:-1:-1;;;;;2582:22:0;;2575:29;;2518:94;:::o;46400:552::-;43259:11;;43240:15;:30;;43232:56;;;;;-1:-1:-1;;;43232:56:0;;;;;;;;;;;;-1:-1:-1;;;43232:56:0;;;;;;;;;;;;;;;2364:9;:7;:9::i;:::-;2356:54;;;;;-1:-1:-1;;;2356:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2356:54:0;;;;;;;;;;;;;;;46540:32;46525:47;;46503:128;;;;;-1:-1:-1;;;46503:128:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;46755:1;46744:8;;:12;;;;;;46728;:28;;46720:64;;;;;-1:-1:-1;;;46720:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;46834:1;46819:8;;46830:1;46819:12;:16;;;;;;46803:12;:32;;46795:69;;;;;-1:-1:-1;;;46795:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;46877:8;:23;;;46916:28;;46888:12;;46916:28;;;;;46400:552;:::o;56508:2271::-;56740:11;56766:18;56799:31;56845:28;56888:22;56925:27;56967:35;57017:23;43374:11;;43356:15;:29;43348:55;;;;;-1:-1:-1;;;43348:55:0;;;;;;;;;;;;-1:-1:-1;;;43348:55:0;;;;;;;;;;;;;;;8239:7;;;;8238:8;8230:27;;;;;-1:-1:-1;;;8230:27:0;;;;;;;;;;;;-1:-1:-1;;;8230:27:0;;;;;;;;;;;;;;;56697:10;-1:-1:-1;;;;;43431:151:0;43503:10;43499:1;:14;:35;;;;;43531:3;43517:10;:17;;43499:35;43491:71;;;;;-1:-1:-1;;;43491:71:0;;;;;;;;;;;;-1:-1:-1;;;43491:71:0;;;;;;;;;;;;;;;57138:1;;-1:-1:-1;57138:1:0;57150:204;57173:9;:16;57169:20;;57150:204;;;57238:6;57215:29;;:9;57225:1;57215:12;;;;;;;;;;;;;;;;;;;;;:19;;;-1:-1:-1;;;57215:19:0;;;;:29;:76;;;;;57271:9;57281:1;57271:12;;;;;;;;;;;;;;;;;;:20;;;;;;;;;;-1:-1:-1;;;;;57271:20:0;-1:-1:-1;;;;;57248:43:0;:9;57258:1;57248:12;;;;;;;;;;;;;;;;:20;:12;;;;;:20;;-1:-1:-1;;;;;57248:20:0;:43;57215:76;57211:132;;;57326:1;57312:15;;;;57211:132;57191:3;;57150:204;;;;57450:10;57436:25;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;57436:25:0;;57422:39;;57494:10;57480:25;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;57480:25:0;;57472:33;;57543:10;57529:25;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;57529:25:0;;57516:38;;57600:10;57587:24;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;57587:24:0;;57565:46;;57645:10;57632:24;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;57632:24:0;-1:-1:-1;57622:34:0;-1:-1:-1;57669:15:0;;57699:861;57722:9;:16;57718:20;;57699:861;;;57760:20;;:::i;:::-;57783:9;57793:1;57783:12;;;;;;;;;;;;;;;;;57760:35;;;;;;;;57783:12;;;;;;;57760:35;;-1:-1:-1;;;;;57760:35:0;;;;-1:-1:-1;;;;;;;;57760:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;57760:35:0;;;;;;;;;;;;;;;;;;;;57814:12;;57760:35;;-1:-1:-1;57814:29:0;;;;57760:35;57824:1;;57814:12;;;;;;;;;;;;;;;;;;;:19;;;-1:-1:-1;;;57814:19:0;;;;:29;:76;;;;;57870:9;57880:1;57870:12;;;;;;;;;;;;;;;;;;:20;;;;;;;;;;-1:-1:-1;;;;;57870:20:0;-1:-1:-1;;;;;57847:43:0;:9;57857:1;57847:12;;;;;;;;;;;;;;;;:20;:12;;;;;:20;;-1:-1:-1;;;;;57847:20:0;:43;57814:76;57810:739;;;57934:1;57911:11;57923:7;57911:20;;;;;;;;;;;;;:24;;;;;57971:4;:9;;;57954:5;57960:7;57954:14;;;;;;;;-1:-1:-1;;;;;57954:26:0;;;:14;;;;;;;;;;;:26;58035:9;;58021:24;;:13;:24::i;:::-;57999:10;58010:7;57999:19;;;;;;;;;;;;;:46;-1:-1:-1;;;;;57999:46:0;;;-1:-1:-1;;;;;57999:46:0;;;;;58175:3;58162:10;58147:4;:12;;;:25;-1:-1:-1;;;;;58147:31:0;;;;;;;58116:19;58136:7;58116:28;;;;;;;;;;;;;:62;-1:-1:-1;;;;;58116:62:0;;;-1:-1:-1;;;;;58116:62:0;;;;;58274:4;:12;;;-1:-1:-1;;;;;58227:59:0;58258:4;:12;;;58227:19;58247:7;58227:28;;;;;;;;;;;;;;:43;-1:-1:-1;;;;;58227:59:0;;;58197:174;;;;-1:-1:-1;;;58197:174:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58409:9;58419:1;58409:12;;;;;;;;;;;;;;;;;;:19;;;;;;;;;;;;58390:7;58398;58390:16;;;;;;;;;;;;;:38;;;;;;;;;;;58474:19;58494:7;58474:28;;;;;;;;;;;;;;-1:-1:-1;;;;;58447:55:0;;;;;58532:1;58521:12;;;;57810:739;-1:-1:-1;57740:3:0;;57699:861;;;-1:-1:-1;58619:9:0;;:34;;;-1:-1:-1;;;58619:34:0;;58647:4;58619:34;;;;;;:9;;;;-1:-1:-1;;;;;58619:9:0;;:19;;:34;;;;;;;;;;;;;;;:9;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;58619:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;58619:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;58619:34:0;58592:61;;;58570:145;;;;-1:-1:-1;;;58570:145:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40887:3;58735:10;:36;;58726:45;;43573:1;8268;56508:2271;;;;;;;;;;;:::o;40777:54::-;40823:8;40777:54;:::o;9325:423::-;5390:30;5407:12;:10;:12::i;5390:30::-;5382:107;;;;-1:-1:-1;;;5382:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9478:9;9474:267;9493:16;;;9474:267;;;9535:5;9531:199;;;9566:23;9580:5;;9586:1;9580:8;;;;;;;;;;;;;-1:-1:-1;;;;;9580:8:0;9566:13;:23::i;:::-;9561:55;;9591:25;9607:5;;9613:1;9607:8;;;;;;;;;;;;;-1:-1:-1;;;;;9607:8:0;9591:15;:25::i;:::-;9531:199;;;9661:23;9675:5;;9681:1;9675:8;;;;;;9661:23;9657:57;;;9686:28;9705:5;;9711:1;9705:8;;;;;;;;;;;;;-1:-1:-1;;;;;9705:8:0;9686:18;:28::i;:::-;9511:3;;9474:267;;59135:2268;59378:11;59404:18;59437:31;59483:28;59526:22;59563:27;59605:35;59655:23;43374:11;;43356:15;:29;43348:55;;;;;-1:-1:-1;;;43348:55:0;;;;;;;;;;;;-1:-1:-1;;;43348:55:0;;;;;;;;;;;;;;;8239:7;;;;8238:8;8230:27;;;;;-1:-1:-1;;;8230:27:0;;;;;;;;;;;;-1:-1:-1;;;8230:27:0;;;;;;;;;;;;;;;59335:10;-1:-1:-1;;;;;43431:151:0;43503:10;43499:1;:14;:35;;;;;43531:3;43517:10;:17;;43499:35;43491:71;;;;;-1:-1:-1;;;43491:71:0;;;;;;;;;;;;-1:-1:-1;;;43491:71:0;;;;;;;;;;;;;;;59719:1;;-1:-1:-1;59719:1:0;59731:332;59750:14;;;59731:332;;;59803:9;:16;59794:3;;59798:1;59794:6;;;;;;;;;;;;;:25;59786:63;;;;;-1:-1:-1;;;59786:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;59868:5;;59864:67;;59892:3;;59900:1;59896;:5;59892:10;;;;;;;;;;;;;59883:3;;59887:1;59883:6;;;;;;;;;;;;;:19;59875:56;;;;;-1:-1:-1;;;59875:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;60014:9;60024:1;60014:12;;;;;;;;;;;;;;;;;;:20;;;;;;;;;;-1:-1:-1;;;;;60014:20:0;-1:-1:-1;;;;;59991:43:0;:9;60001:1;59991:12;;;;;;;;;;;;;;;;:20;:12;;;;;:20;;-1:-1:-1;;;;;59991:20:0;:43;59987:64;;;60050:1;60036:15;;;;59987:64;59766:3;;59731:332;;;;60157:10;60143:25;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;60143:25:0;;60129:39;;60201:10;60187:25;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;60187:25:0;;60179:33;;60250:10;60236:25;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;60236:25:0;;60223:38;;60307:10;60294:24;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;60294:24:0;;60272:46;;60352:10;60339:24;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;60339:24:0;-1:-1:-1;60329:34:0;-1:-1:-1;60376:15:0;;60406:778;60425:14;;;60406:778;;;60489:9;60499:1;60489:12;;;;;;;;;;;;;;;;;;:20;;;;;;;;;;-1:-1:-1;;;;;60489:20:0;-1:-1:-1;;;;;60465:44:0;:9;60475:1;60465:12;;;;;;;;;;;;;;;;:20;:12;;;;;:20;;-1:-1:-1;;;;;60465:20:0;:44;60461:58;;60511:8;;60461:58;60534:20;;:::i;:::-;60557:9;60567:3;;60571:1;60567:6;;;;;;;;;;;;;60557:17;;;;;;;;;;;;;;;;;60534:40;;;;;;;;60557:17;;;;;;;60534:40;;-1:-1:-1;;;;;60534:40:0;;;;-1:-1:-1;;;;;;;;60534:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60534:40:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60612:3:0;;60616:1;60612:6;;;;;;;;;;;;;60589:11;60601:7;60589:20;;;;;;;;;;;;;:29;;;;;60650:4;:9;;;60633:5;60639:7;60633:14;;;;;;;;-1:-1:-1;;;;;60633:26:0;;;:14;;;;;;;;;;;:26;60710:9;;60696:24;;:13;:24::i;:::-;60674:10;60685:7;60674:19;;;;;;;;;;;;;:46;-1:-1:-1;;;;;60674:46:0;;;-1:-1:-1;;;;;60674:46:0;;;;;60842:3;60829:10;60814:4;:12;;;:25;-1:-1:-1;;;;;60814:31:0;;;;;;;60783:19;60803:7;60783:28;;;;;;;;;;;;;:62;-1:-1:-1;;;;;60783:62:0;;;-1:-1:-1;;;;;60783:62:0;;;;;60933:4;:12;;;-1:-1:-1;;;;;60886:59:0;60917:4;:12;;;60886:19;60906:7;60886:28;;;;;;;;;;;;;;:43;-1:-1:-1;;;;;60886:59:0;;;60860:162;;;;-1:-1:-1;;;60860:162:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61064:19;61084:7;61064:28;;;;;;;;;;;;;;-1:-1:-1;;;;;61037:55:0;;;;;61126:9;61136:1;61126:12;;;;;;;;;;;;;;;;;;:19;;;;;;;;;;;;61107:7;61115;61107:16;;;;;;;;;;;;;:38;;;;;;;;;;;61171:1;61160:12;;;;60406:778;;60441:3;;60406:778;;;-1:-1:-1;61243:9:0;;:34;;;-1:-1:-1;;;61243:34:0;;61271:4;61243:34;;;;;;:9;;;;-1:-1:-1;;;;;61243:9:0;;:19;;:34;;;;;;;;;;;;;;;:9;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;61243:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;61243:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;61243:34:0;61216:61;;;61194:145;;;;-1:-1:-1;;;61194:145:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40887:3;61359:10;:36;;61350:45;;43573:1;8268;59135:2268;;;;;;;;;;;:::o;40375:88::-;40420:42;40375:88;:::o;52316:493::-;2364:9;:7;:9::i;:::-;2356:54;;;;;-1:-1:-1;;;2356:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2356:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;52412:20:0;;40420:42;52412:20;52408:329;;;52627:27;;:10;;:27;;;;;52647:6;;52627:27;;;;52647:6;52627:10;:27;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52627:27:0;52408:329;;;52687:38;-1:-1:-1;;;;;52687:18:0;;52706:10;52718:6;52687:38;:18;:38;:::i;:::-;52752:49;;;;;;;;-1:-1:-1;;;;;52752:49:0;;;52775:10;;52752:49;;;;;;;;;52316:493;;:::o;9756:82::-;9823:7;;;;9756:82;:::o;40470:47::-;40508:9;40470:47;:::o;41864:27::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41864:27:0;;;-1:-1:-1;;;;41864:27:0;;;;-1:-1:-1;;;;;41864:27:0;;;;;;;;-1:-1:-1;;;41864:27:0;;;;;;;;;;:::o;5517:125::-;5581:4;5605:29;:16;5626:7;5605:29;:20;:29;:::i;50021:668::-;50201:19;5390:30;5407:12;:10;:12::i;5390:30::-;5382:107;;;;-1:-1:-1;;;5382:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43374:11;;43356:15;:29;43348:55;;;;;-1:-1:-1;;;43348:55:0;;;;;;;;;;;;-1:-1:-1;;;43348:55:0;;;;;;;;;;;;;;;8239:7;;;;8238:8;8230:27;;;;;-1:-1:-1;;;8230:27:0;;;;;;;;;;;;-1:-1:-1;;;8230:27:0;;;;;;;;;;;;;;;50171:10;43503;43499:1;:14;:35;;;;;43531:3;43517:10;:17;;43499:35;43491:71;;;;;-1:-1:-1;;;43491:71:0;;;;;;;;;;;;-1:-1:-1;;;43491:71:0;;;;;;;;;;;;;;;50252:9;:16;50238:11;50279:330;50298:14;;;50279:330;;;50351:3;50342;;50346:1;50342:6;;;;;;;;;;;;;:12;50334:47;;;;;-1:-1:-1;;;50334:47:0;;;;;;;;;;;;-1:-1:-1;;;50334:47:0;;;;;;;;;;;;;;;50455:5;;50451:79;;50483:3;;50487:1;50483:6;;;;;;;;;;;;;50470:3;;50478:1;50474;:5;50470:10;;;;;;;;;;;;;:19;50462:68;;;;-1:-1:-1;;;50462:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50560:37;50578:3;;50582:1;50578:6;;;;;;;;;;;;;50586:10;50560:17;:37::i;:::-;50545:52;;;;50314:3;;50279:330;;;-1:-1:-1;50643:21:0;;:38;;50669:11;50643:38;:25;:38;:::i;:::-;50619:21;:62;-1:-1:-1;50021:668:0;;;-1:-1:-1;;;;50021:668:0:o;7396:89::-;7445:32;7464:12;:10;:12::i;:::-;7445:18;:32::i;53349:865::-;53427:22;53464:26;53505:28;53548:34;53597:23;53648:11;53662:9;:16;;;;53648:30;;53711:3;53697:18;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;53697:18:0;;53689:26;;53752:3;53739:17;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;53739:17:0;;53726:30;;53795:3;53782:17;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;53782:17:0;;53767:32;;53844:3;53831:17;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;53831:17:0;;53810:38;;53882:3;53869:17;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;53869:17:0;-1:-1:-1;53859:27:0;-1:-1:-1;53903:9:0;53899:308;53922:3;53918:1;:7;53899:308;;;53947:20;;:::i;:::-;53970:9;53980:1;53970:12;;;;;;;;;;;;;;;;;53947:35;;;;;;;;53970:12;;;;;;;;53947:35;;-1:-1:-1;;;;;53947:35:0;;;;;-1:-1:-1;;;53947:35:0;;;;-1:-1:-1;;;;;53947:35:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;53947:35:0;;;;;;;;;;;;;;;;;;53997:8;;53947:35;;-1:-1:-1;53997:8:0;;54003:1;;53997:8;;;;;;;;;;;:20;-1:-1:-1;;;;;53997:20:0;;;-1:-1:-1;;;;;53997:20:0;;;;;54048:4;:12;;;54032:10;54043:1;54032:13;;;;;;;;;;;;;:28;-1:-1:-1;;;;;54032:28:0;;;-1:-1:-1;;;;;54032:28:0;;;;;54093:4;:12;;;54075;54088:1;54075:15;;;;;;;;;;;;;:30;-1:-1:-1;;;;;54075:30:0;;;-1:-1:-1;;;;;54075:30:0;;;;;54144:4;:12;;;54120:18;54139:1;54120:21;;;;;;;;;;;;;:36;-1:-1:-1;;;;;54120:36:0;;;-1:-1:-1;;;;;54120:36:0;;;;;54184:4;:11;;;54171:7;54179:1;54171:10;;;;;;;;:24;;;;:10;;;;;;;;;;;:24;-1:-1:-1;53927:3:0;;53899:308;;;;53349:865;;;;;;:::o;53241:100::-;53317:9;:16;53241:100;:::o;41562:40::-;;;;:::o;54271:1336::-;54366:22;54403;54440:23;54478:24;54517:22;54554:26;54595:28;54638:34;54687:23;54755:19;54769:4;54755:13;:19::i;:::-;54738:36;;54841:27;54863:4;54841:21;:27::i;:::-;-1:-1:-1;;;;;55016:18:0;;;;;;:12;:18;;;;;;;;;54985:49;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54785:83:0;;;;-1:-1:-1;54785:83:0;;-1:-1:-1;54785:83:0;;-1:-1:-1;54897:36:0;;;;-1:-1:-1;54985:28:0;;:49;;55016:18;54985:49;;55016:18;54985:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55071:11;:18;55058:32;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;55058:32:0;;55045:45;;55129:11;:18;55116:32;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;55116:32:0;;55101:47;;55193:11;:18;55180:32;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;55180:32:0;;55159:53;;55246:11;:18;55233:32;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;55233:32:0;-1:-1:-1;55223:42:0;-1:-1:-1;55282:9:0;55278:322;55301:11;:18;55297:1;:22;55278:322;;;55357:9;55367:11;55379:1;55367:14;;;;;;;;;;;;;;55357:25;;;;;;;;;;;;;;;;;;:33;;;;;;;;;;-1:-1:-1;;;;;55357:33:0;55341:10;55352:1;55341:13;;;;;;;;;;;;;:49;-1:-1:-1;;;;;55341:49:0;;;-1:-1:-1;;;;;55341:49:0;;;;;55423:9;55433:11;55445:1;55433:14;;;;;;;;;;;;;;55423:25;;;;;;;;;;;;;;;;;;:33;;;;;;;;;;-1:-1:-1;;;;;55423:33:0;55405:12;55418:1;55405:15;;;;;;;;;;;;;:51;-1:-1:-1;;;;;55405:51:0;;;-1:-1:-1;;;;;55405:51:0;;;;;55495:9;55505:11;55517:1;55505:14;;;;;;;;;;;;;;55495:25;;;;;;;;;;;;;;;;;;:33;;;;;;;;;;-1:-1:-1;;;;;55495:33:0;55471:18;55490:1;55471:21;;;;;;;;;;;;;:57;-1:-1:-1;;;;;55471:57:0;;;-1:-1:-1;;;;;55471:57:0;;;;;55556:9;55566:11;55578:1;55566:14;;;;;;;;;;;;;;55556:25;;;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;55543:7;55551:1;55543:10;;;;;;;;:45;;;;:10;;;;;;;;;;;:45;55321:3;;55278:322;;;;54271:1336;;;;;;;;;;;;:::o;41004:24::-;;;;;;-1:-1:-1;;;;;41004:24:0;;:::o;41114:39::-;;;;:::o;3258:109::-;2364:9;:7;:9::i;:::-;2356:54;;;;;-1:-1:-1;;;2356:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2356:54:0;;;;;;;;;;;;;;;3331:28;3350:8;3331:18;:28::i;40838:52::-;40887:3;40838:52;:::o;49264:475::-;49433:19;5390:30;5407:12;:10;:12::i;5390:30::-;5382:107;;;;-1:-1:-1;;;5382:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43374:11;;43356:15;:29;43348:55;;;;;-1:-1:-1;;;43348:55:0;;;;;;;;;;;;-1:-1:-1;;;43348:55:0;;;;;;;;;;;;;;;8239:7;;;;8238:8;8230:27;;;;;-1:-1:-1;;;8230:27:0;;;;;;;;;;;;-1:-1:-1;;;8230:27:0;;;;;;;;;;;;;;;49403:10;43503;43499:1;:14;:35;;;;;43531:3;43517:10;:17;;43499:35;43491:71;;;;;-1:-1:-1;;;43491:71:0;;;;;;;;;;;;-1:-1:-1;;;43491:71:0;;;;;;;;;;;;;;;49474:9;49470:189;49493:9;:16;49489:20;;49470:189;;;49558:6;49535:29;;:9;49545:1;49535:12;;;;;;;;;;;;;;;;;;;;;:19;;;-1:-1:-1;;;49535:19:0;;;;:29;49531:117;;;49600:32;49618:1;49621:10;49600:17;:32::i;:::-;49585:47;;;;49531:117;49511:3;;49470:189;;;-1:-1:-1;49693:21:0;;:38;;49719:11;49693:38;:25;:38;:::i;:::-;49669:21;:62;-1:-1:-1;49264:475:0;;-1:-1:-1;;49264:475:0:o;40575:52::-;40620:7;40575:52;:::o;63206:474::-;-1:-1:-1;;;;;63421:20:0;;63298:14;63421:20;;;:12;:20;;;;;;;;63398:43;;;;;;;;;;;;;;;;;63298:14;;;;63398:20;;:43;;63421:20;;63398:43;;63421:20;63398:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63398:43:0;;-1:-1:-1;63456:9:0;;-1:-1:-1;;;;63452:221:0;63475:3;:10;63471:1;:14;63452:221;;;63507:20;;:::i;:::-;63530:9;63540:3;63544:1;63540:6;;;;;;;;;;;;;;63530:17;;;;;;;;;;;;;;;;;63507:40;;;;;;;;63530:17;;;;;;;;63507:40;;-1:-1:-1;;;;;63507:40:0;;;;-1:-1:-1;;;63507:40:0;;;;-1:-1:-1;;;;;63507:40:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63507:40:0;;;;;;;;;;;;;;;;;;;;;;;;63562:23;;;;;63600;;;;;63638;;;63487:3;;;;;-1:-1:-1;63452:221:0;;;;63206:474;;;;;;:::o;13638:181::-;13696:7;13728:5;;;13752:6;;;;13744:46;;;;;-1:-1:-1;;;13744:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13810:1;-1:-1:-1;13638:181:0;;;;;:::o;63073:125::-;63140:7;63167:23;63181:8;;63167:9;:13;;:23;;;;:::i;14094:136::-;14152:7;14179:43;14183:1;14186;14179:43;;;;;;;;;;;;;;;;;:3;:43::i;62486:258::-;62558:17;62600:19;62614:4;62600:13;:19::i;:::-;62588:31;-1:-1:-1;;;;;;62660:23:0;;62653:31;;;;62695:9;;:41;;:9;;;-1:-1:-1;;;;;62695:9:0;62718;62729:6;62695:22;:41::i;858:98::-;938:10;858:98;:::o;7493:137::-;7555:26;:13;7573:7;7555:26;:17;:26;:::i;:::-;7597:25;;-1:-1:-1;;;;;7597:25:0;;;;;;;;7493:137;:::o;7638:145::-;7703:29;:13;7724:7;7703:29;:20;:29;:::i;:::-;7748:27;;-1:-1:-1;;;;;7748:27:0;;;;;;;;7638:145;:::o;4572:203::-;4644:4;-1:-1:-1;;;;;4669:21:0;;4661:68;;;;-1:-1:-1;;;4661:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;4747:20:0;:11;:20;;;;;;;;;;;;;;;4572:203::o;6031:154::-;6099:32;:16;6123:7;6099:32;:23;:32;:::i;:::-;6147:30;;-1:-1:-1;;;;;6147:30:0;;;;;;;;6031:154;:::o;5877:146::-;5942:29;:16;5963:7;5942:29;:20;:29;:::i;:::-;5987:28;;-1:-1:-1;;;;;5987:28:0;;;;;;;;5877:146;:::o;62752:215::-;-1:-1:-1;;;;;62853:24:0;;;62811:17;62853:24;;;:18;:24;;;;;;;62892:23;62888:72;;-1:-1:-1;62944:4:0;62752:215::o;21969:176::-;22078:58;;;-1:-1:-1;;;;;22078:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;22078:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;22052:85:0;;22071:5;;22052:18;:85::i;:::-;21969:176;;;:::o;61479:999::-;61574:26;61618:20;;:::i;:::-;61641:9;61651:2;61641:13;;;;;;;;;;;;;;;;;61618:36;;;;;;;;61641:13;;;;;;;61618:36;;-1:-1:-1;;;;;61618:36:0;;;;-1:-1:-1;;;;;;;;61618:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;61618:36:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61686:46:0;;61728:3;;61686:37;;61712:10;61686:37;:25;:37;:::i;:::-;:41;:46;:41;:46;:::i;:::-;61665:67;;61805:4;:12;;;-1:-1:-1;;;;;61765:52:0;:36;61788:4;:12;;;-1:-1:-1;;;;;61765:36:0;:18;:22;;:36;;;;:::i;:::-;:52;;61743:145;;;;-1:-1:-1;;;61743:145:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61973:1;61952:18;:22;61944:31;;;;62030:9;;:34;;;-1:-1:-1;;;62030:34:0;;62058:4;62030:34;;;;;;:9;;;;-1:-1:-1;;;;;62030:9:0;;:19;;:34;;;;;;;;;;;;;;;:9;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;62030:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;62030:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;62030:34:0;62008:56;;;61986:148;;;;-1:-1:-1;;;61986:148:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62237:18;62205:9;62215:2;62205:13;;;;;;;;;;;;;;;:21;:13;;;;;:21;:51;;-1:-1:-1;;;;;;;;62205:51:0;;;;;;;;;;;;-1:-1:-1;;;;62205:51:0;;;;;;;;;;62342:9;;62327:45;;62353:18;62327:14;:45::i;:::-;62400:9;;62388:82;;;;;;62454:15;62388:82;;;;;;62307:65;;-1:-1:-1;62442:10:0;;-1:-1:-1;;;;;62388:82:0;;;;;;;;;;;;;;61479:999;;;;;;:::o;3473:229::-;-1:-1:-1;;;;;3547:22:0;;3539:73;;;;-1:-1:-1;;;3539:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3649:6;;;3628:38;;-1:-1:-1;;;;;3628:38:0;;;;3649:6;;;3628:38;;;3677:6;:17;;-1:-1:-1;;;;;;3677:17:0;-1:-1:-1;;;;;3677:17:0;;;;;;;;;;3473:229::o;15010:471::-;15068:7;15313:6;15309:47;;-1:-1:-1;15343:1:0;15336:8;;15309:47;15380:5;;;15384:1;15380;:5;:1;15404:5;;;;;:10;15396:56;;;;-1:-1:-1;;;15396:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14567:192;14653:7;14689:12;14681:6;;;;14673:29;;;;-1:-1:-1;;;14673:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;14673:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;14725:5:0;;;14567:192::o;4036:178::-;4114:18;4118:4;4124:7;4114:3;:18::i;:::-;4113:19;4105:63;;;;;-1:-1:-1;;;4105:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4179:20:0;:11;:20;;;;;;;;;;;:27;;-1:-1:-1;;4179:27:0;4202:4;4179:27;;;4036:178::o;4294:183::-;4374:18;4378:4;4384:7;4374:3;:18::i;:::-;4366:64;;;;-1:-1:-1;;;4366:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4441:20:0;4464:5;4441:20;;;;;;;;;;;:28;;-1:-1:-1;;4441:28:0;;;4294:183::o;24008:1114::-;24612:27;24620:5;-1:-1:-1;;;;;24612:25:0;;:27::i;:::-;24604:71;;;;;-1:-1:-1;;;24604:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;24749:12;24763:23;24798:5;-1:-1:-1;;;;;24790:19:0;24810:4;24790:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;24790:25:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;24748:67:0;;;;24834:7;24826:52;;;;;-1:-1:-1;;;24826:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24895:17;;:21;24891:224;;25037:10;25026:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25026:30:0;25018:85;;;;-1:-1:-1;;;25018:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15949:132;16007:7;16034:39;16038:1;16041;16034:39;;;;;;;;;;;;;;;;;:3;:39::i;18998:619::-;19058:4;19526:20;;19369:66;19566:23;;;;;;:42;;-1:-1:-1;19593:15:0;;;19566:42;19558:51;18998:619;-1:-1:-1;;;;18998:619:0:o;16611:345::-;16697:7;16799:12;16792:5;16784:28;;;;-1:-1:-1;;;16784:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;16784:28:0;;16823:9;16839:1;16835;:5;;;;;;;16611:345;-1:-1:-1;;;;;16611:345:0:o;40211:23472::-;;;;;;;;;-1:-1:-1;40211:23472:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;40211:23472:0;;;;;;;;:::o
Swarm Source
bzzr://a2ef811f4003c66ef0fb0aae7509e5f9676d3367cbf9a65f0fb39b0c15bebd11
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 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.