Feature Tip: Add private address tag to any address under My Name Tag !
Latest 25 from a total of 7,372 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Exchange | 24507706 | 11 days ago | IN | 0 ETH | 0.00004263 | ||||
| Exchange | 24448867 | 19 days ago | IN | 0 ETH | 0.00030793 | ||||
| Remove_liquidity... | 24442400 | 20 days ago | IN | 0 ETH | 0.00004558 | ||||
| Remove_liquidity | 24442387 | 20 days ago | IN | 0 ETH | 0.00002307 | ||||
| Remove_liquidity | 24412394 | 24 days ago | IN | 0 ETH | 0.00002344 | ||||
| Exchange | 24357432 | 32 days ago | IN | 0 ETH | 0.00112486 | ||||
| Exchange | 24357369 | 32 days ago | IN | 0 ETH | 0.00136739 | ||||
| Exchange | 24357363 | 32 days ago | IN | 0 ETH | 0.00139873 | ||||
| Exchange | 24356102 | 32 days ago | IN | 0 ETH | 0.00094963 | ||||
| Remove_liquidity... | 24355150 | 32 days ago | IN | 0 ETH | 0.00005612 | ||||
| Remove_liquidity... | 24355038 | 32 days ago | IN | 0 ETH | 0.00007552 | ||||
| Exchange | 24311968 | 38 days ago | IN | 0 ETH | 0.00001613 | ||||
| Exchange | 24296541 | 40 days ago | IN | 0 ETH | 0.00002457 | ||||
| Exchange | 24293196 | 41 days ago | IN | 0 ETH | 0.00002183 | ||||
| Exchange | 24293192 | 41 days ago | IN | 0 ETH | 0.00002097 | ||||
| Exchange | 24293185 | 41 days ago | IN | 0 ETH | 0.00002067 | ||||
| Exchange | 24293016 | 41 days ago | IN | 0 ETH | 0.00003561 | ||||
| Exchange | 24292925 | 41 days ago | IN | 0 ETH | 0.00052743 | ||||
| Exchange | 24292923 | 41 days ago | IN | 0 ETH | 0.00036961 | ||||
| Exchange | 24292922 | 41 days ago | IN | 0 ETH | 0.00004087 | ||||
| Exchange | 24292921 | 41 days ago | IN | 0 ETH | 0.00037283 | ||||
| Exchange | 24292918 | 41 days ago | IN | 0 ETH | 0.00003113 | ||||
| Exchange | 24292918 | 41 days ago | IN | 0 ETH | 0.00003612 | ||||
| Exchange | 24292918 | 41 days ago | IN | 0 ETH | 0.00005278 | ||||
| Exchange | 24292916 | 41 days ago | IN | 0 ETH | 0.00005321 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Vyper_contract
Compiler Version
vyper:0.2.8
Contract Source Code (Vyper language format)
# @version 0.2.8
"""
@title Curve IronBank Pool
@author Curve.Fi
@license Copyright (c) Curve.Fi, 2021 - all rights reserved
@notice Pool for swapping between cyTokens (cyDAI, cyUSDC, cyUSDT)
"""
# External Contracts
interface cyToken:
def transfer(_to: address, _value: uint256) -> bool: nonpayable
def transferFrom(_from: address, _to: address, _value: uint256) -> bool: nonpayable
def mint(mintAmount: uint256) -> uint256: nonpayable
def redeem(redeemTokens: uint256) -> uint256: nonpayable
def exchangeRateStored() -> uint256: view
def exchangeRateCurrent() -> uint256: nonpayable
def supplyRatePerBlock() -> uint256: view
def accrualBlockNumber() -> uint256: view
interface CurveToken:
def mint(_to: address, _value: uint256) -> bool: nonpayable
def burnFrom(_to: address, _value: uint256) -> bool: nonpayable
interface ERC20:
def transfer(_to: address, _value: uint256): nonpayable
def transferFrom(_from: address, _to: address, _value: uint256): nonpayable
def totalSupply() -> uint256: view
def balanceOf(_addr: address) -> uint256: view
# Events
event TokenExchange:
buyer: indexed(address)
sold_id: int128
tokens_sold: uint256
bought_id: int128
tokens_bought: uint256
event TokenExchangeUnderlying:
buyer: indexed(address)
sold_id: int128
tokens_sold: uint256
bought_id: int128
tokens_bought: uint256
event AddLiquidity:
provider: indexed(address)
token_amounts: uint256[N_COINS]
fees: uint256[N_COINS]
invariant: uint256
token_supply: uint256
event RemoveLiquidity:
provider: indexed(address)
token_amounts: uint256[N_COINS]
fees: uint256[N_COINS]
token_supply: uint256
event RemoveLiquidityOne:
provider: indexed(address)
token_amount: uint256
coin_amount: uint256
event RemoveLiquidityImbalance:
provider: indexed(address)
token_amounts: uint256[N_COINS]
fees: uint256[N_COINS]
invariant: uint256
token_supply: uint256
event CommitNewAdmin:
deadline: indexed(uint256)
admin: indexed(address)
event NewAdmin:
admin: indexed(address)
event CommitNewFee:
deadline: indexed(uint256)
fee: uint256
admin_fee: uint256
event NewFee:
fee: uint256
admin_fee: uint256
event RampA:
old_A: uint256
new_A: uint256
initial_time: uint256
future_time: uint256
event StopRampA:
A: uint256
t: uint256
# These constants must be set prior to compiling
N_COINS: constant(int128) = 3
PRECISION_MUL: constant(uint256[N_COINS]) = [1, 1000000000000, 1000000000000]
# fixed constants
FEE_DENOMINATOR: constant(uint256) = 10 ** 10
PRECISION: constant(uint256) = 10 ** 18 # The precision to convert to
MAX_ADMIN_FEE: constant(uint256) = 10 * 10 ** 9
MAX_FEE: constant(uint256) = 5 * 10 ** 9
MAX_A: constant(uint256) = 10 ** 6
MAX_A_CHANGE: constant(uint256) = 10
ADMIN_ACTIONS_DELAY: constant(uint256) = 3 * 86400
MIN_RAMP_TIME: constant(uint256) = 86400
coins: public(address[N_COINS])
underlying_coins: public(address[N_COINS])
balances: public(uint256[N_COINS])
previous_balances: public(uint256[N_COINS])
block_timestamp_last: public(uint256)
fee: public(uint256) # fee * 1e10
admin_fee: public(uint256) # admin_fee * 1e10
owner: public(address)
lp_token: public(address)
A_PRECISION: constant(uint256) = 100
initial_A: public(uint256)
future_A: public(uint256)
initial_A_time: public(uint256)
future_A_time: public(uint256)
admin_actions_deadline: public(uint256)
transfer_ownership_deadline: public(uint256)
future_fee: public(uint256)
future_admin_fee: public(uint256)
future_owner: public(address)
is_killed: bool
kill_deadline: uint256
KILL_DEADLINE_DT: constant(uint256) = 2 * 30 * 86400
@external
def __init__(
_owner: address,
_coins: address[N_COINS],
_underlying_coins: address[N_COINS],
_pool_token: address,
_A: uint256,
_fee: uint256,
_admin_fee: uint256,
):
"""
@notice Contract constructor
@param _owner Contract owner address
@param _coins Addresses of ERC20 contracts of wrapped coins
@param _underlying_coins Addresses of ERC20 contracts of underlying coins
@param _pool_token Address of the token representing LP share
@param _A Amplification coefficient multiplied by n * (n - 1)
@param _fee Fee to charge for exchanges
@param _admin_fee Admin fee
"""
for i in range(N_COINS):
assert _coins[i] != ZERO_ADDRESS
assert _underlying_coins[i] != ZERO_ADDRESS
# approve underlying coins for infinite transfers
_response: Bytes[32] = raw_call(
_underlying_coins[i],
concat(
method_id("approve(address,uint256)"),
convert(_coins[i], bytes32),
convert(MAX_UINT256, bytes32),
),
max_outsize=32,
)
if len(_response) > 0:
assert convert(_response, bool)
self.coins = _coins
self.underlying_coins = _underlying_coins
self.initial_A = _A * A_PRECISION
self.future_A = _A * A_PRECISION
self.fee = _fee
self.admin_fee = _admin_fee
self.owner = _owner
self.kill_deadline = block.timestamp + KILL_DEADLINE_DT
self.lp_token = _pool_token
@view
@internal
def _A() -> uint256:
"""
Handle ramping A up or down
"""
t1: uint256 = self.future_A_time
A1: uint256 = self.future_A
if block.timestamp < t1:
A0: uint256 = self.initial_A
t0: uint256 = self.initial_A_time
# Expressions in uint256 cannot have negative numbers, thus "if"
if A1 > A0:
return A0 + (A1 - A0) * (block.timestamp - t0) / (t1 - t0)
else:
return A0 - (A0 - A1) * (block.timestamp - t0) / (t1 - t0)
else: # when t1 == 0 or block.timestamp >= t1
return A1
@view
@external
def A() -> uint256:
return self._A() / A_PRECISION
@view
@external
def A_precise() -> uint256:
return self._A()
@view
@internal
def _stored_rates() -> uint256[N_COINS]:
# exchangeRateStored * (1 + supplyRatePerBlock * (getBlockNumber - accrualBlockNumber) / 1e18)
result: uint256[N_COINS] = PRECISION_MUL
for i in range(N_COINS):
coin: address = self.coins[i]
rate: uint256 = cyToken(coin).exchangeRateStored()
rate += rate * cyToken(coin).supplyRatePerBlock() * (block.number - cyToken(coin).accrualBlockNumber()) / PRECISION
result[i] *= rate
return result
@internal
def _update():
"""
Commits pre-change balances for the previous block
Can be used to compare against current values for flash loan checks
"""
if block.timestamp > self.block_timestamp_last:
self.previous_balances = self.balances
self.block_timestamp_last = block.timestamp
@internal
def _current_rates() -> uint256[N_COINS]:
self._update()
result: uint256[N_COINS] = PRECISION_MUL
for i in range(N_COINS):
result[i] *= cyToken(self.coins[i]).exchangeRateCurrent()
return result
@view
@internal
def _xp(rates: uint256[N_COINS]) -> uint256[N_COINS]:
result: uint256[N_COINS] = empty(uint256[N_COINS])
for i in range(N_COINS):
result[i] = rates[i] * self.balances[i] / PRECISION
return result
@pure
@internal
def get_D(xp: uint256[N_COINS], amp: uint256) -> uint256:
S: uint256 = 0
Dprev: uint256 = 0
for _x in xp:
S += _x
if S == 0:
return 0
D: uint256 = S
Ann: uint256 = amp * N_COINS
for _i in range(255):
D_P: uint256 = D
for _x in xp:
D_P = D_P * D / (_x * N_COINS) # If division by 0, this will be borked: only withdrawal will work. And that is good
Dprev = D
D = (Ann * S / A_PRECISION + D_P * N_COINS) * D / ((Ann - A_PRECISION) * D / A_PRECISION + (N_COINS + 1) * D_P)
# Equality with the precision of 1
if D > Dprev:
if D - Dprev <= 1:
return D
else:
if Dprev - D <= 1:
return D
# convergence typically occurs in 4 rounds or less, this should be unreachable!
# if it does happen the pool is borked and LPs can withdraw via `remove_liquidity`
raise
@view
@internal
def get_D_mem(rates: uint256[N_COINS], _balances: uint256[N_COINS], _amp: uint256) -> uint256:
xp: uint256[N_COINS] = empty(uint256[N_COINS])
for i in range(N_COINS):
xp[i] = rates[i] * _balances[i] / PRECISION
return self.get_D(xp, _amp)
@view
@external
def get_virtual_price() -> uint256:
"""
@notice The current virtual price of the pool LP token
@dev Useful for calculating profits
@return LP token virtual price normalized to 1e18
"""
D: uint256 = self.get_D(self._xp(self._stored_rates()), self._A())
# D is in the units similar to DAI (e.g. converted to precision 1e18)
# When balanced, D = n * x_u - total virtual value of the portfolio
return D * PRECISION / ERC20(self.lp_token).totalSupply()
@view
@external
def calc_token_amount(amounts: uint256[N_COINS], is_deposit: bool) -> uint256:
"""
@notice Calculate addition or reduction in token supply from a deposit or withdrawal
@dev This calculation accounts for slippage, but not fees.
Needed to prevent front-running, not for precise calculations!
@param amounts Amount of each coin being deposited
@param is_deposit set True for deposits, False for withdrawals
@return Expected amount of LP tokens received
"""
amp: uint256 = self._A()
rates: uint256[N_COINS] = self._stored_rates()
_balances: uint256[N_COINS] = self.balances
D0: uint256 = self.get_D_mem(rates, _balances, amp)
for i in range(N_COINS):
_amount: uint256 = amounts[i]
if is_deposit:
_balances[i] += _amount
else:
_balances[i] -= _amount
D1: uint256 = self.get_D_mem(rates, _balances, amp)
token_amount: uint256 = ERC20(self.lp_token).totalSupply()
diff: uint256 = 0
if is_deposit:
diff = D1 - D0
else:
diff = D0 - D1
return diff * token_amount / D0
@external
@nonreentrant('lock')
def add_liquidity(
_amounts: uint256[N_COINS],
_min_mint_amount: uint256,
_use_underlying: bool = False
) -> uint256:
"""
@notice Deposit coins into the pool
@param _amounts List of amounts of coins to deposit
@param _min_mint_amount Minimum amount of LP tokens to mint from the deposit
@param _use_underlying If True, deposit underlying assets instead of cyTokens
@return Amount of LP tokens received by depositing
"""
assert not self.is_killed
amp: uint256 = self._A()
rates: uint256[N_COINS] = self._current_rates()
_lp_token: address = self.lp_token
token_supply: uint256 = ERC20(_lp_token).totalSupply()
# Initial invariant
old_balances: uint256[N_COINS] = self.balances
D0: uint256 = self.get_D_mem(rates, old_balances, amp)
# Take coins from the sender
new_balances: uint256[N_COINS] = old_balances
amounts: uint256[N_COINS] = empty(uint256[N_COINS])
for i in range(N_COINS):
amount: uint256 = _amounts[i]
if amount == 0:
assert token_supply > 0
else:
coin: address = self.coins[i]
if _use_underlying:
ERC20(self.underlying_coins[i]).transferFrom(msg.sender, self, amount)
before: uint256 = ERC20(coin).balanceOf(self)
assert cyToken(coin).mint(amount) == 0
amount = ERC20(coin).balanceOf(self) - before
else:
assert cyToken(coin).transferFrom(msg.sender, self, amount)
amounts[i] = amount
new_balances[i] += amount
# Invariant after change
D1: uint256 = self.get_D_mem(rates, new_balances, amp)
assert D1 > D0
# We need to recalculate the invariant accounting for fees
# to calculate fair user's share
fees: uint256[N_COINS] = empty(uint256[N_COINS])
mint_amount: uint256 = 0
if token_supply != 0:
# Only account for fees if we are not the first to deposit
_fee: uint256 = self.fee * N_COINS / (4 * (N_COINS - 1))
_admin_fee: uint256 = self.admin_fee
difference: uint256 = 0
for i in range(N_COINS):
new_balance: uint256 = new_balances[i]
ideal_balance: uint256 = D1 * old_balances[i] / D0
if ideal_balance > new_balance:
difference = ideal_balance - new_balance
else:
difference = new_balance - ideal_balance
fees[i] = _fee * difference / FEE_DENOMINATOR
self.balances[i] = new_balance - (fees[i] * _admin_fee / FEE_DENOMINATOR)
new_balances[i] -= fees[i]
D2: uint256 = self.get_D_mem(rates, new_balances, amp)
mint_amount = token_supply * (D2 - D0) / D0
else:
self.balances = new_balances
mint_amount = D1 # Take the dust if there was any
assert mint_amount >= _min_mint_amount, "Slippage screwed you"
# Mint pool tokens
CurveToken(_lp_token).mint(msg.sender, mint_amount)
log AddLiquidity(msg.sender, amounts, fees, D1, token_supply + mint_amount)
return mint_amount
@view
@internal
def get_y(i: int128, j: int128, x: uint256, xp_: uint256[N_COINS]) -> uint256:
# x in the input is converted to the same price/precision
assert i != j # dev: same coin
assert j >= 0 # dev: j below zero
assert j < N_COINS # dev: j above N_COINS
# should be unreachable, but good for safety
assert i >= 0
assert i < N_COINS
A_: uint256 = self._A()
D: uint256 = self.get_D(xp_, A_)
Ann: uint256 = A_ * N_COINS
c: uint256 = D
S_: uint256 = 0
_x: uint256 = 0
y_prev: uint256 = 0
for _i in range(N_COINS):
if _i == i:
_x = x
elif _i != j:
_x = xp_[_i]
else:
continue
S_ += _x
c = c * D / (_x * N_COINS)
c = c * D * A_PRECISION / (Ann * N_COINS)
b: uint256 = S_ + D * A_PRECISION / Ann # - D
y: uint256 = D
for _i in range(255):
y_prev = y
y = (y*y + c) / (2 * y + b - D)
# Equality with the precision of 1
if y > y_prev:
if y - y_prev <= 1:
return y
else:
if y_prev - y <= 1:
return y
raise
@view
@external
def get_dy(i: int128, j: int128, dx: uint256) -> uint256:
# dx and dy in c-units
rates: uint256[N_COINS] = self._stored_rates()
xp: uint256[N_COINS] = self._xp(rates)
x: uint256 = xp[i] + dx * rates[i] / PRECISION
y: uint256 = self.get_y(i, j, x, xp)
dy: uint256 = xp[j] - y - 1
return (dy - (self.fee * dy / FEE_DENOMINATOR)) * PRECISION / rates[j]
@view
@external
def get_dx(i: int128, j: int128, dy: uint256) -> uint256:
# dx and dy in c-units
rates: uint256[N_COINS] = self._stored_rates()
xp: uint256[N_COINS] = self._xp(rates)
y: uint256 = xp[j] - (dy * FEE_DENOMINATOR / (FEE_DENOMINATOR - self.fee)) * rates[j] / PRECISION
x: uint256 = self.get_y(j, i, y, xp)
return (x - xp[i]) * PRECISION / rates[i]
@view
@external
def get_dy_underlying(i: int128, j: int128, dx: uint256) -> uint256:
# dx and dy in underlying units
rates: uint256[N_COINS] = self._stored_rates()
xp: uint256[N_COINS] = self._xp(rates)
precisions: uint256[N_COINS] = PRECISION_MUL
x: uint256 = xp[i] + dx * precisions[i]
dy: uint256 = xp[j] - self.get_y(i, j, x, xp) - 1
_fee: uint256 = self.fee * dy / FEE_DENOMINATOR
return (dy - _fee) / precisions[j]
@external
@view
def get_dx_underlying(i: int128, j: int128, dy: uint256) -> uint256:
# dx and dy in underlying units
rates: uint256[N_COINS] = self._stored_rates()
xp: uint256[N_COINS] = self._xp(rates)
precisions: uint256[N_COINS] = PRECISION_MUL
y: uint256 = xp[j] - (dy * FEE_DENOMINATOR / (FEE_DENOMINATOR - self.fee)) * precisions[j]
return (self.get_y(j, i, y, xp) - xp[i]) / precisions[i]
@internal
def _exchange(i: int128, j: int128, dx: uint256) -> uint256:
assert not self.is_killed
# dx and dy are in cy tokens
rates: uint256[N_COINS] = self._current_rates()
old_balances: uint256[N_COINS] = self.balances
xp: uint256[N_COINS] = empty(uint256[N_COINS])
for k in range(N_COINS):
xp[k] = rates[k] * old_balances[k] / PRECISION
x: uint256 = xp[i] + dx * rates[i] / PRECISION
dy: uint256 = xp[j] - self.get_y(i, j, x, xp) - 1 # -1 just in case there were some rounding errors
dy_fee: uint256 = dy * self.fee / FEE_DENOMINATOR
dy = (dy - dy_fee) * PRECISION / rates[j]
dy_admin_fee: uint256 = dy_fee * self.admin_fee / FEE_DENOMINATOR
dy_admin_fee = dy_admin_fee * PRECISION / rates[j]
self.balances[i] = old_balances[i] + dx
self.balances[j] = old_balances[j] - dy - dy_admin_fee
return dy
@external
@nonreentrant('lock')
def exchange(i: int128, j: int128, dx: uint256, min_dy: uint256) -> uint256:
"""
@notice Perform an exchange between two coins
@dev Index values can be found via the `coins` public getter method
@param i Index value for the coin to send
@param j Index valie of the coin to recieve
@param dx Amount of `i` being exchanged
@param min_dy Minimum amount of `j` to receive
@return Actual amount of `j` received
"""
dy: uint256 = self._exchange(i, j, dx)
assert dy >= min_dy, "Too few coins in result"
assert cyToken(self.coins[i]).transferFrom(msg.sender, self, dx)
assert cyToken(self.coins[j]).transfer(msg.sender, dy)
log TokenExchange(msg.sender, i, dx, j, dy)
return dy
@external
@nonreentrant('lock')
def exchange_underlying(i: int128, j: int128, dx: uint256, min_dy: uint256) -> uint256:
"""
@notice Perform an exchange between two underlying coins
@dev Index values can be found via the `underlying_coins` public getter method
@param i Index value for the underlying coin to send
@param j Index valie of the underlying coin to recieve
@param dx Amount of `i` being exchanged
@param min_dy Minimum amount of `j` to receive
@return Actual amount of `j` received
"""
ERC20(self.underlying_coins[i]).transferFrom(msg.sender, self, dx)
coin: address = self.coins[i]
dx_: uint256 = ERC20(coin).balanceOf(self)
assert cyToken(coin).mint(dx) == 0
dx_ = ERC20(coin).balanceOf(self) - dx_
dy_: uint256 = self._exchange(i, j, dx_)
assert cyToken(self.coins[j]).redeem(dy_) == 0
underlying: address = self.underlying_coins[j]
dy: uint256 = ERC20(underlying).balanceOf(self)
assert dy >= min_dy, "Too few coins in result"
ERC20(underlying).transfer(msg.sender, dy)
log TokenExchangeUnderlying(msg.sender, i, dx, j, dy)
return dy
@external
@nonreentrant('lock')
def remove_liquidity(
_amount: uint256,
_min_amounts: uint256[N_COINS],
_use_underlying: bool = False
) -> uint256[N_COINS]:
"""
@notice Withdraw coins from the pool
@dev Withdrawal amounts are based on current deposit ratios
@param _amount Quantity of LP tokens to burn in the withdrawal
@param _min_amounts Minimum amounts of underlying coins to receive
@param _use_underlying If True, withdraw underlying assets instead of cyTokens
@return List of amounts of coins that were withdrawn
"""
self._update()
_lp_token: address = self.lp_token
total_supply: uint256 = ERC20(_lp_token).totalSupply()
amounts: uint256[N_COINS] = empty(uint256[N_COINS])
for i in range(N_COINS):
_balance: uint256 = self.balances[i]
value: uint256 = _balance * _amount / total_supply
self.balances[i] = _balance - value
amounts[i] = value
coin: address = self.coins[i]
if _use_underlying:
assert cyToken(coin).redeem(value) == 0
underlying: address = self.underlying_coins[i]
value = ERC20(underlying).balanceOf(self)
ERC20(underlying).transfer(msg.sender, value)
else:
assert cyToken(coin).transfer(msg.sender, value)
assert value >= _min_amounts[i]
CurveToken(_lp_token).burnFrom(msg.sender, _amount) # Will raise if not enough
log RemoveLiquidity(msg.sender, amounts, empty(uint256[N_COINS]), total_supply - _amount)
return amounts
@external
@nonreentrant('lock')
def remove_liquidity_imbalance(
_amounts: uint256[N_COINS],
_max_burn_amount: uint256,
_use_underlying: bool = False
) -> uint256:
"""
@notice Withdraw coins from the pool in an imbalanced amount
@param _amounts List of amounts of underlying coins to withdraw
@param _max_burn_amount Maximum amount of LP token to burn in the withdrawal
@param _use_underlying If True, withdraw underlying assets instead of cyTokens
@return Actual amount of the LP token burned in the withdrawal
"""
assert not self.is_killed
amp: uint256 = self._A()
rates: uint256[N_COINS] = self._current_rates()
old_balances: uint256[N_COINS] = self.balances
D0: uint256 = self.get_D_mem(rates, old_balances, amp)
new_balances: uint256[N_COINS] = old_balances
amounts: uint256[N_COINS] = _amounts
precisions: uint256[N_COINS] = PRECISION_MUL
for i in range(N_COINS):
amount: uint256 = amounts[i]
if amount > 0:
if _use_underlying:
amount = amount * precisions[i] * PRECISION / rates[i]
amounts[i] = amount
new_balances[i] -= amount
D1: uint256 = self.get_D_mem(rates, new_balances, amp)
fees: uint256[N_COINS] = empty(uint256[N_COINS])
_fee: uint256 = self.fee * N_COINS / (4 * (N_COINS - 1))
_admin_fee: uint256 = self.admin_fee
for i in range(N_COINS):
ideal_balance: uint256 = D1 * old_balances[i] / D0
new_balance: uint256 = new_balances[i]
difference: uint256 = 0
if ideal_balance > new_balance:
difference = ideal_balance - new_balance
else:
difference = new_balance - ideal_balance
coin_fee: uint256 = _fee * difference / FEE_DENOMINATOR
self.balances[i] = new_balance - (coin_fee * _admin_fee / FEE_DENOMINATOR)
new_balances[i] -= coin_fee
fees[i] = coin_fee
D2: uint256 = self.get_D_mem(rates, new_balances, amp)
lp_token: address = self.lp_token
token_supply: uint256 = ERC20(lp_token).totalSupply()
token_amount: uint256 = (D0 - D2) * token_supply / D0
assert token_amount != 0
assert token_amount <= _max_burn_amount, "Slippage screwed you"
CurveToken(lp_token).burnFrom(msg.sender, token_amount) # dev: insufficient funds
for i in range(N_COINS):
amount: uint256 = amounts[i]
if amount != 0:
coin: address = self.coins[i]
if _use_underlying:
assert cyToken(coin).redeem(amount) == 0
underlying: address = self.underlying_coins[i]
ERC20(underlying).transfer(msg.sender, ERC20(underlying).balanceOf(self))
else:
assert cyToken(coin).transfer(msg.sender, amount)
log RemoveLiquidityImbalance(msg.sender, amounts, fees, D1, token_supply - token_amount)
return token_amount
@pure
@internal
def get_y_D(A_: uint256, i: int128, xp: uint256[N_COINS], D: uint256) -> uint256:
"""
Calculate x[i] if one reduces D from being calculated for xp to D
Done by solving quadratic equation iteratively.
x_1**2 + x1 * (sum' - (A*n**n - 1) * D / (A * n**n)) = D ** (n + 1) / (n ** (2 * n) * prod' * A)
x_1**2 + b*x_1 = c
x_1 = (x_1**2 + c) / (2*x_1 + b)
"""
# x in the input is converted to the same price/precision
assert i >= 0 # dev: i below zero
assert i < N_COINS # dev: i above N_COINS
Ann: uint256 = A_ * N_COINS
c: uint256 = D
S_: uint256 = 0
_x: uint256 = 0
y_prev: uint256 = 0
for _i in range(N_COINS):
if _i != i:
_x = xp[_i]
else:
continue
S_ += _x
c = c * D / (_x * N_COINS)
c = c * D * A_PRECISION / (Ann * N_COINS)
b: uint256 = S_ + D * A_PRECISION / Ann
y: uint256 = D
for _i in range(255):
y_prev = y
y = (y*y + c) / (2 * y + b - D)
# Equality with the precision of 1
if y > y_prev:
if y - y_prev <= 1:
return y
else:
if y_prev - y <= 1:
return y
raise
@view
@internal
def _calc_withdraw_one_coin(_token_amount: uint256, i: int128, _use_underlying: bool, _rates: uint256[N_COINS]) -> uint256[2]:
# First, need to calculate
# * Get current D
# * Solve Eqn against y_i for D - _token_amount
amp: uint256 = self._A()
xp: uint256[N_COINS] = self._xp(_rates)
D0: uint256 = self.get_D(xp, amp)
total_supply: uint256 = ERC20(self.lp_token).totalSupply()
D1: uint256 = D0 - _token_amount * D0 / total_supply
new_y: uint256 = self.get_y_D(amp, i, xp, D1)
xp_reduced: uint256[N_COINS] = xp
_fee: uint256 = self.fee * N_COINS / (4 * (N_COINS - 1))
rate: uint256 = _rates[i]
for j in range(N_COINS):
dx_expected: uint256 = 0
xp_j: uint256 = xp[j]
if j == i:
dx_expected = xp_j * D1 / D0 - new_y
else:
dx_expected = xp_j - xp_j * D1 / D0
xp_reduced[j] -= _fee * dx_expected / FEE_DENOMINATOR
dy: uint256 = xp_reduced[i] - self.get_y_D(amp, i, xp_reduced, D1)
dy = (dy - 1) * PRECISION / rate # Withdraw less to account for rounding errors
dy_fee: uint256 = ((xp[i] - new_y) * PRECISION / rate) - dy
if _use_underlying:
# this branch is only reachable when called via `calc_withdraw_one_coin`, which
# only needs `dy` - so we don't bother converting `dy_fee` to the underlying
precisions: uint256[N_COINS] = PRECISION_MUL
dy = dy * rate / precisions[i] / PRECISION
return [dy, dy_fee]
@view
@external
def calc_withdraw_one_coin(_token_amount: uint256, i: int128, _use_underlying: bool = False) -> uint256:
"""
@notice Calculate the amount received when withdrawing a single coin
@param _token_amount Amount of LP tokens to burn in the withdrawal
@param i Index value of the coin to withdraw
@return Amount of coin received
"""
return self._calc_withdraw_one_coin(_token_amount, i, _use_underlying, self._stored_rates())[0]
@external
@nonreentrant('lock')
def remove_liquidity_one_coin(
_token_amount: uint256,
i: int128,
_min_amount: uint256,
_use_underlying: bool = False
) -> uint256:
"""
@notice Withdraw a single coin from the pool
@param _token_amount Amount of LP tokens to burn in the withdrawal
@param i Index value of the coin to withdraw
@param _min_amount Minimum amount of coin to receive
@param _use_underlying If True, withdraw underlying assets instead of cyTokens
@return Amount of coin received
"""
assert not self.is_killed # dev: is killed
dy: uint256[2] = self._calc_withdraw_one_coin(_token_amount, i, False, self._current_rates())
amount: uint256 = dy[0]
self.balances[i] -= (dy[0] + dy[1] * self.admin_fee / FEE_DENOMINATOR)
CurveToken(self.lp_token).burnFrom(msg.sender, _token_amount) # dev: insufficient funds
coin: address = self.coins[i]
if _use_underlying:
assert cyToken(coin).redeem(dy[0]) == 0
underlying: address = self.underlying_coins[i]
amount = ERC20(underlying).balanceOf(self)
ERC20(underlying).transfer(msg.sender, amount)
else:
assert cyToken(coin).transfer(msg.sender, amount)
assert amount >= _min_amount, "Not enough coins removed"
log RemoveLiquidityOne(msg.sender, _token_amount, dy[0])
return dy[0]
### Admin functions ###
@external
def ramp_A(_future_A: uint256, _future_time: uint256):
assert msg.sender == self.owner # dev: only owner
assert block.timestamp >= self.initial_A_time + MIN_RAMP_TIME
assert _future_time >= block.timestamp + MIN_RAMP_TIME # dev: insufficient time
_initial_A: uint256 = self._A()
_future_A_p: uint256 = _future_A * A_PRECISION
assert _future_A > 0 and _future_A < MAX_A
if _future_A_p < _initial_A:
assert _future_A_p * MAX_A_CHANGE >= _initial_A
else:
assert _future_A_p <= _initial_A * MAX_A_CHANGE
self.initial_A = _initial_A
self.future_A = _future_A_p
self.initial_A_time = block.timestamp
self.future_A_time = _future_time
log RampA(_initial_A, _future_A_p, block.timestamp, _future_time)
@external
def stop_ramp_A():
assert msg.sender == self.owner # dev: only owner
current_A: uint256 = self._A()
self.initial_A = current_A
self.future_A = current_A
self.initial_A_time = block.timestamp
self.future_A_time = block.timestamp
# now (block.timestamp < t1) is always False, so we return saved A
log StopRampA(current_A, block.timestamp)
@external
def commit_new_fee(new_fee: uint256, new_admin_fee: uint256):
assert msg.sender == self.owner # dev: only owner
assert self.admin_actions_deadline == 0 # dev: active action
assert new_fee <= MAX_FEE # dev: fee exceeds maximum
assert new_admin_fee <= MAX_ADMIN_FEE # dev: admin fee exceeds maximum
_deadline: uint256 = block.timestamp + ADMIN_ACTIONS_DELAY
self.admin_actions_deadline = _deadline
self.future_fee = new_fee
self.future_admin_fee = new_admin_fee
log CommitNewFee(_deadline, new_fee, new_admin_fee)
@external
def apply_new_fee():
assert msg.sender == self.owner # dev: only owner
assert block.timestamp >= self.admin_actions_deadline # dev: insufficient time
assert self.admin_actions_deadline != 0 # dev: no active action
self.admin_actions_deadline = 0
_fee: uint256 = self.future_fee
_admin_fee: uint256 = self.future_admin_fee
self.fee = _fee
self.admin_fee = _admin_fee
log NewFee(_fee, _admin_fee)
@external
def revert_new_parameters():
assert msg.sender == self.owner # dev: only owner
self.admin_actions_deadline = 0
@external
def commit_transfer_ownership(_owner: address):
assert msg.sender == self.owner # dev: only owner
assert self.transfer_ownership_deadline == 0 # dev: active transfer
_deadline: uint256 = block.timestamp + ADMIN_ACTIONS_DELAY
self.transfer_ownership_deadline = _deadline
self.future_owner = _owner
log CommitNewAdmin(_deadline, _owner)
@external
def apply_transfer_ownership():
assert msg.sender == self.owner # dev: only owner
assert block.timestamp >= self.transfer_ownership_deadline # dev: insufficient time
assert self.transfer_ownership_deadline != 0 # dev: no active transfer
self.transfer_ownership_deadline = 0
_owner: address = self.future_owner
self.owner = _owner
log NewAdmin(_owner)
@external
def revert_transfer_ownership():
assert msg.sender == self.owner # dev: only owner
self.transfer_ownership_deadline = 0
@view
@external
def admin_balances(i: uint256) -> uint256:
return ERC20(self.coins[i]).balanceOf(self) - self.balances[i]
@external
def withdraw_admin_fees():
assert msg.sender == self.owner # dev: only owner
for i in range(N_COINS):
coin: address = self.coins[i]
value: uint256 = ERC20(coin).balanceOf(self) - self.balances[i]
if value > 0:
assert cyToken(coin).transfer(msg.sender, value)
@external
def kill_me():
assert msg.sender == self.owner # dev: only owner
assert self.kill_deadline > block.timestamp # dev: deadline has passed
self.is_killed = True
@external
def unkill_me():
assert msg.sender == self.owner # dev: only owner
self.is_killed = FalseContract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"name":"TokenExchange","inputs":[{"type":"address","name":"buyer","indexed":true},{"type":"int128","name":"sold_id","indexed":false},{"type":"uint256","name":"tokens_sold","indexed":false},{"type":"int128","name":"bought_id","indexed":false},{"type":"uint256","name":"tokens_bought","indexed":false}],"anonymous":false,"type":"event"},{"name":"TokenExchangeUnderlying","inputs":[{"type":"address","name":"buyer","indexed":true},{"type":"int128","name":"sold_id","indexed":false},{"type":"uint256","name":"tokens_sold","indexed":false},{"type":"int128","name":"bought_id","indexed":false},{"type":"uint256","name":"tokens_bought","indexed":false}],"anonymous":false,"type":"event"},{"name":"AddLiquidity","inputs":[{"type":"address","name":"provider","indexed":true},{"type":"uint256[3]","name":"token_amounts","indexed":false},{"type":"uint256[3]","name":"fees","indexed":false},{"type":"uint256","name":"invariant","indexed":false},{"type":"uint256","name":"token_supply","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidity","inputs":[{"type":"address","name":"provider","indexed":true},{"type":"uint256[3]","name":"token_amounts","indexed":false},{"type":"uint256[3]","name":"fees","indexed":false},{"type":"uint256","name":"token_supply","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidityOne","inputs":[{"type":"address","name":"provider","indexed":true},{"type":"uint256","name":"token_amount","indexed":false},{"type":"uint256","name":"coin_amount","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidityImbalance","inputs":[{"type":"address","name":"provider","indexed":true},{"type":"uint256[3]","name":"token_amounts","indexed":false},{"type":"uint256[3]","name":"fees","indexed":false},{"type":"uint256","name":"invariant","indexed":false},{"type":"uint256","name":"token_supply","indexed":false}],"anonymous":false,"type":"event"},{"name":"CommitNewAdmin","inputs":[{"type":"uint256","name":"deadline","indexed":true},{"type":"address","name":"admin","indexed":true}],"anonymous":false,"type":"event"},{"name":"NewAdmin","inputs":[{"type":"address","name":"admin","indexed":true}],"anonymous":false,"type":"event"},{"name":"CommitNewFee","inputs":[{"type":"uint256","name":"deadline","indexed":true},{"type":"uint256","name":"fee","indexed":false},{"type":"uint256","name":"admin_fee","indexed":false}],"anonymous":false,"type":"event"},{"name":"NewFee","inputs":[{"type":"uint256","name":"fee","indexed":false},{"type":"uint256","name":"admin_fee","indexed":false}],"anonymous":false,"type":"event"},{"name":"RampA","inputs":[{"type":"uint256","name":"old_A","indexed":false},{"type":"uint256","name":"new_A","indexed":false},{"type":"uint256","name":"initial_time","indexed":false},{"type":"uint256","name":"future_time","indexed":false}],"anonymous":false,"type":"event"},{"name":"StopRampA","inputs":[{"type":"uint256","name":"A","indexed":false},{"type":"uint256","name":"t","indexed":false}],"anonymous":false,"type":"event"},{"outputs":[],"inputs":[{"type":"address","name":"_owner"},{"type":"address[3]","name":"_coins"},{"type":"address[3]","name":"_underlying_coins"},{"type":"address","name":"_pool_token"},{"type":"uint256","name":"_A"},{"type":"uint256","name":"_fee"},{"type":"uint256","name":"_admin_fee"}],"stateMutability":"nonpayable","type":"constructor"},{"name":"A","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":5199},{"name":"A_precise","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":5161},{"name":"get_virtual_price","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":1198966},{"name":"calc_token_amount","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256[3]","name":"amounts"},{"type":"bool","name":"is_deposit"}],"stateMutability":"view","type":"function","gas":4731095},{"name":"add_liquidity","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256[3]","name":"_amounts"},{"type":"uint256","name":"_min_mint_amount"}],"stateMutability":"nonpayable","type":"function"},{"name":"add_liquidity","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256[3]","name":"_amounts"},{"type":"uint256","name":"_min_mint_amount"},{"type":"bool","name":"_use_underlying"}],"stateMutability":"nonpayable","type":"function"},{"name":"get_dy","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dx"}],"stateMutability":"view","type":"function","gas":2814151},{"name":"get_dx","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dy"}],"stateMutability":"view","type":"function","gas":2814012},{"name":"get_dy_underlying","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dx"}],"stateMutability":"view","type":"function","gas":2813991},{"name":"get_dx_underlying","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dy"}],"stateMutability":"view","type":"function","gas":2813825},{"name":"exchange","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dx"},{"type":"uint256","name":"min_dy"}],"stateMutability":"nonpayable","type":"function","gas":6347170},{"name":"exchange_underlying","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"int128","name":"i"},{"type":"int128","name":"j"},{"type":"uint256","name":"dx"},{"type":"uint256","name":"min_dy"}],"stateMutability":"nonpayable","type":"function","gas":6354444},{"name":"remove_liquidity","outputs":[{"type":"uint256[3]","name":""}],"inputs":[{"type":"uint256","name":"_amount"},{"type":"uint256[3]","name":"_min_amounts"}],"stateMutability":"nonpayable","type":"function"},{"name":"remove_liquidity","outputs":[{"type":"uint256[3]","name":""}],"inputs":[{"type":"uint256","name":"_amount"},{"type":"uint256[3]","name":"_min_amounts"},{"type":"bool","name":"_use_underlying"}],"stateMutability":"nonpayable","type":"function"},{"name":"remove_liquidity_imbalance","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256[3]","name":"_amounts"},{"type":"uint256","name":"_max_burn_amount"}],"stateMutability":"nonpayable","type":"function"},{"name":"remove_liquidity_imbalance","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256[3]","name":"_amounts"},{"type":"uint256","name":"_max_burn_amount"},{"type":"bool","name":"_use_underlying"}],"stateMutability":"nonpayable","type":"function"},{"name":"calc_withdraw_one_coin","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256","name":"_token_amount"},{"type":"int128","name":"i"}],"stateMutability":"view","type":"function"},{"name":"calc_withdraw_one_coin","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256","name":"_token_amount"},{"type":"int128","name":"i"},{"type":"bool","name":"_use_underlying"}],"stateMutability":"view","type":"function"},{"name":"remove_liquidity_one_coin","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256","name":"_token_amount"},{"type":"int128","name":"i"},{"type":"uint256","name":"_min_amount"}],"stateMutability":"nonpayable","type":"function"},{"name":"remove_liquidity_one_coin","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256","name":"_token_amount"},{"type":"int128","name":"i"},{"type":"uint256","name":"_min_amount"},{"type":"bool","name":"_use_underlying"}],"stateMutability":"nonpayable","type":"function"},{"name":"ramp_A","outputs":[],"inputs":[{"type":"uint256","name":"_future_A"},{"type":"uint256","name":"_future_time"}],"stateMutability":"nonpayable","type":"function","gas":151984},{"name":"stop_ramp_A","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":148745},{"name":"commit_new_fee","outputs":[],"inputs":[{"type":"uint256","name":"new_fee"},{"type":"uint256","name":"new_admin_fee"}],"stateMutability":"nonpayable","type":"function","gas":110581},{"name":"apply_new_fee","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":97362},{"name":"revert_new_parameters","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":22015},{"name":"commit_transfer_ownership","outputs":[],"inputs":[{"type":"address","name":"_owner"}],"stateMutability":"nonpayable","type":"function","gas":74753},{"name":"apply_transfer_ownership","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":60830},{"name":"revert_transfer_ownership","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":22105},{"name":"admin_balances","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256","name":"i"}],"stateMutability":"view","type":"function","gas":3601},{"name":"withdraw_admin_fees","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":12875},{"name":"kill_me","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":38088},{"name":"unkill_me","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":22225},{"name":"coins","outputs":[{"type":"address","name":""}],"inputs":[{"type":"uint256","name":"arg0"}],"stateMutability":"view","type":"function","gas":2310},{"name":"underlying_coins","outputs":[{"type":"address","name":""}],"inputs":[{"type":"uint256","name":"arg0"}],"stateMutability":"view","type":"function","gas":2340},{"name":"balances","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256","name":"arg0"}],"stateMutability":"view","type":"function","gas":2370},{"name":"previous_balances","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256","name":"arg0"}],"stateMutability":"view","type":"function","gas":2400},{"name":"block_timestamp_last","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2321},{"name":"fee","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2351},{"name":"admin_fee","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2381},{"name":"owner","outputs":[{"type":"address","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2411},{"name":"lp_token","outputs":[{"type":"address","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2441},{"name":"initial_A","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2471},{"name":"future_A","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2501},{"name":"initial_A_time","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2531},{"name":"future_A_time","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2561},{"name":"admin_actions_deadline","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2591},{"name":"transfer_ownership_deadline","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2621},{"name":"future_fee","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2651},{"name":"future_admin_fee","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2681},{"name":"future_owner","outputs":[{"type":"address","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2711}]Contract Creation Code
61016061639f61014039602061639f60c03960c05160a01c1561002157600080fd5b6020602061639f0160c03960c05160a01c1561003c57600080fd5b6020604061639f0160c03960c05160a01c1561005757600080fd5b6020606061639f0160c03960c05160a01c1561007257600080fd5b6020608061639f0160c03960c05160a01c1561008d57600080fd5b602060a061639f0160c03960c05160a01c156100a857600080fd5b602060c061639f0160c03960c05160a01c156100c357600080fd5b602060e061639f0160c03960c05160a01c156100de57600080fd5b6102a060006003818352015b60006101606102a0516003811061010057600080fd5b60200201511861010f57600080fd5b60006101c06102a0516003811061012557600080fd5b60200201511861013457600080fd5b60006004610320527f095ea7b3000000000000000000000000000000000000000000000000000000006103405261032060048060208461038001018260208501600060045af15050805182019150506101606102a0516003811061019757600080fd5b60200201516020826103800101526020810190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602082610380010152602081019050806103805261038090508051602001806104208284600060045af16101ff57600080fd5b505060206104e06104205161044060006101c06102a0516003811061022357600080fd5b60200201515af161023357600080fd5b60203d808211156102445780610246565b815b905090506104c0526104c08051602001806102c08284600060045af161026b57600080fd5b505060006102c05111156102be576102c080602001516000825180602090131561029457600080fd5b80919012156102a257600080fd5b806020036101000a820490509050905015156102bd57600080fd5b5b5b81516001018083528114156100ea575b5050600060c052602060c0206101605181556101805160018201556101a051600282015550600160c052602060c0206101c05181556101e051600182015561020051600282015550610240516064808202821582848304141761033157600080fd5b80905090509050600955610240516064808202821582848304141761035557600080fd5b80905090509050600a5561026051600555610280516006556101405160075542624f1a0081818301101561038857600080fd5b808201905090506013556102205160085561638756341561000a57600080fd5b600436101561001857615fe3565b600035601c526000156101c1575b61014052600c5461016052600a5461018052610160514210156101ae576009546101a052600b546101c0526101a051610180511115610107576101a051610180516101a0518082101561007857600080fd5b80820390509050426101c0518082101561009157600080fd5b8082039050905080820282158284830414176100ac57600080fd5b80905090509050610160516101c051808210156100c857600080fd5b8082039050905080806100da57600080fd5b8204905090508181830110156100ef57600080fd5b808201905090506000526000516101405156506101a9565b6101a0516101a051610180518082101561012057600080fd5b80820390509050426101c0518082101561013957600080fd5b80820390509050808202821582848304141761015457600080fd5b80905090509050610160516101c0518082101561017057600080fd5b80820390509050808061018257600080fd5b8204905090508082101561019557600080fd5b808203905090506000526000516101405156505b6101bf565b610180516000526000516101405156505b005b63f446c1d060005114156101f45760065801610026565b610140526101405160648082049050905060005260206000f350005b6376a2f0f0600051141561021e5760065801610026565b610140526101405160005260206000f350005b60001561041f575b6101405260016101605264e8d4a510006101805264e8d4a510006101a0526101c060006003818352015b6101c0516003811061026157600080fd5b600060c052602060c02001546101e0526020610280600463182df0f56102205261023c6101e0515afa61029357600080fd5b601f3d116102a057600080fd5b60005061028051610200526102008051610200516020610280600463ae9d70b06102205261023c6101e0515afa6102d657600080fd5b601f3d116102e357600080fd5b6000506102805180820282158284830414176102fe57600080fd5b809050905090504360206103006004636c540baf6102a0526102bc6101e0515afa61032857600080fd5b601f3d1161033557600080fd5b600050610300518082101561034957600080fd5b80820390509050808202821582848304141761036457600080fd5b80905090509050670de0b6b3a76400008082049050905081818301101561038a57600080fd5b808201905090508152506101606101c051600381106103a857600080fd5b6020020180516102005180820282158284830414176103c657600080fd5b809050905090508152505b8151600101808352811415610250575b505060606101c0525b60006101c0511115156103fc57610418565b60206101c05103610160015160206101c051036101c0526103ea565b6101405156005b60001561047e575b6101405260045442111561047857600360c052602060c02060028060c052602060c02054825560018160c052602060c0200154600183015560028160c052602060c020015460028301555050426004555b61014051565b60001561059c575b610140526101405160065801610427565b6101405260005060016101605264e8d4a510006101805264e8d4a510006101a0526101c060006003818352015b6101606101c051600381106104d857600080fd5b6020020180516020610240600463bd6d894d6101e0526101fc60006101c0516003811061050457600080fd5b600060c052602060c02001545af161051b57600080fd5b601f3d1161052857600080fd5b60005061024051808202821582848304141761054357600080fd5b809050905090508152505b81516001018083528114156104c4575b505060606101c0525b60006101c05111151561057957610595565b60206101c05103610160015160206101c051036101c052610567565b6101405156005b600015610690575b6101a0526101405261016052610180526060366101c03761022060006003818352015b61014061022051600381106105db57600080fd5b602002015161022051600381106105f157600080fd5b600260c052602060c0200154808202821582848304141761061157600080fd5b80905090509050670de0b6b3a7640000808204905090506101c0610220516003811061063c57600080fd5b60200201525b81516001018083528114156105c7575b50506060610220525b60006102205111151561066d57610689565b602061022051036101c00151602061022051036102205261065b565b6101a05156005b60001561099c575b6101c0526101405261016052610180526101a0526040366101e03761024060006003818352015b602061024051026101400151610220526101e08051610220518181830110156106e757600080fd5b808201905090508152505b81516001018083528114156106bf575b50506101e051151561071d5760006000526000516101c05156505b6101e051610220526101a0516003808202821582848304141761073f57600080fd5b8090509050905061024052610260600060ff818352015b61022051610280526102c060006003818352015b60206102c0510261014001516102a0526102805161022051808202821582848304141761079657600080fd5b809050905090506102a051600380820282158284830414176107b757600080fd5b8090509050905080806107c957600080fd5b820490509050610280525b815160010180835281141561076a575b50506102205161020052610240516101e051808202821582848304141761080a57600080fd5b80905090509050606480820490509050610280516003808202821582848304141761083457600080fd5b8090509050905081818301101561084a57600080fd5b8082019050905061022051808202821582848304141761086957600080fd5b809050905090506102405160648082101561088357600080fd5b808203905090506102205180820282158284830414176108a257600080fd5b8090509050905060648082049050905060046102805180820282158284830414176108cc57600080fd5b809050905090508181830110156108e257600080fd5b8082019050905080806108f457600080fd5b820490509050610220526102005161022051111561094957600161022051610200518082101561092357600080fd5b80820390509050111515610944576102205160005250506000516101c05156505b610982565b600161020051610220518082101561096057600080fd5b80820390509050111515610981576102205160005250506000516101c05156505b5b5b8151600101808352811415610756575b505060006000fd005b600015610b07575b610220526101405261016052610180526101a0526101c0526101e05261020052606036610240376102a060006003818352015b6101406102a051600381106109eb57600080fd5b60200201516101a06102a05160038110610a0457600080fd5b60200201518082028215828483041417610a1d57600080fd5b80905090509050670de0b6b3a7640000808204905090506102406102a05160038110610a4857600080fd5b60200201525b81516001018083528114156109d7575b50506101405161016051610180516101a0516101c0516101e0516102005161022051610240516102605161028051610240516102a052610260516102c052610280516102e0526102005161030052610300516102e0516102c0516102a05160065801610698565b6103605261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261036051600052600051610220515650005b63bb7b8b806000511415610dde576101405160065801610226565b61016052610180526101a0526101405261016080516101c05280602001516101e052806040015161020052506101405161016051610180516101a0516101c0516101e051610200516101c051610220526101e051610240526102005161026052610260516102405161022051600658016105a4565b6102c0526102e05261030052610200526101e0526101c0526101a0526101805261016052610140526102c0805161032052806020015161034052806040015161036052506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e0516103005161032051610340516103605160065801610026565b61038052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610380516103a0526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610320516103405161036051610380516103a051610320516103c052610340516103e05261036051610400526103a0516104205261042051610400516103e0516103c05160065801610698565b610480526103a05261038052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610480516101405261014051670de0b6b3a76400008082028215828483041417610d8657600080fd5b8090509050905060206101c060046318160ddd6101605261017c6008545afa610dae57600080fd5b601f3d11610dbb57600080fd5b6000506101c0518080610dcd57600080fd5b82049050905060005260206000f350005b633883e119600051141561117c5760643560011c15610dfc57600080fd5b6101405160065801610026565b610160526101405261016051610140526101405161016051610180516101a05160065801610226565b6101c0526101e052610200526101a0526101805261016052610140526101c080516101605280602001516101805280604001516101a0525060028060c052602060c020546101c05260018160c052602060c02001546101e05260028160c052602060c020015461020052506101405161016051610180516101a0516101c0516101e0516102005161022051610160516102405261018051610260526101a051610280526101c0516102a0526101e0516102c052610200516102e0526101405161030052610300516102e0516102c0516102a051610280516102605161024051600658016109a4565b6103605261022052610200526101e0526101c0526101a052610180526101605261014052610360516102205261024060006003818352015b60046102405160038110610f6557600080fd5b60200201356102605260643515610fb2576101c06102405160038110610f8a57600080fd5b60200201805161026051818183011015610fa357600080fd5b80820190509050815250610fe8565b6101c06102405160038110610fc657600080fd5b6020020180516102605180821015610fdd57600080fd5b808203905090508152505b5b8151600101808352811415610f52575b50506101405161016051610180516101a0516101c0516101e051610200516102205161024051610160516102605261018051610280526101a0516102a0526101c0516102c0526101e0516102e0526102005161030052610140516103205261032051610300516102e0516102c0516102a0516102805161026051600658016109a4565b610380526102405261022052610200526101e0526101c0526101a052610180526101605261014052610380516102405260206102e060046318160ddd6102805261029c6008545afa6110cd57600080fd5b601f3d116110da57600080fd5b6000506102e05161026052600061028052606435156111185761024051610220518082101561110857600080fd5b8082039050905061028052611139565b61022051610240518082101561112d57600080fd5b80820390509050610280525b6102805161026051808202821582848304141761115557600080fd5b8090509050905061022051808061116b57600080fd5b82049050905060005260206000f350005b634515cef36000511415611195576000610140526111cb565b632b6e993a60005114156111c35760843560011c156111b357600080fd5b60206084610140376000506111cb565b600015611c09575b62ffffff54156111da57600080fd5b600162ffffff55601254156111ee57600080fd5b610140516101605160065801610026565b61018052610160526101405261018051610160526101405161016051610180516101a0516101c05160065801610486565b6101e05261020052610220526101c0526101a0526101805261016052610140526101e080516101805280602001516101a05280604001516101c052506008546101e052602061028060046318160ddd6102205261023c6101e0515afa61129557600080fd5b601f3d116112a257600080fd5b600050610280516102005260028060c052602060c020546102205260018160c052602060c02001546102405260028160c052602060c020015461026052506101405161016051610180516101a0516101c0516101e0516102005161022051610240516102605161028051610180516102a0526101a0516102c0526101c0516102e0526102205161030052610240516103205261026051610340526101605161036052610360516103405161032051610300516102e0516102c0516102a051600658016109a4565b6103c05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103c05161028052610220516102a052610240516102c052610260516102e0526060366103003761036060006003818352015b600461036051600381106113df57600080fd5b602002013561038052610380511515611407576000610200511161140257600080fd5b611634565b610360516003811061141857600080fd5b600060c052602060c02001546103a052610140511561158b57610360516003811061144257600080fd5b600160c052602060c02001543b61145857600080fd5b6000600060646323b872dd6103c052336103e052306104005261038051610420526103dc6000610360516003811061148f57600080fd5b600160c052602060c02001545af16114a657600080fd5b602061046060246370a082316103e05230610400526103fc6103a0515afa6114cd57600080fd5b601f3d116114da57600080fd5b600050610460516103c0526020610460602463a0712d686103e05261038051610400526103fc60006103a0515af161151157600080fd5b601f3d1161151e57600080fd5b600050610460511561152f57600080fd5b602061046060246370a082316103e05230610400526103fc6103a0515afa61155657600080fd5b601f3d1161156357600080fd5b600050610460516103c0518082101561157b57600080fd5b80820390509050610380526115df565b602061048060646323b872dd6103c052336103e052306104005261038051610420526103dc60006103a0515af16115c157600080fd5b601f3d116115ce57600080fd5b600050610480516115de57600080fd5b5b6103805161030061036051600381106115f757600080fd5b60200201526102a0610360516003811061161057600080fd5b6020020180516103805181818301101561162957600080fd5b808201905090508152505b5b81516001018083528114156113cc575b50506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e0516103005161032051610340516103605161018051610380526101a0516103a0526101c0516103c0526102a0516103e0526102c051610400526102e0516104205261016051610440526104405161042051610400516103e0516103c0516103a05161038051600658016109a4565b6104a052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526104a0516103605261028051610360511161175257600080fd5b608036610380376000610200511815611aa4576005546003808202821582848304141761177e57600080fd5b80905090509050600880820490509050610400526006546104205260006104405261046060006003818352015b6102a061046051600381106117bf57600080fd5b6020020151610480526103605161022061046051600381106117e057600080fd5b602002015180820282158284830414176117f957600080fd5b8090509050905061028051808061180f57600080fd5b8204905090506104a052610480516104a051111561184c576104a051610480518082101561183c57600080fd5b808203905090506104405261186d565b610480516104a0518082101561186157600080fd5b80820390509050610440525b6104005161044051808202821582848304141761188957600080fd5b809050905090506402540be4008082049050905061038061046051600381106118b157600080fd5b60200201526104805161038061046051600381106118ce57600080fd5b60200201516104205180820282158284830414176118eb57600080fd5b809050905090506402540be400808204905090508082101561190c57600080fd5b80820390509050610460516003811061192457600080fd5b600260c052602060c02001556102a0610460516003811061194457600080fd5b602002018051610380610460516003811061195e57600080fd5b60200201518082101561197057600080fd5b808203905090508152505b81516001018083528114156117ab575b5050610140610480525b610480515160206104805101610480526104806104805110156119b757611995565b610180516104a0526101a0516104c0526101c0516104e0526102a051610500526102c051610520526102e051610540526101605161056052610560516105405161052051610500516104e0516104c0516104a051600658016109a4565b6105c052610460610480525b6104805152602061048051036104805261014061048051101515611a4357611a20565b6105c0516104605261020051610460516102805180821015611a6457600080fd5b808203905090508082028215828483041417611a7f57600080fd5b80905090509050610280518080611a9557600080fd5b8204905090506103e052611ad0565b600260c052602060c0206102a05181556102c05160018201556102e051600282015550610360516103e0525b6064356103e05110151515611b24576308c379a0610400526020610420526014610440527f536c697070616765207363726577656420796f750000000000000000000000006104605261044050606461041cfd5b60206104a060446340c10f196104005233610420526103e0516104405261041c60006101e0515af1611b5557600080fd5b601f3d11611b6257600080fd5b6000506104a05061030051610400526103205161042052610340516104405261038051610460526103a051610480526103c0516104a052610360516104c052610200516103e051818183011015611bb857600080fd5b808201905090506104e052337f423f6495a08fc652425cf4ed0d1f9e37e571d9b9529b1c1c23cce780b2e7df0d610100610400a26103e051600052600062ffffff5560206000f350600062ffffff55005b6000156120ab575b610200526101405261016052610180526101a0526101c0526101e052610160516101405118611c3f57600080fd5b6000610160511215611c5057600080fd5b60036101605112611c6057600080fd5b6000610140511215611c7157600080fd5b60036101405112611c8157600080fd5b6101405161016051610180516101a0516101c0516101e051610200516102205160065801610026565b6102405261022052610200526101e0526101c0526101a05261018052610160526101405261024051610220526101405161016051610180516101a0516101c0516101e0516102005161022051610240516101a051610260526101c051610280526101e0516102a052610220516102c0526102c0516102a051610280516102605160065801610698565b610320526102405261022052610200526101e0526101c0526101a05261018052610160526101405261032051610240526102205160038082028215828483041417611d7d57600080fd5b809050905090506102605261024051610280526060366102a03761030060006003818352015b61014051610300511415611dbe57610180516102c052611df4565b61016051610300511815611dee576101a06103005160038110611de057600080fd5b60200201516102c052611df3565b611e70565b5b6102a080516102c051818183011015611e0c57600080fd5b8082019050905081525061028051610240518082028215828483041417611e3257600080fd5b809050905090506102c05160038082028215828483041417611e5357600080fd5b809050905090508080611e6557600080fd5b820490509050610280525b8151600101808352811415611da3575b505061028051610240518082028215828483041417611e9e57600080fd5b8090509050905060648082028215828483041417611ebb57600080fd5b809050905090506102605160038082028215828483041417611edc57600080fd5b809050905090508080611eee57600080fd5b820490509050610280526102a0516102405160648082028215828483041417611f1657600080fd5b80905090509050610260518080611f2c57600080fd5b820490509050818183011015611f4157600080fd5b80820190509050610300526102405161032052610340600060ff818352015b610320516102e05261032051610320518082028215828483041417611f8457600080fd5b8090509050905061028051818183011015611f9e57600080fd5b808201905090506002610320518082028215828483041417611fbf57600080fd5b8090509050905061030051818183011015611fd957600080fd5b808201905090506102405180821015611ff157600080fd5b80820390509050808061200357600080fd5b820490509050610320526102e051610320511115612058576001610320516102e0518082101561203257600080fd5b80820390509050111515612053576103205160005250506000516102005156505b612091565b60016102e051610320518082101561206f57600080fd5b80820390509050111515612090576103205160005250506000516102005156505b5b5b8151600101808352811415611f60575b505060006000fd005b635e0d443f60005114156123c357600435808060008112156120c957195b607f1c156120d657600080fd5b905050602435808060008112156120e957195b607f1c156120f657600080fd5b90505061014051610160516101805160065801610226565b6101a0526101c0526101e0526101805261016052610140526101a0805161014052806020015161016052806040015161018052506101405161016051610180516101a0516101c0516101e051610140516102005261016051610220526101805161024052610240516102205161020051600658016105a4565b6102a0526102c0526102e0526101e0526101c0526101a0526101805261016052610140526102a080516101a05280602001516101c05280604001516101e052506101a0600435600381106121da57600080fd5b6020020151604435610140600435600381106121f557600080fd5b6020020151808202821582848304141761220e57600080fd5b80905090509050670de0b6b3a76400008082049050905081818301101561223457600080fd5b80820190509050610200526101405161016051610180516101a0516101c0516101e0516102005161022051600435610240526024356102605261020051610280526101a0516102a0526101c0516102c0526101e0516102e0526102e0516102c0516102a05161028051610260516102405160065801611c11565b6103405261022052610200526101e0526101c0526101a05261018052610160526101405261034051610220526101a0602435600381106122ed57600080fd5b6020020151610220518082101561230357600080fd5b8082039050905060018082101561231957600080fd5b80820390509050610240526102405160055461024051808202821582848304141761234357600080fd5b809050905090506402540be400808204905090508082101561236457600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761238857600080fd5b80905090509050610140602435600381106123a257600080fd5b602002015180806123b257600080fd5b82049050905060005260206000f350005b6367df02ca60005114156126c757600435808060008112156123e157195b607f1c156123ee57600080fd5b9050506024358080600081121561240157195b607f1c1561240e57600080fd5b90505061014051610160516101805160065801610226565b6101a0526101c0526101e0526101805261016052610140526101a0805161014052806020015161016052806040015161018052506101405161016051610180516101a0516101c0516101e051610140516102005261016051610220526101805161024052610240516102205161020051600658016105a4565b6102a0526102c0526102e0526101e0526101c0526101a0526101805261016052610140526102a080516101a05280602001516101c05280604001516101e052506101a0602435600381106124f257600080fd5b60200201516044356402540be400808202821582848304141761251457600080fd5b809050905090506402540be4006005548082101561253157600080fd5b80820390509050808061254357600080fd5b8204905090506101406024356003811061255c57600080fd5b6020020151808202821582848304141761257557600080fd5b80905090509050670de0b6b3a7640000808204905090508082101561259957600080fd5b80820390509050610200526101405161016051610180516101a0516101c0516101e0516102005161022051602435610240526004356102605261020051610280526101a0516102a0526101c0516102c0526101e0516102e0526102e0516102c0516102a05161028051610260516102405160065801611c11565b6103405261022052610200526101e0526101c0526101a0526101805261016052610140526103405161022052610220516101a06004356003811061265657600080fd5b60200201518082101561266857600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761268c57600080fd5b80905090509050610140600435600381106126a657600080fd5b602002015180806126b657600080fd5b82049050905060005260206000f350005b6307211ef760005114156129dd57600435808060008112156126e557195b607f1c156126f257600080fd5b9050506024358080600081121561270557195b607f1c1561271257600080fd5b90505061014051610160516101805160065801610226565b6101a0526101c0526101e0526101805261016052610140526101a0805161014052806020015161016052806040015161018052506101405161016051610180516101a0516101c0516101e051610140516102005261016051610220526101805161024052610240516102205161020051600658016105a4565b6102a0526102c0526102e0526101e0526101c0526101a0526101805261016052610140526102a080516101a05280602001516101c05280604001516101e0525060016102005264e8d4a510006102205264e8d4a51000610240526101a06004356003811061281057600080fd5b60200201516044356102006004356003811061282b57600080fd5b6020020151808202821582848304141761284457600080fd5b8090509050905081818301101561285a57600080fd5b80820190509050610260526101a06024356003811061287857600080fd5b60200201516101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516004356102a0526024356102c052610260516102e0526101a051610300526101c051610320526101e051610340526103405161032051610300516102e0516102c0516102a05160065801611c11565b6103a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103a0518082101561293957600080fd5b8082039050905060018082101561294f57600080fd5b808203905090506102805260055461028051808202821582848304141761297557600080fd5b809050905090506402540be400808204905090506102a052610280516102a051808210156129a257600080fd5b80820390509050610200602435600381106129bc57600080fd5b602002015180806129cc57600080fd5b82049050905060005260206000f350005b630e71d1b96000511415612ccf57600435808060008112156129fb57195b607f1c15612a0857600080fd5b90505060243580806000811215612a1b57195b607f1c15612a2857600080fd5b90505061014051610160516101805160065801610226565b6101a0526101c0526101e0526101805261016052610140526101a0805161014052806020015161016052806040015161018052506101405161016051610180516101a0516101c0516101e051610140516102005261016051610220526101805161024052610240516102205161020051600658016105a4565b6102a0526102c0526102e0526101e0526101c0526101a0526101805261016052610140526102a080516101a05280602001516101c05280604001516101e0525060016102005264e8d4a510006102205264e8d4a51000610240526101a060243560038110612b2657600080fd5b60200201516044356402540be4008082028215828483041417612b4857600080fd5b809050905090506402540be40060055480821015612b6557600080fd5b808203905090508080612b7757600080fd5b82049050905061020060243560038110612b9057600080fd5b60200201518082028215828483041417612ba957600080fd5b8090509050905080821015612bbd57600080fd5b80820390509050610260526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051602435610280526004356102a052610260516102c0526101a0516102e0526101c051610300526101e0516103205261032051610300516102e0516102c0516102a0516102805160065801611c11565b61038052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610380516101a060043560038110612c8257600080fd5b602002015180821015612c9457600080fd5b8082039050905061020060043560038110612cae57600080fd5b60200201518080612cbe57600080fd5b82049050905060005260206000f350005b6000156131b1575b6101a05261014052610160526101805260125415612cf457600080fd5b6101405161016051610180516101a0516101c0516101e0516102005160065801610486565b610220526102405261026052610200526101e0526101c0526101a05261018052610160526101405261022080516101c05280602001516101e0528060400151610200525060028060c052602060c020546102205260018160c052602060c02001546102405260028160c052602060c02001546102605250606036610280376102e060006003818352015b6101c06102e05160038110612db757600080fd5b60200201516102206102e05160038110612dd057600080fd5b60200201518082028215828483041417612de957600080fd5b80905090509050670de0b6b3a7640000808204905090506102806102e05160038110612e1457600080fd5b60200201525b8151600101808352811415612da3575b50506102806101405160038110612e4057600080fd5b6020020151610180516101c06101405160038110612e5d57600080fd5b60200201518082028215828483041417612e7657600080fd5b80905090509050670de0b6b3a764000080820490509050818183011015612e9c57600080fd5b808201905090506102e0526102806101605160038110612ebb57600080fd5b60200201516101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610140516103205261016051610340526102e0516103605261028051610380526102a0516103a0526102c0516103c0526103c0516103a0516103805161036051610340516103205160065801611c11565b61042052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526104205180821015612f9e57600080fd5b80820390509050600180821015612fb457600080fd5b8082039050905061030052610300516005548082028215828483041417612fda57600080fd5b809050905090506402540be400808204905090506103205261030051610320518082101561300757600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761302b57600080fd5b809050905090506101c0610160516003811061304657600080fd5b6020020151808061305657600080fd5b8204905090506103005261032051600654808202821582848304141761307b57600080fd5b809050905090506402540be400808204905090506103405261034051670de0b6b3a764000080820282158284830414176130b457600080fd5b809050905090506101c061016051600381106130cf57600080fd5b602002015180806130df57600080fd5b8204905090506103405261022061014051600381106130fd57600080fd5b60200201516101805181818301101561311557600080fd5b80820190509050610140516003811061312d57600080fd5b600260c052602060c0200155610220610160516003811061314d57600080fd5b6020020151610300518082101561316357600080fd5b80820390509050610340518082101561317b57600080fd5b80820390509050610160516003811061319357600080fd5b600260c052602060c0200155610300516000526000516101a0515650005b633df0212460005114156133d95762ffffff54156131ce57600080fd5b600162ffffff55600435808060008112156131e557195b607f1c156131f257600080fd5b9050506024358080600081121561320557195b607f1c1561321257600080fd5b9050506101405160043561016052602435610180526044356101a0526101a051610180516101605160065801612cd7565b6102005261014052610200516101405260643561014051101515156132a7576308c379a06101605260206101805260176101a0527f546f6f2066657720636f696e7320696e20726573756c740000000000000000006101c0526101a050606461017cfd5b602061022060646323b872dd610160523361018052306101a0526044356101c05261017c6000600435600381106132dd57600080fd5b600060c052602060c02001545af16132f457600080fd5b601f3d1161330157600080fd5b6000506102205161331157600080fd5b6020610200604463a9059cbb610160523361018052610140516101a05261017c60006024356003811061334357600080fd5b600060c052602060c02001545af161335a57600080fd5b601f3d1161336757600080fd5b6000506102005161337757600080fd5b60043561016052604435610180526024356101a052610140516101c052337f8b3e96f2b889fa771c53c981b40daf005f63f637f1869f707052d15a3dd971406080610160a261014051600052600062ffffff5560206000f350600062ffffff55005b63a6417ed660005114156137b25762ffffff54156133f657600080fd5b600162ffffff556004358080600081121561340d57195b607f1c1561341a57600080fd5b9050506024358080600081121561342d57195b607f1c1561343a57600080fd5b9050506004356003811061344d57600080fd5b600160c052602060c02001543b61346357600080fd5b6000600060646323b872dd61014052336101605230610180526044356101a05261015c60006004356003811061349857600080fd5b600160c052602060c02001545af16134af57600080fd5b600435600381106134bf57600080fd5b600060c052602060c020015461014052602061020060246370a0823161018052306101a05261019c610140515afa6134f657600080fd5b601f3d1161350357600080fd5b60005061020051610160526020610200602463a0712d68610180526044356101a05261019c6000610140515af161353957600080fd5b601f3d1161354657600080fd5b600050610200511561355757600080fd5b602061020060246370a0823161018052306101a05261019c610140515afa61357e57600080fd5b601f3d1161358b57600080fd5b6000506102005161016051808210156135a357600080fd5b80820390509050610160526101405161016051610180516004356101a0526024356101c052610160516101e0526101e0516101c0516101a05160065801612cd7565b6102405261018052610160526101405261024051610180526020610220602463db006a756101a052610180516101c0526101bc60006024356003811061362a57600080fd5b600060c052602060c02001545af161364157600080fd5b601f3d1161364e57600080fd5b600050610220511561365f57600080fd5b6024356003811061366f57600080fd5b600160c052602060c02001546101a052602061026060246370a082316101e05230610200526101fc6101a0515afa6136a657600080fd5b601f3d116136b357600080fd5b600050610260516101c0526064356101c05110151515613712576308c379a06101e0526020610200526017610220527f546f6f2066657720636f696e7320696e20726573756c74000000000000000000610240526102205060646101fcfd5b6101a0513b61372057600080fd5b60006000604463a9059cbb6101e05233610200526101c051610220526101fc60006101a0515af161375057600080fd5b6004356101e05260443561020052602435610220526101c05161024052337fd013ca23e77a65003c2c659c5442c00c805371b7fc1ebd4c206c41d1536bd90b60806101e0a26101c051600052600062ffffff5560206000f350600062ffffff55005b63ecb586a560005114156137cb57600061014052613801565b63fce6473660005114156137f95760843560011c156137e957600080fd5b6020608461014037600050613801565b600015613b91575b62ffffff541561381057600080fd5b600162ffffff556101405160065801610427565b6101405260005060085461016052602061020060046318160ddd6101a0526101bc610160515afa61385457600080fd5b601f3d1161386157600080fd5b60005061020051610180526060366101a03761020060006003818352015b610200516003811061389057600080fd5b600260c052602060c0200154610220526102205160043580820282158284830414176138bb57600080fd5b809050905090506101805180806138d157600080fd5b820490509050610240526102205161024051808210156138f057600080fd5b80820390509050610200516003811061390857600080fd5b600260c052602060c0200155610240516101a0610200516003811061392c57600080fd5b6020020152610200516003811061394257600080fd5b600060c052602060c0200154610260526101405115613a48576020610300602463db006a7561028052610240516102a05261029c6000610260515af161398757600080fd5b601f3d1161399457600080fd5b60005061030051156139a557600080fd5b61020051600381106139b657600080fd5b600160c052602060c020015461028052602061032060246370a082316102a052306102c0526102bc610280515afa6139ed57600080fd5b601f3d116139fa57600080fd5b6000506103205161024052610280513b613a1357600080fd5b60006000604463a9059cbb6102a052336102c052610240516102e0526102bc6000610280515af1613a4357600080fd5b613a97565b6020610320604463a9059cbb61028052336102a052610240516102c05261029c6000610260515af1613a7957600080fd5b601f3d11613a8657600080fd5b60005061032051613a9657600080fd5b5b60246102005160038110613aaa57600080fd5b6020020135610240511015613abe57600080fd5b5b815160010180835281141561387f575b505060206102a060446379cc67906102005233610220526004356102405261021c6000610160515af1613b0157600080fd5b601f3d11613b0e57600080fd5b6000506102a0506101a051610200526101c051610220526101e05161024052606036610260376101805160043580821015613b4857600080fd5b808203905090506102c052337fa49d4cf02656aebf8c771f5a8585638a2a15ee6c97cf7205d4208ed7c1df252d60e0610200a2600062ffffff5560606101a0f3600062ffffff55005b639fdaea0c6000511415613baa57600061014052613be0565b635b8369f56000511415613bd85760843560011c15613bc857600080fd5b6020608461014037600050613be0565b600015614630575b62ffffff5415613bef57600080fd5b600162ffffff5560125415613c0357600080fd5b610140516101605160065801610026565b61018052610160526101405261018051610160526101405161016051610180516101a0516101c05160065801610486565b6101e05261020052610220526101c0526101a0526101805261016052610140526101e080516101805280602001516101a05280604001516101c0525060028060c052602060c020546101e05260018160c052602060c02001546102005260028160c052602060c020015461022052506101405161016051610180516101a0516101c0516101e05161020051610220516102405161018051610260526101a051610280526101c0516102a0526101e0516102c052610200516102e0526102205161030052610160516103205261032051610300516102e0516102c0516102a0516102805161026051600658016109a4565b610380526102405261022052610200526101e0526101c0526101a05261018052610160526101405261038051610240526101e051610260526102005161028052610220516102a052600480356102c05280602001356102e0528060400135610300525060016103205264e8d4a510006103405264e8d4a510006103605261038060006003818352015b6102c06103805160038110613dd257600080fd5b60200201516103a05260006103a0511115613ece576101405115613e98576103a0516103206103805160038110613e0857600080fd5b60200201518082028215828483041417613e2157600080fd5b80905090509050670de0b6b3a76400008082028215828483041417613e4557600080fd5b809050905090506101806103805160038110613e6057600080fd5b60200201518080613e7057600080fd5b8204905090506103a0526103a0516102c06103805160038110613e9257600080fd5b60200201525b6102606103805160038110613eac57600080fd5b6020020180516103a05180821015613ec357600080fd5b808203905090508152505b5b8151600101808352811415613dbe575b50506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e0516103005161032051610340516103605161038051610180516103a0526101a0516103c0526101c0516103e052610260516104005261028051610420526102a051610440526101605161046052610460516104405161042051610400516103e0516103c0516103a051600658016109a4565b6104c05261038052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526104c051610380526060366103a0376005546003808202821582848304141761400257600080fd5b80905090509050600880820490509050610400526006546104205261044060006003818352015b610380516101e0610440516003811061404157600080fd5b6020020151808202821582848304141761405a57600080fd5b8090509050905061024051808061407057600080fd5b82049050905061046052610260610440516003811061408e57600080fd5b60200201516104805260006104a052610480516104605111156140d0576104605161048051808210156140c057600080fd5b808203905090506104a0526140f1565b6104805161046051808210156140e557600080fd5b808203905090506104a0525b610400516104a051808202821582848304141761410d57600080fd5b809050905090506402540be400808204905090506104c052610480516104c05161042051808202821582848304141761414557600080fd5b809050905090506402540be400808204905090508082101561416657600080fd5b80820390509050610440516003811061417e57600080fd5b600260c052602060c0200155610260610440516003811061419e57600080fd5b6020020180516104c051808210156141b557600080fd5b808203905090508152506104c0516103a061044051600381106141d757600080fd5b60200201525b8151600101808352811415614029575b5050610140610460525b61046051516020610460510161046052610460610460511015614219576141f7565b61018051610480526101a0516104a0526101c0516104c052610260516104e05261028051610500526102a0516105205261016051610540526105405161052051610500516104e0516104c0516104a05161048051600658016109a4565b6105a052610440610460525b61046051526020610460510361046052610140610460511015156142a557614282565b6105a0516104405260085461046052602061050060046318160ddd6104a0526104bc610460515afa6142d657600080fd5b601f3d116142e357600080fd5b600050610500516104805261024051610440518082101561430357600080fd5b8082039050905061048051808202821582848304141761432257600080fd5b8090509050905061024051808061433857600080fd5b8204905090506104a05260006104a0511861435257600080fd5b6064356104a051111515156143a6576308c379a06104c05260206104e0526014610500527f536c697070616765207363726577656420796f75000000000000000000000000610520526105005060646104dcfd5b602061056060446379cc67906104c052336104e0526104a051610500526104dc6000610460515af16143d757600080fd5b601f3d116143e457600080fd5b600050610560506104c060006003818352015b6102c06104c0516003811061440b57600080fd5b60200201516104e05260006104e051181561457f576104c0516003811061443157600080fd5b600060c052602060c020015461050052610140511561452f5760206105a0602463db006a75610520526104e0516105405261053c6000610500515af161447657600080fd5b601f3d1161448357600080fd5b6000506105a0511561449457600080fd5b6104c051600381106144a557600080fd5b600160c052602060c020015461052052610520513b6144c357600080fd5b60006000604463a9059cbb6105e052336106005260206105c060246370a0823161054052306105605261055c610520515afa6144fe57600080fd5b601f3d1161450b57600080fd5b6000506105c051610620526105fc6000610520515af161452a57600080fd5b61457e565b60206105c0604463a9059cbb6105205233610540526104e0516105605261053c6000610500515af161456057600080fd5b601f3d1161456d57600080fd5b6000506105c05161457d57600080fd5b5b5b5b81516001018083528114156143f7575b50506102c0516104c0526102e0516104e05261030051610500526103a051610520526103c051610540526103e051610560526103805161058052610480516104a051808210156145df57600080fd5b808203905090506105a052337f173599dbf9c6ca6f7c3b590df07ae98a45d74ff54065505141e7de6c46a624c26101006104c0a26104a051600052600062ffffff5560206000f350600062ffffff55005b6000156149a1575b610200526101405261016052610180526101a0526101c0526101e052600061016051121561466557600080fd5b6003610160511261467557600080fd5b610140516003808202821582848304141761468f57600080fd5b80905090509050610220526101e05161024052606036610260376102c060006003818352015b610160516102c05118156146e5576101806102c051600381106146d757600080fd5b6020020151610280526146ea565b614766565b61026080516102805181818301101561470257600080fd5b80820190509050815250610240516101e051808202821582848304141761472857600080fd5b80905090509050610280516003808202821582848304141761474957600080fd5b80905090509050808061475b57600080fd5b820490509050610240525b81516001018083528114156146b5575b5050610240516101e051808202821582848304141761479457600080fd5b80905090509050606480820282158284830414176147b157600080fd5b8090509050905061022051600380820282158284830414176147d257600080fd5b8090509050905080806147e457600080fd5b82049050905061024052610260516101e0516064808202821582848304141761480c57600080fd5b8090509050905061022051808061482257600080fd5b82049050905081818301101561483757600080fd5b808201905090506102c0526101e0516102e052610300600060ff818352015b6102e0516102a0526102e0516102e051808202821582848304141761487a57600080fd5b809050905090506102405181818301101561489457600080fd5b8082019050905060026102e05180820282158284830414176148b557600080fd5b809050905090506102c0518181830110156148cf57600080fd5b808201905090506101e051808210156148e757600080fd5b8082039050905080806148f957600080fd5b8204905090506102e0526102a0516102e051111561494e5760016102e0516102a0518082101561492857600080fd5b80820390509050111515614949576102e05160005250506000516102005156505b614987565b60016102a0516102e0518082101561496557600080fd5b80820390509050111515614986576102e05160005250506000516102005156505b5b5b8151600101808352811415614856575b505060006000fd005b6000156150fa575b610200526101405261016052610180526101a0526101c0526101e0526101405161016051610180516101a0516101c0516101e051610200516102205160065801610026565b6102405261022052610200526101e0526101c0526101a05261018052610160526101405261024051610220526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516101a0516102a0526101c0516102c0526101e0516102e0526102e0516102c0516102a051600658016105a4565b61034052610360526103805261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610340805161024052806020015161026052806040015161028052506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a051610240516102c052610260516102e0526102805161030052610220516103205261032051610300516102e0516102c05160065801610698565b610380526102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610380516102a052602061034060046318160ddd6102e0526102fc6008545afa614b8d57600080fd5b601f3d11614b9a57600080fd5b600050610340516102c0526102a051610140516102a0518082028215828483041417614bc557600080fd5b809050905090506102c0518080614bdb57600080fd5b82049050905080821015614bee57600080fd5b808203905090506102e052610140610320525b61032051516020610320510161032052610320610320511015614c2357614c01565b610220516103405261016051610360526102405161038052610260516103a052610280516103c0526102e0516103e0526103e0516103c0516103a05161038051610360516103405160065801614638565b61044052610300610320525b6103205152602061032051036103205261014061032051101515614ca357614c80565b610440516103005261024051610320526102605161034052610280516103605260055460038082028215828483041417614cdc57600080fd5b80905090509050600880820490509050610380526101a06101605160038110614d0457600080fd5b60200201516103a0526103c060006003818352015b60006103e0526102406103c05160038110614d3357600080fd5b602002015161040052610160516103c0511415614da357610400516102e0518082028215828483041417614d6657600080fd5b809050905090506102a0518080614d7c57600080fd5b8204905090506103005180821015614d9357600080fd5b808203905090506103e052614df8565b61040051610400516102e0518082028215828483041417614dc357600080fd5b809050905090506102a0518080614dd957600080fd5b82049050905080821015614dec57600080fd5b808203905090506103e0525b6103206103c05160038110614e0c57600080fd5b602002018051610380516103e0518082028215828483041417614e2e57600080fd5b809050905090506402540be4008082049050905080821015614e4f57600080fd5b808203905090508152505b8151600101808352811415614d19575b50506103206101605160038110614e8057600080fd5b60200201516101406103e0525b6103e0515160206103e051016103e0526103e06103e0511015614eaf57614e8d565b610220516104005261016051610420526103205161044052610340516104605261036051610480526102e0516104a0526104a051610480516104605161044051610420516104005160065801614638565b610500526103c06103e0525b6103e0515260206103e051036103e0526101406103e051101515614f2f57614f0c565b6105005180821015614f4057600080fd5b808203905090506103c0526103c051600180821015614f5e57600080fd5b80820390509050670de0b6b3a76400008082028215828483041417614f8257600080fd5b809050905090506103a0518080614f9857600080fd5b8204905090506103c0526102406101605160038110614fb657600080fd5b60200201516103005180821015614fcc57600080fd5b80820390509050670de0b6b3a76400008082028215828483041417614ff057600080fd5b809050905090506103a051808061500657600080fd5b8204905090506103c0518082101561501d57600080fd5b808203905090506103e05261018051156150ad5760016104005264e8d4a510006104205264e8d4a51000610440526103c0516103a051808202821582848304141761506757600080fd5b80905090509050610400610160516003811061508257600080fd5b6020020151808061509257600080fd5b820490509050670de0b6b3a7640000808204905090506103c0525b6103c051610420526103e051610440526040610400525b6000610400511115156150d6576150f2565b60206104005103610420015160206104005103610400526150c4565b610200515650005b63cc2b27d7600051141561511357600061014052615149565b63c532a77460005114156151415760443560011c1561513157600080fd5b6020604461014037600050615149565b600015615240575b6024358080600081121561515957195b607f1c1561516657600080fd5b9050506101405160065801610226565b61016052610180526101a0526101405261016080516101c05280602001516101e052806040015161020052506101405161016051610180516101a0516101c0516101e05161020051600435610220526024356102405261014051610260526101c051610280526101e0516102a052610200516102c0526102c0516102a05161028051610260516102405161022051600658016149a9565b6103205261034052610200526101e0526101c0526101a0526101805261016052610140526103205160005260206000f350005b631a4d01d260005114156152595760006101405261528f565b63517a55a360005114156152875760643560011c1561527757600080fd5b602060646101403760005061528f565b60001561569f575b62ffffff541561529e57600080fd5b600162ffffff55602435808060008112156152b557195b607f1c156152c257600080fd5b905050601254156152d257600080fd5b61014051610160516101805160065801610486565b6101a0526101c0526101e0526101805261016052610140526101a0805161020052806020015161022052806040015161024052506101405161016051610180516101a0516101c0516101e051610200516102205161024051600435610260526024356102805260006102a052610200516102c052610220516102e0526102405161030052610300516102e0516102c0516102a0516102805161026051600658016149a9565b61036052610380526102405261022052610200526101e0526101c0526101a05261018052610160526101405261036080516101605280602001516101805250610160516101a052602435600381106153e357600080fd5b600260c052602060c0200180546101605161018051600654808202821582848304141761540f57600080fd5b809050905090506402540be4008082049050905081818301101561543257600080fd5b808201905090508082101561544657600080fd5b80820390509050815550602061026060446379cc67906101c052336101e052600435610200526101dc60006008545af161547f57600080fd5b601f3d1161548c57600080fd5b60005061026050602435600381106154a357600080fd5b600060c052602060c02001546101c05261014051156155a8576020610260602463db006a756101e05261016051610200526101fc60006101c0515af16154e857600080fd5b601f3d116154f557600080fd5b600050610260511561550657600080fd5b6024356003811061551657600080fd5b600160c052602060c02001546101e052602061028060246370a0823161020052306102205261021c6101e0515afa61554d57600080fd5b601f3d1161555a57600080fd5b600050610280516101a0526101e0513b61557357600080fd5b60006000604463a9059cbb6102005233610220526101a0516102405261021c60006101e0515af16155a357600080fd5b6155f7565b6020610280604463a9059cbb6101e05233610200526101a051610220526101fc60006101c0515af16155d957600080fd5b601f3d116155e657600080fd5b600050610280516155f657600080fd5b5b6044356101a0511015151561564b576308c379a06101e0526020610200526018610220527f4e6f7420656e6f75676820636f696e732072656d6f7665640000000000000000610240526102205060646101fcfd5b6004356101e0526101605161020052337f9e96dd3b997a2a257eec4df9bb6eaf626e206df5f543bd963682d143300be31060406101e0a261016051600052600062ffffff5560206000f350600062ffffff55005b633c157e6460005114156158435760075433146156bb57600080fd5b600b54620151808181830110156156d157600080fd5b808201905090504210156156e457600080fd5b42620151808181830110156156f857600080fd5b80820190509050602435101561570d57600080fd5b6101405160065801610026565b610160526101405261016051610140526004356064808202821582848304141761574357600080fd5b80905090509050610160526000600435111561576657620f424060043510615769565b60005b61577257600080fd5b610140516101605110156157b5576101405161016051600a808202821582848304141761579e57600080fd5b8090509050905010156157b057600080fd5b6157e6565b61014051600a80820282158284830414176157cf57600080fd5b809050905090506101605111156157e557600080fd5b5b6101405160095561016051600a5542600b55602435600c556101405161018052610160516101a052426101c0526024356101e0527fa2b71ec6df949300b59aab36b55e189697b750119dd349fcfa8c0f779e83c2546080610180a1005b63551a658860005114156158c857600754331461585f57600080fd5b6101405160065801610026565b610160526101405261016051610140526101405160095561014051600a5542600b5542600c55610140516101605242610180527f46e22fb3709ad289f62ce63d469248536dbc78d82b84a3d7e74ad606dc2019386040610160a1005b635b5a146760005114156159865760075433146158e457600080fd5b600d54156158f157600080fd5b64012a05f200600435111561590557600080fd5b6402540be400602435111561591957600080fd5b426203f48081818301101561592d57600080fd5b808201905090506101405261014051600d55600435600f556024356010556004356101605260243561018052610140517f351fc5da2fbf480f2225debf3664a4bc90fa9923743aad58b4603f648e931fe06040610160a2005b634f12fe976000511415615a1a5760075433146159a257600080fd5b600d544210156159b157600080fd5b6000600d54186159c057600080fd5b6000600d55600f54610140526010546101605261014051600555610160516006556101405161018052610160516101a0527fbe12859b636aed607d5230b2cc2711f68d70e51060e6cca1f575ef5d2fcc95d16040610180a1005b63226840fb6000511415615a3d576007543314615a3657600080fd5b6000600d55005b636b441a406000511415615ad15760043560a01c15615a5b57600080fd5b6007543314615a6957600080fd5b600e5415615a7657600080fd5b426203f480818183011015615a8a57600080fd5b808201905090506101405261014051600e55600435601155600435610140517f181aa3aa17d4cbf99265dd4443eba009433d3cde79d60164fde1d1a192beb93560006000a3005b636a1c05ae6000511415615b4a576007543314615aed57600080fd5b600e54421015615afc57600080fd5b6000600e5418615b0b57600080fd5b6000600e556011546101405261014051600755610140517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60006000a2005b6386fbf1936000511415615b6d576007543314615b6657600080fd5b6000600e55005b63e2e7d2646000511415615c095760206101c060246370a0823161014052306101605261015c60043560038110615ba357600080fd5b600060c052602060c02001545afa615bba57600080fd5b601f3d11615bc757600080fd5b6000506101c05160043560038110615bde57600080fd5b600260c052602060c020015480821015615bf757600080fd5b8082039050905060005260206000f350005b6330c540856000511415615d32576007543314615c2557600080fd5b61014060006003818352015b6101405160038110615c4257600080fd5b600060c052602060c020015461016052602061022060246370a082316101a052306101c0526101bc610160515afa615c7957600080fd5b601f3d11615c8657600080fd5b600050610220516101405160038110615c9e57600080fd5b600260c052602060c020015480821015615cb757600080fd5b80820390509050610180526000610180511115615d1d576020610240604463a9059cbb6101a052336101c052610180516101e0526101bc6000610160515af1615cff57600080fd5b601f3d11615d0c57600080fd5b60005061024051615d1c57600080fd5b5b5b8151600101808352811415615c31575b5050005b63e36988536000511415615d63576007543314615d4e57600080fd5b4260135411615d5c57600080fd5b6001601255005b633046f9726000511415615d86576007543314615d7f57600080fd5b6000601255005b63c66106576000511415615dbb5760043560038110615da457600080fd5b600060c052602060c020015460005260206000f350005b63b9947eb06000511415615df05760043560038110615dd957600080fd5b600160c052602060c020015460005260206000f350005b634903b0d16000511415615e255760043560038110615e0e57600080fd5b600260c052602060c020015460005260206000f350005b639e266d4f6000511415615e5a5760043560038110615e4357600080fd5b600360c052602060c020015460005260206000f350005b6363543f066000511415615e765760045460005260206000f350005b63ddca3f436000511415615e925760055460005260206000f350005b63fee3f7f96000511415615eae5760065460005260206000f350005b638da5cb5b6000511415615eca5760075460005260206000f350005b6382c630666000511415615ee65760085460005260206000f350005b635409491a6000511415615f025760095460005260206000f350005b63b4b577ad6000511415615f1e57600a5460005260206000f350005b632081066c6000511415615f3a57600b5460005260206000f350005b63140522886000511415615f5657600c5460005260206000f350005b63405e28f86000511415615f7257600d5460005260206000f350005b63e0a0b5866000511415615f8e57600e5460005260206000f350005b6358680d0b6000511415615faa57600f5460005260206000f350005b63e38244626000511415615fc65760105460005260206000f350005b631ec0cdc16000511415615fe25760115460005260206000f350005b5b60006000fd5b61039e6163870361039e60003961039e616387036000f30000000000000000000000007eeac6cddbd1d0b8af061742d41877d7f707289a0000000000000000000000008e595470ed749b85c6f7669de83eae304c2ec68f00000000000000000000000076eb2fe28b36b3ee97f3adae0c69606eedb2a37c00000000000000000000000048759f220ed983db51fa7a8c0d2aab8f3ce4166a0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000000000000000000005282a4ef67d9c33135340fb3289cc1711c13638c000000000000000000000000000000000000000000000000000000000000025800000000000000000000000000000000000000000000000000000000003d0900000000000000000000000000000000000000000000000000000000012a05f200
Deployed Bytecode
0x341561000a57600080fd5b600436101561001857615fe3565b600035601c526000156101c1575b61014052600c5461016052600a5461018052610160514210156101ae576009546101a052600b546101c0526101a051610180511115610107576101a051610180516101a0518082101561007857600080fd5b80820390509050426101c0518082101561009157600080fd5b8082039050905080820282158284830414176100ac57600080fd5b80905090509050610160516101c051808210156100c857600080fd5b8082039050905080806100da57600080fd5b8204905090508181830110156100ef57600080fd5b808201905090506000526000516101405156506101a9565b6101a0516101a051610180518082101561012057600080fd5b80820390509050426101c0518082101561013957600080fd5b80820390509050808202821582848304141761015457600080fd5b80905090509050610160516101c0518082101561017057600080fd5b80820390509050808061018257600080fd5b8204905090508082101561019557600080fd5b808203905090506000526000516101405156505b6101bf565b610180516000526000516101405156505b005b63f446c1d060005114156101f45760065801610026565b610140526101405160648082049050905060005260206000f350005b6376a2f0f0600051141561021e5760065801610026565b610140526101405160005260206000f350005b60001561041f575b6101405260016101605264e8d4a510006101805264e8d4a510006101a0526101c060006003818352015b6101c0516003811061026157600080fd5b600060c052602060c02001546101e0526020610280600463182df0f56102205261023c6101e0515afa61029357600080fd5b601f3d116102a057600080fd5b60005061028051610200526102008051610200516020610280600463ae9d70b06102205261023c6101e0515afa6102d657600080fd5b601f3d116102e357600080fd5b6000506102805180820282158284830414176102fe57600080fd5b809050905090504360206103006004636c540baf6102a0526102bc6101e0515afa61032857600080fd5b601f3d1161033557600080fd5b600050610300518082101561034957600080fd5b80820390509050808202821582848304141761036457600080fd5b80905090509050670de0b6b3a76400008082049050905081818301101561038a57600080fd5b808201905090508152506101606101c051600381106103a857600080fd5b6020020180516102005180820282158284830414176103c657600080fd5b809050905090508152505b8151600101808352811415610250575b505060606101c0525b60006101c0511115156103fc57610418565b60206101c05103610160015160206101c051036101c0526103ea565b6101405156005b60001561047e575b6101405260045442111561047857600360c052602060c02060028060c052602060c02054825560018160c052602060c0200154600183015560028160c052602060c020015460028301555050426004555b61014051565b60001561059c575b610140526101405160065801610427565b6101405260005060016101605264e8d4a510006101805264e8d4a510006101a0526101c060006003818352015b6101606101c051600381106104d857600080fd5b6020020180516020610240600463bd6d894d6101e0526101fc60006101c0516003811061050457600080fd5b600060c052602060c02001545af161051b57600080fd5b601f3d1161052857600080fd5b60005061024051808202821582848304141761054357600080fd5b809050905090508152505b81516001018083528114156104c4575b505060606101c0525b60006101c05111151561057957610595565b60206101c05103610160015160206101c051036101c052610567565b6101405156005b600015610690575b6101a0526101405261016052610180526060366101c03761022060006003818352015b61014061022051600381106105db57600080fd5b602002015161022051600381106105f157600080fd5b600260c052602060c0200154808202821582848304141761061157600080fd5b80905090509050670de0b6b3a7640000808204905090506101c0610220516003811061063c57600080fd5b60200201525b81516001018083528114156105c7575b50506060610220525b60006102205111151561066d57610689565b602061022051036101c00151602061022051036102205261065b565b6101a05156005b60001561099c575b6101c0526101405261016052610180526101a0526040366101e03761024060006003818352015b602061024051026101400151610220526101e08051610220518181830110156106e757600080fd5b808201905090508152505b81516001018083528114156106bf575b50506101e051151561071d5760006000526000516101c05156505b6101e051610220526101a0516003808202821582848304141761073f57600080fd5b8090509050905061024052610260600060ff818352015b61022051610280526102c060006003818352015b60206102c0510261014001516102a0526102805161022051808202821582848304141761079657600080fd5b809050905090506102a051600380820282158284830414176107b757600080fd5b8090509050905080806107c957600080fd5b820490509050610280525b815160010180835281141561076a575b50506102205161020052610240516101e051808202821582848304141761080a57600080fd5b80905090509050606480820490509050610280516003808202821582848304141761083457600080fd5b8090509050905081818301101561084a57600080fd5b8082019050905061022051808202821582848304141761086957600080fd5b809050905090506102405160648082101561088357600080fd5b808203905090506102205180820282158284830414176108a257600080fd5b8090509050905060648082049050905060046102805180820282158284830414176108cc57600080fd5b809050905090508181830110156108e257600080fd5b8082019050905080806108f457600080fd5b820490509050610220526102005161022051111561094957600161022051610200518082101561092357600080fd5b80820390509050111515610944576102205160005250506000516101c05156505b610982565b600161020051610220518082101561096057600080fd5b80820390509050111515610981576102205160005250506000516101c05156505b5b5b8151600101808352811415610756575b505060006000fd005b600015610b07575b610220526101405261016052610180526101a0526101c0526101e05261020052606036610240376102a060006003818352015b6101406102a051600381106109eb57600080fd5b60200201516101a06102a05160038110610a0457600080fd5b60200201518082028215828483041417610a1d57600080fd5b80905090509050670de0b6b3a7640000808204905090506102406102a05160038110610a4857600080fd5b60200201525b81516001018083528114156109d7575b50506101405161016051610180516101a0516101c0516101e0516102005161022051610240516102605161028051610240516102a052610260516102c052610280516102e0526102005161030052610300516102e0516102c0516102a05160065801610698565b6103605261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261036051600052600051610220515650005b63bb7b8b806000511415610dde576101405160065801610226565b61016052610180526101a0526101405261016080516101c05280602001516101e052806040015161020052506101405161016051610180516101a0516101c0516101e051610200516101c051610220526101e051610240526102005161026052610260516102405161022051600658016105a4565b6102c0526102e05261030052610200526101e0526101c0526101a0526101805261016052610140526102c0805161032052806020015161034052806040015161036052506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e0516103005161032051610340516103605160065801610026565b61038052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610380516103a0526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610320516103405161036051610380516103a051610320516103c052610340516103e05261036051610400526103a0516104205261042051610400516103e0516103c05160065801610698565b610480526103a05261038052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610480516101405261014051670de0b6b3a76400008082028215828483041417610d8657600080fd5b8090509050905060206101c060046318160ddd6101605261017c6008545afa610dae57600080fd5b601f3d11610dbb57600080fd5b6000506101c0518080610dcd57600080fd5b82049050905060005260206000f350005b633883e119600051141561117c5760643560011c15610dfc57600080fd5b6101405160065801610026565b610160526101405261016051610140526101405161016051610180516101a05160065801610226565b6101c0526101e052610200526101a0526101805261016052610140526101c080516101605280602001516101805280604001516101a0525060028060c052602060c020546101c05260018160c052602060c02001546101e05260028160c052602060c020015461020052506101405161016051610180516101a0516101c0516101e0516102005161022051610160516102405261018051610260526101a051610280526101c0516102a0526101e0516102c052610200516102e0526101405161030052610300516102e0516102c0516102a051610280516102605161024051600658016109a4565b6103605261022052610200526101e0526101c0526101a052610180526101605261014052610360516102205261024060006003818352015b60046102405160038110610f6557600080fd5b60200201356102605260643515610fb2576101c06102405160038110610f8a57600080fd5b60200201805161026051818183011015610fa357600080fd5b80820190509050815250610fe8565b6101c06102405160038110610fc657600080fd5b6020020180516102605180821015610fdd57600080fd5b808203905090508152505b5b8151600101808352811415610f52575b50506101405161016051610180516101a0516101c0516101e051610200516102205161024051610160516102605261018051610280526101a0516102a0526101c0516102c0526101e0516102e0526102005161030052610140516103205261032051610300516102e0516102c0516102a0516102805161026051600658016109a4565b610380526102405261022052610200526101e0526101c0526101a052610180526101605261014052610380516102405260206102e060046318160ddd6102805261029c6008545afa6110cd57600080fd5b601f3d116110da57600080fd5b6000506102e05161026052600061028052606435156111185761024051610220518082101561110857600080fd5b8082039050905061028052611139565b61022051610240518082101561112d57600080fd5b80820390509050610280525b6102805161026051808202821582848304141761115557600080fd5b8090509050905061022051808061116b57600080fd5b82049050905060005260206000f350005b634515cef36000511415611195576000610140526111cb565b632b6e993a60005114156111c35760843560011c156111b357600080fd5b60206084610140376000506111cb565b600015611c09575b62ffffff54156111da57600080fd5b600162ffffff55601254156111ee57600080fd5b610140516101605160065801610026565b61018052610160526101405261018051610160526101405161016051610180516101a0516101c05160065801610486565b6101e05261020052610220526101c0526101a0526101805261016052610140526101e080516101805280602001516101a05280604001516101c052506008546101e052602061028060046318160ddd6102205261023c6101e0515afa61129557600080fd5b601f3d116112a257600080fd5b600050610280516102005260028060c052602060c020546102205260018160c052602060c02001546102405260028160c052602060c020015461026052506101405161016051610180516101a0516101c0516101e0516102005161022051610240516102605161028051610180516102a0526101a0516102c0526101c0516102e0526102205161030052610240516103205261026051610340526101605161036052610360516103405161032051610300516102e0516102c0516102a051600658016109a4565b6103c05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103c05161028052610220516102a052610240516102c052610260516102e0526060366103003761036060006003818352015b600461036051600381106113df57600080fd5b602002013561038052610380511515611407576000610200511161140257600080fd5b611634565b610360516003811061141857600080fd5b600060c052602060c02001546103a052610140511561158b57610360516003811061144257600080fd5b600160c052602060c02001543b61145857600080fd5b6000600060646323b872dd6103c052336103e052306104005261038051610420526103dc6000610360516003811061148f57600080fd5b600160c052602060c02001545af16114a657600080fd5b602061046060246370a082316103e05230610400526103fc6103a0515afa6114cd57600080fd5b601f3d116114da57600080fd5b600050610460516103c0526020610460602463a0712d686103e05261038051610400526103fc60006103a0515af161151157600080fd5b601f3d1161151e57600080fd5b600050610460511561152f57600080fd5b602061046060246370a082316103e05230610400526103fc6103a0515afa61155657600080fd5b601f3d1161156357600080fd5b600050610460516103c0518082101561157b57600080fd5b80820390509050610380526115df565b602061048060646323b872dd6103c052336103e052306104005261038051610420526103dc60006103a0515af16115c157600080fd5b601f3d116115ce57600080fd5b600050610480516115de57600080fd5b5b6103805161030061036051600381106115f757600080fd5b60200201526102a0610360516003811061161057600080fd5b6020020180516103805181818301101561162957600080fd5b808201905090508152505b5b81516001018083528114156113cc575b50506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e0516103005161032051610340516103605161018051610380526101a0516103a0526101c0516103c0526102a0516103e0526102c051610400526102e0516104205261016051610440526104405161042051610400516103e0516103c0516103a05161038051600658016109a4565b6104a052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526104a0516103605261028051610360511161175257600080fd5b608036610380376000610200511815611aa4576005546003808202821582848304141761177e57600080fd5b80905090509050600880820490509050610400526006546104205260006104405261046060006003818352015b6102a061046051600381106117bf57600080fd5b6020020151610480526103605161022061046051600381106117e057600080fd5b602002015180820282158284830414176117f957600080fd5b8090509050905061028051808061180f57600080fd5b8204905090506104a052610480516104a051111561184c576104a051610480518082101561183c57600080fd5b808203905090506104405261186d565b610480516104a0518082101561186157600080fd5b80820390509050610440525b6104005161044051808202821582848304141761188957600080fd5b809050905090506402540be4008082049050905061038061046051600381106118b157600080fd5b60200201526104805161038061046051600381106118ce57600080fd5b60200201516104205180820282158284830414176118eb57600080fd5b809050905090506402540be400808204905090508082101561190c57600080fd5b80820390509050610460516003811061192457600080fd5b600260c052602060c02001556102a0610460516003811061194457600080fd5b602002018051610380610460516003811061195e57600080fd5b60200201518082101561197057600080fd5b808203905090508152505b81516001018083528114156117ab575b5050610140610480525b610480515160206104805101610480526104806104805110156119b757611995565b610180516104a0526101a0516104c0526101c0516104e0526102a051610500526102c051610520526102e051610540526101605161056052610560516105405161052051610500516104e0516104c0516104a051600658016109a4565b6105c052610460610480525b6104805152602061048051036104805261014061048051101515611a4357611a20565b6105c0516104605261020051610460516102805180821015611a6457600080fd5b808203905090508082028215828483041417611a7f57600080fd5b80905090509050610280518080611a9557600080fd5b8204905090506103e052611ad0565b600260c052602060c0206102a05181556102c05160018201556102e051600282015550610360516103e0525b6064356103e05110151515611b24576308c379a0610400526020610420526014610440527f536c697070616765207363726577656420796f750000000000000000000000006104605261044050606461041cfd5b60206104a060446340c10f196104005233610420526103e0516104405261041c60006101e0515af1611b5557600080fd5b601f3d11611b6257600080fd5b6000506104a05061030051610400526103205161042052610340516104405261038051610460526103a051610480526103c0516104a052610360516104c052610200516103e051818183011015611bb857600080fd5b808201905090506104e052337f423f6495a08fc652425cf4ed0d1f9e37e571d9b9529b1c1c23cce780b2e7df0d610100610400a26103e051600052600062ffffff5560206000f350600062ffffff55005b6000156120ab575b610200526101405261016052610180526101a0526101c0526101e052610160516101405118611c3f57600080fd5b6000610160511215611c5057600080fd5b60036101605112611c6057600080fd5b6000610140511215611c7157600080fd5b60036101405112611c8157600080fd5b6101405161016051610180516101a0516101c0516101e051610200516102205160065801610026565b6102405261022052610200526101e0526101c0526101a05261018052610160526101405261024051610220526101405161016051610180516101a0516101c0516101e0516102005161022051610240516101a051610260526101c051610280526101e0516102a052610220516102c0526102c0516102a051610280516102605160065801610698565b610320526102405261022052610200526101e0526101c0526101a05261018052610160526101405261032051610240526102205160038082028215828483041417611d7d57600080fd5b809050905090506102605261024051610280526060366102a03761030060006003818352015b61014051610300511415611dbe57610180516102c052611df4565b61016051610300511815611dee576101a06103005160038110611de057600080fd5b60200201516102c052611df3565b611e70565b5b6102a080516102c051818183011015611e0c57600080fd5b8082019050905081525061028051610240518082028215828483041417611e3257600080fd5b809050905090506102c05160038082028215828483041417611e5357600080fd5b809050905090508080611e6557600080fd5b820490509050610280525b8151600101808352811415611da3575b505061028051610240518082028215828483041417611e9e57600080fd5b8090509050905060648082028215828483041417611ebb57600080fd5b809050905090506102605160038082028215828483041417611edc57600080fd5b809050905090508080611eee57600080fd5b820490509050610280526102a0516102405160648082028215828483041417611f1657600080fd5b80905090509050610260518080611f2c57600080fd5b820490509050818183011015611f4157600080fd5b80820190509050610300526102405161032052610340600060ff818352015b610320516102e05261032051610320518082028215828483041417611f8457600080fd5b8090509050905061028051818183011015611f9e57600080fd5b808201905090506002610320518082028215828483041417611fbf57600080fd5b8090509050905061030051818183011015611fd957600080fd5b808201905090506102405180821015611ff157600080fd5b80820390509050808061200357600080fd5b820490509050610320526102e051610320511115612058576001610320516102e0518082101561203257600080fd5b80820390509050111515612053576103205160005250506000516102005156505b612091565b60016102e051610320518082101561206f57600080fd5b80820390509050111515612090576103205160005250506000516102005156505b5b5b8151600101808352811415611f60575b505060006000fd005b635e0d443f60005114156123c357600435808060008112156120c957195b607f1c156120d657600080fd5b905050602435808060008112156120e957195b607f1c156120f657600080fd5b90505061014051610160516101805160065801610226565b6101a0526101c0526101e0526101805261016052610140526101a0805161014052806020015161016052806040015161018052506101405161016051610180516101a0516101c0516101e051610140516102005261016051610220526101805161024052610240516102205161020051600658016105a4565b6102a0526102c0526102e0526101e0526101c0526101a0526101805261016052610140526102a080516101a05280602001516101c05280604001516101e052506101a0600435600381106121da57600080fd5b6020020151604435610140600435600381106121f557600080fd5b6020020151808202821582848304141761220e57600080fd5b80905090509050670de0b6b3a76400008082049050905081818301101561223457600080fd5b80820190509050610200526101405161016051610180516101a0516101c0516101e0516102005161022051600435610240526024356102605261020051610280526101a0516102a0526101c0516102c0526101e0516102e0526102e0516102c0516102a05161028051610260516102405160065801611c11565b6103405261022052610200526101e0526101c0526101a05261018052610160526101405261034051610220526101a0602435600381106122ed57600080fd5b6020020151610220518082101561230357600080fd5b8082039050905060018082101561231957600080fd5b80820390509050610240526102405160055461024051808202821582848304141761234357600080fd5b809050905090506402540be400808204905090508082101561236457600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761238857600080fd5b80905090509050610140602435600381106123a257600080fd5b602002015180806123b257600080fd5b82049050905060005260206000f350005b6367df02ca60005114156126c757600435808060008112156123e157195b607f1c156123ee57600080fd5b9050506024358080600081121561240157195b607f1c1561240e57600080fd5b90505061014051610160516101805160065801610226565b6101a0526101c0526101e0526101805261016052610140526101a0805161014052806020015161016052806040015161018052506101405161016051610180516101a0516101c0516101e051610140516102005261016051610220526101805161024052610240516102205161020051600658016105a4565b6102a0526102c0526102e0526101e0526101c0526101a0526101805261016052610140526102a080516101a05280602001516101c05280604001516101e052506101a0602435600381106124f257600080fd5b60200201516044356402540be400808202821582848304141761251457600080fd5b809050905090506402540be4006005548082101561253157600080fd5b80820390509050808061254357600080fd5b8204905090506101406024356003811061255c57600080fd5b6020020151808202821582848304141761257557600080fd5b80905090509050670de0b6b3a7640000808204905090508082101561259957600080fd5b80820390509050610200526101405161016051610180516101a0516101c0516101e0516102005161022051602435610240526004356102605261020051610280526101a0516102a0526101c0516102c0526101e0516102e0526102e0516102c0516102a05161028051610260516102405160065801611c11565b6103405261022052610200526101e0526101c0526101a0526101805261016052610140526103405161022052610220516101a06004356003811061265657600080fd5b60200201518082101561266857600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761268c57600080fd5b80905090509050610140600435600381106126a657600080fd5b602002015180806126b657600080fd5b82049050905060005260206000f350005b6307211ef760005114156129dd57600435808060008112156126e557195b607f1c156126f257600080fd5b9050506024358080600081121561270557195b607f1c1561271257600080fd5b90505061014051610160516101805160065801610226565b6101a0526101c0526101e0526101805261016052610140526101a0805161014052806020015161016052806040015161018052506101405161016051610180516101a0516101c0516101e051610140516102005261016051610220526101805161024052610240516102205161020051600658016105a4565b6102a0526102c0526102e0526101e0526101c0526101a0526101805261016052610140526102a080516101a05280602001516101c05280604001516101e0525060016102005264e8d4a510006102205264e8d4a51000610240526101a06004356003811061281057600080fd5b60200201516044356102006004356003811061282b57600080fd5b6020020151808202821582848304141761284457600080fd5b8090509050905081818301101561285a57600080fd5b80820190509050610260526101a06024356003811061287857600080fd5b60200201516101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516004356102a0526024356102c052610260516102e0526101a051610300526101c051610320526101e051610340526103405161032051610300516102e0516102c0516102a05160065801611c11565b6103a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103a0518082101561293957600080fd5b8082039050905060018082101561294f57600080fd5b808203905090506102805260055461028051808202821582848304141761297557600080fd5b809050905090506402540be400808204905090506102a052610280516102a051808210156129a257600080fd5b80820390509050610200602435600381106129bc57600080fd5b602002015180806129cc57600080fd5b82049050905060005260206000f350005b630e71d1b96000511415612ccf57600435808060008112156129fb57195b607f1c15612a0857600080fd5b90505060243580806000811215612a1b57195b607f1c15612a2857600080fd5b90505061014051610160516101805160065801610226565b6101a0526101c0526101e0526101805261016052610140526101a0805161014052806020015161016052806040015161018052506101405161016051610180516101a0516101c0516101e051610140516102005261016051610220526101805161024052610240516102205161020051600658016105a4565b6102a0526102c0526102e0526101e0526101c0526101a0526101805261016052610140526102a080516101a05280602001516101c05280604001516101e0525060016102005264e8d4a510006102205264e8d4a51000610240526101a060243560038110612b2657600080fd5b60200201516044356402540be4008082028215828483041417612b4857600080fd5b809050905090506402540be40060055480821015612b6557600080fd5b808203905090508080612b7757600080fd5b82049050905061020060243560038110612b9057600080fd5b60200201518082028215828483041417612ba957600080fd5b8090509050905080821015612bbd57600080fd5b80820390509050610260526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051602435610280526004356102a052610260516102c0526101a0516102e0526101c051610300526101e0516103205261032051610300516102e0516102c0516102a0516102805160065801611c11565b61038052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610380516101a060043560038110612c8257600080fd5b602002015180821015612c9457600080fd5b8082039050905061020060043560038110612cae57600080fd5b60200201518080612cbe57600080fd5b82049050905060005260206000f350005b6000156131b1575b6101a05261014052610160526101805260125415612cf457600080fd5b6101405161016051610180516101a0516101c0516101e0516102005160065801610486565b610220526102405261026052610200526101e0526101c0526101a05261018052610160526101405261022080516101c05280602001516101e0528060400151610200525060028060c052602060c020546102205260018160c052602060c02001546102405260028160c052602060c02001546102605250606036610280376102e060006003818352015b6101c06102e05160038110612db757600080fd5b60200201516102206102e05160038110612dd057600080fd5b60200201518082028215828483041417612de957600080fd5b80905090509050670de0b6b3a7640000808204905090506102806102e05160038110612e1457600080fd5b60200201525b8151600101808352811415612da3575b50506102806101405160038110612e4057600080fd5b6020020151610180516101c06101405160038110612e5d57600080fd5b60200201518082028215828483041417612e7657600080fd5b80905090509050670de0b6b3a764000080820490509050818183011015612e9c57600080fd5b808201905090506102e0526102806101605160038110612ebb57600080fd5b60200201516101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610140516103205261016051610340526102e0516103605261028051610380526102a0516103a0526102c0516103c0526103c0516103a0516103805161036051610340516103205160065801611c11565b61042052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526104205180821015612f9e57600080fd5b80820390509050600180821015612fb457600080fd5b8082039050905061030052610300516005548082028215828483041417612fda57600080fd5b809050905090506402540be400808204905090506103205261030051610320518082101561300757600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761302b57600080fd5b809050905090506101c0610160516003811061304657600080fd5b6020020151808061305657600080fd5b8204905090506103005261032051600654808202821582848304141761307b57600080fd5b809050905090506402540be400808204905090506103405261034051670de0b6b3a764000080820282158284830414176130b457600080fd5b809050905090506101c061016051600381106130cf57600080fd5b602002015180806130df57600080fd5b8204905090506103405261022061014051600381106130fd57600080fd5b60200201516101805181818301101561311557600080fd5b80820190509050610140516003811061312d57600080fd5b600260c052602060c0200155610220610160516003811061314d57600080fd5b6020020151610300518082101561316357600080fd5b80820390509050610340518082101561317b57600080fd5b80820390509050610160516003811061319357600080fd5b600260c052602060c0200155610300516000526000516101a0515650005b633df0212460005114156133d95762ffffff54156131ce57600080fd5b600162ffffff55600435808060008112156131e557195b607f1c156131f257600080fd5b9050506024358080600081121561320557195b607f1c1561321257600080fd5b9050506101405160043561016052602435610180526044356101a0526101a051610180516101605160065801612cd7565b6102005261014052610200516101405260643561014051101515156132a7576308c379a06101605260206101805260176101a0527f546f6f2066657720636f696e7320696e20726573756c740000000000000000006101c0526101a050606461017cfd5b602061022060646323b872dd610160523361018052306101a0526044356101c05261017c6000600435600381106132dd57600080fd5b600060c052602060c02001545af16132f457600080fd5b601f3d1161330157600080fd5b6000506102205161331157600080fd5b6020610200604463a9059cbb610160523361018052610140516101a05261017c60006024356003811061334357600080fd5b600060c052602060c02001545af161335a57600080fd5b601f3d1161336757600080fd5b6000506102005161337757600080fd5b60043561016052604435610180526024356101a052610140516101c052337f8b3e96f2b889fa771c53c981b40daf005f63f637f1869f707052d15a3dd971406080610160a261014051600052600062ffffff5560206000f350600062ffffff55005b63a6417ed660005114156137b25762ffffff54156133f657600080fd5b600162ffffff556004358080600081121561340d57195b607f1c1561341a57600080fd5b9050506024358080600081121561342d57195b607f1c1561343a57600080fd5b9050506004356003811061344d57600080fd5b600160c052602060c02001543b61346357600080fd5b6000600060646323b872dd61014052336101605230610180526044356101a05261015c60006004356003811061349857600080fd5b600160c052602060c02001545af16134af57600080fd5b600435600381106134bf57600080fd5b600060c052602060c020015461014052602061020060246370a0823161018052306101a05261019c610140515afa6134f657600080fd5b601f3d1161350357600080fd5b60005061020051610160526020610200602463a0712d68610180526044356101a05261019c6000610140515af161353957600080fd5b601f3d1161354657600080fd5b600050610200511561355757600080fd5b602061020060246370a0823161018052306101a05261019c610140515afa61357e57600080fd5b601f3d1161358b57600080fd5b6000506102005161016051808210156135a357600080fd5b80820390509050610160526101405161016051610180516004356101a0526024356101c052610160516101e0526101e0516101c0516101a05160065801612cd7565b6102405261018052610160526101405261024051610180526020610220602463db006a756101a052610180516101c0526101bc60006024356003811061362a57600080fd5b600060c052602060c02001545af161364157600080fd5b601f3d1161364e57600080fd5b600050610220511561365f57600080fd5b6024356003811061366f57600080fd5b600160c052602060c02001546101a052602061026060246370a082316101e05230610200526101fc6101a0515afa6136a657600080fd5b601f3d116136b357600080fd5b600050610260516101c0526064356101c05110151515613712576308c379a06101e0526020610200526017610220527f546f6f2066657720636f696e7320696e20726573756c74000000000000000000610240526102205060646101fcfd5b6101a0513b61372057600080fd5b60006000604463a9059cbb6101e05233610200526101c051610220526101fc60006101a0515af161375057600080fd5b6004356101e05260443561020052602435610220526101c05161024052337fd013ca23e77a65003c2c659c5442c00c805371b7fc1ebd4c206c41d1536bd90b60806101e0a26101c051600052600062ffffff5560206000f350600062ffffff55005b63ecb586a560005114156137cb57600061014052613801565b63fce6473660005114156137f95760843560011c156137e957600080fd5b6020608461014037600050613801565b600015613b91575b62ffffff541561381057600080fd5b600162ffffff556101405160065801610427565b6101405260005060085461016052602061020060046318160ddd6101a0526101bc610160515afa61385457600080fd5b601f3d1161386157600080fd5b60005061020051610180526060366101a03761020060006003818352015b610200516003811061389057600080fd5b600260c052602060c0200154610220526102205160043580820282158284830414176138bb57600080fd5b809050905090506101805180806138d157600080fd5b820490509050610240526102205161024051808210156138f057600080fd5b80820390509050610200516003811061390857600080fd5b600260c052602060c0200155610240516101a0610200516003811061392c57600080fd5b6020020152610200516003811061394257600080fd5b600060c052602060c0200154610260526101405115613a48576020610300602463db006a7561028052610240516102a05261029c6000610260515af161398757600080fd5b601f3d1161399457600080fd5b60005061030051156139a557600080fd5b61020051600381106139b657600080fd5b600160c052602060c020015461028052602061032060246370a082316102a052306102c0526102bc610280515afa6139ed57600080fd5b601f3d116139fa57600080fd5b6000506103205161024052610280513b613a1357600080fd5b60006000604463a9059cbb6102a052336102c052610240516102e0526102bc6000610280515af1613a4357600080fd5b613a97565b6020610320604463a9059cbb61028052336102a052610240516102c05261029c6000610260515af1613a7957600080fd5b601f3d11613a8657600080fd5b60005061032051613a9657600080fd5b5b60246102005160038110613aaa57600080fd5b6020020135610240511015613abe57600080fd5b5b815160010180835281141561387f575b505060206102a060446379cc67906102005233610220526004356102405261021c6000610160515af1613b0157600080fd5b601f3d11613b0e57600080fd5b6000506102a0506101a051610200526101c051610220526101e05161024052606036610260376101805160043580821015613b4857600080fd5b808203905090506102c052337fa49d4cf02656aebf8c771f5a8585638a2a15ee6c97cf7205d4208ed7c1df252d60e0610200a2600062ffffff5560606101a0f3600062ffffff55005b639fdaea0c6000511415613baa57600061014052613be0565b635b8369f56000511415613bd85760843560011c15613bc857600080fd5b6020608461014037600050613be0565b600015614630575b62ffffff5415613bef57600080fd5b600162ffffff5560125415613c0357600080fd5b610140516101605160065801610026565b61018052610160526101405261018051610160526101405161016051610180516101a0516101c05160065801610486565b6101e05261020052610220526101c0526101a0526101805261016052610140526101e080516101805280602001516101a05280604001516101c0525060028060c052602060c020546101e05260018160c052602060c02001546102005260028160c052602060c020015461022052506101405161016051610180516101a0516101c0516101e05161020051610220516102405161018051610260526101a051610280526101c0516102a0526101e0516102c052610200516102e0526102205161030052610160516103205261032051610300516102e0516102c0516102a0516102805161026051600658016109a4565b610380526102405261022052610200526101e0526101c0526101a05261018052610160526101405261038051610240526101e051610260526102005161028052610220516102a052600480356102c05280602001356102e0528060400135610300525060016103205264e8d4a510006103405264e8d4a510006103605261038060006003818352015b6102c06103805160038110613dd257600080fd5b60200201516103a05260006103a0511115613ece576101405115613e98576103a0516103206103805160038110613e0857600080fd5b60200201518082028215828483041417613e2157600080fd5b80905090509050670de0b6b3a76400008082028215828483041417613e4557600080fd5b809050905090506101806103805160038110613e6057600080fd5b60200201518080613e7057600080fd5b8204905090506103a0526103a0516102c06103805160038110613e9257600080fd5b60200201525b6102606103805160038110613eac57600080fd5b6020020180516103a05180821015613ec357600080fd5b808203905090508152505b5b8151600101808352811415613dbe575b50506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e0516103005161032051610340516103605161038051610180516103a0526101a0516103c0526101c0516103e052610260516104005261028051610420526102a051610440526101605161046052610460516104405161042051610400516103e0516103c0516103a051600658016109a4565b6104c05261038052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526104c051610380526060366103a0376005546003808202821582848304141761400257600080fd5b80905090509050600880820490509050610400526006546104205261044060006003818352015b610380516101e0610440516003811061404157600080fd5b6020020151808202821582848304141761405a57600080fd5b8090509050905061024051808061407057600080fd5b82049050905061046052610260610440516003811061408e57600080fd5b60200201516104805260006104a052610480516104605111156140d0576104605161048051808210156140c057600080fd5b808203905090506104a0526140f1565b6104805161046051808210156140e557600080fd5b808203905090506104a0525b610400516104a051808202821582848304141761410d57600080fd5b809050905090506402540be400808204905090506104c052610480516104c05161042051808202821582848304141761414557600080fd5b809050905090506402540be400808204905090508082101561416657600080fd5b80820390509050610440516003811061417e57600080fd5b600260c052602060c0200155610260610440516003811061419e57600080fd5b6020020180516104c051808210156141b557600080fd5b808203905090508152506104c0516103a061044051600381106141d757600080fd5b60200201525b8151600101808352811415614029575b5050610140610460525b61046051516020610460510161046052610460610460511015614219576141f7565b61018051610480526101a0516104a0526101c0516104c052610260516104e05261028051610500526102a0516105205261016051610540526105405161052051610500516104e0516104c0516104a05161048051600658016109a4565b6105a052610440610460525b61046051526020610460510361046052610140610460511015156142a557614282565b6105a0516104405260085461046052602061050060046318160ddd6104a0526104bc610460515afa6142d657600080fd5b601f3d116142e357600080fd5b600050610500516104805261024051610440518082101561430357600080fd5b8082039050905061048051808202821582848304141761432257600080fd5b8090509050905061024051808061433857600080fd5b8204905090506104a05260006104a0511861435257600080fd5b6064356104a051111515156143a6576308c379a06104c05260206104e0526014610500527f536c697070616765207363726577656420796f75000000000000000000000000610520526105005060646104dcfd5b602061056060446379cc67906104c052336104e0526104a051610500526104dc6000610460515af16143d757600080fd5b601f3d116143e457600080fd5b600050610560506104c060006003818352015b6102c06104c0516003811061440b57600080fd5b60200201516104e05260006104e051181561457f576104c0516003811061443157600080fd5b600060c052602060c020015461050052610140511561452f5760206105a0602463db006a75610520526104e0516105405261053c6000610500515af161447657600080fd5b601f3d1161448357600080fd5b6000506105a0511561449457600080fd5b6104c051600381106144a557600080fd5b600160c052602060c020015461052052610520513b6144c357600080fd5b60006000604463a9059cbb6105e052336106005260206105c060246370a0823161054052306105605261055c610520515afa6144fe57600080fd5b601f3d1161450b57600080fd5b6000506105c051610620526105fc6000610520515af161452a57600080fd5b61457e565b60206105c0604463a9059cbb6105205233610540526104e0516105605261053c6000610500515af161456057600080fd5b601f3d1161456d57600080fd5b6000506105c05161457d57600080fd5b5b5b5b81516001018083528114156143f7575b50506102c0516104c0526102e0516104e05261030051610500526103a051610520526103c051610540526103e051610560526103805161058052610480516104a051808210156145df57600080fd5b808203905090506105a052337f173599dbf9c6ca6f7c3b590df07ae98a45d74ff54065505141e7de6c46a624c26101006104c0a26104a051600052600062ffffff5560206000f350600062ffffff55005b6000156149a1575b610200526101405261016052610180526101a0526101c0526101e052600061016051121561466557600080fd5b6003610160511261467557600080fd5b610140516003808202821582848304141761468f57600080fd5b80905090509050610220526101e05161024052606036610260376102c060006003818352015b610160516102c05118156146e5576101806102c051600381106146d757600080fd5b6020020151610280526146ea565b614766565b61026080516102805181818301101561470257600080fd5b80820190509050815250610240516101e051808202821582848304141761472857600080fd5b80905090509050610280516003808202821582848304141761474957600080fd5b80905090509050808061475b57600080fd5b820490509050610240525b81516001018083528114156146b5575b5050610240516101e051808202821582848304141761479457600080fd5b80905090509050606480820282158284830414176147b157600080fd5b8090509050905061022051600380820282158284830414176147d257600080fd5b8090509050905080806147e457600080fd5b82049050905061024052610260516101e0516064808202821582848304141761480c57600080fd5b8090509050905061022051808061482257600080fd5b82049050905081818301101561483757600080fd5b808201905090506102c0526101e0516102e052610300600060ff818352015b6102e0516102a0526102e0516102e051808202821582848304141761487a57600080fd5b809050905090506102405181818301101561489457600080fd5b8082019050905060026102e05180820282158284830414176148b557600080fd5b809050905090506102c0518181830110156148cf57600080fd5b808201905090506101e051808210156148e757600080fd5b8082039050905080806148f957600080fd5b8204905090506102e0526102a0516102e051111561494e5760016102e0516102a0518082101561492857600080fd5b80820390509050111515614949576102e05160005250506000516102005156505b614987565b60016102a0516102e0518082101561496557600080fd5b80820390509050111515614986576102e05160005250506000516102005156505b5b5b8151600101808352811415614856575b505060006000fd005b6000156150fa575b610200526101405261016052610180526101a0526101c0526101e0526101405161016051610180516101a0516101c0516101e051610200516102205160065801610026565b6102405261022052610200526101e0526101c0526101a05261018052610160526101405261024051610220526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516101a0516102a0526101c0516102c0526101e0516102e0526102e0516102c0516102a051600658016105a4565b61034052610360526103805261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610340805161024052806020015161026052806040015161028052506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a051610240516102c052610260516102e0526102805161030052610220516103205261032051610300516102e0516102c05160065801610698565b610380526102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052610380516102a052602061034060046318160ddd6102e0526102fc6008545afa614b8d57600080fd5b601f3d11614b9a57600080fd5b600050610340516102c0526102a051610140516102a0518082028215828483041417614bc557600080fd5b809050905090506102c0518080614bdb57600080fd5b82049050905080821015614bee57600080fd5b808203905090506102e052610140610320525b61032051516020610320510161032052610320610320511015614c2357614c01565b610220516103405261016051610360526102405161038052610260516103a052610280516103c0526102e0516103e0526103e0516103c0516103a05161038051610360516103405160065801614638565b61044052610300610320525b6103205152602061032051036103205261014061032051101515614ca357614c80565b610440516103005261024051610320526102605161034052610280516103605260055460038082028215828483041417614cdc57600080fd5b80905090509050600880820490509050610380526101a06101605160038110614d0457600080fd5b60200201516103a0526103c060006003818352015b60006103e0526102406103c05160038110614d3357600080fd5b602002015161040052610160516103c0511415614da357610400516102e0518082028215828483041417614d6657600080fd5b809050905090506102a0518080614d7c57600080fd5b8204905090506103005180821015614d9357600080fd5b808203905090506103e052614df8565b61040051610400516102e0518082028215828483041417614dc357600080fd5b809050905090506102a0518080614dd957600080fd5b82049050905080821015614dec57600080fd5b808203905090506103e0525b6103206103c05160038110614e0c57600080fd5b602002018051610380516103e0518082028215828483041417614e2e57600080fd5b809050905090506402540be4008082049050905080821015614e4f57600080fd5b808203905090508152505b8151600101808352811415614d19575b50506103206101605160038110614e8057600080fd5b60200201516101406103e0525b6103e0515160206103e051016103e0526103e06103e0511015614eaf57614e8d565b610220516104005261016051610420526103205161044052610340516104605261036051610480526102e0516104a0526104a051610480516104605161044051610420516104005160065801614638565b610500526103c06103e0525b6103e0515260206103e051036103e0526101406103e051101515614f2f57614f0c565b6105005180821015614f4057600080fd5b808203905090506103c0526103c051600180821015614f5e57600080fd5b80820390509050670de0b6b3a76400008082028215828483041417614f8257600080fd5b809050905090506103a0518080614f9857600080fd5b8204905090506103c0526102406101605160038110614fb657600080fd5b60200201516103005180821015614fcc57600080fd5b80820390509050670de0b6b3a76400008082028215828483041417614ff057600080fd5b809050905090506103a051808061500657600080fd5b8204905090506103c0518082101561501d57600080fd5b808203905090506103e05261018051156150ad5760016104005264e8d4a510006104205264e8d4a51000610440526103c0516103a051808202821582848304141761506757600080fd5b80905090509050610400610160516003811061508257600080fd5b6020020151808061509257600080fd5b820490509050670de0b6b3a7640000808204905090506103c0525b6103c051610420526103e051610440526040610400525b6000610400511115156150d6576150f2565b60206104005103610420015160206104005103610400526150c4565b610200515650005b63cc2b27d7600051141561511357600061014052615149565b63c532a77460005114156151415760443560011c1561513157600080fd5b6020604461014037600050615149565b600015615240575b6024358080600081121561515957195b607f1c1561516657600080fd5b9050506101405160065801610226565b61016052610180526101a0526101405261016080516101c05280602001516101e052806040015161020052506101405161016051610180516101a0516101c0516101e05161020051600435610220526024356102405261014051610260526101c051610280526101e0516102a052610200516102c0526102c0516102a05161028051610260516102405161022051600658016149a9565b6103205261034052610200526101e0526101c0526101a0526101805261016052610140526103205160005260206000f350005b631a4d01d260005114156152595760006101405261528f565b63517a55a360005114156152875760643560011c1561527757600080fd5b602060646101403760005061528f565b60001561569f575b62ffffff541561529e57600080fd5b600162ffffff55602435808060008112156152b557195b607f1c156152c257600080fd5b905050601254156152d257600080fd5b61014051610160516101805160065801610486565b6101a0526101c0526101e0526101805261016052610140526101a0805161020052806020015161022052806040015161024052506101405161016051610180516101a0516101c0516101e051610200516102205161024051600435610260526024356102805260006102a052610200516102c052610220516102e0526102405161030052610300516102e0516102c0516102a0516102805161026051600658016149a9565b61036052610380526102405261022052610200526101e0526101c0526101a05261018052610160526101405261036080516101605280602001516101805250610160516101a052602435600381106153e357600080fd5b600260c052602060c0200180546101605161018051600654808202821582848304141761540f57600080fd5b809050905090506402540be4008082049050905081818301101561543257600080fd5b808201905090508082101561544657600080fd5b80820390509050815550602061026060446379cc67906101c052336101e052600435610200526101dc60006008545af161547f57600080fd5b601f3d1161548c57600080fd5b60005061026050602435600381106154a357600080fd5b600060c052602060c02001546101c05261014051156155a8576020610260602463db006a756101e05261016051610200526101fc60006101c0515af16154e857600080fd5b601f3d116154f557600080fd5b600050610260511561550657600080fd5b6024356003811061551657600080fd5b600160c052602060c02001546101e052602061028060246370a0823161020052306102205261021c6101e0515afa61554d57600080fd5b601f3d1161555a57600080fd5b600050610280516101a0526101e0513b61557357600080fd5b60006000604463a9059cbb6102005233610220526101a0516102405261021c60006101e0515af16155a357600080fd5b6155f7565b6020610280604463a9059cbb6101e05233610200526101a051610220526101fc60006101c0515af16155d957600080fd5b601f3d116155e657600080fd5b600050610280516155f657600080fd5b5b6044356101a0511015151561564b576308c379a06101e0526020610200526018610220527f4e6f7420656e6f75676820636f696e732072656d6f7665640000000000000000610240526102205060646101fcfd5b6004356101e0526101605161020052337f9e96dd3b997a2a257eec4df9bb6eaf626e206df5f543bd963682d143300be31060406101e0a261016051600052600062ffffff5560206000f350600062ffffff55005b633c157e6460005114156158435760075433146156bb57600080fd5b600b54620151808181830110156156d157600080fd5b808201905090504210156156e457600080fd5b42620151808181830110156156f857600080fd5b80820190509050602435101561570d57600080fd5b6101405160065801610026565b610160526101405261016051610140526004356064808202821582848304141761574357600080fd5b80905090509050610160526000600435111561576657620f424060043510615769565b60005b61577257600080fd5b610140516101605110156157b5576101405161016051600a808202821582848304141761579e57600080fd5b8090509050905010156157b057600080fd5b6157e6565b61014051600a80820282158284830414176157cf57600080fd5b809050905090506101605111156157e557600080fd5b5b6101405160095561016051600a5542600b55602435600c556101405161018052610160516101a052426101c0526024356101e0527fa2b71ec6df949300b59aab36b55e189697b750119dd349fcfa8c0f779e83c2546080610180a1005b63551a658860005114156158c857600754331461585f57600080fd5b6101405160065801610026565b610160526101405261016051610140526101405160095561014051600a5542600b5542600c55610140516101605242610180527f46e22fb3709ad289f62ce63d469248536dbc78d82b84a3d7e74ad606dc2019386040610160a1005b635b5a146760005114156159865760075433146158e457600080fd5b600d54156158f157600080fd5b64012a05f200600435111561590557600080fd5b6402540be400602435111561591957600080fd5b426203f48081818301101561592d57600080fd5b808201905090506101405261014051600d55600435600f556024356010556004356101605260243561018052610140517f351fc5da2fbf480f2225debf3664a4bc90fa9923743aad58b4603f648e931fe06040610160a2005b634f12fe976000511415615a1a5760075433146159a257600080fd5b600d544210156159b157600080fd5b6000600d54186159c057600080fd5b6000600d55600f54610140526010546101605261014051600555610160516006556101405161018052610160516101a0527fbe12859b636aed607d5230b2cc2711f68d70e51060e6cca1f575ef5d2fcc95d16040610180a1005b63226840fb6000511415615a3d576007543314615a3657600080fd5b6000600d55005b636b441a406000511415615ad15760043560a01c15615a5b57600080fd5b6007543314615a6957600080fd5b600e5415615a7657600080fd5b426203f480818183011015615a8a57600080fd5b808201905090506101405261014051600e55600435601155600435610140517f181aa3aa17d4cbf99265dd4443eba009433d3cde79d60164fde1d1a192beb93560006000a3005b636a1c05ae6000511415615b4a576007543314615aed57600080fd5b600e54421015615afc57600080fd5b6000600e5418615b0b57600080fd5b6000600e556011546101405261014051600755610140517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60006000a2005b6386fbf1936000511415615b6d576007543314615b6657600080fd5b6000600e55005b63e2e7d2646000511415615c095760206101c060246370a0823161014052306101605261015c60043560038110615ba357600080fd5b600060c052602060c02001545afa615bba57600080fd5b601f3d11615bc757600080fd5b6000506101c05160043560038110615bde57600080fd5b600260c052602060c020015480821015615bf757600080fd5b8082039050905060005260206000f350005b6330c540856000511415615d32576007543314615c2557600080fd5b61014060006003818352015b6101405160038110615c4257600080fd5b600060c052602060c020015461016052602061022060246370a082316101a052306101c0526101bc610160515afa615c7957600080fd5b601f3d11615c8657600080fd5b600050610220516101405160038110615c9e57600080fd5b600260c052602060c020015480821015615cb757600080fd5b80820390509050610180526000610180511115615d1d576020610240604463a9059cbb6101a052336101c052610180516101e0526101bc6000610160515af1615cff57600080fd5b601f3d11615d0c57600080fd5b60005061024051615d1c57600080fd5b5b5b8151600101808352811415615c31575b5050005b63e36988536000511415615d63576007543314615d4e57600080fd5b4260135411615d5c57600080fd5b6001601255005b633046f9726000511415615d86576007543314615d7f57600080fd5b6000601255005b63c66106576000511415615dbb5760043560038110615da457600080fd5b600060c052602060c020015460005260206000f350005b63b9947eb06000511415615df05760043560038110615dd957600080fd5b600160c052602060c020015460005260206000f350005b634903b0d16000511415615e255760043560038110615e0e57600080fd5b600260c052602060c020015460005260206000f350005b639e266d4f6000511415615e5a5760043560038110615e4357600080fd5b600360c052602060c020015460005260206000f350005b6363543f066000511415615e765760045460005260206000f350005b63ddca3f436000511415615e925760055460005260206000f350005b63fee3f7f96000511415615eae5760065460005260206000f350005b638da5cb5b6000511415615eca5760075460005260206000f350005b6382c630666000511415615ee65760085460005260206000f350005b635409491a6000511415615f025760095460005260206000f350005b63b4b577ad6000511415615f1e57600a5460005260206000f350005b632081066c6000511415615f3a57600b5460005260206000f350005b63140522886000511415615f5657600c5460005260206000f350005b63405e28f86000511415615f7257600d5460005260206000f350005b63e0a0b5866000511415615f8e57600e5460005260206000f350005b6358680d0b6000511415615faa57600f5460005260206000f350005b63e38244626000511415615fc65760105460005260206000f350005b631ec0cdc16000511415615fe25760115460005260206000f350005b5b60006000fd
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000007eeac6cddbd1d0b8af061742d41877d7f707289a0000000000000000000000008e595470ed749b85c6f7669de83eae304c2ec68f00000000000000000000000076eb2fe28b36b3ee97f3adae0c69606eedb2a37c00000000000000000000000048759f220ed983db51fa7a8c0d2aab8f3ce4166a0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000000000000000000005282a4ef67d9c33135340fb3289cc1711c13638c000000000000000000000000000000000000000000000000000000000000025800000000000000000000000000000000000000000000000000000000003d0900000000000000000000000000000000000000000000000000000000012a05f200
-----Decoded View---------------
Arg [0] : _owner (address): 0x7EeAC6CDdbd1D0B8aF061742D41877D7F707289a
Arg [1] : _coins (address[3]): 0x8e595470Ed749b85C6F7669de83EAe304C2ec68F,0x76Eb2FE28b36B3ee97F3Adae0C69606eeDB2A37c,0x48759F220ED983dB51fA7A8C0D2AAb8f3ce4166a
Arg [2] : _underlying_coins (address[3]): 0x6B175474E89094C44Da98b954EedeAC495271d0F,0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48,0xdAC17F958D2ee523a2206206994597C13D831ec7
Arg [3] : _pool_token (address): 0x5282a4eF67D9C33135340fB3289cc1711c13638C
Arg [4] : _A (uint256): 600
Arg [5] : _fee (uint256): 4000000
Arg [6] : _admin_fee (uint256): 5000000000
-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000007eeac6cddbd1d0b8af061742d41877d7f707289a
Arg [1] : 0000000000000000000000008e595470ed749b85c6f7669de83eae304c2ec68f
Arg [2] : 00000000000000000000000076eb2fe28b36b3ee97f3adae0c69606eedb2a37c
Arg [3] : 00000000000000000000000048759f220ed983db51fa7a8c0d2aab8f3ce4166a
Arg [4] : 0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f
Arg [5] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [6] : 000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7
Arg [7] : 0000000000000000000000005282a4ef67d9c33135340fb3289cc1711c13638c
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000258
Arg [9] : 00000000000000000000000000000000000000000000000000000000003d0900
Arg [10] : 000000000000000000000000000000000000000000000000000000012a05f200
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Token Allocations
POL
100.00%
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| POL | 100.00% | $0.103852 | 0.0001 | $0.00001 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.