Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Write Contract
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
This contract has been verified via Sourcify.
View contract in Sourcify repository
- Contract name:
- InsureToken
- Optimization enabled
- true
- Compiler version
- v0.8.10+commit.fc410830
- Optimization runs
- 200
- EVM Version
- london
- Verified at
- 2026-04-16T07:13:06.256107Z
Constructor Arguments
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000056246e83f3148b05ce2d90b44fbb4e9fa9eaf5bb000000000000000000000000000000000000000000000000000000000000000b496e73757265546f6b656e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006494e535552450000000000000000000000000000000000000000000000000000
Arg [0] (string) : InsureToken
Arg [1] (string) : INSURE
Arg [2] (address) : 0x56246e83f3148b05ce2d90b44fbb4e9fa9eaf5bb
contracts/InsureToken.sol
pragma solidity 0.8.10;
/***
*@title InsureToken
*@author InsureDAO
* SPDX-License-Identifier: MIT
*@notice InsureDAO's governance token
*/
//libraries
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "./interfaces/pool/IOwnership.sol";
contract InsureToken is IERC20 {
event UpdateMiningParameters(
uint256 time,
uint256 rate,
uint256 supply,
int256 miningepoch
);
event SetMinter(address minter);
event SetAdmin(address admin);
event SetRate(uint256 rate);
string public name;
string public symbol;
uint256 public constant decimals = 18;
mapping(address => uint256) public override balanceOf;
mapping(address => mapping(address => uint256)) allowances;
uint256 public total_supply;
address public minter;
IOwnership public immutable ownership;
//General constants
uint256 constant YEAR = 86400 * 365;
// Allocation within 5years:
// ==========
// * Team & Development: 24%
// * Liquidity Mining: 40%
// * Investors: 10%
// * Foundation Treasury: 14%
// * Community Treasury: 10%
// ==========
//
// After 5years:
// ==========
// * Liquidity Mining: 40%~ (Mint fixed amount every year)
//
// Mint 2_800_000 INSURE every year.
// 6th year: 1.32% inflation rate
// 7th year: 1.30% inflation rate
// 8th year: 1.28% infration rate
// so on
// ==========
// Supply parameters
uint256 constant INITIAL_SUPPLY = 126_000_000; //will be vested
uint256 constant RATE_REDUCTION_TIME = YEAR;
uint256[6] public RATES = [
(28_000_000 * 10 ** 18) / YEAR, //epoch 0
(22_400_000 * 10 ** 18) / YEAR, //epoch 1
(16_800_000 * 10 ** 18) / YEAR, //epoch 2
(11_200_000 * 10 ** 18) / YEAR, //epoch 3
(5_600_000 * 10 ** 18) / YEAR, //epoch 4
(2_800_000 * 10 ** 18) / YEAR //epoch 5~
];
uint256 constant RATE_DENOMINATOR = 10 ** 18;
uint256 constant INFLATION_DELAY = 86400;
// Supply variables
int256 public mining_epoch;
uint256 public start_epoch_time;
uint256 public rate;
uint256 public start_epoch_supply;
uint256 public emergency_minted;
modifier onlyOwner() {
require(
ownership.owner() == msg.sender,
"Caller is not allowed to operate"
);
_;
}
/***
* @notice Contract constructor
* @param _name Token full name
* @param _symbol Token symbol
*/
constructor(string memory _name, string memory _symbol, address _ownership) {
uint256 _init_supply = INITIAL_SUPPLY * RATE_DENOMINATOR;
name = _name;
symbol = _symbol;
balanceOf[msg.sender] = _init_supply;
total_supply = _init_supply;
ownership = IOwnership(_ownership);
emit Transfer(address(0), msg.sender, _init_supply);
unchecked {
start_epoch_time =
block.timestamp +
INFLATION_DELAY -
RATE_REDUCTION_TIME;
mining_epoch = -1;
}
rate = 0;
start_epoch_supply = _init_supply;
}
/***
*@dev Update mining rate and supply at the start of the epoch
* Any modifying mining call must also call this
*/
function _update_mining_parameters() internal {
uint256 _rate = rate;
uint256 _start_epoch_supply = start_epoch_supply;
start_epoch_time += RATE_REDUCTION_TIME;
unchecked {
mining_epoch += 1;
}
if (mining_epoch == 0) {
_rate = RATES[uint256(mining_epoch)];
} else if (mining_epoch < int256(6)) {
_start_epoch_supply += RATES[uint256(mining_epoch) - 1] * YEAR;
start_epoch_supply = _start_epoch_supply;
_rate = RATES[uint256(mining_epoch)];
} else {
_start_epoch_supply += RATES[5] * YEAR;
start_epoch_supply = _start_epoch_supply;
_rate = RATES[5];
}
rate = _rate;
emit UpdateMiningParameters(
block.timestamp,
_rate,
_start_epoch_supply,
mining_epoch
);
}
/***
* @notice Update mining rate and supply at the start of the epoch
* @dev Callable by any address, but only once per epoch
* Total supply becomes slightly larger if this function is called late
*/
function update_mining_parameters() external {
require(
block.timestamp >= start_epoch_time + RATE_REDUCTION_TIME,
"dev: too soon!"
);
_update_mining_parameters();
}
/***
*@notice Get timestamp of the current mining epoch start
* while simultaneously updating mining parameters
*@return Timestamp of the epoch
*/
function start_epoch_time_write() external returns(uint256) {
uint256 _start_epoch_time = start_epoch_time;
if (block.timestamp >= _start_epoch_time + RATE_REDUCTION_TIME) {
_update_mining_parameters();
return start_epoch_time;
} else {
return _start_epoch_time;
}
}
/***
*@notice Get timestamp of the next mining epoch start
* while simultaneously updating mining parameters
*@return Timestamp of the next epoch
*/
function future_epoch_time_write() external returns(uint256) {
uint256 _start_epoch_time = start_epoch_time;
if (block.timestamp >= _start_epoch_time + RATE_REDUCTION_TIME) {
_update_mining_parameters();
return start_epoch_time + RATE_REDUCTION_TIME;
} else {
return _start_epoch_time + RATE_REDUCTION_TIME;
}
}
function _available_supply() internal view returns(uint256) {
return
start_epoch_supply +
((block.timestamp - start_epoch_time) * rate) +
emergency_minted;
}
/***
*@notice Current number of tokens in existence (claimed or unclaimed)
*/
function available_supply() external view returns(uint256) {
return _available_supply();
}
/***
*@notice How much supply is mintable from start timestamp till end timestamp
*@param start Start of the time interval (timestamp)
*@param end End of the time interval (timestamp)
*@return Tokens mintable from `start` till `end`
*/
function mintable_in_timeframe(uint256 start, uint256 end)
external
view
returns(uint256) {
require(start <= end, "dev: start > end");
uint256 _to_mint = 0;
uint256 _current_epoch_time = start_epoch_time;
uint256 _current_rate = rate;
int256 _current_epoch = mining_epoch;
// Special case if end is in future (not yet minted) epoch
if (end > _current_epoch_time + RATE_REDUCTION_TIME) {
_current_epoch_time += RATE_REDUCTION_TIME;
if (_current_epoch < 5) {
_current_epoch += 1;
_current_rate = RATES[uint256(_current_epoch)];
} else {
_current_epoch += 1;
_current_rate = RATES[5];
}
}
require(
end <= _current_epoch_time + RATE_REDUCTION_TIME,
"dev: too far in future"
);
for (uint256 i; i < 999;) {
// InsureDAO will not work in 1000 years.
if (end >= _current_epoch_time) {
uint256 current_end = end;
if (current_end > _current_epoch_time + RATE_REDUCTION_TIME) {
current_end = _current_epoch_time + RATE_REDUCTION_TIME;
}
uint256 current_start = start;
if (
current_start >= _current_epoch_time + RATE_REDUCTION_TIME
) {
break; // We should never get here but what if...
} else if (current_start < _current_epoch_time) {
current_start = _current_epoch_time;
}
_to_mint += (_current_rate * (current_end - current_start));
if (start >= _current_epoch_time) {
break;
}
}
_current_epoch_time -= RATE_REDUCTION_TIME;
if (_current_epoch == 0) {
_current_rate = 0;
} else {
_current_rate = _current_epoch < 5 ? RATES[uint256(_current_epoch) - 1] : RATES[5];
}
_current_epoch -= 1;
assert(_current_rate <= RATES[0]); // This should never happen
unchecked {
++i;
}
}
return _to_mint;
}
/***
*@notice Total number of tokens in existence.
*/
function totalSupply() external view override returns(uint256) {
return total_supply;
}
/***
*@notice Check the amount of tokens that an owner allowed to a spender
*@param _owner The address which owns the funds
*@param _spender The address which will spend the funds
*@return uint256 specifying the amount of tokens still available for the spender
*/
function allowance(address _owner, address _spender)
external
view
override
returns(uint256) {
return allowances[_owner][_spender];
}
/***
*@notice Transfer `_value` tokens from `msg.sender` to `_to`
*@dev Vyper does not allow underflows, so the subtraction in
* this function will revert on an insufficient balance
*@param _to The address to transfer to
*@param _value The amount to be transferred
*@return bool success
*/
function transfer(address _to, uint256 _value)
external
override
returns(bool) {
require(_to != address(0), "transfers to 0x0 are not allowed");
uint256 _fromBalance = balanceOf[msg.sender];
require(_fromBalance >= _value, "transfer amount exceeds balance");
unchecked {
balanceOf[msg.sender] = _fromBalance - _value;
}
balanceOf[_to] += _value;
emit Transfer(msg.sender, _to, _value);
return true;
}
/***
* @notice Transfer `_value` tokens from `_from` to `_to`
* @param _from address The address which you want to send tokens from
* @param _to address The address which you want to transfer to
* @param _value uint256 the amount of tokens to be transferred
* @return bool success
*/
function transferFrom(
address _from,
address _to,
uint256 _value
) external override returns(bool) {
require(_from != address(0), "transfer from the zero address");
require(_to != address(0), "transfer to the zero address");
uint256 currentAllowance = allowances[_from][msg.sender];
require(currentAllowance >= _value, "transfer amount exceeds allow");
unchecked {
allowances[_from][msg.sender] -= _value;
}
uint256 _fromBalance = balanceOf[_from];
require(_fromBalance >= _value, "transfer amount exceeds balance");
unchecked {
balanceOf[_from] -= _value;
}
balanceOf[_to] += _value;
emit Transfer(_from, _to, _value);
return true;
}
function _approve(
address owner,
address spender,
uint256 amount
) internal {
require(owner != address(0), "approve from the zero address");
require(spender != address(0), "approve to the zero address");
allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
*@notice Approve `_spender` to transfer `_value` tokens on behalf of `msg.sender`
*@param _spender The address which will spend the funds
*@param _value The amount of tokens to be spent
*@return bool success
*/
function approve(address _spender, uint256 _value)
external
override
returns(bool) {
_approve(msg.sender, _spender, _value);
return true;
}
function increaseAllowance(address _spender, uint256 addedValue)
external
returns(bool) {
_approve(
msg.sender,
_spender,
allowances[msg.sender][_spender] + addedValue
);
return true;
}
function decreaseAllowance(address _spender, uint256 subtractedValue)
external
returns(bool) {
uint256 currentAllowance = allowances[msg.sender][_spender];
require(
currentAllowance >= subtractedValue,
"decreased allowance below zero"
);
unchecked {
_approve(msg.sender, _spender, currentAllowance - subtractedValue);
}
return true;
}
/***
*@notice Mint `_value` tokens and assign them to `_to`
*@dev Emits a Transfer event originating from 0x00
*@param _to The account that will receive the created tokens
*@param _value The amount that will be created
*@return bool success
*/
function mint(address _to, uint256 _value) external returns(bool) {
require(msg.sender == minter, "dev: minter only");
require(_to != address(0), "dev: zero address");
_mint(_to, _value);
return true;
}
function _mint(address _to, uint256 _value) internal {
uint256 _total_supply = total_supply + _value;
require(
_total_supply <= _available_supply(),
"exceeds allowable mint amount"
);
if (block.timestamp >= start_epoch_time + RATE_REDUCTION_TIME) {
_update_mining_parameters();
}
total_supply = _total_supply;
balanceOf[_to] += _value;
emit Transfer(address(0), _to, _value);
}
/**
*@notice Burn `_value` tokens belonging to `msg.sender`
*@dev Emits a Transfer event with a destination of 0x00
*@param _value The amount that will be burned
*@return bool success
*/
function burn(uint256 _value) external returns(bool) {
require(
balanceOf[msg.sender] >= _value,
"_value > balanceOf[msg.sender]"
);
unchecked {
balanceOf[msg.sender] -= _value;
}
total_supply -= _value;
emit Transfer(msg.sender, address(0), _value);
return true;
}
/***
*@notice Change the token name and symbol to `_name` and `_symbol`
*@dev Only callable by the admin account
*@param _name New token name
*@param _symbol New token symbol
*/
function set_name(string memory _name, string memory _symbol) external onlyOwner {
name = _name;
symbol = _symbol;
}
/***
*@notice Set the minter address
*@dev Only callable once, when minter has not yet been set
*@param _minter Address of the minter
*/
function set_minter(address _minter) external onlyOwner {
require(
minter == address(0),
"can set the minter at creation"
);
minter = _minter;
emit SetMinter(_minter);
}
/***
*@notice Set the new rate for the infration after 5 years.
*@dev input must be the number of INSURE to be minted per second.
*@param _rate mint amount per second
*/
function set_rate(uint256 _rate) external onlyOwner {
require(_rate < RATES[5], "Decrease Only");
RATES[5] = _rate;
emit SetRate(_rate);
}
/***
* @notice Emergency minting only when CDS couldn't afford the insolvency.
* @dev
* @param _amountOut token amount needed. token is defiend whithin converter.
* @param _to CDS address
*/
function emergency_mint(uint256 _amount, address _to)
external
returns(bool) {
require(msg.sender == minter, "dev: minter only");
//mint
emergency_minted += _amount;
_mint(_to, _amount);
return true;
}
}
/IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
/
pragma solidity 0.8.10;
//SPDX-License-Identifier: MIT
interface IOwnership {
function owner() external view returns (address);
function futureOwner() external view returns (address);
function commitTransferOwnership(address newOwner) external;
function acceptTransferOwnership() external;
}
Compiler Settings
{"remappings":[],"optimizer":{"runs":200,"enabled":true},"metadata":{"bytecodeHash":"ipfs"},"libraries":{},"evmVersion":"london","compilationTarget":{"contracts/InsureToken.sol":"InsureToken"}}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"string","name":"_name","internalType":"string"},{"type":"string","name":"_symbol","internalType":"string"},{"type":"address","name":"_ownership","internalType":"address"}]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"SetAdmin","inputs":[{"type":"address","name":"admin","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"SetMinter","inputs":[{"type":"address","name":"minter","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"SetRate","inputs":[{"type":"uint256","name":"rate","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"UpdateMiningParameters","inputs":[{"type":"uint256","name":"time","internalType":"uint256","indexed":false},{"type":"uint256","name":"rate","internalType":"uint256","indexed":false},{"type":"uint256","name":"supply","internalType":"uint256","indexed":false},{"type":"int256","name":"miningepoch","internalType":"int256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"RATES","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"_owner","internalType":"address"},{"type":"address","name":"_spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"_spender","internalType":"address"},{"type":"uint256","name":"_value","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"available_supply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"burn","inputs":[{"type":"uint256","name":"_value","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"decreaseAllowance","inputs":[{"type":"address","name":"_spender","internalType":"address"},{"type":"uint256","name":"subtractedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"emergency_mint","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"},{"type":"address","name":"_to","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"emergency_minted","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"future_epoch_time_write","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"increaseAllowance","inputs":[{"type":"address","name":"_spender","internalType":"address"},{"type":"uint256","name":"addedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"int256","name":"","internalType":"int256"}],"name":"mining_epoch","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"mint","inputs":[{"type":"address","name":"_to","internalType":"address"},{"type":"uint256","name":"_value","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"mintable_in_timeframe","inputs":[{"type":"uint256","name":"start","internalType":"uint256"},{"type":"uint256","name":"end","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"minter","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IOwnership"}],"name":"ownership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"rate","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"set_minter","inputs":[{"type":"address","name":"_minter","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"set_name","inputs":[{"type":"string","name":"_name","internalType":"string"},{"type":"string","name":"_symbol","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"set_rate","inputs":[{"type":"uint256","name":"_rate","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"start_epoch_supply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"start_epoch_time","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"start_epoch_time_write","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"total_supply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"_to","internalType":"address"},{"type":"uint256","name":"_value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"_from","internalType":"address"},{"type":"address","name":"_to","internalType":"address"},{"type":"uint256","name":"_value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"update_mining_parameters","inputs":[]}]
Contract Creation Code
0x61016060405260a080620000236301e133806a17293b0a9e69fd9c0000006200029d565b8152602001620000436301e133806a1287626ee52197b00000006200029d565b8152602001620000636301e133806a0de589d32bd931c40000006200029d565b8152602001620000836301e133806a0943b1377290cbd80000006200029d565b8152602001620000a36301e133806a04a1d89bb94865ec0000006200029d565b8152602001620000c36301e133806a0250ec4ddca432f60000006200029d565b9052620000d49060069081620001c7565b50348015620000e257600080fd5b5060405162001e9c38038062001e9c83398101604081905262000105916200038d565b60006200011f670de0b6b3a76400006307829b806200041a565b8451909150620001379060009060208701906200020a565b5082516200014d9060019060208601906200020a565b5033600081815260026020908152604080832085905560048590556001600160a01b038616608052518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36301dfe1ff194201600d55600019600c556000600e55600f555062000485915050565b8260068101928215620001f8579160200282015b82811115620001f8578251825591602001919060010190620001db565b506200020692915062000286565b5090565b828054620002189062000448565b90600052602060002090601f0160209004810192826200023c5760008555620001f8565b82601f106200025757805160ff1916838001178555620001f8565b82800160010185558215620001f85791820182811115620001f8578251825591602001919060010190620001db565b5b8082111562000206576000815560010162000287565b600082620002bb57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620002e857600080fd5b81516001600160401b0380821115620003055762000305620002c0565b604051601f8301601f19908116603f01168101908282118183101715620003305762000330620002c0565b816040528381526020925086838588010111156200034d57600080fd5b600091505b8382101562000371578582018301518183018401529082019062000352565b83821115620003835760008385830101525b9695505050505050565b600080600060608486031215620003a357600080fd5b83516001600160401b0380821115620003bb57600080fd5b620003c987838801620002d6565b94506020860151915080821115620003e057600080fd5b50620003ef86828701620002d6565b604086015190935090506001600160a01b03811681146200040f57600080fd5b809150509250925092565b60008160001904831182151516156200044357634e487b7160e01b600052601160045260246000fd5b500290565b600181811c908216806200045d57607f821691505b602082108114156200047f57634e487b7160e01b600052602260045260246000fd5b50919050565b6080516119e6620004b6600039600081816102f0015281816104e401528181610c74015261109501526119e66000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c80636e1d35b21161010f578063d4387a99116100a2578063dd62ed3e11610071578063dd62ed3e146103d6578063e1430e061461040f578063f9a40bf614610422578063f9e988eb1461042b57600080fd5b8063d4387a9914610395578063d43b40fa146103a8578063d54d1c98146103b0578063d725a9ca146103c357600080fd5b8063a457c2d7116100de578063a457c2d71461035f578063a9059cbb14610372578063adc4cf4314610385578063b26b238e1461038d57600080fd5b80636e1d35b21461032557806370a082311461032e5780637375be261461034e57806395d89b411461035757600080fd5b80632c4e722e1161018757806340c10f191161015657806340c10f19146102c557806342966c68146102d85780635d03147a146102eb57806362203d741461031257600080fd5b80632c4e722e14610298578063313ce567146102a15780633940e9ee146102a957806339509351146102b257600080fd5b80631652e9fc116101c35780631652e9fc1461025657806318160ddd1461026b57806323b872dd1461027d57806324f92a251461029057600080fd5b806306fdde03146101ea5780630754617214610208578063095ea7b314610233575b600080fd5b6101f2610434565b6040516101ff9190611555565b60405180910390f35b60055461021b906001600160a01b031681565b6040516001600160a01b0390911681526020016101ff565b6102466102413660046115c2565b6104c2565b60405190151581526020016101ff565b6102696102643660046115ee565b6104d8565b005b6004545b6040519081526020016101ff565b61024661028b366004611612565b610641565b61026f61086d565b61026f600e5481565b61026f601281565b61026f60045481565b6102466102c03660046115c2565b61087c565b6102466102d33660046115c2565b6108b8565b6102466102e6366004611653565b61095c565b61021b7f000000000000000000000000000000000000000000000000000000000000000081565b61026f610320366004611653565b610a16565b61026f60105481565b61026f61033c3660046115ee565b60026020526000908152604090205481565b61026f600d5481565b6101f2610a2d565b61024661036d3660046115c2565b610a3a565b6102466103803660046115c2565b610ac5565b61026f610bed565b61026f610c20565b6102696103a3366004611653565b610c68565b610269610d90565b6102466103be36600461166c565b610dec565b61026f6103d136600461169c565b610e5e565b61026f6103e43660046116be565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b61026961041d36600461178f565b611089565b61026f600c5481565b61026f600f5481565b60008054610441906117f3565b80601f016020809104026020016040519081016040528092919081815260200182805461046d906117f3565b80156104ba5780601f1061048f576101008083540402835291602001916104ba565b820191906000526020600020905b81548152906001019060200180831161049d57829003601f168201915b505050505081565b60006104cf338484611167565b50600192915050565b336001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610540573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610564919061182e565b6001600160a01b0316146105935760405162461bcd60e51b815260040161058a9061184b565b60405180910390fd5b6005546001600160a01b0316156105ec5760405162461bcd60e51b815260206004820152601e60248201527f63616e2073657420746865206d696e746572206174206372656174696f6e0000604482015260640161058a565b600580546001600160a01b0319166001600160a01b0383169081179091556040519081527fcec52196e972044edde8689a1b608e459c5946b7f3e5c8cd3d6d8e126d422e1c906020015b60405180910390a150565b60006001600160a01b0384166106995760405162461bcd60e51b815260206004820152601e60248201527f7472616e736665722066726f6d20746865207a65726f20616464726573730000604482015260640161058a565b6001600160a01b0383166106ef5760405162461bcd60e51b815260206004820152601c60248201527f7472616e7366657220746f20746865207a65726f206164647265737300000000604482015260640161058a565b6001600160a01b0384166000908152600360209081526040808320338452909152902054828110156107635760405162461bcd60e51b815260206004820152601d60248201527f7472616e7366657220616d6f756e74206578636565647320616c6c6f77000000604482015260640161058a565b6001600160a01b0385166000818152600360209081526040808320338452825280832080548890039055928252600290522054838110156107e65760405162461bcd60e51b815260206004820152601f60248201527f7472616e7366657220616d6f756e7420657863656564732062616c616e636500604482015260640161058a565b6001600160a01b03808716600090815260026020526040808220805488900390559187168152908120805486929061081f908490611896565b92505081905550846001600160a01b0316866001600160a01b03166000805160206119918339815191528660405161085991815260200190565b60405180910390a350600195945050505050565b6000610877611275565b905090565b3360008181526003602090815260408083206001600160a01b038716845290915281205490916104cf9185906108b3908690611896565b611167565b6005546000906001600160a01b031633146109085760405162461bcd60e51b815260206004820152601060248201526f6465763a206d696e746572206f6e6c7960801b604482015260640161058a565b6001600160a01b0383166109525760405162461bcd60e51b81526020600482015260116024820152706465763a207a65726f206164647265737360781b604482015260640161058a565b6104cf83836112ac565b336000908152600260205260408120548211156109bb5760405162461bcd60e51b815260206004820152601e60248201527f5f76616c7565203e2062616c616e63654f665b6d73672e73656e6465725d0000604482015260640161058a565b33600090815260026020526040812080548490039055600480548492906109e39084906118ae565b909155505060405182815260009033906000805160206119918339815191529060200160405180910390a3506001919050565b60068160068110610a2657600080fd5b0154905081565b60018054610441906117f3565b3360009081526003602090815260408083206001600160a01b038616845290915281205482811015610aae5760405162461bcd60e51b815260206004820152601e60248201527f64656372656173656420616c6c6f77616e63652062656c6f77207a65726f0000604482015260640161058a565b610abb3385858403611167565b5060019392505050565b60006001600160a01b038316610b1d5760405162461bcd60e51b815260206004820181905260248201527f7472616e736665727320746f2030783020617265206e6f7420616c6c6f776564604482015260640161058a565b3360009081526002602052604090205482811015610b7d5760405162461bcd60e51b815260206004820152601f60248201527f7472616e7366657220616d6f756e7420657863656564732062616c616e636500604482015260640161058a565b3360009081526002602052604080822085840390556001600160a01b038616825281208054859290610bb0908490611896565b90915550506040518381526001600160a01b0385169033906000805160206119918339815191529060200160405180910390a35060019392505050565b600d54600090610c016301e1338082611896565b4210610c1757610c0f611393565b5050600d5490565b919050565b5090565b600d54600090610c346301e1338082611896565b4210610c5a57610c42611393565b6301e13380600d54610c549190611896565b91505090565b610c546301e1338082611896565b336001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf4919061182e565b6001600160a01b031614610d1a5760405162461bcd60e51b815260040161058a9061184b565b600b548110610d5b5760405162461bcd60e51b815260206004820152600d60248201526c4465637265617365204f6e6c7960981b604482015260640161058a565b600b8190556040518181527f2640b4015d3473fd09bf2b30939e17deb4068cdacf3892136e737e166ceb321090602001610636565b6301e13380600d54610da29190611896565b421015610de25760405162461bcd60e51b815260206004820152600e60248201526d6465763a20746f6f20736f6f6e2160901b604482015260640161058a565b610dea611393565b565b6005546000906001600160a01b03163314610e3c5760405162461bcd60e51b815260206004820152601060248201526f6465763a206d696e746572206f6e6c7960801b604482015260640161058a565b8260106000828254610e4e9190611896565b909155506104cf905082846112ac565b600081831115610ea35760405162461bcd60e51b815260206004820152601060248201526f19195d8e881cdd185c9d080f88195b9960821b604482015260640161058a565b600d54600e54600c546000929190610ebf6301e1338084611896565b861115610f1b57610ed46301e1338084611896565b92506005811215610f0857610eea6001826118db565b905060068160068110610eff57610eff6118c5565b01549150610f1b565b610f136001826118db565b600b54925090505b610f296301e1338084611896565b861115610f715760405162461bcd60e51b81526020600482015260166024820152756465763a20746f6f2066617220696e2066757475726560501b604482015260640161058a565b60005b6103e781101561107d578387106110045786610f946301e1338086611896565b811115610fac57610fa96301e1338086611896565b90505b88610fbb6301e1338087611896565b8110610fc857505061107d565b85811015610fd35750845b610fdd81836118ae565b610fe7908661191c565b610ff19088611896565b9650858a1061100157505061107d565b50505b6110126301e13380856118ae565b9350816110225760009250611055565b6005821261103257600b54611052565b600661103f6001846118ae565b6006811061104f5761104f6118c5565b01545b92505b61106060018361193b565b6006549092508311156110755761107561197a565b600101610f74565b50929695505050505050565b336001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611115919061182e565b6001600160a01b03161461113b5760405162461bcd60e51b815260040161058a9061184b565b815161114e9060009060208501906114c5565b5080516111629060019060208401906114c5565b505050565b6001600160a01b0383166111bd5760405162461bcd60e51b815260206004820152601d60248201527f617070726f76652066726f6d20746865207a65726f2061646472657373000000604482015260640161058a565b6001600160a01b0382166112135760405162461bcd60e51b815260206004820152601b60248201527f617070726f766520746f20746865207a65726f20616464726573730000000000604482015260640161058a565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6000601054600e54600d544261128b91906118ae565b611295919061191c565b600f546112a29190611896565b6108779190611896565b6000816004546112bc9190611896565b90506112c6611275565b8111156113155760405162461bcd60e51b815260206004820152601d60248201527f6578636565647320616c6c6f7761626c65206d696e7420616d6f756e74000000604482015260640161058a565b6301e13380600d546113279190611896565b421061133557611335611393565b60048190556001600160a01b03831660009081526002602052604081208054849290611362908490611896565b90915550506040518281526001600160a01b0384169060009060008051602061199183398151915290602001611268565b600e54600f54600d80546301e1338091906000906113b2908490611896565b9091555050600c8054600101908190556113e4576006600c54600681106113db576113db6118c5565b01549150611472565b6006600c541215611449576301e1338060066001600c5461140591906118ae565b60068110611415576114156118c5565b0154611421919061191c565b61142b9082611896565b905080600f819055506006600c54600681106113db576113db6118c5565b600b5461145b906301e133809061191c565b6114659082611896565b600f819055600b54925090505b600e829055600c5460408051428152602081018590528082018490526060810192909252517f77c99c82d406169745430d971da8381be7390d804af3ad20e40a95e070e08bd19181900360800190a15050565b8280546114d1906117f3565b90600052602060002090601f0160209004810192826114f35760008555611539565b82601f1061150c57805160ff1916838001178555611539565b82800160010185558215611539579182015b8281111561153957825182559160200191906001019061151e565b50610c1c9291505b80821115610c1c5760008155600101611541565b600060208083528351808285015260005b8181101561158257858101830151858201604001528201611566565b81811115611594576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b03811681146115bf57600080fd5b50565b600080604083850312156115d557600080fd5b82356115e0816115aa565b946020939093013593505050565b60006020828403121561160057600080fd5b813561160b816115aa565b9392505050565b60008060006060848603121561162757600080fd5b8335611632816115aa565b92506020840135611642816115aa565b929592945050506040919091013590565b60006020828403121561166557600080fd5b5035919050565b6000806040838503121561167f57600080fd5b823591506020830135611691816115aa565b809150509250929050565b600080604083850312156116af57600080fd5b50508035926020909101359150565b600080604083850312156116d157600080fd5b82356116dc816115aa565b91506020830135611691816115aa565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261171357600080fd5b813567ffffffffffffffff8082111561172e5761172e6116ec565b604051601f8301601f19908116603f01168101908282118183101715611756576117566116ec565b8160405283815286602085880101111561176f57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080604083850312156117a257600080fd5b823567ffffffffffffffff808211156117ba57600080fd5b6117c686838701611702565b935060208501359150808211156117dc57600080fd5b506117e985828601611702565b9150509250929050565b600181811c9082168061180757607f821691505b6020821081141561182857634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561184057600080fd5b815161160b816115aa565b6020808252818101527f43616c6c6572206973206e6f7420616c6c6f77656420746f206f706572617465604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082198211156118a9576118a9611880565b500190565b6000828210156118c0576118c0611880565b500390565b634e487b7160e01b600052603260045260246000fd5b600080821280156001600160ff1b03849003851316156118fd576118fd611880565b600160ff1b839003841281161561191657611916611880565b50500190565b600081600019048311821515161561193657611936611880565b500290565b60008083128015600160ff1b85018412161561195957611959611880565b6001600160ff1b038401831381161561197457611974611880565b50500390565b634e487b7160e01b600052600160045260246000fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220f8f9f00d15f0f96ffe36e7b64842769c6dc3eeba883f7d3829b035f1a70887d864736f6c634300080a0033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000056246e83f3148b05ce2d90b44fbb4e9fa9eaf5bb000000000000000000000000000000000000000000000000000000000000000b496e73757265546f6b656e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006494e535552450000000000000000000000000000000000000000000000000000
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106101e55760003560e01c80636e1d35b21161010f578063d4387a99116100a2578063dd62ed3e11610071578063dd62ed3e146103d6578063e1430e061461040f578063f9a40bf614610422578063f9e988eb1461042b57600080fd5b8063d4387a9914610395578063d43b40fa146103a8578063d54d1c98146103b0578063d725a9ca146103c357600080fd5b8063a457c2d7116100de578063a457c2d71461035f578063a9059cbb14610372578063adc4cf4314610385578063b26b238e1461038d57600080fd5b80636e1d35b21461032557806370a082311461032e5780637375be261461034e57806395d89b411461035757600080fd5b80632c4e722e1161018757806340c10f191161015657806340c10f19146102c557806342966c68146102d85780635d03147a146102eb57806362203d741461031257600080fd5b80632c4e722e14610298578063313ce567146102a15780633940e9ee146102a957806339509351146102b257600080fd5b80631652e9fc116101c35780631652e9fc1461025657806318160ddd1461026b57806323b872dd1461027d57806324f92a251461029057600080fd5b806306fdde03146101ea5780630754617214610208578063095ea7b314610233575b600080fd5b6101f2610434565b6040516101ff9190611555565b60405180910390f35b60055461021b906001600160a01b031681565b6040516001600160a01b0390911681526020016101ff565b6102466102413660046115c2565b6104c2565b60405190151581526020016101ff565b6102696102643660046115ee565b6104d8565b005b6004545b6040519081526020016101ff565b61024661028b366004611612565b610641565b61026f61086d565b61026f600e5481565b61026f601281565b61026f60045481565b6102466102c03660046115c2565b61087c565b6102466102d33660046115c2565b6108b8565b6102466102e6366004611653565b61095c565b61021b7f00000000000000000000000056246e83f3148b05ce2d90b44fbb4e9fa9eaf5bb81565b61026f610320366004611653565b610a16565b61026f60105481565b61026f61033c3660046115ee565b60026020526000908152604090205481565b61026f600d5481565b6101f2610a2d565b61024661036d3660046115c2565b610a3a565b6102466103803660046115c2565b610ac5565b61026f610bed565b61026f610c20565b6102696103a3366004611653565b610c68565b610269610d90565b6102466103be36600461166c565b610dec565b61026f6103d136600461169c565b610e5e565b61026f6103e43660046116be565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b61026961041d36600461178f565b611089565b61026f600c5481565b61026f600f5481565b60008054610441906117f3565b80601f016020809104026020016040519081016040528092919081815260200182805461046d906117f3565b80156104ba5780601f1061048f576101008083540402835291602001916104ba565b820191906000526020600020905b81548152906001019060200180831161049d57829003601f168201915b505050505081565b60006104cf338484611167565b50600192915050565b336001600160a01b03167f00000000000000000000000056246e83f3148b05ce2d90b44fbb4e9fa9eaf5bb6001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610540573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610564919061182e565b6001600160a01b0316146105935760405162461bcd60e51b815260040161058a9061184b565b60405180910390fd5b6005546001600160a01b0316156105ec5760405162461bcd60e51b815260206004820152601e60248201527f63616e2073657420746865206d696e746572206174206372656174696f6e0000604482015260640161058a565b600580546001600160a01b0319166001600160a01b0383169081179091556040519081527fcec52196e972044edde8689a1b608e459c5946b7f3e5c8cd3d6d8e126d422e1c906020015b60405180910390a150565b60006001600160a01b0384166106995760405162461bcd60e51b815260206004820152601e60248201527f7472616e736665722066726f6d20746865207a65726f20616464726573730000604482015260640161058a565b6001600160a01b0383166106ef5760405162461bcd60e51b815260206004820152601c60248201527f7472616e7366657220746f20746865207a65726f206164647265737300000000604482015260640161058a565b6001600160a01b0384166000908152600360209081526040808320338452909152902054828110156107635760405162461bcd60e51b815260206004820152601d60248201527f7472616e7366657220616d6f756e74206578636565647320616c6c6f77000000604482015260640161058a565b6001600160a01b0385166000818152600360209081526040808320338452825280832080548890039055928252600290522054838110156107e65760405162461bcd60e51b815260206004820152601f60248201527f7472616e7366657220616d6f756e7420657863656564732062616c616e636500604482015260640161058a565b6001600160a01b03808716600090815260026020526040808220805488900390559187168152908120805486929061081f908490611896565b92505081905550846001600160a01b0316866001600160a01b03166000805160206119918339815191528660405161085991815260200190565b60405180910390a350600195945050505050565b6000610877611275565b905090565b3360008181526003602090815260408083206001600160a01b038716845290915281205490916104cf9185906108b3908690611896565b611167565b6005546000906001600160a01b031633146109085760405162461bcd60e51b815260206004820152601060248201526f6465763a206d696e746572206f6e6c7960801b604482015260640161058a565b6001600160a01b0383166109525760405162461bcd60e51b81526020600482015260116024820152706465763a207a65726f206164647265737360781b604482015260640161058a565b6104cf83836112ac565b336000908152600260205260408120548211156109bb5760405162461bcd60e51b815260206004820152601e60248201527f5f76616c7565203e2062616c616e63654f665b6d73672e73656e6465725d0000604482015260640161058a565b33600090815260026020526040812080548490039055600480548492906109e39084906118ae565b909155505060405182815260009033906000805160206119918339815191529060200160405180910390a3506001919050565b60068160068110610a2657600080fd5b0154905081565b60018054610441906117f3565b3360009081526003602090815260408083206001600160a01b038616845290915281205482811015610aae5760405162461bcd60e51b815260206004820152601e60248201527f64656372656173656420616c6c6f77616e63652062656c6f77207a65726f0000604482015260640161058a565b610abb3385858403611167565b5060019392505050565b60006001600160a01b038316610b1d5760405162461bcd60e51b815260206004820181905260248201527f7472616e736665727320746f2030783020617265206e6f7420616c6c6f776564604482015260640161058a565b3360009081526002602052604090205482811015610b7d5760405162461bcd60e51b815260206004820152601f60248201527f7472616e7366657220616d6f756e7420657863656564732062616c616e636500604482015260640161058a565b3360009081526002602052604080822085840390556001600160a01b038616825281208054859290610bb0908490611896565b90915550506040518381526001600160a01b0385169033906000805160206119918339815191529060200160405180910390a35060019392505050565b600d54600090610c016301e1338082611896565b4210610c1757610c0f611393565b5050600d5490565b919050565b5090565b600d54600090610c346301e1338082611896565b4210610c5a57610c42611393565b6301e13380600d54610c549190611896565b91505090565b610c546301e1338082611896565b336001600160a01b03167f00000000000000000000000056246e83f3148b05ce2d90b44fbb4e9fa9eaf5bb6001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf4919061182e565b6001600160a01b031614610d1a5760405162461bcd60e51b815260040161058a9061184b565b600b548110610d5b5760405162461bcd60e51b815260206004820152600d60248201526c4465637265617365204f6e6c7960981b604482015260640161058a565b600b8190556040518181527f2640b4015d3473fd09bf2b30939e17deb4068cdacf3892136e737e166ceb321090602001610636565b6301e13380600d54610da29190611896565b421015610de25760405162461bcd60e51b815260206004820152600e60248201526d6465763a20746f6f20736f6f6e2160901b604482015260640161058a565b610dea611393565b565b6005546000906001600160a01b03163314610e3c5760405162461bcd60e51b815260206004820152601060248201526f6465763a206d696e746572206f6e6c7960801b604482015260640161058a565b8260106000828254610e4e9190611896565b909155506104cf905082846112ac565b600081831115610ea35760405162461bcd60e51b815260206004820152601060248201526f19195d8e881cdd185c9d080f88195b9960821b604482015260640161058a565b600d54600e54600c546000929190610ebf6301e1338084611896565b861115610f1b57610ed46301e1338084611896565b92506005811215610f0857610eea6001826118db565b905060068160068110610eff57610eff6118c5565b01549150610f1b565b610f136001826118db565b600b54925090505b610f296301e1338084611896565b861115610f715760405162461bcd60e51b81526020600482015260166024820152756465763a20746f6f2066617220696e2066757475726560501b604482015260640161058a565b60005b6103e781101561107d578387106110045786610f946301e1338086611896565b811115610fac57610fa96301e1338086611896565b90505b88610fbb6301e1338087611896565b8110610fc857505061107d565b85811015610fd35750845b610fdd81836118ae565b610fe7908661191c565b610ff19088611896565b9650858a1061100157505061107d565b50505b6110126301e13380856118ae565b9350816110225760009250611055565b6005821261103257600b54611052565b600661103f6001846118ae565b6006811061104f5761104f6118c5565b01545b92505b61106060018361193b565b6006549092508311156110755761107561197a565b600101610f74565b50929695505050505050565b336001600160a01b03167f00000000000000000000000056246e83f3148b05ce2d90b44fbb4e9fa9eaf5bb6001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611115919061182e565b6001600160a01b03161461113b5760405162461bcd60e51b815260040161058a9061184b565b815161114e9060009060208501906114c5565b5080516111629060019060208401906114c5565b505050565b6001600160a01b0383166111bd5760405162461bcd60e51b815260206004820152601d60248201527f617070726f76652066726f6d20746865207a65726f2061646472657373000000604482015260640161058a565b6001600160a01b0382166112135760405162461bcd60e51b815260206004820152601b60248201527f617070726f766520746f20746865207a65726f20616464726573730000000000604482015260640161058a565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6000601054600e54600d544261128b91906118ae565b611295919061191c565b600f546112a29190611896565b6108779190611896565b6000816004546112bc9190611896565b90506112c6611275565b8111156113155760405162461bcd60e51b815260206004820152601d60248201527f6578636565647320616c6c6f7761626c65206d696e7420616d6f756e74000000604482015260640161058a565b6301e13380600d546113279190611896565b421061133557611335611393565b60048190556001600160a01b03831660009081526002602052604081208054849290611362908490611896565b90915550506040518281526001600160a01b0384169060009060008051602061199183398151915290602001611268565b600e54600f54600d80546301e1338091906000906113b2908490611896565b9091555050600c8054600101908190556113e4576006600c54600681106113db576113db6118c5565b01549150611472565b6006600c541215611449576301e1338060066001600c5461140591906118ae565b60068110611415576114156118c5565b0154611421919061191c565b61142b9082611896565b905080600f819055506006600c54600681106113db576113db6118c5565b600b5461145b906301e133809061191c565b6114659082611896565b600f819055600b54925090505b600e829055600c5460408051428152602081018590528082018490526060810192909252517f77c99c82d406169745430d971da8381be7390d804af3ad20e40a95e070e08bd19181900360800190a15050565b8280546114d1906117f3565b90600052602060002090601f0160209004810192826114f35760008555611539565b82601f1061150c57805160ff1916838001178555611539565b82800160010185558215611539579182015b8281111561153957825182559160200191906001019061151e565b50610c1c9291505b80821115610c1c5760008155600101611541565b600060208083528351808285015260005b8181101561158257858101830151858201604001528201611566565b81811115611594576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b03811681146115bf57600080fd5b50565b600080604083850312156115d557600080fd5b82356115e0816115aa565b946020939093013593505050565b60006020828403121561160057600080fd5b813561160b816115aa565b9392505050565b60008060006060848603121561162757600080fd5b8335611632816115aa565b92506020840135611642816115aa565b929592945050506040919091013590565b60006020828403121561166557600080fd5b5035919050565b6000806040838503121561167f57600080fd5b823591506020830135611691816115aa565b809150509250929050565b600080604083850312156116af57600080fd5b50508035926020909101359150565b600080604083850312156116d157600080fd5b82356116dc816115aa565b91506020830135611691816115aa565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261171357600080fd5b813567ffffffffffffffff8082111561172e5761172e6116ec565b604051601f8301601f19908116603f01168101908282118183101715611756576117566116ec565b8160405283815286602085880101111561176f57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080604083850312156117a257600080fd5b823567ffffffffffffffff808211156117ba57600080fd5b6117c686838701611702565b935060208501359150808211156117dc57600080fd5b506117e985828601611702565b9150509250929050565b600181811c9082168061180757607f821691505b6020821081141561182857634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561184057600080fd5b815161160b816115aa565b6020808252818101527f43616c6c6572206973206e6f7420616c6c6f77656420746f206f706572617465604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082198211156118a9576118a9611880565b500190565b6000828210156118c0576118c0611880565b500390565b634e487b7160e01b600052603260045260246000fd5b600080821280156001600160ff1b03849003851316156118fd576118fd611880565b600160ff1b839003841281161561191657611916611880565b50500190565b600081600019048311821515161561193657611936611880565b500290565b60008083128015600160ff1b85018412161561195957611959611880565b6001600160ff1b038401831381161561197457611974611880565b50500390565b634e487b7160e01b600052600160045260246000fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220f8f9f00d15f0f96ffe36e7b64842769c6dc3eeba883f7d3829b035f1a70887d864736f6c634300080a0033