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:
- OlympusTokenMigrator
- Optimization enabled
- false
- Compiler version
- v0.7.5+commit.eb77ed08
- EVM Version
- istanbul
- Verified at
- 2026-03-30T09:55:30.234000Z
Constructor Arguments
000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89900000000000000000000000004f2694c8fcee23e8fd0dfea1d4f5bb8c352111f00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e8000000000000000000000000fd31c7d00ca47653c6ce64af53c1571f9c36566a000000000000000000000000ca76543cf381ebbb277be79574059e32108e3e65000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d0000000000000000000000000000000000000000000000000000000000001b580000000000000000000000001c21f8ea7e39e2ba00bc12d2968d63f4acb38b7a
Arg [0] (address) : 0x383518188c0c6d7730d91b2c03a03c837814a899
Arg [1] (address) : 0x04f2694c8fcee23e8fd0dfea1d4f5bb8c352111f
Arg [2] (address) : 0x31f8cc382c9898b273eff4e0b7626a6987c846e8
Arg [3] (address) : 0xfd31c7d00ca47653c6ce64af53c1571f9c36566a
Arg [4] (address) : 0xca76543cf381ebbb277be79574059e32108e3e65
Arg [5] (address) : 0xd9e1ce17f2641f24ae83637ab66a2cca9c378b9f
Arg [6] (address) : 0x7a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [7] (uint256) : 7000
Arg [8] (address) : 0x1c21f8ea7e39e2ba00bc12d2968d63f4acb38b7a
gOHM_flat.sol
// SPDX-License-Identifier: AGPL-3.0-or-later
// File: libraries/SafeMath.sol
pragma solidity ^0.7.5;
// TODO(zx): Replace all instances of SafeMath with OZ implementation
library SafeMath {
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
// Only used in the BondingCalculator.sol
function sqrrt(uint256 a) internal pure returns (uint c) {
if (a > 3) {
c = a;
uint b = add( div( a, 2), 1 );
while (b < c) {
c = b;
b = div( add( div( a, b ), b), 2 );
}
} else if (a != 0) {
c = 1;
}
}
}
// File: interfaces/IOlympusAuthority.sol
pragma solidity =0.7.5;
interface IOlympusAuthority {
/* ========== EVENTS ========== */
event GovernorPushed(address indexed from, address indexed to, bool _effectiveImmediately);
event GuardianPushed(address indexed from, address indexed to, bool _effectiveImmediately);
event PolicyPushed(address indexed from, address indexed to, bool _effectiveImmediately);
event VaultPushed(address indexed from, address indexed to, bool _effectiveImmediately);
event GovernorPulled(address indexed from, address indexed to);
event GuardianPulled(address indexed from, address indexed to);
event PolicyPulled(address indexed from, address indexed to);
event VaultPulled(address indexed from, address indexed to);
/* ========== VIEW ========== */
function governor() external view returns (address);
function guardian() external view returns (address);
function policy() external view returns (address);
function vault() external view returns (address);
}
// File: types/OlympusAccessControlled.sol
pragma solidity >=0.7.5;
abstract contract OlympusAccessControlled {
/* ========== EVENTS ========== */
event AuthorityUpdated(IOlympusAuthority indexed authority);
string UNAUTHORIZED = "UNAUTHORIZED"; // save gas
/* ========== STATE VARIABLES ========== */
IOlympusAuthority public authority;
/* ========== Constructor ========== */
constructor(IOlympusAuthority _authority) {
authority = _authority;
emit AuthorityUpdated(_authority);
}
/* ========== MODIFIERS ========== */
modifier onlyGovernor() {
require(msg.sender == authority.governor(), UNAUTHORIZED);
_;
}
modifier onlyGuardian() {
require(msg.sender == authority.guardian(), UNAUTHORIZED);
_;
}
modifier onlyPolicy() {
require(msg.sender == authority.policy(), UNAUTHORIZED);
_;
}
modifier onlyVault() {
require(msg.sender == authority.vault(), UNAUTHORIZED);
_;
}
/* ========== GOV ONLY ========== */
function setAuthority(IOlympusAuthority _newAuthority) external onlyGovernor {
authority = _newAuthority;
emit AuthorityUpdated(_newAuthority);
}
}
// File: interfaces/ITreasuryV1.sol
pragma solidity >=0.7.5;
interface ITreasuryV1 {
function withdraw(uint256 amount, address token) external;
function manage(address token, uint256 amount) external;
function valueOf(address token, uint256 amount) external view returns (uint256);
function excessReserves() external view returns (uint256);
}
// File: interfaces/IStakingV1.sol
pragma solidity >=0.7.5;
interface IStakingV1 {
function unstake(uint256 _amount, bool _trigger) external;
function index() external view returns (uint256);
}
// File: interfaces/IUniswapV2Router.sol
pragma solidity >=0.7.5;
interface IUniswapV2Router {
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function addLiquidity(
address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
function removeLiquidity(
address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline
) external returns (uint amountA, uint amountB);
}
// File: interfaces/IOwnable.sol
pragma solidity >=0.7.5;
interface IOwnable {
function owner() external view returns (address);
function renounceManagement() external;
function pushManagement( address newOwner_ ) external;
function pullManagement() external;
}
// File: interfaces/IStaking.sol
pragma solidity >=0.7.5;
interface IStaking {
function stake(
address _to,
uint256 _amount,
bool _rebasing,
bool _claim
) external returns (uint256);
function claim(address _recipient, bool _rebasing) external returns (uint256);
function forfeit() external returns (uint256);
function toggleLock() external;
function unstake(
address _to,
uint256 _amount,
bool _trigger,
bool _rebasing
) external returns (uint256);
function wrap(address _to, uint256 _amount) external returns (uint256 gBalance_);
function unwrap(address _to, uint256 _amount) external returns (uint256 sBalance_);
function rebase() external;
function index() external view returns (uint256);
function contractBalance() external view returns (uint256);
function totalStaked() external view returns (uint256);
function supplyInWarmup() external view returns (uint256);
}
// File: interfaces/ITreasury.sol
pragma solidity >=0.7.5;
interface ITreasury {
function deposit(
uint256 _amount,
address _token,
uint256 _profit
) external returns (uint256);
function withdraw(uint256 _amount, address _token) external;
function tokenValue(address _token, uint256 _amount) external view returns (uint256 value_);
function mint(address _recipient, uint256 _amount) external;
function manage(address _token, uint256 _amount) external;
function incurDebt(uint256 amount_, address token_) external;
function repayDebtWithReserve(uint256 amount_, address token_) external;
function excessReserves() external view returns (uint256);
}
// File: interfaces/IERC20.sol
pragma solidity >=0.7.5;
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: libraries/SafeERC20.sol
pragma solidity >=0.7.5;
/// @notice Safe IERC20 and ETH transfer library that safely handles missing return values.
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v3-periphery/blob/main/contracts/libraries/TransferHelper.sol)
/// Taken from Solmate
library SafeERC20 {
function safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 amount
) internal {
(bool success, bytes memory data) = address(token).call(
abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, amount)
);
require(success && (data.length == 0 || abi.decode(data, (bool))), "TRANSFER_FROM_FAILED");
}
function safeTransfer(
IERC20 token,
address to,
uint256 amount
) internal {
(bool success, bytes memory data) = address(token).call(
abi.encodeWithSelector(IERC20.transfer.selector, to, amount)
);
require(success && (data.length == 0 || abi.decode(data, (bool))), "TRANSFER_FAILED");
}
function safeApprove(
IERC20 token,
address to,
uint256 amount
) internal {
(bool success, bytes memory data) = address(token).call(
abi.encodeWithSelector(IERC20.approve.selector, to, amount)
);
require(success && (data.length == 0 || abi.decode(data, (bool))), "APPROVE_FAILED");
}
function safeTransferETH(address to, uint256 amount) internal {
(bool success, ) = to.call{value: amount}(new bytes(0));
require(success, "ETH_TRANSFER_FAILED");
}
}
// File: interfaces/IgOHM.sol
pragma solidity >=0.7.5;
interface IgOHM is IERC20 {
function mint(address _to, uint256 _amount) external;
function burn(address _from, uint256 _amount) external;
function index() external view returns (uint256);
function balanceFrom(uint256 _amount) external view returns (uint256);
function balanceTo(uint256 _amount) external view returns (uint256);
function migrate( address _staking, address _sOHM ) external;
}
// File: interfaces/IwsOHM.sol
pragma solidity >=0.7.5;
// Old wsOHM interface
interface IwsOHM is IERC20 {
function wrap(uint256 _amount) external returns (uint256);
function unwrap(uint256 _amount) external returns (uint256);
function wOHMTosOHM(uint256 _amount) external view returns (uint256);
function sOHMTowOHM(uint256 _amount) external view returns (uint256);
}
// File: interfaces/IsOHM.sol
pragma solidity >=0.7.5;
interface IsOHM is IERC20 {
function rebase( uint256 ohmProfit_, uint epoch_) external returns (uint256);
function circulatingSupply() external view returns (uint256);
function gonsForBalance( uint amount ) external view returns ( uint );
function balanceForGons( uint gons ) external view returns ( uint );
function index() external view returns ( uint );
function toG(uint amount) external view returns (uint);
function fromG(uint amount) external view returns (uint);
function changeDebt(
uint256 amount,
address debtor,
bool add
) external;
function debtBalances(address _address) external view returns (uint256);
}
// File: gOHM.sol
pragma solidity 0.7.5;
contract OlympusTokenMigrator is OlympusAccessControlled {
using SafeMath for uint256;
using SafeERC20 for IERC20;
using SafeERC20 for IgOHM;
using SafeERC20 for IsOHM;
using SafeERC20 for IwsOHM;
/* ========== MIGRATION ========== */
event TimelockStarted(uint256 block, uint256 end);
event Migrated(address staking, address treasury);
event Funded(uint256 amount);
event Defunded(uint256 amount);
/* ========== STATE VARIABLES ========== */
IERC20 public immutable oldOHM;
IsOHM public immutable oldsOHM;
IwsOHM public immutable oldwsOHM;
ITreasuryV1 public immutable oldTreasury;
IStakingV1 public immutable oldStaking;
IUniswapV2Router public immutable sushiRouter;
IUniswapV2Router public immutable uniRouter;
IgOHM public gOHM;
ITreasury public newTreasury;
IStaking public newStaking;
IERC20 public newOHM;
bool public ohmMigrated;
bool public shutdown;
uint256 public immutable timelockLength;
uint256 public timelockEnd;
uint256 public oldSupply;
constructor(
address _oldOHM,
address _oldsOHM,
address _oldTreasury,
address _oldStaking,
address _oldwsOHM,
address _sushi,
address _uni,
uint256 _timelock,
address _authority
) OlympusAccessControlled(IOlympusAuthority(_authority)) {
require(_oldOHM != address(0), "Zero address: OHM");
oldOHM = IERC20(_oldOHM);
require(_oldsOHM != address(0), "Zero address: sOHM");
oldsOHM = IsOHM(_oldsOHM);
require(_oldTreasury != address(0), "Zero address: Treasury");
oldTreasury = ITreasuryV1(_oldTreasury);
require(_oldStaking != address(0), "Zero address: Staking");
oldStaking = IStakingV1(_oldStaking);
require(_oldwsOHM != address(0), "Zero address: wsOHM");
oldwsOHM = IwsOHM(_oldwsOHM);
require(_sushi != address(0), "Zero address: Sushi");
sushiRouter = IUniswapV2Router(_sushi);
require(_uni != address(0), "Zero address: Uni");
uniRouter = IUniswapV2Router(_uni);
timelockLength = _timelock;
}
/* ========== MIGRATION ========== */
enum TYPE {
UNSTAKED,
STAKED,
WRAPPED
}
// migrate OHMv1, sOHMv1, or wsOHM for OHMv2, sOHMv2, or gOHM
function migrate(
uint256 _amount,
TYPE _from,
TYPE _to
) external {
require(!shutdown, "Shut down");
uint256 wAmount = oldwsOHM.sOHMTowOHM(_amount);
if (_from == TYPE.UNSTAKED) {
require(ohmMigrated, "Only staked until migration");
oldOHM.safeTransferFrom(msg.sender, address(this), _amount);
} else if (_from == TYPE.STAKED) {
oldsOHM.safeTransferFrom(msg.sender, address(this), _amount);
} else {
oldwsOHM.safeTransferFrom(msg.sender, address(this), _amount);
wAmount = _amount;
}
if (ohmMigrated) {
require(oldSupply >= oldOHM.totalSupply(), "OHMv1 minted");
_send(wAmount, _to);
} else {
gOHM.mint(msg.sender, wAmount);
}
}
// migrate all olympus tokens held
function migrateAll(TYPE _to) external {
require(!shutdown, "Shut down");
uint256 ohmBal = 0;
uint256 sOHMBal = oldsOHM.balanceOf(msg.sender);
uint256 wsOHMBal = oldwsOHM.balanceOf(msg.sender);
if (oldOHM.balanceOf(msg.sender) > 0 && ohmMigrated) {
ohmBal = oldOHM.balanceOf(msg.sender);
oldOHM.safeTransferFrom(msg.sender, address(this), ohmBal);
}
if (sOHMBal > 0) {
oldsOHM.safeTransferFrom(msg.sender, address(this), sOHMBal);
}
if (wsOHMBal > 0) {
oldwsOHM.safeTransferFrom(msg.sender, address(this), wsOHMBal);
}
uint256 wAmount = wsOHMBal.add(oldwsOHM.sOHMTowOHM(ohmBal.add(sOHMBal)));
if (ohmMigrated) {
require(oldSupply >= oldOHM.totalSupply(), "OHMv1 minted");
_send(wAmount, _to);
} else {
gOHM.mint(msg.sender, wAmount);
}
}
// send preferred token
function _send(uint256 wAmount, TYPE _to) internal {
if (_to == TYPE.WRAPPED) {
gOHM.safeTransfer(msg.sender, wAmount);
} else if (_to == TYPE.STAKED) {
newStaking.unwrap(msg.sender, wAmount);
} else if (_to == TYPE.UNSTAKED) {
newStaking.unstake(msg.sender, wAmount, false, false);
}
}
// bridge back to OHM, sOHM, or wsOHM
function bridgeBack(uint256 _amount, TYPE _to) external {
if (!ohmMigrated) {
gOHM.burn(msg.sender, _amount);
} else {
gOHM.safeTransferFrom(msg.sender, address(this), _amount);
}
uint256 amount = oldwsOHM.wOHMTosOHM(_amount);
// error throws if contract does not have enough of type to send
if (_to == TYPE.UNSTAKED) {
oldOHM.safeTransfer(msg.sender, amount);
} else if (_to == TYPE.STAKED) {
oldsOHM.safeTransfer(msg.sender, amount);
} else if (_to == TYPE.WRAPPED) {
oldwsOHM.safeTransfer(msg.sender, _amount);
}
}
/* ========== OWNABLE ========== */
// halt migrations (but not bridging back)
function halt() external onlyPolicy {
require(!ohmMigrated, "Migration has occurred");
shutdown = !shutdown;
}
// withdraw backing of migrated OHM
function defund(address reserve) external onlyGovernor {
require(ohmMigrated, "Migration has not begun");
require(timelockEnd < block.number && timelockEnd != 0, "Timelock not complete");
oldwsOHM.unwrap(oldwsOHM.balanceOf(address(this)));
uint256 amountToUnstake = oldsOHM.balanceOf(address(this));
oldsOHM.approve(address(oldStaking), amountToUnstake);
oldStaking.unstake(amountToUnstake, false);
uint256 balance = oldOHM.balanceOf(address(this));
if(balance > oldSupply) {
oldSupply = 0;
} else {
oldSupply -= balance;
}
uint256 amountToWithdraw = balance.mul(1e9);
oldOHM.approve(address(oldTreasury), amountToWithdraw);
oldTreasury.withdraw(amountToWithdraw, reserve);
IERC20(reserve).safeTransfer(address(newTreasury), IERC20(reserve).balanceOf(address(this)));
emit Defunded(balance);
}
// start timelock to send backing to new treasury
function startTimelock() external onlyGovernor {
require(timelockEnd == 0, "Timelock set");
timelockEnd = block.number.add(timelockLength);
emit TimelockStarted(block.number, timelockEnd);
}
// set gOHM address
function setgOHM(address _gOHM) external onlyGovernor {
require(address(gOHM) == address(0), "Already set");
require(_gOHM != address(0), "Zero address: gOHM");
gOHM = IgOHM(_gOHM);
}
// call internal migrate token function
function migrateToken(address token) external onlyGovernor {
_migrateToken(token, false);
}
/**
* @notice Migrate LP and pair with new OHM
*/
function migrateLP(
address pair,
bool sushi,
address token,
uint256 _minA,
uint256 _minB
) external onlyGovernor {
uint256 oldLPAmount = IERC20(pair).balanceOf(address(oldTreasury));
oldTreasury.manage(pair, oldLPAmount);
IUniswapV2Router router = sushiRouter;
if (!sushi) {
router = uniRouter;
}
IERC20(pair).approve(address(router), oldLPAmount);
(uint256 amountA, uint256 amountB) = router.removeLiquidity(
token,
address(oldOHM),
oldLPAmount,
_minA,
_minB,
address(this),
block.timestamp
);
newTreasury.mint(address(this), amountB);
IERC20(token).approve(address(router), amountA);
newOHM.approve(address(router), amountB);
router.addLiquidity(
token,
address(newOHM),
amountA,
amountB,
amountA,
amountB,
address(newTreasury),
block.timestamp
);
}
// Failsafe function to allow owner to withdraw funds sent directly to contract in case someone sends non-ohm tokens to the contract
function withdrawToken(
address tokenAddress,
uint256 amount,
address recipient
) external onlyGovernor {
require(tokenAddress != address(0), "Token address cannot be 0x0");
require(tokenAddress != address(gOHM), "Cannot withdraw: gOHM");
require(tokenAddress != address(oldOHM), "Cannot withdraw: old-OHM");
require(tokenAddress != address(oldsOHM), "Cannot withdraw: old-sOHM");
require(tokenAddress != address(oldwsOHM), "Cannot withdraw: old-wsOHM");
require(amount > 0, "Withdraw value must be greater than 0");
if (recipient == address(0)) {
recipient = msg.sender; // if no address is specified the value will will be withdrawn to Owner
}
IERC20 tokenContract = IERC20(tokenAddress);
uint256 contractBalance = tokenContract.balanceOf(address(this));
if (amount > contractBalance) {
amount = contractBalance; // set the withdrawal amount equal to balance within the account.
}
// transfer the token from address of this contract
tokenContract.safeTransfer(recipient, amount);
}
// migrate contracts
function migrateContracts(
address _newTreasury,
address _newStaking,
address _newOHM,
address _newsOHM,
address _reserve
) external onlyGovernor {
require(!ohmMigrated, "Already migrated");
ohmMigrated = true;
shutdown = false;
require(_newTreasury != address(0), "Zero address: Treasury");
newTreasury = ITreasury(_newTreasury);
require(_newStaking != address(0), "Zero address: Staking");
newStaking = IStaking(_newStaking);
require(_newOHM != address(0), "Zero address: OHM");
newOHM = IERC20(_newOHM);
oldSupply = oldOHM.totalSupply(); // log total supply at time of migration
gOHM.migrate(_newStaking, _newsOHM); // change gOHM minter
_migrateToken(_reserve, true); // will deposit tokens into new treasury so reserves can be accounted for
_fund(oldsOHM.circulatingSupply()); // fund with current staked supply for token migration
emit Migrated(_newStaking, _newTreasury);
}
/* ========== INTERNAL FUNCTIONS ========== */
// fund contract with gOHM
function _fund(uint256 _amount) internal {
newTreasury.mint(address(this), _amount);
newOHM.approve(address(newStaking), _amount);
newStaking.stake(address(this), _amount, false, true); // stake and claim gOHM
emit Funded(_amount);
}
/**
* @notice Migrate token from old treasury to new treasury
*/
function _migrateToken(address token, bool deposit) internal {
uint256 balance = IERC20(token).balanceOf(address(oldTreasury));
uint256 excessReserves = oldTreasury.excessReserves();
uint256 tokenValue = oldTreasury.valueOf(token, balance);
if (tokenValue > excessReserves) {
tokenValue = excessReserves;
balance = excessReserves * 10**9;
}
oldTreasury.manage(token, balance);
if (deposit) {
IERC20(token).safeApprove(address(newTreasury), balance);
newTreasury.deposit(balance, token, tokenValue);
} else {
IERC20(token).safeTransfer(address(newTreasury), balance);
}
}
}
Compiler Settings
{"remappings":[],"optimizer":{"runs":200,"enabled":false},"metadata":{"bytecodeHash":"ipfs"},"libraries":{},"evmVersion":"istanbul","compilationTarget":{"gOHM_flat.sol":"OlympusTokenMigrator"}}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_oldOHM","internalType":"address"},{"type":"address","name":"_oldsOHM","internalType":"address"},{"type":"address","name":"_oldTreasury","internalType":"address"},{"type":"address","name":"_oldStaking","internalType":"address"},{"type":"address","name":"_oldwsOHM","internalType":"address"},{"type":"address","name":"_sushi","internalType":"address"},{"type":"address","name":"_uni","internalType":"address"},{"type":"uint256","name":"_timelock","internalType":"uint256"},{"type":"address","name":"_authority","internalType":"address"}]},{"type":"event","name":"AuthorityUpdated","inputs":[{"type":"address","name":"authority","internalType":"contract IOlympusAuthority","indexed":true}],"anonymous":false},{"type":"event","name":"Defunded","inputs":[{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Funded","inputs":[{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Migrated","inputs":[{"type":"address","name":"staking","internalType":"address","indexed":false},{"type":"address","name":"treasury","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"TimelockStarted","inputs":[{"type":"uint256","name":"block","internalType":"uint256","indexed":false},{"type":"uint256","name":"end","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IOlympusAuthority"}],"name":"authority","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"bridgeBack","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"},{"type":"uint8","name":"_to","internalType":"enum OlympusTokenMigrator.TYPE"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"defund","inputs":[{"type":"address","name":"reserve","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IgOHM"}],"name":"gOHM","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"halt","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"migrate","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"},{"type":"uint8","name":"_from","internalType":"enum OlympusTokenMigrator.TYPE"},{"type":"uint8","name":"_to","internalType":"enum OlympusTokenMigrator.TYPE"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"migrateAll","inputs":[{"type":"uint8","name":"_to","internalType":"enum OlympusTokenMigrator.TYPE"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"migrateContracts","inputs":[{"type":"address","name":"_newTreasury","internalType":"address"},{"type":"address","name":"_newStaking","internalType":"address"},{"type":"address","name":"_newOHM","internalType":"address"},{"type":"address","name":"_newsOHM","internalType":"address"},{"type":"address","name":"_reserve","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"migrateLP","inputs":[{"type":"address","name":"pair","internalType":"address"},{"type":"bool","name":"sushi","internalType":"bool"},{"type":"address","name":"token","internalType":"address"},{"type":"uint256","name":"_minA","internalType":"uint256"},{"type":"uint256","name":"_minB","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"migrateToken","inputs":[{"type":"address","name":"token","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"newOHM","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IStaking"}],"name":"newStaking","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract ITreasury"}],"name":"newTreasury","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"ohmMigrated","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"oldOHM","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IStakingV1"}],"name":"oldStaking","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"oldSupply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract ITreasuryV1"}],"name":"oldTreasury","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IsOHM"}],"name":"oldsOHM","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IwsOHM"}],"name":"oldwsOHM","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAuthority","inputs":[{"type":"address","name":"_newAuthority","internalType":"contract IOlympusAuthority"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setgOHM","inputs":[{"type":"address","name":"_gOHM","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"shutdown","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"startTimelock","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IUniswapV2Router"}],"name":"sushiRouter","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"timelockEnd","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"timelockLength","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IUniswapV2Router"}],"name":"uniRouter","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdrawToken","inputs":[{"type":"address","name":"tokenAddress","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"address","name":"recipient","internalType":"address"}]}]
Contract Creation Code
0x6101806040526040518060400160405280600c81526020017f554e415554484f52495a45440000000000000000000000000000000000000000815250600090805190602001906200005292919062000786565b503480156200006057600080fd5b50604051620061b9380380620061b983398181016040526101208110156200008757600080fd5b810190808051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291905050508080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad60405160405180910390a250600073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16141562000212576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f5a65726f20616464726573733a204f484d00000000000000000000000000000081525060200191505060405180910390fd5b8873ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415620002ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f5a65726f20616464726573733a20734f484d000000000000000000000000000081525060200191505060405180910390fd5b8773ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415620003c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f5a65726f20616464726573733a2054726561737572790000000000000000000081525060200191505060405180910390fd5b8673ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415620004a3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f5a65726f20616464726573733a205374616b696e67000000000000000000000081525060200191505060405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff166101008173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156200057f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f5a65726f20616464726573733a2077734f484d0000000000000000000000000081525060200191505060405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156200065a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f5a65726f20616464726573733a2053757368690000000000000000000000000081525060200191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff166101208173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562000736576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f5a65726f20616464726573733a20556e6900000000000000000000000000000081525060200191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff166101408173ffffffffffffffffffffffffffffffffffffffff1660601b815250508161016081815250505050505050505050506200083c565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620007be57600085556200080a565b82601f10620007d957805160ff19168380011785556200080a565b828001600101855582156200080a579182015b8281111562000809578251825591602001919060010190620007ec565b5b5090506200081991906200081d565b5090565b5b80821115620008385760008160009055506001016200081e565b5090565b60805160601c60a05160601c60c05160601c60e05160601c6101005160601c6101205160601c6101405160601c610160516158336200098660003980610d715280612225525080611cdc52806137e7525080611a9a52806137bf5250806118065280612fa75280613058525080612a4e528061323352806132e4528061366c52806137145280614e195280614ec35280614f6852806150495250806108f35280610b0b52806115595280611a705280611e165280611fc55280612d355280612d715280613edc52806141fa5280614247525080610ab9528061149752806117e25280611f5752806129105280612ea75280612f6b5280613e1652806141a3525080610a485280610b6c52806113d55280611ee8528061279a5280612a7252806130f052806131f752806138d85280613fa25280614082528061414c528061432b52506158336000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c80637a9e5e4b11610104578063d5f42869116100a2578063ec78f90b11610071578063ec78f90b146107a3578063ed44527b146107d4578063f96a600614610808578063fc0e74d11461084c576101cf565b8063d5f4286914610687578063d6fa3760146106bb578063dfd9e685146106ff578063e7a1705c14610783576101cf565b8063b29c7444116100de578063b29c744414610551578063b71a6df31461055b578063bf7e214f1461061f578063cf0ef51614610653576101cf565b80637a9e5e4b1461049e578063a0e47bf6146104e2578063abacbb2f14610516576101cf565b80634579b8b4116101715780635ed7ca5b1161014b5780635ed7ca5b1461040e57806360ca094e14610418578063694d66351461044c5780636d13582c1461046a576101cf565b80634579b8b4146103725780634ed3b35f146103a65780634edf8980146103da576101cf565b8063219a1f81116101ad578063219a1f811461026e578063245c0e991461028c5780633ccdbb28146102d05780633fc85b341461033e576101cf565b80630465f072146101d4578063058508441461021c5780630cd305851461023a575b600080fd5b61021a600480360360608110156101ea57600080fd5b8101908080359060200190929190803560ff169060200190929190803560ff16906020019092919050505061086c565b005b610224610d43565b6040518082815260200191505060405180910390f35b610242610d49565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610276610d6f565b6040518082815260200191505060405180910390f35b6102ce600480360360208110156102a257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d93565b005b61033c600480360360608110156102e657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506110d5565b005b610346611794565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61037a6117ba565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103ae6117e0565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103e2611804565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610416611828565b005b610420611a6e565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610454611a92565b6040518082815260200191505060405180910390f35b610472611a98565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104e0600480360360208110156104b457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611abc565b005b6104ea611cda565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61054f6004803603604081101561052c57600080fd5b8101908080359060200190929190803560ff169060200190929190505050611cfe565b005b610559612011565b005b61061d600480360360a081101561057157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061229c565b005b610627612a26565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61065b612a4c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61068f612a70565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106fd600480360360208110156106d157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612a94565b005b610781600480360360a081101561071557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291905050506134b5565b005b61078b613d7b565b60405180821515815260200191505060405180910390f35b6107d2600480360360208110156107b957600080fd5b81019080803560ff169060200190929190505050613d8e565b005b6107dc614503565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61084a6004803603602081101561081e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614529565b005b6108546146ce565b60405180821515815260200191505060405180910390f35b600560159054906101000a900460ff16156108ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f5368757420646f776e000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166373f79c04856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561096257600080fd5b505afa158015610976573d6000803e3d6000fd5b505050506040513d602081101561098c57600080fd5b81019080805190602001909291905050509050600060028111156109ac57fe5b8360028111156109b857fe5b1415610a9257600560149054906101000a900460ff16610a40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4f6e6c79207374616b656420756e74696c206d6967726174696f6e000000000081525060200191505060405180910390fd5b610a8d3330867f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166146e1909392919063ffffffff16565b610b55565b60016002811115610a9f57fe5b836002811115610aab57fe5b1415610b0357610afe3330867f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166146e1909392919063ffffffff16565b610b54565b610b503330867f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166146e1909392919063ffffffff16565b8390505b5b600560149054906101000a900460ff1615610c91577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610bd057600080fd5b505afa158015610be4573d6000803e3d6000fd5b505050506040513d6020811015610bfa57600080fd5b81019080805190602001909291905050506007541015610c82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4f484d7631206d696e746564000000000000000000000000000000000000000081525060200191505060405180910390fd5b610c8c8183614902565b610d3d565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1933836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015610d2457600080fd5b505af1158015610d38573d6000803e3d6000fd5b505050505b50505050565b60075481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015610dfb57600080fd5b505afa158015610e0f573d6000803e3d6000fd5b505050506040513d6020811015610e2557600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614600090610f29576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015610f1a5780601f10610eef57610100808354040283529160200191610f1a565b820191906000526020600020905b815481529060010190602001808311610efd57829003601f168201915b50509250505060405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610fee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f416c72656164792073657400000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611091576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f5a65726f20616464726573733a20674f484d000000000000000000000000000081525060200191505060405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561113d57600080fd5b505afa158015611151573d6000803e3d6000fd5b505050506040513d602081101561116757600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161460009061126b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382528381815460018160011615610100020316600290048152602001915080546001816001161561010002031660029004801561125c5780601f106112315761010080835404028352916020019161125c565b820191906000526020600020905b81548152906001019060200180831161123f57829003601f168201915b50509250505060405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561130f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f546f6b656e20616464726573732063616e6e6f7420626520307830000000000081525060200191505060405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156113d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f43616e6e6f742077697468647261773a20674f484d000000000000000000000081525060200191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611495576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f43616e6e6f742077697468647261773a206f6c642d4f484d000000000000000081525060200191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611557576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f43616e6e6f742077697468647261773a206f6c642d734f484d0000000000000081525060200191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611619576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f43616e6e6f742077697468647261773a206f6c642d77734f484d00000000000081525060200191505060405180910390fd5b60008211611672576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806157d96025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116ab573390505b600083905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561171957600080fd5b505afa15801561172d573d6000803e3d6000fd5b505050506040513d602081101561174357600080fd5b8101908080519060200190929190505050905080841115611762578093505b61178d83858473ffffffffffffffffffffffffffffffffffffffff16614b6f9092919063ffffffff16565b5050505050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630505c8c96040518163ffffffff1660e01b815260040160206040518083038186803b15801561189057600080fd5b505afa1580156118a4573d6000803e3d6000fd5b505050506040513d60208110156118ba57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146000906119be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252838181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156119af5780601f10611984576101008083540402835291602001916119af565b820191906000526020600020905b81548152906001019060200180831161199257829003601f168201915b50509250505060405180910390fd5b50600560149054906101000a900460ff1615611a42576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f4d6967726174696f6e20686173206f636375727265640000000000000000000081525060200191505060405180910390fd5b600560159054906101000a900460ff1615600560156101000a81548160ff021916908315150217905550565b7f000000000000000000000000000000000000000000000000000000000000000081565b60065481565b7f000000000000000000000000000000000000000000000000000000000000000081565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015611b2457600080fd5b505afa158015611b38573d6000803e3d6000fd5b505050506040513d6020811015611b4e57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614600090611c52576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015611c435780601f10611c1857610100808354040283529160200191611c43565b820191906000526020600020905b815481529060010190602001808311611c2657829003601f168201915b50509250505060405180910390fd5b5080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad60405160405180910390a250565b7f000000000000000000000000000000000000000000000000000000000000000081565b600560149054906101000a900460ff16611dc257600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac33846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015611da557600080fd5b505af1158015611db9573d6000803e3d6000fd5b50505050611e12565b611e11333084600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166146e1909392919063ffffffff16565b5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663554c85a3846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611e8557600080fd5b505afa158015611e99573d6000803e3d6000fd5b505050506040513d6020811015611eaf57600080fd5b8101908080519060200190929190505050905060006002811115611ecf57fe5b826002811115611edb57fe5b1415611f3157611f2c33827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16614b6f9092919063ffffffff16565b61200c565b60016002811115611f3e57fe5b826002811115611f4a57fe5b1415611fa057611f9b33827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16614b6f9092919063ffffffff16565b61200b565b600280811115611fac57fe5b826002811115611fb857fe5b141561200a5761200933847f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16614b6f9092919063ffffffff16565b5b5b5b505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561207957600080fd5b505afa15801561208d573d6000803e3d6000fd5b505050506040513d60208110156120a357600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146000906121a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252838181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156121985780601f1061216d57610100808354040283529160200191612198565b820191906000526020600020905b81548152906001019060200180831161217b57829003601f168201915b50509250505060405180910390fd5b50600060065414612220576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f54696d656c6f636b20736574000000000000000000000000000000000000000081525060200191505060405180910390fd5b6122537f000000000000000000000000000000000000000000000000000000000000000043614d7190919063ffffffff16565b6006819055507f1f1c77590fcb154ccfac3f34adef3adfd45fa19cd5bd058297a1d6137d0229c043600654604051808381526020018281526020019250505060405180910390a1565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561230457600080fd5b505afa158015612318573d6000803e3d6000fd5b505050506040513d602081101561232e57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614600090612432576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252838181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156124235780601f106123f857610100808354040283529160200191612423565b820191906000526020600020905b81548152906001019060200180831161240657829003601f168201915b50509250505060405180910390fd5b50600560149054906101000a900460ff16156124b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f416c7265616479206d696772617465640000000000000000000000000000000081525060200191505060405180910390fd5b6001600560146101000a81548160ff0219169083151502179055506000600560156101000a81548160ff021916908315150217905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561258f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f5a65726f20616464726573733a2054726561737572790000000000000000000081525060200191505060405180910390fd5b84600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612673576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f5a65726f20616464726573733a205374616b696e67000000000000000000000081525060200191505060405180910390fd5b83600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612757576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f5a65726f20616464726573733a204f484d00000000000000000000000000000081525060200191505060405180910390fd5b82600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156127fe57600080fd5b505afa158015612812573d6000803e3d6000fd5b505050506040513d602081101561282857600080fd5b8101908080519060200190929190505050600781905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631068361f85846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b1580156128e857600080fd5b505af11580156128fc573d6000803e3d6000fd5b5050505061290b816001614df9565b6129b47f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639358928b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561297457600080fd5b505afa158015612988573d6000803e3d6000fd5b505050506040513d602081101561299e57600080fd5b8101908080519060200190929190505050615274565b7f844985ce6880ca51e25a6d4ecc8af37a5de880279f2081af96d0e875c42b70828486604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a15050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015612afc57600080fd5b505afa158015612b10573d6000803e3d6000fd5b505050506040513d6020811015612b2657600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614600090612c2a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015612c1b5780601f10612bf057610100808354040283529160200191612c1b565b820191906000526020600020905b815481529060010190602001808311612bfe57829003601f168201915b50509250505060405180910390fd5b50600560149054906101000a900460ff16612cad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4d6967726174696f6e20686173206e6f7420626567756e00000000000000000081525060200191505060405180910390fd5b43600654108015612cc15750600060065414155b612d33576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f54696d656c6f636b206e6f7420636f6d706c657465000000000000000000000081525060200191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663de0e9a3e7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612df657600080fd5b505afa158015612e0a573d6000803e3d6000fd5b505050506040513d6020811015612e2057600080fd5b81019080805190602001909291905050506040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015612e6757600080fd5b505af1158015612e7b573d6000803e3d6000fd5b505050506040513d6020811015612e9157600080fd5b81019080805190602001909291905050505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612f2c57600080fd5b505afa158015612f40573d6000803e3d6000fd5b505050506040513d6020811015612f5657600080fd5b810190808051906020019092919050505090507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f0000000000000000000000000000000000000000000000000000000000000000836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561301a57600080fd5b505af115801561302e573d6000803e3d6000fd5b505050506040513d602081101561304457600080fd5b8101908080519060200190929190505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639ebea88c8260006040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b1580156130d457600080fd5b505af11580156130e8573d6000803e3d6000fd5b5050505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561317557600080fd5b505afa158015613189573d6000803e3d6000fd5b505050506040513d602081101561319f57600080fd5b810190808051906020019092919050505090506007548111156131c95760006007819055506131da565b806007600082825403925050819055505b60006131f3633b9aca008361552f90919063ffffffff16565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f0000000000000000000000000000000000000000000000000000000000000000836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156132a657600080fd5b505af11580156132ba573d6000803e3d6000fd5b505050506040513d60208110156132d057600080fd5b8101908080519060200190929190505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1662f714ce82866040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b15801561337257600080fd5b505af1158015613386573d6000803e3d6000fd5b50505050613478600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561341757600080fd5b505afa15801561342b573d6000803e3d6000fd5b505050506040513d602081101561344157600080fd5b81019080805190602001909291905050508673ffffffffffffffffffffffffffffffffffffffff16614b6f9092919063ffffffff16565b7faf5e14f4cc37b04db239269739bd935c4ed55328b691792af028e5570dfe61fa826040518082815260200191505060405180910390a150505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561351d57600080fd5b505afa158015613531573d6000803e3d6000fd5b505050506040513d602081101561354757600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161460009061364b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382528381815460018160011615610100020316600290048152602001915080546001816001161561010002031660029004801561363c5780601f106136115761010080835404028352916020019161363c565b820191906000526020600020905b81548152906001019060200180831161361f57829003601f168201915b50509250505060405180910390fd5b5060008573ffffffffffffffffffffffffffffffffffffffff166370a082317f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156136d557600080fd5b505afa1580156136e9573d6000803e3d6000fd5b505050506040513d60208110156136ff57600080fd5b810190808051906020019092919050505090507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630b0eee3087836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156137a357600080fd5b505af11580156137b7573d6000803e3d6000fd5b5050505060007f0000000000000000000000000000000000000000000000000000000000000000905085613809577f000000000000000000000000000000000000000000000000000000000000000090505b8673ffffffffffffffffffffffffffffffffffffffff1663095ea7b382846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561387a57600080fd5b505af115801561388e573d6000803e3d6000fd5b505050506040513d60208110156138a457600080fd5b8101908080519060200190929190505050506000808273ffffffffffffffffffffffffffffffffffffffff1663baa2abde887f0000000000000000000000000000000000000000000000000000000000000000878a8a30426040518863ffffffff1660e01b8152600401808873ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019750505050505050506040805180830381600087803b15801561399d57600080fd5b505af11580156139b1573d6000803e3d6000fd5b505050506040513d60408110156139c757600080fd5b81019080805190602001909291908051906020019092919050505091509150600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1930836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015613a7957600080fd5b505af1158015613a8d573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff1663095ea7b384846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613b0257600080fd5b505af1158015613b16573d6000803e3d6000fd5b505050506040513d6020811015613b2c57600080fd5b810190808051906020019092919050505050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b384836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613bd157600080fd5b505af1158015613be5573d6000803e3d6000fd5b505050506040513d6020811015613bfb57600080fd5b8101908080519060200190929190505050508273ffffffffffffffffffffffffffffffffffffffff1663e8e3370088600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685858787600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518963ffffffff1660e01b8152600401808973ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018781526020018681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200198505050505050505050606060405180830381600087803b158015613d1e57600080fd5b505af1158015613d32573d6000803e3d6000fd5b505050506040513d6060811015613d4857600080fd5b81019080805190602001909291908051906020019092919080519060200190929190505050505050505050505050505050565b600560149054906101000a900460ff1681565b600560159054906101000a900460ff1615613e11576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f5368757420646f776e000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015613e9b57600080fd5b505afa158015613eaf573d6000803e3d6000fd5b505050506040513d6020811015613ec557600080fd5b8101908080519060200190929190505050905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015613f6157600080fd5b505afa158015613f75573d6000803e3d6000fd5b505050506040513d6020811015613f8b57600080fd5b8101908080519060200190929190505050905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561402757600080fd5b505afa15801561403b573d6000803e3d6000fd5b505050506040513d602081101561405157600080fd5b810190808051906020019092919050505011801561407b5750600560149054906101000a900460ff165b15614192577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561410757600080fd5b505afa15801561411b573d6000803e3d6000fd5b505050506040513d602081101561413157600080fd5b810190808051906020019092919050505092506141913330857f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166146e1909392919063ffffffff16565b5b60008211156141e9576141e83330847f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166146e1909392919063ffffffff16565b5b60008111156142405761423f3330837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166146e1909392919063ffffffff16565b5b60006143127f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166373f79c046142948688614d7190919063ffffffff16565b6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156142c857600080fd5b505afa1580156142dc573d6000803e3d6000fd5b505050506040513d60208110156142f257600080fd5b810190808051906020019092919050505083614d7190919063ffffffff16565b9050600560149054906101000a900460ff1615614450577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561438f57600080fd5b505afa1580156143a3573d6000803e3d6000fd5b505050506040513d60208110156143b957600080fd5b81019080805190602001909291905050506007541015614441576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4f484d7631206d696e746564000000000000000000000000000000000000000081525060200191505060405180910390fd5b61444b8186614902565b6144fc565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1933836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156144e357600080fd5b505af11580156144f7573d6000803e3d6000fd5b505050505b5050505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561459157600080fd5b505afa1580156145a5573d6000803e3d6000fd5b505050506040513d60208110156145bb57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146000906146bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252838181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156146b05780601f10614685576101008083540402835291602001916146b0565b820191906000526020600020905b81548152906001019060200180831161469357829003601f168201915b50509250505060405180910390fd5b506146cb816000614df9565b50565b600560159054906101000a900460ff1681565b600060608573ffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b868686604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b602083106147e157805182526020820191506020810190506020830392506147be565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614843576040519150601f19603f3d011682016040523d82523d6000602084013e614848565b606091505b50915091508180156148885750600081511480614887575080806020019051602081101561487557600080fd5b81019080805190602001909291905050505b5b6148fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5452414e534645525f46524f4d5f4641494c454400000000000000000000000081525060200191505060405180910390fd5b505050505050565b60028081111561490e57fe5b81600281111561491a57fe5b14156149725761496d3383600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16614b6f9092919063ffffffff16565b614b6b565b6001600281111561497f57fe5b81600281111561498b57fe5b1415614a6557600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166339f4769333846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015614a2457600080fd5b505af1158015614a38573d6000803e3d6000fd5b505050506040513d6020811015614a4e57600080fd5b810190808051906020019092919050505050614b6a565b60006002811115614a7257fe5b816002811115614a7e57fe5b1415614b6957600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663990966d533846000806040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183151581526020018215158152602001945050505050602060405180830381600087803b158015614b2c57600080fd5b505af1158015614b40573d6000803e3d6000fd5b505050506040513d6020811015614b5657600080fd5b8101908080519060200190929190505050505b5b5b5050565b600060608473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b8585604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b60208310614c515780518252602082019150602081019050602083039250614c2e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614cb3576040519150601f19603f3d011682016040523d82523d6000602084013e614cb8565b606091505b5091509150818015614cf85750600081511480614cf75750808060200190516020811015614ce557600080fd5b81019080805190602001909291905050505b5b614d6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f5452414e534645525f4641494c4544000000000000000000000000000000000081525060200191505060405180910390fd5b5050505050565b600080828401905083811015614def576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166370a082317f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015614e8257600080fd5b505afa158015614e96573d6000803e3d6000fd5b505050506040513d6020811015614eac57600080fd5b8101908080519060200190929190505050905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630c3513a86040518163ffffffff1660e01b815260040160206040518083038186803b158015614f2757600080fd5b505afa158015614f3b573d6000803e3d6000fd5b505050506040513d6020811015614f5157600080fd5b8101908080519060200190929190505050905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631eec5a9a86856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b158015614ff557600080fd5b505afa158015615009573d6000803e3d6000fd5b505050506040513d602081101561501f57600080fd5b810190808051906020019092919050505090508181111561504757819050633b9aca00820292505b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630b0eee3086856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156150d857600080fd5b505af11580156150ec573d6000803e3d6000fd5b50505050831561521f57615143600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16848773ffffffffffffffffffffffffffffffffffffffff166155b59092919063ffffffff16565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bc157ac18487846040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156151de57600080fd5b505af11580156151f2573d6000803e3d6000fd5b505050506040513d602081101561520857600080fd5b81019080805190602001909291905050505061526d565b61526c600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16848773ffffffffffffffffffffffffffffffffffffffff16614b6f9092919063ffffffff16565b5b5050505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1930836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561530757600080fd5b505af115801561531b573d6000803e3d6000fd5b50505050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156153d457600080fd5b505af11580156153e8573d6000803e3d6000fd5b505050506040513d60208110156153fe57600080fd5b810190808051906020019092919050505050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d866c9d83083600060016040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183151581526020018215158152602001945050505050602060405180830381600087803b1580156154b957600080fd5b505af11580156154cd573d6000803e3d6000fd5b505050506040513d60208110156154e357600080fd5b8101908080519060200190929190505050507fc4c14883ae9fd8e26d5d59e3485ed29fd126d781d7e498a4ca5c54c8268e4936816040518082815260200191505060405180910390a150565b60008083141561554257600090506155af565b600082840290508284828161555357fe5b04146155aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806157b86021913960400191505060405180910390fd5b809150505b92915050565b600060608473ffffffffffffffffffffffffffffffffffffffff1663095ea7b360e01b8585604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b602083106156975780518252602082019150602081019050602083039250615674565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146156f9576040519150601f19603f3d011682016040523d82523d6000602084013e6156fe565b606091505b509150915081801561573e575060008151148061573d575080806020019051602081101561572b57600080fd5b81019080805190602001909291905050505b5b6157b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f415050524f56455f4641494c454400000000000000000000000000000000000081525060200191505060405180910390fd5b505050505056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7757697468647261772076616c7565206d7573742062652067726561746572207468616e2030a2646970667358221220b09b2af2a491d817278550a9f835a52946dfb113bad0ba1275e3732207f35e6d64736f6c63430007050033000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89900000000000000000000000004f2694c8fcee23e8fd0dfea1d4f5bb8c352111f00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e8000000000000000000000000fd31c7d00ca47653c6ce64af53c1571f9c36566a000000000000000000000000ca76543cf381ebbb277be79574059e32108e3e65000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d0000000000000000000000000000000000000000000000000000000000001b580000000000000000000000001c21f8ea7e39e2ba00bc12d2968d63f4acb38b7a
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c80637a9e5e4b11610104578063d5f42869116100a2578063ec78f90b11610071578063ec78f90b146107a3578063ed44527b146107d4578063f96a600614610808578063fc0e74d11461084c576101cf565b8063d5f4286914610687578063d6fa3760146106bb578063dfd9e685146106ff578063e7a1705c14610783576101cf565b8063b29c7444116100de578063b29c744414610551578063b71a6df31461055b578063bf7e214f1461061f578063cf0ef51614610653576101cf565b80637a9e5e4b1461049e578063a0e47bf6146104e2578063abacbb2f14610516576101cf565b80634579b8b4116101715780635ed7ca5b1161014b5780635ed7ca5b1461040e57806360ca094e14610418578063694d66351461044c5780636d13582c1461046a576101cf565b80634579b8b4146103725780634ed3b35f146103a65780634edf8980146103da576101cf565b8063219a1f81116101ad578063219a1f811461026e578063245c0e991461028c5780633ccdbb28146102d05780633fc85b341461033e576101cf565b80630465f072146101d4578063058508441461021c5780630cd305851461023a575b600080fd5b61021a600480360360608110156101ea57600080fd5b8101908080359060200190929190803560ff169060200190929190803560ff16906020019092919050505061086c565b005b610224610d43565b6040518082815260200191505060405180910390f35b610242610d49565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610276610d6f565b6040518082815260200191505060405180910390f35b6102ce600480360360208110156102a257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d93565b005b61033c600480360360608110156102e657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506110d5565b005b610346611794565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61037a6117ba565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103ae6117e0565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103e2611804565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610416611828565b005b610420611a6e565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610454611a92565b6040518082815260200191505060405180910390f35b610472611a98565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104e0600480360360208110156104b457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611abc565b005b6104ea611cda565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61054f6004803603604081101561052c57600080fd5b8101908080359060200190929190803560ff169060200190929190505050611cfe565b005b610559612011565b005b61061d600480360360a081101561057157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061229c565b005b610627612a26565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61065b612a4c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61068f612a70565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106fd600480360360208110156106d157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612a94565b005b610781600480360360a081101561071557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291905050506134b5565b005b61078b613d7b565b60405180821515815260200191505060405180910390f35b6107d2600480360360208110156107b957600080fd5b81019080803560ff169060200190929190505050613d8e565b005b6107dc614503565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61084a6004803603602081101561081e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614529565b005b6108546146ce565b60405180821515815260200191505060405180910390f35b600560159054906101000a900460ff16156108ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f5368757420646f776e000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b60007f000000000000000000000000ca76543cf381ebbb277be79574059e32108e3e6573ffffffffffffffffffffffffffffffffffffffff166373f79c04856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561096257600080fd5b505afa158015610976573d6000803e3d6000fd5b505050506040513d602081101561098c57600080fd5b81019080805190602001909291905050509050600060028111156109ac57fe5b8360028111156109b857fe5b1415610a9257600560149054906101000a900460ff16610a40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4f6e6c79207374616b656420756e74696c206d6967726174696f6e000000000081525060200191505060405180910390fd5b610a8d3330867f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89973ffffffffffffffffffffffffffffffffffffffff166146e1909392919063ffffffff16565b610b55565b60016002811115610a9f57fe5b836002811115610aab57fe5b1415610b0357610afe3330867f00000000000000000000000004f2694c8fcee23e8fd0dfea1d4f5bb8c352111f73ffffffffffffffffffffffffffffffffffffffff166146e1909392919063ffffffff16565b610b54565b610b503330867f000000000000000000000000ca76543cf381ebbb277be79574059e32108e3e6573ffffffffffffffffffffffffffffffffffffffff166146e1909392919063ffffffff16565b8390505b5b600560149054906101000a900460ff1615610c91577f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89973ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610bd057600080fd5b505afa158015610be4573d6000803e3d6000fd5b505050506040513d6020811015610bfa57600080fd5b81019080805190602001909291905050506007541015610c82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4f484d7631206d696e746564000000000000000000000000000000000000000081525060200191505060405180910390fd5b610c8c8183614902565b610d3d565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1933836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015610d2457600080fd5b505af1158015610d38573d6000803e3d6000fd5b505050505b50505050565b60075481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f0000000000000000000000000000000000000000000000000000000000001b5881565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015610dfb57600080fd5b505afa158015610e0f573d6000803e3d6000fd5b505050506040513d6020811015610e2557600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614600090610f29576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015610f1a5780601f10610eef57610100808354040283529160200191610f1a565b820191906000526020600020905b815481529060010190602001808311610efd57829003601f168201915b50509250505060405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610fee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f416c72656164792073657400000000000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611091576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f5a65726f20616464726573733a20674f484d000000000000000000000000000081525060200191505060405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561113d57600080fd5b505afa158015611151573d6000803e3d6000fd5b505050506040513d602081101561116757600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161460009061126b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382528381815460018160011615610100020316600290048152602001915080546001816001161561010002031660029004801561125c5780601f106112315761010080835404028352916020019161125c565b820191906000526020600020905b81548152906001019060200180831161123f57829003601f168201915b50509250505060405180910390fd5b50600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561130f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f546f6b656e20616464726573732063616e6e6f7420626520307830000000000081525060200191505060405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156113d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f43616e6e6f742077697468647261773a20674f484d000000000000000000000081525060200191505060405180910390fd5b7f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611495576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f43616e6e6f742077697468647261773a206f6c642d4f484d000000000000000081525060200191505060405180910390fd5b7f00000000000000000000000004f2694c8fcee23e8fd0dfea1d4f5bb8c352111f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611557576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f43616e6e6f742077697468647261773a206f6c642d734f484d0000000000000081525060200191505060405180910390fd5b7f000000000000000000000000ca76543cf381ebbb277be79574059e32108e3e6573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611619576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f43616e6e6f742077697468647261773a206f6c642d77734f484d00000000000081525060200191505060405180910390fd5b60008211611672576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806157d96025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116ab573390505b600083905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561171957600080fd5b505afa15801561172d573d6000803e3d6000fd5b505050506040513d602081101561174357600080fd5b8101908080519060200190929190505050905080841115611762578093505b61178d83858473ffffffffffffffffffffffffffffffffffffffff16614b6f9092919063ffffffff16565b5050505050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f00000000000000000000000004f2694c8fcee23e8fd0dfea1d4f5bb8c352111f81565b7f000000000000000000000000fd31c7d00ca47653c6ce64af53c1571f9c36566a81565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630505c8c96040518163ffffffff1660e01b815260040160206040518083038186803b15801561189057600080fd5b505afa1580156118a4573d6000803e3d6000fd5b505050506040513d60208110156118ba57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146000906119be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252838181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156119af5780601f10611984576101008083540402835291602001916119af565b820191906000526020600020905b81548152906001019060200180831161199257829003601f168201915b50509250505060405180910390fd5b50600560149054906101000a900460ff1615611a42576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f4d6967726174696f6e20686173206f636375727265640000000000000000000081525060200191505060405180910390fd5b600560159054906101000a900460ff1615600560156101000a81548160ff021916908315150217905550565b7f000000000000000000000000ca76543cf381ebbb277be79574059e32108e3e6581565b60065481565b7f000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f81565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015611b2457600080fd5b505afa158015611b38573d6000803e3d6000fd5b505050506040513d6020811015611b4e57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614600090611c52576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015611c435780601f10611c1857610100808354040283529160200191611c43565b820191906000526020600020905b815481529060010190602001808311611c2657829003601f168201915b50509250505060405180910390fd5b5080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad60405160405180910390a250565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b600560149054906101000a900460ff16611dc257600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac33846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015611da557600080fd5b505af1158015611db9573d6000803e3d6000fd5b50505050611e12565b611e11333084600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166146e1909392919063ffffffff16565b5b60007f000000000000000000000000ca76543cf381ebbb277be79574059e32108e3e6573ffffffffffffffffffffffffffffffffffffffff1663554c85a3846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611e8557600080fd5b505afa158015611e99573d6000803e3d6000fd5b505050506040513d6020811015611eaf57600080fd5b8101908080519060200190929190505050905060006002811115611ecf57fe5b826002811115611edb57fe5b1415611f3157611f2c33827f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89973ffffffffffffffffffffffffffffffffffffffff16614b6f9092919063ffffffff16565b61200c565b60016002811115611f3e57fe5b826002811115611f4a57fe5b1415611fa057611f9b33827f00000000000000000000000004f2694c8fcee23e8fd0dfea1d4f5bb8c352111f73ffffffffffffffffffffffffffffffffffffffff16614b6f9092919063ffffffff16565b61200b565b600280811115611fac57fe5b826002811115611fb857fe5b141561200a5761200933847f000000000000000000000000ca76543cf381ebbb277be79574059e32108e3e6573ffffffffffffffffffffffffffffffffffffffff16614b6f9092919063ffffffff16565b5b5b5b505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561207957600080fd5b505afa15801561208d573d6000803e3d6000fd5b505050506040513d60208110156120a357600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146000906121a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252838181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156121985780601f1061216d57610100808354040283529160200191612198565b820191906000526020600020905b81548152906001019060200180831161217b57829003601f168201915b50509250505060405180910390fd5b50600060065414612220576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f54696d656c6f636b20736574000000000000000000000000000000000000000081525060200191505060405180910390fd5b6122537f0000000000000000000000000000000000000000000000000000000000001b5843614d7190919063ffffffff16565b6006819055507f1f1c77590fcb154ccfac3f34adef3adfd45fa19cd5bd058297a1d6137d0229c043600654604051808381526020018281526020019250505060405180910390a1565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561230457600080fd5b505afa158015612318573d6000803e3d6000fd5b505050506040513d602081101561232e57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614600090612432576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252838181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156124235780601f106123f857610100808354040283529160200191612423565b820191906000526020600020905b81548152906001019060200180831161240657829003601f168201915b50509250505060405180910390fd5b50600560149054906101000a900460ff16156124b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f416c7265616479206d696772617465640000000000000000000000000000000081525060200191505060405180910390fd5b6001600560146101000a81548160ff0219169083151502179055506000600560156101000a81548160ff021916908315150217905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561258f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f5a65726f20616464726573733a2054726561737572790000000000000000000081525060200191505060405180910390fd5b84600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612673576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f5a65726f20616464726573733a205374616b696e67000000000000000000000081525060200191505060405180910390fd5b83600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612757576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f5a65726f20616464726573733a204f484d00000000000000000000000000000081525060200191505060405180910390fd5b82600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89973ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156127fe57600080fd5b505afa158015612812573d6000803e3d6000fd5b505050506040513d602081101561282857600080fd5b8101908080519060200190929190505050600781905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631068361f85846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b1580156128e857600080fd5b505af11580156128fc573d6000803e3d6000fd5b5050505061290b816001614df9565b6129b47f00000000000000000000000004f2694c8fcee23e8fd0dfea1d4f5bb8c352111f73ffffffffffffffffffffffffffffffffffffffff16639358928b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561297457600080fd5b505afa158015612988573d6000803e3d6000fd5b505050506040513d602081101561299e57600080fd5b8101908080519060200190929190505050615274565b7f844985ce6880ca51e25a6d4ecc8af37a5de880279f2081af96d0e875c42b70828486604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a15050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e881565b7f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89981565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b158015612afc57600080fd5b505afa158015612b10573d6000803e3d6000fd5b505050506040513d6020811015612b2657600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614600090612c2a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015612c1b5780601f10612bf057610100808354040283529160200191612c1b565b820191906000526020600020905b815481529060010190602001808311612bfe57829003601f168201915b50509250505060405180910390fd5b50600560149054906101000a900460ff16612cad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4d6967726174696f6e20686173206e6f7420626567756e00000000000000000081525060200191505060405180910390fd5b43600654108015612cc15750600060065414155b612d33576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f54696d656c6f636b206e6f7420636f6d706c657465000000000000000000000081525060200191505060405180910390fd5b7f000000000000000000000000ca76543cf381ebbb277be79574059e32108e3e6573ffffffffffffffffffffffffffffffffffffffff1663de0e9a3e7f000000000000000000000000ca76543cf381ebbb277be79574059e32108e3e6573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612df657600080fd5b505afa158015612e0a573d6000803e3d6000fd5b505050506040513d6020811015612e2057600080fd5b81019080805190602001909291905050506040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015612e6757600080fd5b505af1158015612e7b573d6000803e3d6000fd5b505050506040513d6020811015612e9157600080fd5b81019080805190602001909291905050505060007f00000000000000000000000004f2694c8fcee23e8fd0dfea1d4f5bb8c352111f73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612f2c57600080fd5b505afa158015612f40573d6000803e3d6000fd5b505050506040513d6020811015612f5657600080fd5b810190808051906020019092919050505090507f00000000000000000000000004f2694c8fcee23e8fd0dfea1d4f5bb8c352111f73ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f000000000000000000000000fd31c7d00ca47653c6ce64af53c1571f9c36566a836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561301a57600080fd5b505af115801561302e573d6000803e3d6000fd5b505050506040513d602081101561304457600080fd5b8101908080519060200190929190505050507f000000000000000000000000fd31c7d00ca47653c6ce64af53c1571f9c36566a73ffffffffffffffffffffffffffffffffffffffff16639ebea88c8260006040518363ffffffff1660e01b815260040180838152602001821515815260200192505050600060405180830381600087803b1580156130d457600080fd5b505af11580156130e8573d6000803e3d6000fd5b5050505060007f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89973ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561317557600080fd5b505afa158015613189573d6000803e3d6000fd5b505050506040513d602081101561319f57600080fd5b810190808051906020019092919050505090506007548111156131c95760006007819055506131da565b806007600082825403925050819055505b60006131f3633b9aca008361552f90919063ffffffff16565b90507f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89973ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e8836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156132a657600080fd5b505af11580156132ba573d6000803e3d6000fd5b505050506040513d60208110156132d057600080fd5b8101908080519060200190929190505050507f00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e873ffffffffffffffffffffffffffffffffffffffff1662f714ce82866040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b15801561337257600080fd5b505af1158015613386573d6000803e3d6000fd5b50505050613478600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561341757600080fd5b505afa15801561342b573d6000803e3d6000fd5b505050506040513d602081101561344157600080fd5b81019080805190602001909291905050508673ffffffffffffffffffffffffffffffffffffffff16614b6f9092919063ffffffff16565b7faf5e14f4cc37b04db239269739bd935c4ed55328b691792af028e5570dfe61fa826040518082815260200191505060405180910390a150505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561351d57600080fd5b505afa158015613531573d6000803e3d6000fd5b505050506040513d602081101561354757600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161460009061364b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382528381815460018160011615610100020316600290048152602001915080546001816001161561010002031660029004801561363c5780601f106136115761010080835404028352916020019161363c565b820191906000526020600020905b81548152906001019060200180831161361f57829003601f168201915b50509250505060405180910390fd5b5060008573ffffffffffffffffffffffffffffffffffffffff166370a082317f00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e86040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156136d557600080fd5b505afa1580156136e9573d6000803e3d6000fd5b505050506040513d60208110156136ff57600080fd5b810190808051906020019092919050505090507f00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e873ffffffffffffffffffffffffffffffffffffffff16630b0eee3087836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156137a357600080fd5b505af11580156137b7573d6000803e3d6000fd5b5050505060007f000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f905085613809577f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d90505b8673ffffffffffffffffffffffffffffffffffffffff1663095ea7b382846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561387a57600080fd5b505af115801561388e573d6000803e3d6000fd5b505050506040513d60208110156138a457600080fd5b8101908080519060200190929190505050506000808273ffffffffffffffffffffffffffffffffffffffff1663baa2abde887f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a899878a8a30426040518863ffffffff1660e01b8152600401808873ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019750505050505050506040805180830381600087803b15801561399d57600080fd5b505af11580156139b1573d6000803e3d6000fd5b505050506040513d60408110156139c757600080fd5b81019080805190602001909291908051906020019092919050505091509150600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1930836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b158015613a7957600080fd5b505af1158015613a8d573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff1663095ea7b384846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613b0257600080fd5b505af1158015613b16573d6000803e3d6000fd5b505050506040513d6020811015613b2c57600080fd5b810190808051906020019092919050505050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b384836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613bd157600080fd5b505af1158015613be5573d6000803e3d6000fd5b505050506040513d6020811015613bfb57600080fd5b8101908080519060200190929190505050508273ffffffffffffffffffffffffffffffffffffffff1663e8e3370088600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685858787600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518963ffffffff1660e01b8152600401808973ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018781526020018681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200198505050505050505050606060405180830381600087803b158015613d1e57600080fd5b505af1158015613d32573d6000803e3d6000fd5b505050506040513d6060811015613d4857600080fd5b81019080805190602001909291908051906020019092919080519060200190929190505050505050505050505050505050565b600560149054906101000a900460ff1681565b600560159054906101000a900460ff1615613e11576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f5368757420646f776e000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000807f00000000000000000000000004f2694c8fcee23e8fd0dfea1d4f5bb8c352111f73ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015613e9b57600080fd5b505afa158015613eaf573d6000803e3d6000fd5b505050506040513d6020811015613ec557600080fd5b8101908080519060200190929190505050905060007f000000000000000000000000ca76543cf381ebbb277be79574059e32108e3e6573ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015613f6157600080fd5b505afa158015613f75573d6000803e3d6000fd5b505050506040513d6020811015613f8b57600080fd5b8101908080519060200190929190505050905060007f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89973ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561402757600080fd5b505afa15801561403b573d6000803e3d6000fd5b505050506040513d602081101561405157600080fd5b810190808051906020019092919050505011801561407b5750600560149054906101000a900460ff165b15614192577f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89973ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561410757600080fd5b505afa15801561411b573d6000803e3d6000fd5b505050506040513d602081101561413157600080fd5b810190808051906020019092919050505092506141913330857f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89973ffffffffffffffffffffffffffffffffffffffff166146e1909392919063ffffffff16565b5b60008211156141e9576141e83330847f00000000000000000000000004f2694c8fcee23e8fd0dfea1d4f5bb8c352111f73ffffffffffffffffffffffffffffffffffffffff166146e1909392919063ffffffff16565b5b60008111156142405761423f3330837f000000000000000000000000ca76543cf381ebbb277be79574059e32108e3e6573ffffffffffffffffffffffffffffffffffffffff166146e1909392919063ffffffff16565b5b60006143127f000000000000000000000000ca76543cf381ebbb277be79574059e32108e3e6573ffffffffffffffffffffffffffffffffffffffff166373f79c046142948688614d7190919063ffffffff16565b6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156142c857600080fd5b505afa1580156142dc573d6000803e3d6000fd5b505050506040513d60208110156142f257600080fd5b810190808051906020019092919050505083614d7190919063ffffffff16565b9050600560149054906101000a900460ff1615614450577f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89973ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561438f57600080fd5b505afa1580156143a3573d6000803e3d6000fd5b505050506040513d60208110156143b957600080fd5b81019080805190602001909291905050506007541015614441576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f4f484d7631206d696e746564000000000000000000000000000000000000000081525060200191505060405180910390fd5b61444b8186614902565b6144fc565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1933836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156144e357600080fd5b505af11580156144f7573d6000803e3d6000fd5b505050505b5050505050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b15801561459157600080fd5b505afa1580156145a5573d6000803e3d6000fd5b505050506040513d60208110156145bb57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146000906146bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252838181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156146b05780601f10614685576101008083540402835291602001916146b0565b820191906000526020600020905b81548152906001019060200180831161469357829003601f168201915b50509250505060405180910390fd5b506146cb816000614df9565b50565b600560159054906101000a900460ff1681565b600060608573ffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b868686604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b602083106147e157805182526020820191506020810190506020830392506147be565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614843576040519150601f19603f3d011682016040523d82523d6000602084013e614848565b606091505b50915091508180156148885750600081511480614887575080806020019051602081101561487557600080fd5b81019080805190602001909291905050505b5b6148fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5452414e534645525f46524f4d5f4641494c454400000000000000000000000081525060200191505060405180910390fd5b505050505050565b60028081111561490e57fe5b81600281111561491a57fe5b14156149725761496d3383600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16614b6f9092919063ffffffff16565b614b6b565b6001600281111561497f57fe5b81600281111561498b57fe5b1415614a6557600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166339f4769333846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015614a2457600080fd5b505af1158015614a38573d6000803e3d6000fd5b505050506040513d6020811015614a4e57600080fd5b810190808051906020019092919050505050614b6a565b60006002811115614a7257fe5b816002811115614a7e57fe5b1415614b6957600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663990966d533846000806040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183151581526020018215158152602001945050505050602060405180830381600087803b158015614b2c57600080fd5b505af1158015614b40573d6000803e3d6000fd5b505050506040513d6020811015614b5657600080fd5b8101908080519060200190929190505050505b5b5b5050565b600060608473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b8585604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b60208310614c515780518252602082019150602081019050602083039250614c2e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614cb3576040519150601f19603f3d011682016040523d82523d6000602084013e614cb8565b606091505b5091509150818015614cf85750600081511480614cf75750808060200190516020811015614ce557600080fd5b81019080805190602001909291905050505b5b614d6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f5452414e534645525f4641494c4544000000000000000000000000000000000081525060200191505060405180910390fd5b5050505050565b600080828401905083811015614def576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff166370a082317f00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e86040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015614e8257600080fd5b505afa158015614e96573d6000803e3d6000fd5b505050506040513d6020811015614eac57600080fd5b8101908080519060200190929190505050905060007f00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e873ffffffffffffffffffffffffffffffffffffffff16630c3513a86040518163ffffffff1660e01b815260040160206040518083038186803b158015614f2757600080fd5b505afa158015614f3b573d6000803e3d6000fd5b505050506040513d6020811015614f5157600080fd5b8101908080519060200190929190505050905060007f00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e873ffffffffffffffffffffffffffffffffffffffff16631eec5a9a86856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b158015614ff557600080fd5b505afa158015615009573d6000803e3d6000fd5b505050506040513d602081101561501f57600080fd5b810190808051906020019092919050505090508181111561504757819050633b9aca00820292505b7f00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e873ffffffffffffffffffffffffffffffffffffffff16630b0eee3086856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156150d857600080fd5b505af11580156150ec573d6000803e3d6000fd5b50505050831561521f57615143600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16848773ffffffffffffffffffffffffffffffffffffffff166155b59092919063ffffffff16565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bc157ac18487846040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156151de57600080fd5b505af11580156151f2573d6000803e3d6000fd5b505050506040513d602081101561520857600080fd5b81019080805190602001909291905050505061526d565b61526c600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16848773ffffffffffffffffffffffffffffffffffffffff16614b6f9092919063ffffffff16565b5b5050505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1930836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561530757600080fd5b505af115801561531b573d6000803e3d6000fd5b50505050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156153d457600080fd5b505af11580156153e8573d6000803e3d6000fd5b505050506040513d60208110156153fe57600080fd5b810190808051906020019092919050505050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d866c9d83083600060016040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183151581526020018215158152602001945050505050602060405180830381600087803b1580156154b957600080fd5b505af11580156154cd573d6000803e3d6000fd5b505050506040513d60208110156154e357600080fd5b8101908080519060200190929190505050507fc4c14883ae9fd8e26d5d59e3485ed29fd126d781d7e498a4ca5c54c8268e4936816040518082815260200191505060405180910390a150565b60008083141561554257600090506155af565b600082840290508284828161555357fe5b04146155aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806157b86021913960400191505060405180910390fd5b809150505b92915050565b600060608473ffffffffffffffffffffffffffffffffffffffff1663095ea7b360e01b8585604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b602083106156975780518252602082019150602081019050602083039250615674565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146156f9576040519150601f19603f3d011682016040523d82523d6000602084013e6156fe565b606091505b509150915081801561573e575060008151148061573d575080806020019051602081101561572b57600080fd5b81019080805190602001909291905050505b5b6157b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f415050524f56455f4641494c454400000000000000000000000000000000000081525060200191505060405180910390fd5b505050505056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7757697468647261772076616c7565206d7573742062652067726561746572207468616e2030a2646970667358221220b09b2af2a491d817278550a9f835a52946dfb113bad0ba1275e3732207f35e6d64736f6c63430007050033