Latest 25 from a total of 6,300 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Remove_liquidity | 23299580 | 61 days ago | IN | 0 ETH | 0.00001651 | ||||
| Remove_liquidity... | 23239414 | 69 days ago | IN | 0 ETH | 0.00014298 | ||||
| Remove_liquidity... | 22972873 | 106 days ago | IN | 0 ETH | 0.00013096 | ||||
| Remove_liquidity | 22947543 | 110 days ago | IN | 0 ETH | 0.00033024 | ||||
| Remove_liquidity | 22824741 | 127 days ago | IN | 0 ETH | 0.00054766 | ||||
| Remove_liquidity | 22700633 | 145 days ago | IN | 0 ETH | 0.00003584 | ||||
| Remove_liquidity... | 22671958 | 149 days ago | IN | 0 ETH | 0.00025824 | ||||
| Remove_liquidity... | 22238490 | 209 days ago | IN | 0 ETH | 0.00043476 | ||||
| Remove_liquidity... | 21995039 | 243 days ago | IN | 0 ETH | 0.00026401 | ||||
| Remove_liquidity | 21864458 | 261 days ago | IN | 0 ETH | 0.00004696 | ||||
| Remove_liquidity... | 21837595 | 265 days ago | IN | 0 ETH | 0.00020781 | ||||
| Remove_liquidity | 21808521 | 269 days ago | IN | 0 ETH | 0.00012507 | ||||
| Remove_liquidity... | 21347752 | 334 days ago | IN | 0 ETH | 0.00442851 | ||||
| Remove_liquidity | 21266820 | 345 days ago | IN | 0 ETH | 0.00109503 | ||||
| Remove_liquidity... | 21116642 | 366 days ago | IN | 0 ETH | 0.00160243 | ||||
| Exchange | 21116600 | 366 days ago | IN | 0.69401755 ETH | 0.00232526 | ||||
| Remove_liquidity... | 20600495 | 438 days ago | IN | 0 ETH | 0.00023316 | ||||
| Remove_liquidity | 20594567 | 439 days ago | IN | 0 ETH | 0.00017566 | ||||
| Remove_liquidity | 20508317 | 451 days ago | IN | 0 ETH | 0.00011678 | ||||
| Remove_liquidity... | 20202828 | 493 days ago | IN | 0 ETH | 0.00036597 | ||||
| Remove_liquidity | 19835072 | 545 days ago | IN | 0 ETH | 0.00028612 | ||||
| Remove_liquidity... | 19488281 | 593 days ago | IN | 0 ETH | 0.00764656 | ||||
| Remove_liquidity... | 19459740 | 597 days ago | IN | 0 ETH | 0.0076102 | ||||
| Remove_liquidity... | 19458301 | 598 days ago | IN | 0 ETH | 0.00998938 | ||||
| Remove_liquidity... | 19414088 | 604 days ago | IN | 0 ETH | 0.02630914 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Deposit | 23726697 | 38 hrs ago | 0.0983508 ETH | ||||
| Exchange | 23726697 | 38 hrs ago | 0.0983508 ETH | ||||
| Deposit | 23724253 | 47 hrs ago | 0.04768309 ETH | ||||
| Exchange | 23724253 | 47 hrs ago | 0.04768309 ETH | ||||
| Deposit | 23721431 | 2 days ago | 0.02693301 ETH | ||||
| Exchange | 23721431 | 2 days ago | 0.02693301 ETH | ||||
| Deposit | 23721132 | 2 days ago | 0.02946835 ETH | ||||
| Exchange | 23721132 | 2 days ago | 0.02946835 ETH | ||||
| Deposit | 23719027 | 2 days ago | 0.00196701 ETH | ||||
| Exchange | 23719027 | 2 days ago | 0.00196701 ETH | ||||
| Deposit | 23707267 | 4 days ago | 0.00295052 ETH | ||||
| Exchange | 23707267 | 4 days ago | 0.00295052 ETH | ||||
| Transfer | 23706960 | 4 days ago | 0.10016573 ETH | ||||
| Transfer | 23706960 | 4 days ago | 0.10016573 ETH | ||||
| Transfer | 23706960 | 4 days ago | 0.02571978 ETH | ||||
| Transfer | 23706960 | 4 days ago | 0.02571978 ETH | ||||
| Transfer | 23706959 | 4 days ago | 0.11645667 ETH | ||||
| Transfer | 23706959 | 4 days ago | 0.11645667 ETH | ||||
| Deposit | 23706598 | 4 days ago | 0.0029901 ETH | ||||
| Exchange | 23706598 | 4 days ago | 0.0029901 ETH | ||||
| Deposit | 23703139 | 4 days ago | 0.00609774 ETH | ||||
| Exchange | 23703139 | 4 days ago | 0.00609774 ETH | ||||
| Deposit | 23698387 | 5 days ago | 0.02491752 ETH | ||||
| Exchange | 23698387 | 5 days ago | 0.02491752 ETH | ||||
| Deposit | 23697400 | 5 days ago | 0.00167196 ETH |
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Vyper_contract
Compiler Version
vyper:0.2.12
Contract Source Code (Vyper language format)
# @version 0.2.12
# (c) Curve.Fi, 2021
# Pool for USDT/WBTC/WETH or similar
interface ERC20: # Custom ERC20 which works for USDT, WETH and WBTC
def transfer(_to: address, _amount: uint256): nonpayable
def transferFrom(_from: address, _to: address, _amount: uint256): nonpayable
def balanceOf(_user: address) -> uint256: view
interface CurveToken:
def totalSupply() -> uint256: view
def mint(_to: address, _value: uint256) -> bool: nonpayable
def mint_relative(_to: address, frac: uint256) -> uint256: nonpayable
def burnFrom(_to: address, _value: uint256) -> bool: nonpayable
interface Math:
def geometric_mean(unsorted_x: uint256[N_COINS]) -> uint256: view
def reduction_coefficient(x: uint256[N_COINS], fee_gamma: uint256) -> uint256: view
def newton_D(ANN: uint256, gamma: uint256, x_unsorted: uint256[N_COINS]) -> uint256: view
def newton_y(ANN: uint256, gamma: uint256, x: uint256[N_COINS], D: uint256, i: uint256) -> uint256: view
def halfpow(power: uint256, precision: uint256) -> uint256: view
def sqrt_int(x: uint256) -> uint256: view
interface Views:
def get_dy(i: uint256, j: uint256, dx: uint256) -> uint256: view
def calc_token_amount(amounts: uint256[N_COINS], deposit: bool) -> uint256: view
interface WETH:
def deposit(): payable
def withdraw(_amount: uint256): nonpayable
# Events
event TokenExchange:
buyer: indexed(address)
sold_id: uint256
tokens_sold: uint256
bought_id: uint256
tokens_bought: uint256
event AddLiquidity:
provider: indexed(address)
token_amounts: uint256[N_COINS]
fee: uint256
token_supply: uint256
event RemoveLiquidity:
provider: indexed(address)
token_amounts: uint256[N_COINS]
token_supply: uint256
event RemoveLiquidityOne:
provider: indexed(address)
token_amount: uint256
coin_index: uint256
coin_amount: uint256
event CommitNewAdmin:
deadline: indexed(uint256)
admin: indexed(address)
event NewAdmin:
admin: indexed(address)
event CommitNewParameters:
deadline: indexed(uint256)
admin_fee: uint256
mid_fee: uint256
out_fee: uint256
fee_gamma: uint256
price_threshold: uint256
adjustment_step: uint256
ma_half_time: uint256
event NewParameters:
admin_fee: uint256
mid_fee: uint256
out_fee: uint256
fee_gamma: uint256
price_threshold: uint256
adjustment_step: uint256
ma_half_time: uint256
event RampAgamma:
initial_A: uint256
future_A: uint256
initial_time: uint256
future_time: uint256
event StopRampA:
current_A: uint256
current_gamma: uint256
time: uint256
event ClaimAdminFee:
admin: indexed(address)
tokens: uint256
N_COINS: constant(int128) = 3 # <- change
FEE_DENOMINATOR: constant(uint256) = 10 ** 10
PRECISION: constant(uint256) = 10 ** 18 # The precision to convert to
A_MULTIPLIER: constant(uint256) = 100
# These addresses are replaced by the deployer
math: constant(address) = 0x656Dd75d33a6241A0C4C2368eb00441Ad3113ec0
token: constant(address) = 0xcA3d75aC011BF5aD07a98d02f18225F9bD9A6BDF
views: constant(address) = 0xCfB3CFEaE8c3F39aECDf7ec275a00d29ECA08535
coins: constant(address[N_COINS]) = [
0xdAC17F958D2ee523a2206206994597C13D831ec7,
0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599,
0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2,
]
price_scale_packed: uint256 # Internal price scale
price_oracle_packed: uint256 # Price target given by MA
last_prices_packed: uint256
last_prices_timestamp: public(uint256)
initial_A_gamma: public(uint256)
future_A_gamma: public(uint256)
initial_A_gamma_time: public(uint256)
future_A_gamma_time: public(uint256)
price_threshold: public(uint256)
future_price_threshoold: public(uint256)
fee_gamma: public(uint256)
future_fee_gamma: public(uint256)
adjustment_step: public(uint256)
future_adjustment_step: public(uint256)
ma_half_time: public(uint256)
future_ma_half_time: public(uint256)
mid_fee: public(uint256)
out_fee: public(uint256)
admin_fee: public(uint256)
future_mid_fee: public(uint256)
future_out_fee: public(uint256)
future_admin_fee: public(uint256)
balances: public(uint256[N_COINS])
D: public(uint256)
owner: public(address)
future_owner: public(address)
xcp_profit: public(uint256)
xcp_profit_a: public(uint256) # Full profit at last claim of admin fees
virtual_price: public(uint256) # Cached (fast to read) virtual price also used internally
not_adjusted: bool
is_killed: public(bool)
kill_deadline: public(uint256)
transfer_ownership_deadline: public(uint256)
admin_actions_deadline: public(uint256)
admin_fee_receiver: public(address)
KILL_DEADLINE_DT: constant(uint256) = 2 * 30 * 86400
ADMIN_ACTIONS_DELAY: constant(uint256) = 3 * 86400
MIN_RAMP_TIME: constant(uint256) = 86400
MAX_ADMIN_FEE: constant(uint256) = 10 * 10 ** 9
MIN_FEE: constant(uint256) = 5 * 10 ** 5 # 0.5 bps
MAX_FEE: constant(uint256) = 5 * 10 ** 9
MAX_A: constant(uint256) = 10000 * A_MULTIPLIER
MAX_A_CHANGE: constant(uint256) = 10
MIN_GAMMA: constant(uint256) = 10**10
MAX_GAMMA: constant(uint256) = 10**16
NOISE_FEE: constant(uint256) = 10**5 # 0.1 bps
PRICE_SIZE: constant(int128) = 256 / (N_COINS-1)
PRICE_MASK: constant(uint256) = 2**PRICE_SIZE - 1
ALLOWED_EXTRA_PROFIT: constant(uint256) = 10**13 # 0.1 bps above the baseline
# This must be changed for different N_COINS
# For example:
# N_COINS = 3 -> 1 (10**18 -> 10**18)
# N_COINS = 4 -> 10**8 (10**18 -> 10**10)
# PRICE_PRECISION_MUL: constant(uint256) = 1
PRECISIONS: constant(uint256[N_COINS]) = [
10**12, # USDT
10**10, # WBTC
1, # WETH
]
@external
def __init__(
owner: address,
A: uint256,
gamma: uint256,
mid_fee: uint256,
out_fee: uint256,
price_threshold: uint256,
fee_gamma: uint256,
adjustment_step: uint256,
admin_fee: uint256,
ma_half_time: uint256,
initial_prices: uint256[N_COINS-1]
):
self.owner = owner
# Pack A and gamma:
# shifted A + gamma
A_gamma: uint256 = shift(A * A_MULTIPLIER, 128)
A_gamma = bitwise_or(A_gamma, gamma)
self.initial_A_gamma = A_gamma
self.future_A_gamma = A_gamma
self.mid_fee = mid_fee
self.out_fee = out_fee
self.price_threshold = price_threshold
self.fee_gamma = fee_gamma
self.adjustment_step = adjustment_step
self.admin_fee = admin_fee
# Packing prices
packed_prices: uint256 = 0
for k in range(N_COINS-1):
packed_prices = shift(packed_prices, PRICE_SIZE)
p: uint256 = initial_prices[N_COINS-2 - k] # / PRICE_PRECISION_MUL
assert p < PRICE_MASK
packed_prices = bitwise_or(p, packed_prices)
self.price_scale_packed = packed_prices
self.price_oracle_packed = packed_prices
self.last_prices_packed = packed_prices
self.last_prices_timestamp = block.timestamp
self.ma_half_time = ma_half_time
self.xcp_profit_a = 10**18
self.kill_deadline = block.timestamp + KILL_DEADLINE_DT
self.admin_fee_receiver = owner
@payable
@external
def __default__():
pass
@internal
@view
def _packed_view(k: uint256, p: uint256) -> uint256:
assert k < N_COINS-1
return bitwise_and(
shift(p, -PRICE_SIZE * convert(k, int256)),
PRICE_MASK
) # * PRICE_PRECISION_MUL
@external
@view
def price_oracle(k: uint256) -> uint256:
return self._packed_view(k, self.price_oracle_packed)
@external
@view
def price_scale(k: uint256) -> uint256:
return self._packed_view(k, self.price_scale_packed)
@external
@view
def last_prices(k: uint256) -> uint256:
return self._packed_view(k, self.last_prices_packed)
@external
@view
def token() -> address:
return token
@external
@view
def coins(i: uint256) -> address:
_coins: address[N_COINS] = coins
return _coins[i]
@internal
@view
def xp() -> uint256[N_COINS]:
result: uint256[N_COINS] = self.balances
packed_prices: uint256 = self.price_scale_packed
precisions: uint256[N_COINS] = PRECISIONS
result[0] *= PRECISIONS[0]
for i in range(1, N_COINS):
p: uint256 = bitwise_and(packed_prices, PRICE_MASK) * precisions[i] # * PRICE_PRECISION_MUL
result[i] = result[i] * p / PRECISION
packed_prices = shift(packed_prices, -PRICE_SIZE)
return result
@view
@internal
def _A_gamma() -> (uint256, uint256):
t1: uint256 = self.future_A_gamma_time
A_gamma_1: uint256 = self.future_A_gamma
gamma1: uint256 = bitwise_and(A_gamma_1, 2**128-1)
A1: uint256 = shift(A_gamma_1, -128)
if block.timestamp < t1:
# handle ramping up and down of A
A_gamma_0: uint256 = self.initial_A_gamma
t0: uint256 = self.initial_A_gamma_time
# Less readable but more compact way of writing and converting to uint256
# gamma0: uint256 = bitwise_and(A_gamma_0, 2**128-1)
# A0: uint256 = shift(A_gamma_0, -128)
# A1 = A0 + (A1 - A0) * (block.timestamp - t0) / (t1 - t0)
# gamma1 = gamma0 + (gamma1 - gamma0) * (block.timestamp - t0) / (t1 - t0)
t1 -= t0
t0 = block.timestamp - t0
A1 = (shift(A_gamma_0, -128) * (t1 - t0) + A1 * t0) / t1
gamma1 = (bitwise_and(A_gamma_0, 2**128-1) * (t1 - t0) + gamma1 * t0) / t1
return A1, gamma1
@view
@external
def A() -> uint256:
return self._A_gamma()[0] / A_MULTIPLIER
@view
@external
def gamma() -> uint256:
return self._A_gamma()[1]
@view
@external
def A_precise() -> uint256:
return self._A_gamma()[0]
@internal
@view
def _fee(xp: uint256[N_COINS]) -> uint256:
f: uint256 = Math(math).reduction_coefficient(xp, self.fee_gamma)
return (self.mid_fee * f + self.out_fee * (10**18 - f)) / 10**18
@external
@view
def fee() -> uint256:
return self._fee(self.xp())
@external
@view
def fee_calc(xp: uint256[N_COINS]) -> uint256:
return self._fee(xp)
@internal
@view
def get_xcp(D: uint256) -> uint256:
x: uint256[N_COINS] = empty(uint256[N_COINS])
x[0] = D / N_COINS
packed_prices: uint256 = self.price_scale_packed
# No precisions here because we don't switch to "real" units
for i in range(1, N_COINS):
x[i] = D * 10**18 / (N_COINS * bitwise_and(packed_prices, PRICE_MASK)) # ... * PRICE_PRECISION_MUL)
packed_prices = shift(packed_prices, -PRICE_SIZE)
return Math(math).geometric_mean(x)
@external
@view
def get_virtual_price() -> uint256:
return 10**18 * self.get_xcp(self.D) / CurveToken(token).totalSupply()
@internal
def _claim_admin_fees():
receiver: address = self.admin_fee_receiver
xcp_profit: uint256 = self.xcp_profit
vprice: uint256 = self.virtual_price
fees: uint256 = (xcp_profit - self.xcp_profit_a) * self.admin_fee / (2 * 10**10)
if fees > 0:
# Would be nice to recalc D, but we have no bytespace left
frac: uint256 = vprice * 10**18 / (vprice - fees) - 10**18
claimed: uint256 = CurveToken(token).mint_relative(receiver, frac)
total_supply: uint256 = CurveToken(token).totalSupply()
# Gulp here
_coins: address[N_COINS] = coins
for i in range(N_COINS):
self.balances[i] = ERC20(_coins[i]).balanceOf(self)
# Recalculate D b/c we gulped
A: uint256 = 0
gamma: uint256 = 0
A, gamma = self._A_gamma()
xp: uint256[N_COINS] = self.xp()
D: uint256 = Math(math).newton_D(A, gamma, xp)
new_vprice: uint256 = 10**18 * self.get_xcp(D) / total_supply
self.virtual_price = new_vprice
xcp_profit = new_vprice + xcp_profit - vprice
self.xcp_profit_a = xcp_profit
self.xcp_profit = xcp_profit
log ClaimAdminFee(receiver, claimed)
@internal
def tweak_price(A: uint256, gamma: uint256,
_xp: uint256[N_COINS], i: uint256, p_i: uint256,
new_D: uint256 = 0):
price_oracle: uint256[N_COINS-1] = empty(uint256[N_COINS-1])
last_prices: uint256[N_COINS-1] = empty(uint256[N_COINS-1])
price_scale: uint256[N_COINS-1] = empty(uint256[N_COINS-1])
xp: uint256[N_COINS] = empty(uint256[N_COINS])
p_new: uint256[N_COINS-1] = empty(uint256[N_COINS-1])
norm: uint256 = 0
# Update MA if needed
packed_prices: uint256 = self.price_oracle_packed
for k in range(N_COINS-1):
price_oracle[k] = bitwise_and(packed_prices, PRICE_MASK) # * PRICE_PRECISION_MUL
packed_prices = shift(packed_prices, -PRICE_SIZE)
last_prices_timestamp: uint256 = self.last_prices_timestamp
packed_prices = self.last_prices_packed
for k in range(N_COINS-1):
last_prices[k] = bitwise_and(packed_prices, PRICE_MASK) # * PRICE_PRECISION_MUL
packed_prices = shift(packed_prices, -PRICE_SIZE)
if last_prices_timestamp < block.timestamp:
# MA update required
ma_half_time: uint256 = self.ma_half_time
alpha: uint256 = Math(math).halfpow((block.timestamp - last_prices_timestamp) * 10**18 / ma_half_time, 10**10)
packed_prices = 0
for k in range(N_COINS-1):
price_oracle[k] = (last_prices[k] * (10**18 - alpha) + price_oracle[k] * alpha) / 10**18
for k in range(N_COINS-1):
packed_prices = shift(packed_prices, PRICE_SIZE)
p: uint256 = price_oracle[N_COINS-2 - k] # / PRICE_PRECISION_MUL
assert p < PRICE_MASK
packed_prices = bitwise_or(p, packed_prices)
self.price_oracle_packed = packed_prices
self.last_prices_timestamp = block.timestamp
D_unadjusted: uint256 = new_D # Withdrawal methods know new D already
if new_D == 0:
# We will need this a few times (35k gas)
D_unadjusted = Math(math).newton_D(A, gamma, _xp)
packed_prices = self.price_scale_packed
for k in range(N_COINS-1):
price_scale[k] = bitwise_and(packed_prices, PRICE_MASK) # * PRICE_PRECISION_MUL
packed_prices = shift(packed_prices, -PRICE_SIZE)
if p_i > 0:
# Save the last price
if i > 0:
last_prices[i-1] = p_i
else:
# If 0th price changed - change all prices instead
for k in range(N_COINS-1):
last_prices[k] = last_prices[k] * 10**18 / p_i
else:
# calculate real prices
# it would cost 70k gas for a 3-token pool. Sad. How do we do better?
__xp: uint256[N_COINS] = _xp
dx_price: uint256 = __xp[0] / 10**6
__xp[0] += dx_price
for k in range(N_COINS-1):
last_prices[k] = price_scale[k] * dx_price / (_xp[k+1] - Math(math).newton_y(A, gamma, __xp, D_unadjusted, k+1))
packed_prices = 0
for k in range(N_COINS-1):
packed_prices = shift(packed_prices, PRICE_SIZE)
p: uint256 = last_prices[N_COINS-2 - k] # / PRICE_PRECISION_MUL
assert p < PRICE_MASK
packed_prices = bitwise_or(p, packed_prices)
self.last_prices_packed = packed_prices
total_supply: uint256 = CurveToken(token).totalSupply()
old_xcp_profit: uint256 = self.xcp_profit
old_virtual_price: uint256 = self.virtual_price
for k in range(N_COINS-1):
ratio: uint256 = price_oracle[k] * 10**18 / price_scale[k]
if ratio > 10**18:
ratio -= 10**18
else:
ratio = 10**18 - ratio
norm += ratio**2
# Update profit numbers without price adjustment first
xp[0] = D_unadjusted / N_COINS
for k in range(N_COINS-1):
xp[k+1] = D_unadjusted * 10**18 / (N_COINS * price_scale[k])
xcp_profit: uint256 = 10**18
virtual_price: uint256 = 10**18
if old_virtual_price > 0:
xcp: uint256 = Math(math).geometric_mean(xp)
virtual_price = 10**18 * xcp / total_supply
xcp_profit = old_xcp_profit * virtual_price / old_virtual_price
if virtual_price < old_virtual_price:
raise "Loss"
self.xcp_profit = xcp_profit
needs_adjustment: bool = self.not_adjusted
if not needs_adjustment and (virtual_price-10**18 > (xcp_profit-10**18)/2 + ALLOWED_EXTRA_PROFIT):
needs_adjustment = True
self.not_adjusted = True
# self.price_threshold must be > self.adjustment_step
if needs_adjustment and norm > self.price_threshold ** 2 and old_virtual_price > 0:
norm = Math(math).sqrt_int(norm / 10**18) # Need to convert to 1e18 units!
adjustment_step: uint256 = self.adjustment_step
for k in range(N_COINS-1):
p_new[k] = (price_scale[k] * (norm - adjustment_step) + adjustment_step * price_oracle[k]) / norm
# Calculate balances*prices
xp = _xp
for k in range(N_COINS-1):
xp[k+1] = _xp[k+1] * p_new[k] / price_scale[k]
# Calculate "extended constant product" invariant xCP and virtual price
D: uint256 = Math(math).newton_D(A, gamma, xp)
xp[0] = D / N_COINS
for k in range(N_COINS-1):
xp[k+1] = D * 10**18 / (N_COINS * p_new[k])
# We reuse old_virtual_price here but it's not old anymore
old_virtual_price = 10**18 * Math(math).geometric_mean(xp) / total_supply
# Proceed if we've got enough profit
if (old_virtual_price > 10**18) and (2 * (old_virtual_price - 10**18) > xcp_profit - 10**18):
packed_prices = 0
for k in range(N_COINS-1):
packed_prices = shift(packed_prices, PRICE_SIZE)
p: uint256 = p_new[N_COINS-2 - k] # / PRICE_PRECISION_MUL
assert p < PRICE_MASK
packed_prices = bitwise_or(p, packed_prices)
self.price_scale_packed = packed_prices
self.D = D
self.virtual_price = old_virtual_price
return
else:
self.not_adjusted = False
# If we are here, the price_scale adjustment did not happen
# Still need to update the profit counter and D
self.D = D_unadjusted
self.virtual_price = virtual_price
@payable
@external
@nonreentrant('lock')
def exchange(i: uint256, j: uint256, dx: uint256, min_dy: uint256, use_eth: bool = False):
assert not self.is_killed # dev: the pool is killed
assert i != j # dev: coin index out of range
assert i < N_COINS # dev: coin index out of range
assert j < N_COINS # dev: coin index out of range
assert dx > 0 # dev: do not exchange 0 coins
A: uint256 = 0
gamma: uint256 = 0
A, gamma = self._A_gamma()
xp: uint256[N_COINS] = self.balances
ix: uint256 = j
p: uint256 = 0
dy: uint256 = 0
if True: # scope to reduce size of memory when making internal calls later
_coins: address[N_COINS] = coins
if i == 2 and use_eth:
assert msg.value == dx # dev: incorrect eth amount
WETH(coins[2]).deposit(value=msg.value)
else:
assert msg.value == 0 # dev: nonzero eth amount
# assert might be needed for some tokens - removed one to save bytespace
ERC20(_coins[i]).transferFrom(msg.sender, self, dx)
y: uint256 = xp[j]
xp[i] += dx
self.balances[i] = xp[i]
prec_i: uint256 = 0
prec_j: uint256 = 0
price_scale: uint256[N_COINS-1] = empty(uint256[N_COINS-1])
packed_prices: uint256 = self.price_scale_packed
for k in range(N_COINS-1):
price_scale[k] = bitwise_and(packed_prices, PRICE_MASK) # * PRICE_PRECISION_MUL
packed_prices = shift(packed_prices, -PRICE_SIZE)
precisions: uint256[N_COINS] = PRECISIONS
xp[0] *= PRECISIONS[0]
for k in range(1, N_COINS):
xp[k] = xp[k] * price_scale[k-1] * precisions[k] / PRECISION
prec_i = precisions[i]
prec_j = precisions[j]
dy = xp[j] - Math(math).newton_y(A, gamma, xp, self.D, j)
# Not defining new "y" here to have less variables / make subsequent calls cheaper
xp[j] -= dy
dy -= 1
if j > 0:
dy = dy * PRECISION / price_scale[j-1]
dy /= prec_j
dy -= self._fee(xp) * dy / 10**10
assert dy >= min_dy, "Slippage"
y -= dy
self.balances[j] = y
# assert might be needed for some tokens - removed one to save bytespace
if j == 2 and use_eth:
WETH(coins[2]).withdraw(dy)
raw_call(msg.sender, b"", value=dy)
else:
ERC20(_coins[j]).transfer(msg.sender, dy)
xp[j] = y * prec_j
if j > 0:
xp[j] = xp[j] * price_scale[j-1] / PRECISION
# Calculate price
if dx > 10**5 and dy > 10**5:
if i != 0 and j != 0:
p = bitwise_and(
shift(self.last_prices_packed, -PRICE_SIZE * convert(i-1, int256)),
PRICE_MASK
) * (dx * prec_i) / (dy * prec_j) # * PRICE_PRECISION_MUL
elif i == 0:
p = (dx * prec_i) * 10**18 / (dy * prec_j)
else: # j == 0
p = (dy * prec_j) * 10**18 / (dx * prec_i)
ix = i
self.tweak_price(A, gamma, xp, ix, p)
log TokenExchange(msg.sender, i, dx, j, dy)
@external
@view
def get_dy(i: uint256, j: uint256, dx: uint256) -> uint256:
return Views(views).get_dy(i, j, dx)
@view
@internal
def _calc_token_fee(amounts: uint256[N_COINS], xp: uint256[N_COINS]) -> uint256:
# fee = sum(amounts_i - avg(amounts)) * fee' / sum(amounts)
fee: uint256 = self._fee(xp) * N_COINS / (4 * (N_COINS-1))
S: uint256 = 0
for _x in amounts:
S += _x
avg: uint256 = S / N_COINS
Sdiff: uint256 = 0
for _x in amounts:
if _x > avg:
Sdiff += _x - avg
else:
Sdiff += avg - _x
return fee * Sdiff / S + NOISE_FEE
@external
@view
def calc_token_fee(amounts: uint256[N_COINS], xp: uint256[N_COINS]) -> uint256:
return self._calc_token_fee(amounts, xp)
@external
@nonreentrant('lock')
def add_liquidity(amounts: uint256[N_COINS], min_mint_amount: uint256):
assert not self.is_killed # dev: the pool is killed
A: uint256 = 0
gamma: uint256 = 0
A, gamma = self._A_gamma()
_coins: address[N_COINS] = coins
xp: uint256[N_COINS] = self.balances
amountsp: uint256[N_COINS] = amounts
xx: uint256[N_COINS] = empty(uint256[N_COINS])
d_token: uint256 = 0
d_token_fee: uint256 = 0
if True: # Scope to avoid having extra variables in memory later
n_coins_added: uint256 = 0
for i in range(N_COINS):
if amounts[i] > 0:
# assert might be needed for some tokens - removed one to save bytespace
ERC20(_coins[i]).transferFrom(msg.sender, self, amounts[i])
n_coins_added += 1
assert n_coins_added > 0 # dev: no coins to add
for i in range(N_COINS):
bal: uint256 = xp[i] + amounts[i]
xp[i] = bal
self.balances[i] = bal
xx = xp
precisions: uint256[N_COINS] = PRECISIONS
packed_prices: uint256 = self.price_scale_packed
xp[0] *= PRECISIONS[0]
for i in range(1, N_COINS):
price_scale: uint256 = bitwise_and(packed_prices, PRICE_MASK) * precisions[i] # * PRICE_PRECISION_MUL
xp[i] = xp[i] * price_scale / PRECISION
amountsp[i] = amountsp[i] * price_scale / PRECISION
packed_prices = shift(packed_prices, -PRICE_SIZE)
D: uint256 = Math(math).newton_D(A, gamma, xp)
token_supply: uint256 = CurveToken(token).totalSupply()
old_D: uint256 = self.D
if old_D > 0:
d_token = token_supply * D / old_D - token_supply
else:
d_token = self.get_xcp(D) # making initial virtual price equal to 1
assert d_token > 0 # dev: nothing minted
if old_D > 0:
d_token_fee = self._calc_token_fee(amountsp, xp) * d_token / 10**10 + 1
d_token -= d_token_fee
token_supply += d_token
CurveToken(token).mint(msg.sender, d_token)
# Calculate price
# p_i * (dx_i - dtoken / token_supply * xx_i) = sum{k!=i}(p_k * (dtoken / token_supply * xx_k - dx_k))
# Only ix is nonzero
p: uint256 = 0
ix: uint256 = 0
if d_token > 10**5:
n_zeros: uint256 = 0
for i in range(N_COINS):
if amounts[i] == 0:
n_zeros += 1
else:
ix = i
if n_zeros == N_COINS-1:
S: uint256 = 0
last_prices: uint256[N_COINS-1] = empty(uint256[N_COINS-1])
packed_prices: uint256 = self.last_prices_packed
precisions: uint256[N_COINS] = PRECISIONS
for k in range(N_COINS-1):
last_prices[k] = bitwise_and(packed_prices, PRICE_MASK) # * PRICE_PRECISION_MUL
packed_prices = shift(packed_prices, -PRICE_SIZE)
for i in range(N_COINS):
if i != ix:
if i == 0:
S += xx[0] * PRECISIONS[0]
else:
S += xx[i] * last_prices[i-1] * precisions[i] / PRECISION
S = S * d_token / token_supply
p = S * PRECISION / (amounts[ix] * precisions[ix] - d_token * xx[ix] * precisions[ix] / token_supply)
self.tweak_price(A, gamma, xp, ix, p, D)
else:
self.D = D
self.virtual_price = 10**18
self.xcp_profit = 10**18
assert CurveToken(token).mint(msg.sender, d_token)
assert d_token >= min_mint_amount, "Slippage"
log AddLiquidity(msg.sender, amounts, d_token_fee, token_supply)
@external
@nonreentrant('lock')
def remove_liquidity(_amount: uint256, min_amounts: uint256[N_COINS]):
"""
This withdrawal method is very safe, does no complex math
"""
_coins: address[N_COINS] = coins
total_supply: uint256 = CurveToken(token).totalSupply()
assert CurveToken(token).burnFrom(msg.sender, _amount)
balances: uint256[N_COINS] = self.balances
amount: uint256 = _amount - 1 # Make rounding errors favoring other LPs a tiny bit
for i in range(N_COINS):
d_balance: uint256 = balances[i] * amount / total_supply
assert d_balance >= min_amounts[i]
self.balances[i] = balances[i] - d_balance
balances[i] = d_balance # now it's the amounts going out
# assert might be needed for some tokens - removed one to save bytespace
ERC20(_coins[i]).transfer(msg.sender, d_balance)
D: uint256 = self.D
self.D = D - D * amount / total_supply
log RemoveLiquidity(msg.sender, balances, total_supply - _amount)
@view
@external
def calc_token_amount(amounts: uint256[N_COINS], deposit: bool) -> uint256:
return Views(views).calc_token_amount(amounts, deposit)
@internal
@view
def _calc_withdraw_one_coin(A: uint256, gamma: uint256, token_amount: uint256, i: uint256,
calc_price: bool) -> (uint256, uint256, uint256, uint256[N_COINS]):
D: uint256 = self.D
D0: uint256 = D
token_supply: uint256 = CurveToken(token).totalSupply()
assert token_amount <= token_supply # dev: token amount more than supply
assert i < N_COINS # dev: coin out of range
xx: uint256[N_COINS] = self.balances
xp: uint256[N_COINS] = PRECISIONS
price_scale_i: uint256 = PRECISION * PRECISIONS[0]
if True: # To remove packed_prices from memory
packed_prices: uint256 = self.price_scale_packed
xp[0] *= xx[0]
for k in range(1, N_COINS):
p: uint256 = bitwise_and(packed_prices, PRICE_MASK) # * PRICE_PRECISION_MUL
if i == k:
price_scale_i = p * xp[i]
xp[k] = xp[k] * xx[k] * p / PRECISION
packed_prices = shift(packed_prices, -PRICE_SIZE)
# Charge the fee on D, not on y, e.g. reducing invariant LESS than charging the user
fee: uint256 = self._fee(xp)
dD: uint256 = token_amount * D / token_supply
D -= (dD - (fee * dD / (2 * 10**10) + 1))
y: uint256 = Math(math).newton_y(A, gamma, xp, D, i)
dy: uint256 = (xp[i] - y) * PRECISION / price_scale_i
xp[i] = y
# Price calc
p: uint256 = 0
if calc_price and dy > 10**5 and token_amount > 10**5:
# p_i = dD / D0 * sum'(p_k * x_k) / (dy - dD / D0 * y0)
S: uint256 = 0
precisions: uint256[N_COINS] = PRECISIONS
last_prices: uint256[N_COINS-1] = empty(uint256[N_COINS-1])
packed_prices: uint256 = self.last_prices_packed
for k in range(N_COINS-1):
last_prices[k] = bitwise_and(packed_prices, PRICE_MASK) # * PRICE_PRECISION_MUL
packed_prices = shift(packed_prices, -PRICE_SIZE)
for k in range(N_COINS):
if k != i:
if k == 0:
S += xx[0] * PRECISIONS[0]
else:
S += xx[k] * last_prices[k-1] * precisions[k] / PRECISION
S = S * dD / D0
p = S * PRECISION / (dy * precisions[i] - dD * xx[i] * precisions[i] / D0)
return dy, p, D, xp
@view
@external
def calc_withdraw_one_coin(token_amount: uint256, i: uint256) -> uint256:
A: uint256 = 0
gamma: uint256 = 0
A, gamma = self._A_gamma()
return self._calc_withdraw_one_coin(A, gamma, token_amount, i, False)[0]
@external
@nonreentrant('lock')
def remove_liquidity_one_coin(token_amount: uint256, i: uint256, min_amount: uint256):
assert not self.is_killed # dev: the pool is killed
A: uint256 = 0
gamma: uint256 = 0
A, gamma = self._A_gamma()
dy: uint256 = 0
D: uint256 = 0
p: uint256 = 0
xp: uint256[N_COINS] = empty(uint256[N_COINS])
dy, p, D, xp = self._calc_withdraw_one_coin(A, gamma, token_amount, i, True)
assert dy >= min_amount, "Slippage"
self.balances[i] -= dy
assert CurveToken(token).burnFrom(msg.sender, token_amount)
self.tweak_price(A, gamma, xp, i, p, D)
_coins: address[N_COINS] = coins
# assert might be needed for some tokens - removed one to save bytespace
ERC20(_coins[i]).transfer(msg.sender, dy)
log RemoveLiquidityOne(msg.sender, token_amount, i, dy)
@external
@nonreentrant('lock')
def claim_admin_fees():
self._claim_admin_fees()
# Admin parameters
@external
def ramp_A_gamma(future_A: uint256, future_gamma: uint256, future_time: uint256):
assert msg.sender == self.owner # dev: only owner
assert block.timestamp > self.initial_A_gamma_time + (MIN_RAMP_TIME-1)
assert future_time > block.timestamp + (MIN_RAMP_TIME-1) # dev: insufficient time
initial_A: uint256 = 0
initial_gamma: uint256 = 0
initial_A, initial_gamma = self._A_gamma()
initial_A_gamma: uint256 = shift(initial_A, 128)
initial_A_gamma = bitwise_or(initial_A_gamma, initial_gamma)
future_A_p: uint256 = future_A * A_MULTIPLIER
assert future_A > 0
assert future_A < MAX_A
assert future_gamma > MIN_GAMMA-1
assert future_gamma < MAX_GAMMA+1
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_gamma = initial_A_gamma
self.initial_A_gamma_time = block.timestamp
future_A_gamma: uint256 = shift(future_A_p, 128)
future_A_gamma = bitwise_or(future_A_gamma, future_gamma)
self.future_A_gamma_time = future_time
self.future_A_gamma = future_A_gamma
log RampAgamma(initial_A, future_A_p, block.timestamp, future_time)
@external
def stop_ramp_A_gamma():
assert msg.sender == self.owner # dev: only owner
current_A: uint256 = 0
current_gamma: uint256 = 0
current_A, current_gamma = self._A_gamma()
current_A_gamma: uint256 = shift(current_A, 128)
current_A_gamma = bitwise_or(current_A_gamma, current_gamma)
self.initial_A_gamma = current_A_gamma
self.future_A_gamma = current_A_gamma
self.initial_A_gamma_time = block.timestamp
self.future_A_gamma_time = block.timestamp
# now (block.timestamp < t1) is always False, so we return saved A
log StopRampA(current_A, current_gamma, block.timestamp)
@external
def commit_new_parameters(
_new_mid_fee: uint256,
_new_out_fee: uint256,
_new_admin_fee: uint256,
_new_fee_gamma: uint256,
_new_price_threshold: uint256,
_new_adjustment_step: uint256,
_new_ma_half_time: uint256,
):
assert msg.sender == self.owner # dev: only owner
assert self.admin_actions_deadline == 0 # dev: active action
new_mid_fee: uint256 = _new_mid_fee
new_out_fee: uint256 = _new_out_fee
new_admin_fee: uint256 = _new_admin_fee
new_fee_gamma: uint256 = _new_fee_gamma
new_price_threshold: uint256 = _new_price_threshold
new_adjustment_step: uint256 = _new_adjustment_step
new_ma_half_time: uint256 = _new_ma_half_time
# Fees
if new_out_fee != MAX_UINT256:
assert new_out_fee < MAX_FEE+1 # dev: fee is out of range
assert new_out_fee > MIN_FEE-1 # dev: fee is out of range
else:
new_out_fee = self.out_fee
if new_mid_fee == MAX_UINT256:
new_mid_fee = self.mid_fee
assert new_mid_fee <= new_out_fee # dev: mid-fee is too high
if new_admin_fee != MAX_UINT256:
assert new_admin_fee < MAX_ADMIN_FEE+1 # dev: admin fee exceeds maximum
else:
new_admin_fee = self.admin_fee
# AMM parameters
if new_fee_gamma != MAX_UINT256:
assert new_fee_gamma > 0 # dev: fee_gamma out of range [1 .. 2**100]
assert new_fee_gamma < 2**100 # dev: fee_gamma out of range [1 .. 2**100]
else:
new_fee_gamma = self.fee_gamma
if new_price_threshold != MAX_UINT256:
assert new_price_threshold > new_mid_fee # dev: price threshold should be higher than the fee
else:
new_price_threshold = self.price_threshold
if new_adjustment_step == MAX_UINT256:
new_adjustment_step = self.adjustment_step
assert new_adjustment_step <= new_price_threshold # dev: adjustment step should be smaller than price threshold
# MA
if new_ma_half_time != MAX_UINT256:
assert new_ma_half_time > 0 # dev: MA time should be shorter than 1 week
assert new_ma_half_time < 7*86400 # dev: MA time should be shorter than 1 week
else:
new_ma_half_time = self.ma_half_time
_deadline: uint256 = block.timestamp + ADMIN_ACTIONS_DELAY
self.admin_actions_deadline = _deadline
self.future_admin_fee = new_admin_fee
self.future_mid_fee = new_mid_fee
self.future_out_fee = new_out_fee
self.future_fee_gamma = new_fee_gamma
self.future_price_threshoold = new_price_threshold
self.future_adjustment_step = new_adjustment_step
self.future_ma_half_time = new_ma_half_time
log CommitNewParameters(_deadline, new_admin_fee, new_mid_fee, new_out_fee,
new_fee_gamma,
new_price_threshold, new_adjustment_step,
new_ma_half_time)
@external
@nonreentrant('lock')
def apply_new_parameters():
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
admin_fee: uint256 = self.future_admin_fee
if self.admin_fee != admin_fee:
self._claim_admin_fees()
self.admin_fee = admin_fee
mid_fee: uint256 = self.future_mid_fee
self.mid_fee = mid_fee
out_fee: uint256 = self.future_out_fee
self.out_fee = out_fee
fee_gamma: uint256 = self.future_fee_gamma
self.fee_gamma = fee_gamma
price_threshold: uint256 = self.future_price_threshoold
self.price_threshold = price_threshold
adjustment_step: uint256 = self.future_adjustment_step
self.adjustment_step = adjustment_step
ma_half_time: uint256 = self.future_ma_half_time
self.ma_half_time = ma_half_time
log NewParameters(admin_fee, mid_fee, out_fee,
fee_gamma,
price_threshold, adjustment_step,
ma_half_time)
@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
@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 = False
@external
def set_admin_fee_receiver(_admin_fee_receiver: address):
assert msg.sender == self.owner # dev: only owner
self.admin_fee_receiver = _admin_fee_receiverContract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"name":"TokenExchange","inputs":[{"name":"buyer","type":"address","indexed":true},{"name":"sold_id","type":"uint256","indexed":false},{"name":"tokens_sold","type":"uint256","indexed":false},{"name":"bought_id","type":"uint256","indexed":false},{"name":"tokens_bought","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"AddLiquidity","inputs":[{"name":"provider","type":"address","indexed":true},{"name":"token_amounts","type":"uint256[3]","indexed":false},{"name":"fee","type":"uint256","indexed":false},{"name":"token_supply","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidity","inputs":[{"name":"provider","type":"address","indexed":true},{"name":"token_amounts","type":"uint256[3]","indexed":false},{"name":"token_supply","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"RemoveLiquidityOne","inputs":[{"name":"provider","type":"address","indexed":true},{"name":"token_amount","type":"uint256","indexed":false},{"name":"coin_index","type":"uint256","indexed":false},{"name":"coin_amount","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"CommitNewAdmin","inputs":[{"name":"deadline","type":"uint256","indexed":true},{"name":"admin","type":"address","indexed":true}],"anonymous":false,"type":"event"},{"name":"NewAdmin","inputs":[{"name":"admin","type":"address","indexed":true}],"anonymous":false,"type":"event"},{"name":"CommitNewParameters","inputs":[{"name":"deadline","type":"uint256","indexed":true},{"name":"admin_fee","type":"uint256","indexed":false},{"name":"mid_fee","type":"uint256","indexed":false},{"name":"out_fee","type":"uint256","indexed":false},{"name":"fee_gamma","type":"uint256","indexed":false},{"name":"price_threshold","type":"uint256","indexed":false},{"name":"adjustment_step","type":"uint256","indexed":false},{"name":"ma_half_time","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"NewParameters","inputs":[{"name":"admin_fee","type":"uint256","indexed":false},{"name":"mid_fee","type":"uint256","indexed":false},{"name":"out_fee","type":"uint256","indexed":false},{"name":"fee_gamma","type":"uint256","indexed":false},{"name":"price_threshold","type":"uint256","indexed":false},{"name":"adjustment_step","type":"uint256","indexed":false},{"name":"ma_half_time","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"RampAgamma","inputs":[{"name":"initial_A","type":"uint256","indexed":false},{"name":"future_A","type":"uint256","indexed":false},{"name":"initial_time","type":"uint256","indexed":false},{"name":"future_time","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"StopRampA","inputs":[{"name":"current_A","type":"uint256","indexed":false},{"name":"current_gamma","type":"uint256","indexed":false},{"name":"time","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"ClaimAdminFee","inputs":[{"name":"admin","type":"address","indexed":true},{"name":"tokens","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"stateMutability":"nonpayable","type":"constructor","inputs":[{"name":"owner","type":"address"},{"name":"A","type":"uint256"},{"name":"gamma","type":"uint256"},{"name":"mid_fee","type":"uint256"},{"name":"out_fee","type":"uint256"},{"name":"price_threshold","type":"uint256"},{"name":"fee_gamma","type":"uint256"},{"name":"adjustment_step","type":"uint256"},{"name":"admin_fee","type":"uint256"},{"name":"ma_half_time","type":"uint256"},{"name":"initial_prices","type":"uint256[2]"}],"outputs":[]},{"stateMutability":"payable","type":"fallback"},{"stateMutability":"view","type":"function","name":"price_oracle","inputs":[{"name":"k","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":3361},{"stateMutability":"view","type":"function","name":"price_scale","inputs":[{"name":"k","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":3391},{"stateMutability":"view","type":"function","name":"last_prices","inputs":[{"name":"k","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":3421},{"stateMutability":"view","type":"function","name":"token","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":468},{"stateMutability":"view","type":"function","name":"coins","inputs":[{"name":"i","type":"uint256"}],"outputs":[{"name":"","type":"address"}],"gas":582},{"stateMutability":"view","type":"function","name":"A","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":937},{"stateMutability":"view","type":"function","name":"gamma","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":12484},{"stateMutability":"view","type":"function","name":"A_precise","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":929},{"stateMutability":"view","type":"function","name":"fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":21733},{"stateMutability":"view","type":"function","name":"fee_calc","inputs":[{"name":"xp","type":"uint256[3]"}],"outputs":[{"name":"","type":"uint256"}],"gas":11156},{"stateMutability":"view","type":"function","name":"get_virtual_price","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":11642},{"stateMutability":"payable","type":"function","name":"exchange","inputs":[{"name":"i","type":"uint256"},{"name":"j","type":"uint256"},{"name":"dx","type":"uint256"},{"name":"min_dy","type":"uint256"}],"outputs":[]},{"stateMutability":"payable","type":"function","name":"exchange","inputs":[{"name":"i","type":"uint256"},{"name":"j","type":"uint256"},{"name":"dx","type":"uint256"},{"name":"min_dy","type":"uint256"},{"name":"use_eth","type":"bool"}],"outputs":[]},{"stateMutability":"view","type":"function","name":"get_dy","inputs":[{"name":"i","type":"uint256"},{"name":"j","type":"uint256"},{"name":"dx","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":3152},{"stateMutability":"view","type":"function","name":"calc_token_fee","inputs":[{"name":"amounts","type":"uint256[3]"},{"name":"xp","type":"uint256[3]"}],"outputs":[{"name":"","type":"uint256"}],"gas":26702},{"stateMutability":"nonpayable","type":"function","name":"add_liquidity","inputs":[{"name":"amounts","type":"uint256[3]"},{"name":"min_mint_amount","type":"uint256"}],"outputs":[],"gas":682649},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity","inputs":[{"name":"_amount","type":"uint256"},{"name":"min_amounts","type":"uint256[3]"}],"outputs":[],"gas":234127},{"stateMutability":"view","type":"function","name":"calc_token_amount","inputs":[{"name":"amounts","type":"uint256[3]"},{"name":"deposit","type":"bool"}],"outputs":[{"name":"","type":"uint256"}],"gas":3459},{"stateMutability":"view","type":"function","name":"calc_withdraw_one_coin","inputs":[{"name":"token_amount","type":"uint256"},{"name":"i","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":13939},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity_one_coin","inputs":[{"name":"token_amount","type":"uint256"},{"name":"i","type":"uint256"},{"name":"min_amount","type":"uint256"}],"outputs":[],"gas":592064},{"stateMutability":"nonpayable","type":"function","name":"claim_admin_fees","inputs":[],"outputs":[],"gas":355740},{"stateMutability":"nonpayable","type":"function","name":"ramp_A_gamma","inputs":[{"name":"future_A","type":"uint256"},{"name":"future_gamma","type":"uint256"},{"name":"future_time","type":"uint256"}],"outputs":[],"gas":162031},{"stateMutability":"nonpayable","type":"function","name":"stop_ramp_A_gamma","inputs":[],"outputs":[],"gas":157781},{"stateMutability":"nonpayable","type":"function","name":"commit_new_parameters","inputs":[{"name":"_new_mid_fee","type":"uint256"},{"name":"_new_out_fee","type":"uint256"},{"name":"_new_admin_fee","type":"uint256"},{"name":"_new_fee_gamma","type":"uint256"},{"name":"_new_price_threshold","type":"uint256"},{"name":"_new_adjustment_step","type":"uint256"},{"name":"_new_ma_half_time","type":"uint256"}],"outputs":[],"gas":306299},{"stateMutability":"nonpayable","type":"function","name":"apply_new_parameters","inputs":[],"outputs":[],"gas":649370},{"stateMutability":"nonpayable","type":"function","name":"revert_new_parameters","inputs":[],"outputs":[],"gas":23252},{"stateMutability":"nonpayable","type":"function","name":"commit_transfer_ownership","inputs":[{"name":"_owner","type":"address"}],"outputs":[],"gas":77290},{"stateMutability":"nonpayable","type":"function","name":"apply_transfer_ownership","inputs":[],"outputs":[],"gas":65967},{"stateMutability":"nonpayable","type":"function","name":"revert_transfer_ownership","inputs":[],"outputs":[],"gas":23342},{"stateMutability":"nonpayable","type":"function","name":"kill_me","inputs":[],"outputs":[],"gas":40565},{"stateMutability":"nonpayable","type":"function","name":"unkill_me","inputs":[],"outputs":[],"gas":23402},{"stateMutability":"nonpayable","type":"function","name":"set_admin_fee_receiver","inputs":[{"name":"_admin_fee_receiver","type":"address"}],"outputs":[],"gas":38535},{"stateMutability":"view","type":"function","name":"last_prices_timestamp","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3408},{"stateMutability":"view","type":"function","name":"initial_A_gamma","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3438},{"stateMutability":"view","type":"function","name":"future_A_gamma","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3468},{"stateMutability":"view","type":"function","name":"initial_A_gamma_time","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3498},{"stateMutability":"view","type":"function","name":"future_A_gamma_time","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3528},{"stateMutability":"view","type":"function","name":"price_threshold","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3558},{"stateMutability":"view","type":"function","name":"future_price_threshoold","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3588},{"stateMutability":"view","type":"function","name":"fee_gamma","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3618},{"stateMutability":"view","type":"function","name":"future_fee_gamma","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3648},{"stateMutability":"view","type":"function","name":"adjustment_step","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3678},{"stateMutability":"view","type":"function","name":"future_adjustment_step","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3708},{"stateMutability":"view","type":"function","name":"ma_half_time","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3738},{"stateMutability":"view","type":"function","name":"future_ma_half_time","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3768},{"stateMutability":"view","type":"function","name":"mid_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3798},{"stateMutability":"view","type":"function","name":"out_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3828},{"stateMutability":"view","type":"function","name":"admin_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3858},{"stateMutability":"view","type":"function","name":"future_mid_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3888},{"stateMutability":"view","type":"function","name":"future_out_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3918},{"stateMutability":"view","type":"function","name":"future_admin_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3948},{"stateMutability":"view","type":"function","name":"balances","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":4087},{"stateMutability":"view","type":"function","name":"D","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":4008},{"stateMutability":"view","type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":4038},{"stateMutability":"view","type":"function","name":"future_owner","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":4068},{"stateMutability":"view","type":"function","name":"xcp_profit","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":4098},{"stateMutability":"view","type":"function","name":"xcp_profit_a","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":4128},{"stateMutability":"view","type":"function","name":"virtual_price","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":4158},{"stateMutability":"view","type":"function","name":"is_killed","inputs":[],"outputs":[{"name":"","type":"bool"}],"gas":4188},{"stateMutability":"view","type":"function","name":"kill_deadline","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":4218},{"stateMutability":"view","type":"function","name":"transfer_ownership_deadline","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":4248},{"stateMutability":"view","type":"function","name":"admin_actions_deadline","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":4278},{"stateMutability":"view","type":"function","name":"admin_fee_receiver","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":4308}]Contract Creation Code
61018061616c61014039602061616c60c03960c05160a01c1561002157600080fd5b61014051601855610160516064808202821582848304141761004257600080fd5b8090509050905060801b6102c052610180516102c051176102c0526102c0516004556102c0516005556101a0516010556101c0516011556101e05160085561020051600a5561022051600c556102405160125560006102e05261030060006002818352015b6102e05160801b6102e052610280600161030051808210156100c857600080fd5b80820390509050600281106100dc57600080fd5b6020020151610320526fffffffffffffffffffffffffffffffff610320511061010457600080fd5b6102e05161032051176102e0525b81516001018083528114156100a7575b50506102e0516000556102e0516001556102e0516002554260035561026051600e55670de0b6b3a7640000601b5542624f1a0081818301101561016457600080fd5b80820190509050601f556101405160225561615456600436101561000d576137d7565b600035601c52600051635b41b90881141561002d5760006101405261005e565b63394747c58114156100595760843560011c1561004957600080fd5b602060846101403760005061005e565b610d2e565b6023541561006b57600080fd5b6001602355601e541561007d57600080fd5b6024356004351861008d57600080fd5b60036004351061009c57600080fd5b6003602435106100ab57600080fd5b6000604435116100ba57600080fd5b6040366101603761014051610160516101805160065801613a18565b6101a0526101c0526101805261016052610140526101a080808080516101e05250506020810190508080805161020052505050506101e08051610160528060200151610180525060168060c052602060c020546101a05260018160c052602060c02001546101c05260028160c052602060c02001546101e052506024356102005260403661022037600115610c3a5773dac17f958d2ee523a2206206994597c13d831ec761026052732260fac5e5542a773aa44fbcfedf7c193bc2c5996102805273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26102a052600260043514156101c457610140516101c7565b60005b156102315760443534146101da57600080fd5b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc23b6101f957600080fd5b60006000600463d0e30db06102c0526102dc3473c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af161022c57600080fd5b6102a6565b341561023c57600080fd5b6102606004356003811061024f57600080fd5b60200201513b61025e57600080fd5b6000600060646323b872dd6102c052336102e0523061030052604435610320526102dc60006102606004356003811061029657600080fd5b60200201515af16102a657600080fd5b6101a0602435600381106102b957600080fd5b60200201516102c0526101a0600435600381106102d557600080fd5b6020020180516044358181830110156102ed57600080fd5b808201905090508152506101a06004356003811061030a57600080fd5b60200201516004356003811061031f57600080fd5b601660c052602060c02001556080366102e0376000546103605261038060006002818352015b6fffffffffffffffffffffffffffffffff6103605116610320610380516002811061036f57600080fd5b60200201526103605160801c610360525b8151600101808352811415610345575b505064e8d4a51000610380526402540be4006103a05260016103c0526101a0805164e8d4a5100080820282158284830414176103cb57600080fd5b809050905090508152506103e060016002818352015b6101a06103e051600381106103f557600080fd5b60200201516103206103e05160018082101561041057600080fd5b808203905090506002811061042457600080fd5b6020020151808202821582848304141761043d57600080fd5b809050905090506103806103e0516003811061045857600080fd5b6020020151808202821582848304141761047157600080fd5b80905090509050670de0b6b3a7640000808204905090506101a06103e0516003811061049c57600080fd5b60200201525b81516001018083528114156103e1575b5050610380600435600381106104c757600080fd5b60200201516102e052610380602435600381106104e357600080fd5b6020020151610300526101a0602435600381106104ff57600080fd5b6020020151602061052060e46336bc88556103e052610160516104005261018051610420526101a051610440526101c051610460526101e051610480526017546104a0526024356104c0526103fc73656dd75d33a6241a0c4c2368eb00441ad3113ec05afa61056d57600080fd5b601f3d1161057a57600080fd5b600050610520518082101561058e57600080fd5b80820390509050610240526101a0602435600381106105ac57600080fd5b60200201805161024051808210156105c357600080fd5b8082039050905081525061024080516001808210156105e157600080fd5b80820390509050815250600060243511156106625761024051670de0b6b3a7640000808202821582848304141761061757600080fd5b8090509050905061032060243560018082101561063357600080fd5b808203905090506002811061064757600080fd5b6020020151808061065757600080fd5b820490509050610240525b610240805161030051808061067657600080fd5b82049050905081525061024080516101406103e0525b6103e0515160206103e051016103e0526103e06103e05110156106ae5761068c565b6101a051610400526101c051610420526101e0516104405261044051610420516104005160065801613c23565b6104a0526103c06103e0525b6103e0515260206103e051036103e0526101406103e05110151561070a576106e7565b6104a05161024051808202821582848304141761072657600080fd5b809050905090506402540be400808204905090508082101561074757600080fd5b8082039050905081525060643561024051101515156107a5576308c379a06103e0526020610400526008610420527f536c697070616765000000000000000000000000000000000000000000000000610440526104205060646103fcfd5b6102c0805161024051808210156107bb57600080fd5b808203905090508152506102c051602435600381106107d957600080fd5b601660c052602060c0200155600260243514156107f957610140516107fc565b60005b156108a15773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc23b61082057600080fd5b600060006024632e1a7d4d6103e05261024051610400526103fc600073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af161085c57600080fd5b60006103e0526103e08051602001806104208284600060045af161087f57600080fd5b5050600060006104205161044061024051335af161089c57600080fd5b610907565b610260602435600381106108b457600080fd5b60200201513b6108c357600080fd5b60006000604463a9059cbb6103e052336104005261024051610420526103fc6000610260602435600381106108f757600080fd5b60200201515af161090757600080fd5b6102c05161030051808202821582848304141761092357600080fd5b809050905090506101a06024356003811061093d57600080fd5b6020020152600060243511156109d7576101a06024356003811061096057600080fd5b602002015161032060243560018082101561097a57600080fd5b808203905090506002811061098e57600080fd5b602002015180820282158284830414176109a757600080fd5b80905090509050670de0b6b3a7640000808204905090506101a0602435600381106109d157600080fd5b60200201525b620186a060443511156109f257620186a061024051116109f5565b60005b15610c3a5760006004351815610a115760006024351415610a14565b60005b15610b28576fffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80600435600180821015610a5d57600080fd5b80820390509050600160ff1b8110610a7457600080fd5b8082028215828483051417610a8857600080fd5b809050905090506000811215610aa557600254816000031c610aab565b600254811b5b9050166044356102e0518082028215828483041417610ac957600080fd5b809050905090508082028215828483041417610ae457600080fd5b8090509050905061024051610300518082028215828483041417610b0757600080fd5b809050905090508080610b1957600080fd5b82049050905061022052610c3a565b6004351515610bb4576044356102e0518082028215828483041417610b4c57600080fd5b80905090509050670de0b6b3a76400008082028215828483041417610b7057600080fd5b8090509050905061024051610300518082028215828483041417610b9357600080fd5b809050905090508080610ba557600080fd5b82049050905061022052610c3a565b61024051610300518082028215828483041417610bd057600080fd5b80905090509050670de0b6b3a76400008082028215828483041417610bf457600080fd5b809050905090506044356102e0518082028215828483041417610c1657600080fd5b809050905090508080610c2857600080fd5b82049050905061022052600435610200525b6101405161016051610180516101a0516101c0516101e051610200516102205161024051610160516102605261018051610280526101a0516102a0526101c0516102c0526101e0516102e0526102005161030052610220516103205261032051610300516102e0516102c0516102a0516102805161026051600658016143aa565b6102405261022052610200526101e0526101c0526101a05261018052610160526101405260005060043561026052604435610280526024356102a052610240516102c052337fb2e76ae99761dc136e598d4a629bb347eccb9532a5f8bbd72e18467c3c34cc986080610260a26000602355005b6368727653811415610d75573415610d4557600080fd5b60043561014052600154610160526101605161014051600658016137d9565b6101c0526101c05160005260206000f35b63a3f7cdd5811415610dbc573415610d8c57600080fd5b60043561014052600054610160526101605161014051600658016137d9565b6101c0526101c05160005260206000f35b6359189017811415610e03573415610dd357600080fd5b60043561014052600254610160526101605161014051600658016137d9565b6101c0526101c05160005260206000f35b63fc0c546a811415610e38573415610e1a57600080fd5b73ca3d75ac011bf5ad07a98d02f18225f9bd9a6bdf60005260206000f35b63c6610657811415610ebb573415610e4f57600080fd5b73dac17f958d2ee523a2206206994597c13d831ec761014052732260fac5e5542a773aa44fbcfedf7c193bc2c5996101605273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26101805261014060043560038110610ead57600080fd5b602002015160005260206000f35b63f446c1d0811415610f19573415610ed257600080fd5b60065801613a18565b61014052610160526101408080808051610180525050602081019050808080516101a052505050506101805160648082049050905060005260206000f35b63b1373929811415610f71573415610f3057600080fd5b60065801613a18565b61014052610160526101408080808051610180525050602081019050808080516101a052505050506101806020015160005260206000f35b6376a2f0f0811415610fc6573415610f8857600080fd5b60065801613a18565b61014052610160526101408080808051610180525050602081019050808080516101a052505050506101805160005260206000f35b63ddca3f4381141561107c573415610fdd57600080fd5b60065801613883565b61014052610160526101805261014080516101a05280602001516101c05280604001516101e052506101405161016051610180516101a0516101c0516101e0516101a051610200526101c051610220526101e0516102405261024051610220516102005160065801613c23565b6102a0526101e0526101c0526101a0526101805261016052610140526102a05160005260206000f35b63572e56258114156110d457341561109357600080fd5b60048035610140528060200135610160528060400135610180525061018051610160516101405160065801613c23565b6101e0526101e05160005260206000f35b63bb7b8b8081141561118c5734156110eb57600080fd5b670de0b6b3a7640000601754610140526101405160065801613d30565b6101a0526101a051808202821582848304141761112457600080fd5b80905090509050602061022060046318160ddd6101c0526101dc73ca3d75ac011bf5ad07a98d02f18225f9bd9a6bdf5afa61115e57600080fd5b601f3d1161116b57600080fd5b60005061022051808061117d57600080fd5b82049050905060005260206000f35b63556d6e9f8114156111fb5734156111a357600080fd5b6020610200606463556d6e9f61014052606060046101603761015c73cfb3cfeae8c3f39aecdf7ec275a00d29eca085355afa6111de57600080fd5b601f3d116111eb57600080fd5b6000506102005160005260206000f35b63cde699fa81141561127a57341561121257600080fd5b600480356101405280602001356101605280604001356101805250606480356101a05280602001356101c05280604001356101e052506101e0516101c0516101a0516101805161016051610140516006580161553a565b610240526102405160005260206000f35b634515cef3811415611fc8576023541561129357600080fd5b600160235534156112a357600080fd5b601e54156112b057600080fd5b60403661014037610140516101605160065801613a18565b610180526101a052610160526101405261018080808080516101c0525050602081019050808080516101e052505050506101c08051610140528060200151610160525073dac17f958d2ee523a2206206994597c13d831ec761018052732260fac5e5542a773aa44fbcfedf7c193bc2c5996101a05273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26101c05260168060c052602060c020546101e05260018160c052602060c02001546102005260028160c052602060c0200154610220525060048035610240528060200135610260528060400135610280525060a0366102a0376001156116ed5760006103405261036060006003818352015b6000600461036051600381106113d957600080fd5b602002013511156114865761018061036051600381106113f857600080fd5b60200201513b61140757600080fd5b6000600060646323b872dd61038052336103a052306103c0526004610360516003811061143357600080fd5b60200201356103e05261039c6000610180610360516003811061145557600080fd5b60200201515af161146557600080fd5b6103408051600181818301101561147b57600080fd5b808201905090508152505b81516001018083528114156113c4575b5050600061034051116114a857600080fd5b61036060006003818352015b6101e061036051600381106114c857600080fd5b6020020151600461036051600381106114e057600080fd5b60200201358181830110156114f457600080fd5b8082019050905061038052610380516101e0610360516003811061151757600080fd5b602002015261038051610360516003811061153157600080fd5b601660c052602060c02001555b81516001018083528114156114b4575b50506101e0516102a052610200516102c052610220516102e05264e8d4a51000610360526402540be4006103805260016103a0526000546103c0526101e0805164e8d4a5100080820282158284830414176115a857600080fd5b809050905090508152506103e060016002818352015b6fffffffffffffffffffffffffffffffff6103c051166103606103e051600381106115e857600080fd5b6020020151808202821582848304141761160157600080fd5b80905090509050610400526101e06103e0516003811061162057600080fd5b602002015161040051808202821582848304141761163d57600080fd5b80905090509050670de0b6b3a7640000808204905090506101e06103e0516003811061166857600080fd5b60200201526102406103e0516003811061168157600080fd5b602002015161040051808202821582848304141761169e57600080fd5b80905090509050670de0b6b3a7640000808204905090506102406103e051600381106116c957600080fd5b60200201526103c05160801c6103c0525b81516001018083528114156115be575b50505b602061046060a463c7fab708610360526101405161038052610160516103a0526101e0516103c052610200516103e052610220516104005261037c73656dd75d33a6241a0c4c2368eb00441ad3113ec05afa61174857600080fd5b601f3d1161175557600080fd5b600050610460516103405260206103e060046318160ddd6103805261039c73ca3d75ac011bf5ad07a98d02f18225f9bd9a6bdf5afa61179357600080fd5b601f3d116117a057600080fd5b6000506103e0516103605260175461038052600061038051111561181757610360516103405180820282158284830414176117da57600080fd5b809050905090506103805180806117f057600080fd5b820490509050610360518082101561180757600080fd5b808203905090506103005261188e565b6101406103a0525b6103a0515160206103a051016103a0526103a06103a05110156118415761181f565b610340516103c0526103c05160065801613d30565b610420526103806103a0525b6103a0515260206103a051036103a0526101406103a05110151561188557611862565b61042051610300525b6000610300511161189e57600080fd5b6000610380511115611eaf576101406103a0525b6103a0515160206103a051016103a0526103a06103a05110156118d4576118b2565b610240516103c052610260516103e05261028051610400526101e0516104205261020051610440526102205161046052610460516104405161042051610400516103e0516103c0516006580161553a565b6104c0526103806103a0525b6103a0515260206103a051036103a0526101406103a05110151561195457611931565b6104c05161030051808202821582848304141761197057600080fd5b809050905090506402540be40080820490509050600181818301101561199557600080fd5b8082019050905061032052610300805161032051808210156119b657600080fd5b808203905090508152506103608051610300518181830110156119d857600080fd5b80820190509050815250602061044060446340c10f196103a052336103c052610300516103e0526103bc600073ca3d75ac011bf5ad07a98d02f18225f9bd9a6bdf5af1611a2457600080fd5b601f3d11611a3157600080fd5b600050610440506040366103a037620186a0610300511115611de95760006103e05261040060006003818352015b60046104005160038110611a7257600080fd5b60200201351515611aa2576103e080516001818183011015611a9357600080fd5b80820190509050815250611aab565b610400516103c0525b8151600101808352811415611a5f575b505060026103e0511415611de957606036610400376002546104605264e8d4a51000610480526402540be4006104a05260016104c0526104e060006002818352015b6fffffffffffffffffffffffffffffffff61046051166104206104e05160028110611b2757600080fd5b60200201526104605160801c610460525b8151600101808352811415611afd575b50506104e060006003818352015b6103c0516104e0511815611c7c576104e0511515611bb65761040080516102a05164e8d4a510008082028215828483041417611b9157600080fd5b80905090509050818183011015611ba757600080fd5b80820190509050815250611c7c565b61040080516102a06104e05160038110611bcf57600080fd5b60200201516104206104e051600180821015611bea57600080fd5b8082039050905060028110611bfe57600080fd5b60200201518082028215828483041417611c1757600080fd5b809050905090506104806104e05160038110611c3257600080fd5b60200201518082028215828483041417611c4b57600080fd5b80905090509050670de0b6b3a764000080820490509050818183011015611c7157600080fd5b808201905090508152505b8151600101808352811415611b56575b505061040051610300518082028215828483041417611caa57600080fd5b80905090509050610360518080611cc057600080fd5b8204905090506104005261040051670de0b6b3a76400008082028215828483041417611ceb57600080fd5b8090509050905060046103c05160038110611d0557600080fd5b60200201356104806103c05160038110611d1e57600080fd5b60200201518082028215828483041417611d3757600080fd5b80905090509050610300516102a06103c05160038110611d5657600080fd5b60200201518082028215828483041417611d6f57600080fd5b809050905090506104806103c05160038110611d8a57600080fd5b60200201518082028215828483041417611da357600080fd5b80905090509050610360518080611db957600080fd5b82049050905080821015611dcc57600080fd5b808203905090508080611dde57600080fd5b8204905090506103a0525b6101406103e0525b6103e0515160206103e051016103e0526103e06103e0511015611e1357611df1565b610140516104005261016051610420526101e05161044052610200516104605261022051610480526103c0516104a0526103a0516104c052610340516104e0526104e0516104c0516104a0516104805161046051610440516104205161040051600658016143e0565b6103c06103e0525b6103e0515260206103e051036103e0526101406103e051101515611ea757611e84565b600050611f2d565b61034051601755670de0b6b3a7640000601c55670de0b6b3a7640000601a55602061044060446340c10f196103a052336103c052610300516103e0526103bc600073ca3d75ac011bf5ad07a98d02f18225f9bd9a6bdf5af1611f1057600080fd5b601f3d11611f1d57600080fd5b60005061044051611f2d57600080fd5b6064356103005110151515611f81576308c379a06103a05260206103c05260086103e0527f536c697070616765000000000000000000000000000000000000000000000000610400526103e05060646103bcfd5b606060046103a03761032051610400526103605161042052337f96b486485420b963edd3fdec0b0195730035600feb7de6f544383d7950fa97ee60a06103a0a26000602355005b63ecb586a581141561235e5760235415611fe157600080fd5b60016023553415611ff157600080fd5b73dac17f958d2ee523a2206206994597c13d831ec761014052732260fac5e5542a773aa44fbcfedf7c193bc2c5996101605273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc261018052602061022060046318160ddd6101c0526101dc73ca3d75ac011bf5ad07a98d02f18225f9bd9a6bdf5afa61206f57600080fd5b601f3d1161207c57600080fd5b600050610220516101a052602061026060446379cc67906101c052336101e052600435610200526101dc600073ca3d75ac011bf5ad07a98d02f18225f9bd9a6bdf5af16120c857600080fd5b601f3d116120d557600080fd5b600050610260516120e557600080fd5b60168060c052602060c020546101c05260018160c052602060c02001546101e05260028160c052602060c0200154610200525060043560018082101561212a57600080fd5b808203905090506102205261024060006003818352015b6101c0610240516003811061215557600080fd5b602002015161022051808202821582848304141761217257600080fd5b809050905090506101a051808061218857600080fd5b82049050905061026052602461024051600381106121a557600080fd5b60200201356102605110156121b957600080fd5b6101c061024051600381106121cd57600080fd5b602002015161026051808210156121e357600080fd5b8082039050905061024051600381106121fb57600080fd5b601660c052602060c0200155610260516101c0610240516003811061221f57600080fd5b6020020152610140610240516003811061223857600080fd5b60200201513b61224757600080fd5b60006000604463a9059cbb61028052336102a052610260516102c05261029c6000610140610240516003811061227c57600080fd5b60200201515af161228c57600080fd5b8151600101808352811415612141575b50506017546102405261024051610240516102205180820282158284830414176122c557600080fd5b809050905090506101a05180806122db57600080fd5b820490509050808210156122ee57600080fd5b808203905090506017556101c051610260526101e05161028052610200516102a0526101a0516004358082101561232457600080fd5b808203905090506102c052337fd6cc314a0b1e3b2579f8e64248e82434072e8271290eef8ad0886709304195f56080610260a26000602355005b633883e1198114156123f757341561237557600080fd5b60643560011c1561238557600080fd5b60206102206084633883e11961014052600480356101605280602001356101805280604001356101a052506064356101c05261015c73cfb3cfeae8c3f39aecdf7ec275a00d29eca085355afa6123da57600080fd5b601f3d116123e757600080fd5b6000506102205160005260206000f35b634fb08c5e81141561253d57341561240e57600080fd5b60403661014037610140516101605160065801613a18565b610180526101a052610160526101405261018080808080516101c0525050602081019050808080516101e052505050506101c08051610140528060200151610160525061014051610160516101405161018052610160516101a052604060046101c037600061020052610200516101e0516101c0516101a0516101805160065801615777565b61026052610280526102a0526102c0526102e05261030052610160526101405261026080808080516103205250506020810190508080805161034052505060208101905080808051610360525050602081019050808080808051610380525050602081019050808080516103a0525050602081019050808080516103c0525050505050506103205160005260206000f35b63f1dc3cc981141561298a576023541561255657600080fd5b6001602355341561256657600080fd5b601e541561257357600080fd5b60403661014037610140516101605160065801613a18565b610180526101a052610160526101405261018080808080516101c0525050602081019050808080516101e052505050506101c08051610140528060200151610160525060c036610180376101405161016051610180516101a0516101c0516101e051610200516102205161014051610240526101605161026052604060046102803760016102c0526102c0516102a05161028051610260516102405160065801615777565b610320526103405261036052610380526103a0526103c05261022052610200526101e0526101c0526101a05261018052610160526101405261032080808080516103e052505060208101905080808051610400525050602081019050808080516104205250506020810190508080808080516104405250506020810190508080805161046052505060208101905080808051610480525050505050506103e080516101805280602001516101c05280604001516101a0528060600180516101e05280602001516102005280604001516102205250506044356101805110151515612759576308c379a0610240526020610260526008610280527f536c6970706167650000000000000000000000000000000000000000000000006102a05261028050606461025cfd5b6024356003811061276957600080fd5b601660c052602060c020018054610180518082101561278757600080fd5b8082039050905081555060206102e060446379cc67906102405233610260526004356102805261025c600073ca3d75ac011bf5ad07a98d02f18225f9bd9a6bdf5af16127d257600080fd5b601f3d116127df57600080fd5b6000506102e0516127ef57600080fd5b6101405161016051610180516101a0516101c0516101e0516102005161022051610140516102405261016051610260526101e05161028052610200516102a052610220516102c0526024356102e0526101c051610300526101a0516103205261032051610300516102e0516102c0516102a051610280516102605161024051600658016143e0565b61022052610200526101e0526101c0526101a05261018052610160526101405260005073dac17f958d2ee523a2206206994597c13d831ec761024052732260fac5e5542a773aa44fbcfedf7c193bc2c5996102605273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc261028052610240602435600381106128f857600080fd5b60200201513b61290757600080fd5b60006000604463a9059cbb6102a052336102c052610180516102e0526102bc60006102406024356003811061293b57600080fd5b60200201515af161294b57600080fd5b604060046102a037610180516102e052337f5ad056f2e28a8cec232015406b843668c1e36cda598127ec3b8c59b8c72773a060606102a0a26000602355005b63c93f49e88114156129c657602354156129a357600080fd5b600160235534156129b357600080fd5b60065801613e71565b6000506000602355005b635e248072811415612c015734156129dd57600080fd5b60185433146129eb57600080fd5b6006546201517f818183011015612a0157600080fd5b808201905090504211612a1357600080fd5b426201517f818183011015612a2757600080fd5b8082019050905060443511612a3b57600080fd5b60403661014037610140516101605160065801613a18565b610180526101a052610160526101405261018080808080516101c0525050602081019050808080516101e052505050506101c0805161014052806020015161016052506101405160801b610180526101605161018051176101805260043560648082028215828483041417612ac757600080fd5b809050905090506101a052600060043511612ae157600080fd5b620f424060043510612af257600080fd5b6402540be3ff60243511612b0557600080fd5b662386f26fc1000160243510612b1a57600080fd5b610140516101a0511015612b5d57610140516101a051600a8082028215828483041417612b4657600080fd5b809050905090501015612b5857600080fd5b612b8d565b61014051600a8082028215828483041417612b7757600080fd5b809050905090506101a0511115612b8d57600080fd5b61018051600455426006556101a05160801b6101c0526024356101c051176101c0526044356007556101c051600555610140516101e0526101a051610200524261022052604435610240527f7dce008c7221b9d42f26174f7435e50f9cc8f502c57019724c090b546415a02960806101e0a1005b63244c7c2e811415612ced573415612c1857600080fd5b6018543314612c2657600080fd5b60403661014037610140516101605160065801613a18565b610180526101a052610160526101405261018080808080516101c0525050602081019050808080516101e052505050506101c0805161014052806020015161016052506101405160801b610180526101605161018051176101805261018051600455610180516005554260065542600755610140516101a052610160516101c052426101e0527f5f0e7fba3d100c9e19446e1c92fe436f0a9a22fe99669360e4fdd6d3de2fc28460606101a0a1005b63a43c3351811415613021573415612d0457600080fd5b6018543314612d1257600080fd5b60215415612d1f57600080fd5b60e06004610140377fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610160511815612d7d5764012a05f2016101605110612d6657600080fd5b6207a11f6101605111612d7857600080fd5b612d85565b601154610160525b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610140511415612db857601054610140525b61016051610140511115612dcb57600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610180511815612e0f576402540be4016101805110612e0a57600080fd5b612e17565b601254610180525b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101a0511815612e735760006101a05111612e5257600080fd5b6c100000000000000000000000006101a05110612e6e57600080fd5b612e7b565b600a546101a0525b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101c0511815612ebd57610140516101c05111612eb857600080fd5b612ec5565b6008546101c0525b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101e0511415612ef857600c546101e0525b6101c0516101e0511115612f0b57600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610200511815612f5d5760006102005111612f4657600080fd5b62093a806102005110612f5857600080fd5b612f65565b600e54610200525b426203f480818183011015612f7957600080fd5b8082019050905061022052610220516021556101805160155561014051601355610160516014556101a051600b556101c0516009556101e051600d5561020051600f556101805161024052610140516102605261016051610280526101a0516102a0526101c0516102c0526101e0516102e0526102005161030052610220517f913fde9a37e1f8ab67876a4d0ce80790d764fcfc5692f4529526df9c6bdde55360e0610240a2005b632a7dd7cd811415613165576023541561303a57600080fd5b6001602355341561304a57600080fd5b601854331461305857600080fd5b60215442101561306757600080fd5b60006021541861307657600080fd5b6000602155601554610140526101405160125418156130ab576101405160065801613e71565b61014052600050610140516012555b60135461016052610160516010556014546101805261018051601155600b546101a0526101a051600a556009546101c0526101c051600855600d546101e0526101e051600c55600f546102005261020051600e556101405161022052610160516102405261018051610260526101a051610280526101c0516102a0526101e0516102c052610200516102e0527f1c65bbdc939f346e5d6f0bde1f072819947438d4fc7b182cc59c2f6dc550408760e0610220a16000602355005b63226840fb81141561319157341561317c57600080fd5b601854331461318a57600080fd5b6000602155005b636b441a4081141561322e5734156131a857600080fd5b60043560a01c156131b857600080fd5b60185433146131c657600080fd5b602054156131d357600080fd5b426203f4808181830110156131e757600080fd5b808201905090506101405261014051602055600435601955600435610140517f181aa3aa17d4cbf99265dd4443eba009433d3cde79d60164fde1d1a192beb93560006000a3005b636a1c05ae8114156132b057341561324557600080fd5b601854331461325357600080fd5b60205442101561326257600080fd5b60006020541861327157600080fd5b60006020556019546101405261014051601855610140517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60006000a2005b6386fbf1938114156132dc5734156132c757600080fd5b60185433146132d557600080fd5b6000602055005b63e36988538114156133165734156132f357600080fd5b601854331461330157600080fd5b42601f541161330f57600080fd5b6001601e55005b633046f97281141561334257341561332d57600080fd5b601854331461333b57600080fd5b6000601e55005b637242e52481141561337f57341561335957600080fd5b60043560a01c1561336957600080fd5b601854331461337757600080fd5b600435602255005b636112c7478114156133a257341561339657600080fd5b60035460005260206000f35b63204fe3d58114156133c55734156133b957600080fd5b60045460005260206000f35b63f30cfad58114156133e85734156133dc57600080fd5b60055460005260206000f35b63e89876ff81141561340b5734156133ff57600080fd5b60065460005260206000f35b63f9ed959781141561342e57341561342257600080fd5b60075460005260206000f35b6303b736e081141561345157341561344557600080fd5b60085460005260206000f35b6373fb971181141561347457341561346857600080fd5b60095460005260206000f35b6372d4f0e281141561349757341561348b57600080fd5b600a5460005260206000f35b63d7c3dcbe8114156134ba5734156134ae57600080fd5b600b5460005260206000f35b63083812e58114156134dd5734156134d157600080fd5b600c5460005260206000f35b634ea12c7d8114156135005734156134f457600080fd5b600d5460005260206000f35b63662b627481141561352357341561351757600080fd5b600e5460005260206000f35b630c5e23d481141561354657341561353a57600080fd5b600f5460005260206000f35b6392526c0c81141561356957341561355d57600080fd5b60105460005260206000f35b63ee8de67581141561358c57341561358057600080fd5b60115460005260206000f35b63fee3f7f98114156135af5734156135a357600080fd5b60125460005260206000f35b637cf9aedc8114156135d25734156135c657600080fd5b60135460005260206000f35b637d1b060c8114156135f55734156135e957600080fd5b60145460005260206000f35b63e382446281141561361857341561360c57600080fd5b60155460005260206000f35b634903b0d181141561365457341561362f57600080fd5b6004356003811061363f57600080fd5b601660c052602060c020015460005260206000f35b630f529ba281141561367757341561366b57600080fd5b60175460005260206000f35b638da5cb5b81141561369a57341561368e57600080fd5b60185460005260206000f35b631ec0cdc18114156136bd5734156136b157600080fd5b60195460005260206000f35b637ba1a74d8114156136e05734156136d457600080fd5b601a5460005260206000f35b630b7b594b8114156137035734156136f757600080fd5b601b5460005260206000f35b630c46b72a81141561372657341561371a57600080fd5b601c5460005260206000f35b639c868ac081141561374957341561373d57600080fd5b601e5460005260206000f35b632a42689681141561376c57341561376057600080fd5b601f5460005260206000f35b63e0a0b58681141561378f57341561378357600080fd5b60205460005260206000f35b63405e28f88114156137b25734156137a657600080fd5b60215460005260206000f35b636e42e4d28114156137d55734156137c957600080fd5b60225460005260206000f35b505b005b610180526101405261016052600261014051106137f557600080fd5b6fffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8061014051600160ff1b811061383b57600080fd5b808202821582848305141761384f57600080fd5b80905090509050600081121561386d5761016051816000031c613874565b61016051811b5b90501660005260005161018051565b6101405260168060c052602060c020546101605260018160c052602060c02001546101805260028160c052602060c02001546101a052506000546101c05264e8d4a510006101e0526402540be40061020052600161022052610160805164e8d4a5100080820282158284830414176138fa57600080fd5b8090509050905081525061024060016002818352015b6fffffffffffffffffffffffffffffffff6101c051166101e0610240516003811061393a57600080fd5b6020020151808202821582848304141761395357600080fd5b8090509050905061026052610160610240516003811061397257600080fd5b602002015161026051808202821582848304141761398f57600080fd5b80905090509050670de0b6b3a76400008082049050905061016061024051600381106139ba57600080fd5b60200201526101c05160801c6101c0525b8151600101808352811415613910575b50506060610240525b6000610240511115156139f657613a12565b60206102405103610160015160206102405103610240526139e4565b61014051565b6101405260075461016052600554610180526fffffffffffffffffffffffffffffffff61018051166101a0526101805160801c6101c05261016051421015613bd5576004546101e0526006546102005261016080516102005180821015613a7e57600080fd5b80820390509050815250426102005180821015613a9a57600080fd5b80820390509050610200526101e05160801c610160516102005180821015613ac157600080fd5b808203905090508082028215828483041417613adc57600080fd5b809050905090506101c051610200518082028215828483041417613aff57600080fd5b80905090509050818183011015613b1557600080fd5b80820190509050610160518080613b2b57600080fd5b8204905090506101c0526fffffffffffffffffffffffffffffffff6101e05116610160516102005180821015613b6057600080fd5b808203905090508082028215828483041417613b7b57600080fd5b809050905090506101a051610200518082028215828483041417613b9e57600080fd5b80905090509050818183011015613bb457600080fd5b80820190509050610160518080613bca57600080fd5b8204905090506101a0525b6102206101c05181526101a0518160200152506040610260525b600061026051111515613c0157613c1d565b6020610260510361022001516020610260510361026052613bef565b61014051565b6101a05261014052610160526101805260206102c0608463fa18042d6101e052610140516102005261016051610220526101805161024052600a54610260526101fc73656dd75d33a6241a0c4c2368eb00441ad3113ec05afa613c8557600080fd5b601f3d11613c9257600080fd5b6000506102c0516101c0526010546101c0518082028215828483041417613cb857600080fd5b80905090509050601154670de0b6b3a76400006101c05180821015613cdc57600080fd5b808203905090508082028215828483041417613cf757600080fd5b80905090509050818183011015613d0d57600080fd5b80820190509050670de0b6b3a7640000808204905090506000526000516101a051565b61016052610140526060366101803761014051600380820490509050610180526000546101e05261020060016002818352015b61014051670de0b6b3a76400008082028215828483041417613d8457600080fd5b8090509050905060036fffffffffffffffffffffffffffffffff6101e051168082028215828483041417613db757600080fd5b809050905090508080613dc957600080fd5b8204905090506101806102005160038110613de357600080fd5b60200201526101e05160801c6101e0525b8151600101808352811415613d63575b505060206102c0606463bad1dc266102005261018051610220526101a051610240526101c0516102605261021c73656dd75d33a6241a0c4c2368eb00441ad3113ec05afa613e5157600080fd5b601f3d11613e5e57600080fd5b6000506102c05160005260005161016051565b6101405260225461016052601a5461018052601c546101a05261018051601b5480821015613e9e57600080fd5b808203905090506012548082028215828483041417613ebc57600080fd5b809050905090506404a817c800808204905090506101c05260006101c05111156143a0576101a051670de0b6b3a76400008082028215828483041417613f0157600080fd5b809050905090506101a0516101c05180821015613f1d57600080fd5b808203905090508080613f2f57600080fd5b820490509050670de0b6b3a764000080821015613f4b57600080fd5b808203905090506101e05260206102c06044636962f8456102205261016051610240526101e0516102605261023c600073ca3d75ac011bf5ad07a98d02f18225f9bd9a6bdf5af1613f9b57600080fd5b601f3d11613fa857600080fd5b6000506102c0516102005260206102a060046318160ddd6102405261025c73ca3d75ac011bf5ad07a98d02f18225f9bd9a6bdf5afa613fe657600080fd5b601f3d11613ff357600080fd5b6000506102a0516102205273dac17f958d2ee523a2206206994597c13d831ec761024052732260fac5e5542a773aa44fbcfedf7c193bc2c5996102605273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2610280526102a060006003818352015b602061034060246370a082316102c052306102e0526102dc6102406102a0516003811061408157600080fd5b60200201515afa61409157600080fd5b601f3d1161409e57600080fd5b600050610340516102a051600381106140b657600080fd5b601660c052602060c02001555b8151600101808352811415614055575b50506040366102a0376101406102e0525b6102e0515160206102e051016102e0526102e06102e0511015614106576140e4565b60065801613a18565b61030052610320526102c06102e0525b6102e0515260206102e051036102e0526101406102e0511015156141425761411f565b610300808080805161034052505060208101905080808051610360525050505061034080516102a05280602001516102c05250610140610340525b6103405151602061034051016103405261034061034051101561419f5761417d565b60065801613883565b61036052610380526103a052610320610340525b61034051526020610340510361034052610140610340511015156141df576141bc565b61036080516102e05280602001516103005280604001516103205250602061046060a463c7fab708610360526102a051610380526102c0516103a0526102e0516103c052610300516103e052610320516104005261037c73656dd75d33a6241a0c4c2368eb00441ad3113ec05afa61425657600080fd5b601f3d1161426357600080fd5b6000506104605161034052670de0b6b3a7640000610140610380525b610380515160206103805101610380526103806103805110156142a15761427f565b610340516103a0526103a05160065801613d30565b61040052610360610380525b61038051526020610380510361038052610140610380511015156142e5576142c2565b6104005180820282158284830414176142fd57600080fd5b8090509050905061022051808061431357600080fd5b8204905090506103605261036051601c55610360516101805181818301101561433b57600080fd5b808201905090506101a0518082101561435357600080fd5b808203905090506101805261018051601b5561018051601a556102005161038052610160517f6059a38198b1dc42b3791087d1ff0fbd72b3179553c25f678cd246f52ffaaf596020610380a25b61014051566143d8575b610240526000610220526101405261016052610180526101a0526101c0526101e0526102005260005061440c565b60001561440c575b610240526101405261016052610180526101a0526101c0526101e052610200526102205260005061440c565b61018036610260376001546103e05261040060006002818352015b6fffffffffffffffffffffffffffffffff6103e05116610260610400516002811061445157600080fd5b60200201526103e05160801c6103e0525b8151600101808352811415614427575b5050600354610400526002546103e05261042060006002818352015b6fffffffffffffffffffffffffffffffff6103e051166102a061042051600281106144b857600080fd5b60200201526103e05160801c6103e0525b815160010180835281141561448e575b50504261040051101561471e57600e54610420526020610500604463571bae3f6104605242610400518082101561450f57600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761453357600080fd5b8090509050905061042051808061454957600080fd5b820490509050610480526402540be4006104a05261047c73656dd75d33a6241a0c4c2368eb00441ad3113ec05afa61458057600080fd5b601f3d1161458d57600080fd5b600050610500516104405260006103e05261046060006002818352015b6102a061046051600281106145be57600080fd5b6020020151670de0b6b3a764000061044051808210156145dd57600080fd5b8082039050905080820282158284830414176145f857600080fd5b80905090509050610260610460516002811061461357600080fd5b602002015161044051808202821582848304141761463057600080fd5b8090509050905081818301101561464657600080fd5b80820190509050670de0b6b3a764000080820490509050610260610460516002811061467157600080fd5b60200201525b81516001018083528114156145aa575b505061046060006002818352015b6103e05160801b6103e052610260600161046051808210156146b657600080fd5b80820390509050600281106146ca57600080fd5b6020020151610480526fffffffffffffffffffffffffffffffff61048051106146f257600080fd5b6103e05161048051176103e0525b8151600101808352811415614695575b50506103e051600155426003555b61022051610420526102205115156147a457602061054060a463c7fab7086104405261014051610460526101605161048052610180516104a0526101a0516104c0526101c0516104e05261045c73656dd75d33a6241a0c4c2368eb00441ad3113ec05afa61478b57600080fd5b601f3d1161479857600080fd5b60005061054051610420525b6000546103e05261044060006002818352015b6fffffffffffffffffffffffffffffffff6103e051166102e061044051600281106147e157600080fd5b60200201526103e05160801c6103e0525b81516001018083528114156147b7575b505060006102005111156148e45760006101e051111561485457610200516102a06101e05160018082101561483657600080fd5b808203905090506002811061484a57600080fd5b60200201526148df565b61044060006002818352015b6102a0610440516002811061487457600080fd5b6020020151670de0b6b3a7640000808202821582848304141761489657600080fd5b809050905090506102005180806148ac57600080fd5b8204905090506102a061044051600281106148c657600080fd5b60200201525b8151600101808352811415614860575b50505b614a8f565b61018051610440526101a051610460526101c0516104805261044051620f4240808204905090506104a05261044080516104a05181818301101561492757600080fd5b808201905090508152506104c060006002818352015b6102e06104c0516002811061495157600080fd5b60200201516104a051808202821582848304141761496e57600080fd5b809050905090506101806104c051600181818301101561498d57600080fd5b80820190509050600381106149a157600080fd5b6020020151602061062060e46336bc88556104e05261014051610500526101605161052052610440516105405261046051610560526104805161058052610420516105a0526104c05160018181830110156149fb57600080fd5b808201905090506105c0526104fc73656dd75d33a6241a0c4c2368eb00441ad3113ec05afa614a2957600080fd5b601f3d11614a3657600080fd5b6000506106205180821015614a4a57600080fd5b808203905090508080614a5c57600080fd5b8204905090506102a06104c05160028110614a7657600080fd5b60200201525b815160010180835281141561493d575b50505b60006103e05261044060006002818352015b6103e05160801b6103e0526102a060016104405180821015614ac257600080fd5b8082039050905060028110614ad657600080fd5b6020020151610460526fffffffffffffffffffffffffffffffff6104605110614afe57600080fd5b6103e05161046051176103e0525b8151600101808352811415614aa1575b50506103e05160025560206104c060046318160ddd6104605261047c73ca3d75ac011bf5ad07a98d02f18225f9bd9a6bdf5afa614b5857600080fd5b601f3d11614b6557600080fd5b6000506104c05161044052601a5461046052601c54610480526104a060006002818352015b6102606104a05160028110614b9e57600080fd5b6020020151670de0b6b3a76400008082028215828483041417614bc057600080fd5b809050905090506102e06104a05160028110614bdb57600080fd5b60200201518080614beb57600080fd5b8204905090506104c052670de0b6b3a76400006104c0511115614c32576104c08051670de0b6b3a764000080821015614c2357600080fd5b80820390509050815250614c58565b670de0b6b3a76400006104c05180821015614c4c57600080fd5b808203905090506104c0525b6103c080517001000000000000000000000000000000006104c05110614c7d57600080fd5b60026104c0510a818183011015614c9357600080fd5b808201905090508152505b8151600101808352811415614b8a575b505061042051600380820490509050610320526104a060006002818352015b61042051670de0b6b3a76400008082028215828483041417614cee57600080fd5b8090509050905060036102e06104a05160028110614d0b57600080fd5b60200201518082028215828483041417614d2457600080fd5b809050905090508080614d3657600080fd5b8204905090506103206104a0516001818183011015614d5457600080fd5b8082019050905060038110614d6857600080fd5b60200201525b8151600101808352811415614ccd575b5050670de0b6b3a76400006104a052670de0b6b3a76400006104c0526000610480511115614ed95760206105c0606463bad1dc266105005261032051610520526103405161054052610360516105605261051c73656dd75d33a6241a0c4c2368eb00441ad3113ec05afa614df157600080fd5b601f3d11614dfe57600080fd5b6000506105c0516104e052670de0b6b3a76400006104e0518082028215828483041417614e2a57600080fd5b80905090509050610440518080614e4057600080fd5b8204905090506104c052610460516104c0518082028215828483041417614e6657600080fd5b80905090509050610480518080614e7c57600080fd5b8204905090506104a052610480516104c0511015614ed9576308c379a0610500526020610520526004610540527f4c6f7373000000000000000000000000000000000000000000000000000000006105605261054050606461051cfd5b6104a051601a55601d546104e0526104e0511515614f5f576104a051670de0b6b3a764000080821015614f0b57600080fd5b808203905090506002808204905090506509184e72a000818183011015614f3157600080fd5b808201905090506104c051670de0b6b3a764000080821015614f5257600080fd5b8082039050905011614f62565b60005b15614f735760016104e0526001601d555b6104e05115614fbf5770010000000000000000000000000000000060085410614f9b57600080fd5b60026008540a6103c0511115614fb75760006104805111614fba565b60005b614fc2565b60005b156155265760206105806024634e60b141610500526103c051670de0b6b3a7640000808204905090506105205261051c73656dd75d33a6241a0c4c2368eb00441ad3113ec05afa61501257600080fd5b601f3d1161501f57600080fd5b600050610580516103c052600c546105005261052060006002818352015b6102e0610520516002811061505157600080fd5b60200201516103c051610500518082101561506b57600080fd5b80820390509050808202821582848304141761508657600080fd5b809050905090506105005161026061052051600281106150a557600080fd5b602002015180820282158284830414176150be57600080fd5b809050905090508181830110156150d457600080fd5b808201905090506103c05180806150ea57600080fd5b820490509050610380610520516002811061510457600080fd5b60200201525b815160010180835281141561503d575b505061018051610320526101a051610340526101c0516103605261052060006002818352015b61018061052051600181818301101561515857600080fd5b808201905090506003811061516c57600080fd5b6020020151610380610520516002811061518557600080fd5b6020020151808202821582848304141761519e57600080fd5b809050905090506102e061052051600281106151b957600080fd5b602002015180806151c957600080fd5b8204905090506103206105205160018181830110156151e757600080fd5b80820190509050600381106151fb57600080fd5b60200201525b8151600101808352811415615140575b5050602061064060a463c7fab7086105405261014051610560526101605161058052610320516105a052610340516105c052610360516105e05261055c73656dd75d33a6241a0c4c2368eb00441ad3113ec05afa61526e57600080fd5b601f3d1161527b57600080fd5b6000506106405161052052610520516003808204905090506103205261054060006002818352015b61052051670de0b6b3a764000080820282158284830414176152c457600080fd5b80905090509050600361038061054051600281106152e157600080fd5b602002015180820282158284830414176152fa57600080fd5b80905090509050808061530c57600080fd5b82049050905061032061054051600181818301101561532a57600080fd5b808201905090506003811061533e57600080fd5b60200201525b81516001018083528114156152a3575b5050670de0b6b3a76400006020610600606463bad1dc266105405261032051610560526103405161058052610360516105a05261055c73656dd75d33a6241a0c4c2368eb00441ad3113ec05afa6153aa57600080fd5b601f3d116153b757600080fd5b6000506106005180820282158284830414176153d257600080fd5b809050905090506104405180806153e857600080fd5b82049050905061048052670de0b6b3a764000061048051111561546a576104a051670de0b6b3a76400008082101561541f57600080fd5b80820390509050600261048051670de0b6b3a76400008082101561544257600080fd5b80820390509050808202821582848304141761545d57600080fd5b809050905090501161546d565b60005b156155205760006103e05261054060006002818352015b6103e05160801b6103e052610380600161054051808210156154a557600080fd5b80820390509050600281106154b957600080fd5b6020020151610560526fffffffffffffffffffffffffffffffff61056051106154e157600080fd5b6103e05161056051176103e0525b8151600101808352811415615484575b50506103e0516000556105205160175561048051601c556102405156615526565b6000601d555b610420516017556104c051601c5561024051565b610200526101405261016052610180526101a0526101c0526101e0526101405161016051610180516101a0516101c0516101e05161020051610220516101a051610240526101c051610260526101e0516102805261028051610260516102405160065801613c23565b6102e05261022052610200526101e0526101c0526101a0526101805261016052610140526102e051600380820282158284830414176155e157600080fd5b809050905090506008808204905090506102205260006102405261028060006003818352015b6020610280510261014001516102605261024080516102605181818301101561562f57600080fd5b808201905090508152505b8151600101808352811415615607575b505061024051600380820490509050610260526000610280526102c060006003818352015b60206102c0510261014001516102a052610260516102a05111156156cc5761028080516102a05161026051808210156156a757600080fd5b808203905090508181830110156156bd57600080fd5b80820190509050815250615707565b6102808051610260516102a051808210156156e657600080fd5b808203905090508181830110156156fc57600080fd5b808201905090508152505b815160010180835281141561566f575b50506102205161028051808202821582848304141761573557600080fd5b8090509050905061024051808061574b57600080fd5b820490509050620186a081818301101561576457600080fd5b8082019050905060005260005161020051565b6101e0526101405261016052610180526101a0526101c05260175461020052610200516102205260206102c060046318160ddd6102605261027c73ca3d75ac011bf5ad07a98d02f18225f9bd9a6bdf5afa6157d157600080fd5b601f3d116157de57600080fd5b6000506102c05161024052610240516101805111156157fc57600080fd5b60036101a0511061580c57600080fd5b60168060c052602060c020546102605260018160c052602060c02001546102805260028160c052602060c02001546102a0525064e8d4a510006102c0526402540be4006102e0526001610300526c0c9f2c9cd04674edea40000000610320526001156159c557600054610340526102c0805161026051808202821582848304141761589657600080fd5b8090509050905081525061036060016002818352015b6fffffffffffffffffffffffffffffffff610340511661038052610360516101a051141561591157610380516102c06101a051600381106158ec57600080fd5b6020020151808202821582848304141761590557600080fd5b80905090509050610320525b6102c0610360516003811061592557600080fd5b6020020151610260610360516003811061593e57600080fd5b6020020151808202821582848304141761595757600080fd5b8090509050905061038051808202821582848304141761597657600080fd5b80905090509050670de0b6b3a7640000808204905090506102c061036051600381106159a157600080fd5b60200201526103405160801c610340525b81516001018083528114156158ac575b50505b610140610360525b610360515160206103605101610360526103606103605110156159ef576159cd565b6102c051610380526102e0516103a052610300516103c0526103c0516103a0516103805160065801613c23565b61042052610340610360525b6103605152602061036051036103605261014061036051101515615a4b57615a28565b610420516103405261018051610200518082028215828483041417615a6f57600080fd5b80905090509050610240518080615a8557600080fd5b8204905090506103605261020080516103605161034051610360518082028215828483041417615ab457600080fd5b809050905090506404a817c800808204905090506001818183011015615ad957600080fd5b8082019050905080821015615aed57600080fd5b8082039050905080821015615b0157600080fd5b8082039050905081525060206104e060e46336bc88556103a052610140516103c052610160516103e0526102c051610400526102e05161042052610300516104405261020051610460526101a051610480526103bc73656dd75d33a6241a0c4c2368eb00441ad3113ec05afa615b7657600080fd5b601f3d11615b8357600080fd5b6000506104e051610380526102c06101a05160038110615ba257600080fd5b60200201516103805180821015615bb857600080fd5b80820390509050670de0b6b3a76400008082028215828483041417615bdc57600080fd5b80905090509050610320518080615bf257600080fd5b8204905090506103a052610380516102c06101a05160038110615c1457600080fd5b602002015260006103c0526101c05115615c4c57620186a06103a0511115615c4457620186a06101805111615c47565b60005b615c4f565b60005b15615f665760006103e05264e8d4a51000610400526402540be40061042052600161044052604036610460376002546104a0526104c060006002818352015b6fffffffffffffffffffffffffffffffff6104a051166104606104c05160028110615cb857600080fd5b60200201526104a05160801c6104a0525b8151600101808352811415615c8e575b50506104c060006003818352015b6101a0516104c0511815615e0d576104c0511515615d47576103e080516102605164e8d4a510008082028215828483041417615d2257600080fd5b80905090509050818183011015615d3857600080fd5b80820190509050815250615e0d565b6103e080516102606104c05160038110615d6057600080fd5b60200201516104606104c051600180821015615d7b57600080fd5b8082039050905060028110615d8f57600080fd5b60200201518082028215828483041417615da857600080fd5b809050905090506104006104c05160038110615dc357600080fd5b60200201518082028215828483041417615ddc57600080fd5b80905090509050670de0b6b3a764000080820490509050818183011015615e0257600080fd5b808201905090508152505b8151600101808352811415615ce7575b50506103e051610360518082028215828483041417615e3b57600080fd5b80905090509050610220518080615e5157600080fd5b8204905090506103e0526103e051670de0b6b3a76400008082028215828483041417615e7c57600080fd5b809050905090506103a0516104006101a05160038110615e9b57600080fd5b60200201518082028215828483041417615eb457600080fd5b80905090509050610360516102606101a05160038110615ed357600080fd5b60200201518082028215828483041417615eec57600080fd5b809050905090506104006101a05160038110615f0757600080fd5b60200201518082028215828483041417615f2057600080fd5b80905090509050610220518080615f3657600080fd5b82049050905080821015615f4957600080fd5b808203905090508080615f5b57600080fd5b8204905090506103c0525b6104a06103a05181526103c0518160200152610200518160400152806060016102c05181526102e0518160200152610300518160400152505060c0610560525b600061056051111515615fb857615fd4565b602061056051036104a001516020610560510361056052615fa6565b6101e051565b61017a6161540361017a60003961017a616154036000f3000000000000000000000000babe61887f1de2713c6f97e567623453d3c79f670000000000000000000000000000000000000000000000000000000000000e3d00000000000000000000000000000000000000000000000000003faa25225fff00000000000000000000000000000000000000000000000000000000003d09000000000000000000000000000000000000000000000000000000000002625a000000000000000000000000000000000000000000000000000009f295cd5f0000000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000000000000000000000000000000005543df729c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002580000000000000000000000000000000000000000000007da7d8434a71000000000000000000000000000000000000000000000000000008ba6039972fcc80000
Deployed Bytecode
0x600436101561000d576137d7565b600035601c52600051635b41b90881141561002d5760006101405261005e565b63394747c58114156100595760843560011c1561004957600080fd5b602060846101403760005061005e565b610d2e565b6023541561006b57600080fd5b6001602355601e541561007d57600080fd5b6024356004351861008d57600080fd5b60036004351061009c57600080fd5b6003602435106100ab57600080fd5b6000604435116100ba57600080fd5b6040366101603761014051610160516101805160065801613a18565b6101a0526101c0526101805261016052610140526101a080808080516101e05250506020810190508080805161020052505050506101e08051610160528060200151610180525060168060c052602060c020546101a05260018160c052602060c02001546101c05260028160c052602060c02001546101e052506024356102005260403661022037600115610c3a5773dac17f958d2ee523a2206206994597c13d831ec761026052732260fac5e5542a773aa44fbcfedf7c193bc2c5996102805273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26102a052600260043514156101c457610140516101c7565b60005b156102315760443534146101da57600080fd5b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc23b6101f957600080fd5b60006000600463d0e30db06102c0526102dc3473c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af161022c57600080fd5b6102a6565b341561023c57600080fd5b6102606004356003811061024f57600080fd5b60200201513b61025e57600080fd5b6000600060646323b872dd6102c052336102e0523061030052604435610320526102dc60006102606004356003811061029657600080fd5b60200201515af16102a657600080fd5b6101a0602435600381106102b957600080fd5b60200201516102c0526101a0600435600381106102d557600080fd5b6020020180516044358181830110156102ed57600080fd5b808201905090508152506101a06004356003811061030a57600080fd5b60200201516004356003811061031f57600080fd5b601660c052602060c02001556080366102e0376000546103605261038060006002818352015b6fffffffffffffffffffffffffffffffff6103605116610320610380516002811061036f57600080fd5b60200201526103605160801c610360525b8151600101808352811415610345575b505064e8d4a51000610380526402540be4006103a05260016103c0526101a0805164e8d4a5100080820282158284830414176103cb57600080fd5b809050905090508152506103e060016002818352015b6101a06103e051600381106103f557600080fd5b60200201516103206103e05160018082101561041057600080fd5b808203905090506002811061042457600080fd5b6020020151808202821582848304141761043d57600080fd5b809050905090506103806103e0516003811061045857600080fd5b6020020151808202821582848304141761047157600080fd5b80905090509050670de0b6b3a7640000808204905090506101a06103e0516003811061049c57600080fd5b60200201525b81516001018083528114156103e1575b5050610380600435600381106104c757600080fd5b60200201516102e052610380602435600381106104e357600080fd5b6020020151610300526101a0602435600381106104ff57600080fd5b6020020151602061052060e46336bc88556103e052610160516104005261018051610420526101a051610440526101c051610460526101e051610480526017546104a0526024356104c0526103fc73656dd75d33a6241a0c4c2368eb00441ad3113ec05afa61056d57600080fd5b601f3d1161057a57600080fd5b600050610520518082101561058e57600080fd5b80820390509050610240526101a0602435600381106105ac57600080fd5b60200201805161024051808210156105c357600080fd5b8082039050905081525061024080516001808210156105e157600080fd5b80820390509050815250600060243511156106625761024051670de0b6b3a7640000808202821582848304141761061757600080fd5b8090509050905061032060243560018082101561063357600080fd5b808203905090506002811061064757600080fd5b6020020151808061065757600080fd5b820490509050610240525b610240805161030051808061067657600080fd5b82049050905081525061024080516101406103e0525b6103e0515160206103e051016103e0526103e06103e05110156106ae5761068c565b6101a051610400526101c051610420526101e0516104405261044051610420516104005160065801613c23565b6104a0526103c06103e0525b6103e0515260206103e051036103e0526101406103e05110151561070a576106e7565b6104a05161024051808202821582848304141761072657600080fd5b809050905090506402540be400808204905090508082101561074757600080fd5b8082039050905081525060643561024051101515156107a5576308c379a06103e0526020610400526008610420527f536c697070616765000000000000000000000000000000000000000000000000610440526104205060646103fcfd5b6102c0805161024051808210156107bb57600080fd5b808203905090508152506102c051602435600381106107d957600080fd5b601660c052602060c0200155600260243514156107f957610140516107fc565b60005b156108a15773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc23b61082057600080fd5b600060006024632e1a7d4d6103e05261024051610400526103fc600073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af161085c57600080fd5b60006103e0526103e08051602001806104208284600060045af161087f57600080fd5b5050600060006104205161044061024051335af161089c57600080fd5b610907565b610260602435600381106108b457600080fd5b60200201513b6108c357600080fd5b60006000604463a9059cbb6103e052336104005261024051610420526103fc6000610260602435600381106108f757600080fd5b60200201515af161090757600080fd5b6102c05161030051808202821582848304141761092357600080fd5b809050905090506101a06024356003811061093d57600080fd5b6020020152600060243511156109d7576101a06024356003811061096057600080fd5b602002015161032060243560018082101561097a57600080fd5b808203905090506002811061098e57600080fd5b602002015180820282158284830414176109a757600080fd5b80905090509050670de0b6b3a7640000808204905090506101a0602435600381106109d157600080fd5b60200201525b620186a060443511156109f257620186a061024051116109f5565b60005b15610c3a5760006004351815610a115760006024351415610a14565b60005b15610b28576fffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80600435600180821015610a5d57600080fd5b80820390509050600160ff1b8110610a7457600080fd5b8082028215828483051417610a8857600080fd5b809050905090506000811215610aa557600254816000031c610aab565b600254811b5b9050166044356102e0518082028215828483041417610ac957600080fd5b809050905090508082028215828483041417610ae457600080fd5b8090509050905061024051610300518082028215828483041417610b0757600080fd5b809050905090508080610b1957600080fd5b82049050905061022052610c3a565b6004351515610bb4576044356102e0518082028215828483041417610b4c57600080fd5b80905090509050670de0b6b3a76400008082028215828483041417610b7057600080fd5b8090509050905061024051610300518082028215828483041417610b9357600080fd5b809050905090508080610ba557600080fd5b82049050905061022052610c3a565b61024051610300518082028215828483041417610bd057600080fd5b80905090509050670de0b6b3a76400008082028215828483041417610bf457600080fd5b809050905090506044356102e0518082028215828483041417610c1657600080fd5b809050905090508080610c2857600080fd5b82049050905061022052600435610200525b6101405161016051610180516101a0516101c0516101e051610200516102205161024051610160516102605261018051610280526101a0516102a0526101c0516102c0526101e0516102e0526102005161030052610220516103205261032051610300516102e0516102c0516102a0516102805161026051600658016143aa565b6102405261022052610200526101e0526101c0526101a05261018052610160526101405260005060043561026052604435610280526024356102a052610240516102c052337fb2e76ae99761dc136e598d4a629bb347eccb9532a5f8bbd72e18467c3c34cc986080610260a26000602355005b6368727653811415610d75573415610d4557600080fd5b60043561014052600154610160526101605161014051600658016137d9565b6101c0526101c05160005260206000f35b63a3f7cdd5811415610dbc573415610d8c57600080fd5b60043561014052600054610160526101605161014051600658016137d9565b6101c0526101c05160005260206000f35b6359189017811415610e03573415610dd357600080fd5b60043561014052600254610160526101605161014051600658016137d9565b6101c0526101c05160005260206000f35b63fc0c546a811415610e38573415610e1a57600080fd5b73ca3d75ac011bf5ad07a98d02f18225f9bd9a6bdf60005260206000f35b63c6610657811415610ebb573415610e4f57600080fd5b73dac17f958d2ee523a2206206994597c13d831ec761014052732260fac5e5542a773aa44fbcfedf7c193bc2c5996101605273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26101805261014060043560038110610ead57600080fd5b602002015160005260206000f35b63f446c1d0811415610f19573415610ed257600080fd5b60065801613a18565b61014052610160526101408080808051610180525050602081019050808080516101a052505050506101805160648082049050905060005260206000f35b63b1373929811415610f71573415610f3057600080fd5b60065801613a18565b61014052610160526101408080808051610180525050602081019050808080516101a052505050506101806020015160005260206000f35b6376a2f0f0811415610fc6573415610f8857600080fd5b60065801613a18565b61014052610160526101408080808051610180525050602081019050808080516101a052505050506101805160005260206000f35b63ddca3f4381141561107c573415610fdd57600080fd5b60065801613883565b61014052610160526101805261014080516101a05280602001516101c05280604001516101e052506101405161016051610180516101a0516101c0516101e0516101a051610200526101c051610220526101e0516102405261024051610220516102005160065801613c23565b6102a0526101e0526101c0526101a0526101805261016052610140526102a05160005260206000f35b63572e56258114156110d457341561109357600080fd5b60048035610140528060200135610160528060400135610180525061018051610160516101405160065801613c23565b6101e0526101e05160005260206000f35b63bb7b8b8081141561118c5734156110eb57600080fd5b670de0b6b3a7640000601754610140526101405160065801613d30565b6101a0526101a051808202821582848304141761112457600080fd5b80905090509050602061022060046318160ddd6101c0526101dc73ca3d75ac011bf5ad07a98d02f18225f9bd9a6bdf5afa61115e57600080fd5b601f3d1161116b57600080fd5b60005061022051808061117d57600080fd5b82049050905060005260206000f35b63556d6e9f8114156111fb5734156111a357600080fd5b6020610200606463556d6e9f61014052606060046101603761015c73cfb3cfeae8c3f39aecdf7ec275a00d29eca085355afa6111de57600080fd5b601f3d116111eb57600080fd5b6000506102005160005260206000f35b63cde699fa81141561127a57341561121257600080fd5b600480356101405280602001356101605280604001356101805250606480356101a05280602001356101c05280604001356101e052506101e0516101c0516101a0516101805161016051610140516006580161553a565b610240526102405160005260206000f35b634515cef3811415611fc8576023541561129357600080fd5b600160235534156112a357600080fd5b601e54156112b057600080fd5b60403661014037610140516101605160065801613a18565b610180526101a052610160526101405261018080808080516101c0525050602081019050808080516101e052505050506101c08051610140528060200151610160525073dac17f958d2ee523a2206206994597c13d831ec761018052732260fac5e5542a773aa44fbcfedf7c193bc2c5996101a05273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26101c05260168060c052602060c020546101e05260018160c052602060c02001546102005260028160c052602060c0200154610220525060048035610240528060200135610260528060400135610280525060a0366102a0376001156116ed5760006103405261036060006003818352015b6000600461036051600381106113d957600080fd5b602002013511156114865761018061036051600381106113f857600080fd5b60200201513b61140757600080fd5b6000600060646323b872dd61038052336103a052306103c0526004610360516003811061143357600080fd5b60200201356103e05261039c6000610180610360516003811061145557600080fd5b60200201515af161146557600080fd5b6103408051600181818301101561147b57600080fd5b808201905090508152505b81516001018083528114156113c4575b5050600061034051116114a857600080fd5b61036060006003818352015b6101e061036051600381106114c857600080fd5b6020020151600461036051600381106114e057600080fd5b60200201358181830110156114f457600080fd5b8082019050905061038052610380516101e0610360516003811061151757600080fd5b602002015261038051610360516003811061153157600080fd5b601660c052602060c02001555b81516001018083528114156114b4575b50506101e0516102a052610200516102c052610220516102e05264e8d4a51000610360526402540be4006103805260016103a0526000546103c0526101e0805164e8d4a5100080820282158284830414176115a857600080fd5b809050905090508152506103e060016002818352015b6fffffffffffffffffffffffffffffffff6103c051166103606103e051600381106115e857600080fd5b6020020151808202821582848304141761160157600080fd5b80905090509050610400526101e06103e0516003811061162057600080fd5b602002015161040051808202821582848304141761163d57600080fd5b80905090509050670de0b6b3a7640000808204905090506101e06103e0516003811061166857600080fd5b60200201526102406103e0516003811061168157600080fd5b602002015161040051808202821582848304141761169e57600080fd5b80905090509050670de0b6b3a7640000808204905090506102406103e051600381106116c957600080fd5b60200201526103c05160801c6103c0525b81516001018083528114156115be575b50505b602061046060a463c7fab708610360526101405161038052610160516103a0526101e0516103c052610200516103e052610220516104005261037c73656dd75d33a6241a0c4c2368eb00441ad3113ec05afa61174857600080fd5b601f3d1161175557600080fd5b600050610460516103405260206103e060046318160ddd6103805261039c73ca3d75ac011bf5ad07a98d02f18225f9bd9a6bdf5afa61179357600080fd5b601f3d116117a057600080fd5b6000506103e0516103605260175461038052600061038051111561181757610360516103405180820282158284830414176117da57600080fd5b809050905090506103805180806117f057600080fd5b820490509050610360518082101561180757600080fd5b808203905090506103005261188e565b6101406103a0525b6103a0515160206103a051016103a0526103a06103a05110156118415761181f565b610340516103c0526103c05160065801613d30565b610420526103806103a0525b6103a0515260206103a051036103a0526101406103a05110151561188557611862565b61042051610300525b6000610300511161189e57600080fd5b6000610380511115611eaf576101406103a0525b6103a0515160206103a051016103a0526103a06103a05110156118d4576118b2565b610240516103c052610260516103e05261028051610400526101e0516104205261020051610440526102205161046052610460516104405161042051610400516103e0516103c0516006580161553a565b6104c0526103806103a0525b6103a0515260206103a051036103a0526101406103a05110151561195457611931565b6104c05161030051808202821582848304141761197057600080fd5b809050905090506402540be40080820490509050600181818301101561199557600080fd5b8082019050905061032052610300805161032051808210156119b657600080fd5b808203905090508152506103608051610300518181830110156119d857600080fd5b80820190509050815250602061044060446340c10f196103a052336103c052610300516103e0526103bc600073ca3d75ac011bf5ad07a98d02f18225f9bd9a6bdf5af1611a2457600080fd5b601f3d11611a3157600080fd5b600050610440506040366103a037620186a0610300511115611de95760006103e05261040060006003818352015b60046104005160038110611a7257600080fd5b60200201351515611aa2576103e080516001818183011015611a9357600080fd5b80820190509050815250611aab565b610400516103c0525b8151600101808352811415611a5f575b505060026103e0511415611de957606036610400376002546104605264e8d4a51000610480526402540be4006104a05260016104c0526104e060006002818352015b6fffffffffffffffffffffffffffffffff61046051166104206104e05160028110611b2757600080fd5b60200201526104605160801c610460525b8151600101808352811415611afd575b50506104e060006003818352015b6103c0516104e0511815611c7c576104e0511515611bb65761040080516102a05164e8d4a510008082028215828483041417611b9157600080fd5b80905090509050818183011015611ba757600080fd5b80820190509050815250611c7c565b61040080516102a06104e05160038110611bcf57600080fd5b60200201516104206104e051600180821015611bea57600080fd5b8082039050905060028110611bfe57600080fd5b60200201518082028215828483041417611c1757600080fd5b809050905090506104806104e05160038110611c3257600080fd5b60200201518082028215828483041417611c4b57600080fd5b80905090509050670de0b6b3a764000080820490509050818183011015611c7157600080fd5b808201905090508152505b8151600101808352811415611b56575b505061040051610300518082028215828483041417611caa57600080fd5b80905090509050610360518080611cc057600080fd5b8204905090506104005261040051670de0b6b3a76400008082028215828483041417611ceb57600080fd5b8090509050905060046103c05160038110611d0557600080fd5b60200201356104806103c05160038110611d1e57600080fd5b60200201518082028215828483041417611d3757600080fd5b80905090509050610300516102a06103c05160038110611d5657600080fd5b60200201518082028215828483041417611d6f57600080fd5b809050905090506104806103c05160038110611d8a57600080fd5b60200201518082028215828483041417611da357600080fd5b80905090509050610360518080611db957600080fd5b82049050905080821015611dcc57600080fd5b808203905090508080611dde57600080fd5b8204905090506103a0525b6101406103e0525b6103e0515160206103e051016103e0526103e06103e0511015611e1357611df1565b610140516104005261016051610420526101e05161044052610200516104605261022051610480526103c0516104a0526103a0516104c052610340516104e0526104e0516104c0516104a0516104805161046051610440516104205161040051600658016143e0565b6103c06103e0525b6103e0515260206103e051036103e0526101406103e051101515611ea757611e84565b600050611f2d565b61034051601755670de0b6b3a7640000601c55670de0b6b3a7640000601a55602061044060446340c10f196103a052336103c052610300516103e0526103bc600073ca3d75ac011bf5ad07a98d02f18225f9bd9a6bdf5af1611f1057600080fd5b601f3d11611f1d57600080fd5b60005061044051611f2d57600080fd5b6064356103005110151515611f81576308c379a06103a05260206103c05260086103e0527f536c697070616765000000000000000000000000000000000000000000000000610400526103e05060646103bcfd5b606060046103a03761032051610400526103605161042052337f96b486485420b963edd3fdec0b0195730035600feb7de6f544383d7950fa97ee60a06103a0a26000602355005b63ecb586a581141561235e5760235415611fe157600080fd5b60016023553415611ff157600080fd5b73dac17f958d2ee523a2206206994597c13d831ec761014052732260fac5e5542a773aa44fbcfedf7c193bc2c5996101605273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc261018052602061022060046318160ddd6101c0526101dc73ca3d75ac011bf5ad07a98d02f18225f9bd9a6bdf5afa61206f57600080fd5b601f3d1161207c57600080fd5b600050610220516101a052602061026060446379cc67906101c052336101e052600435610200526101dc600073ca3d75ac011bf5ad07a98d02f18225f9bd9a6bdf5af16120c857600080fd5b601f3d116120d557600080fd5b600050610260516120e557600080fd5b60168060c052602060c020546101c05260018160c052602060c02001546101e05260028160c052602060c0200154610200525060043560018082101561212a57600080fd5b808203905090506102205261024060006003818352015b6101c0610240516003811061215557600080fd5b602002015161022051808202821582848304141761217257600080fd5b809050905090506101a051808061218857600080fd5b82049050905061026052602461024051600381106121a557600080fd5b60200201356102605110156121b957600080fd5b6101c061024051600381106121cd57600080fd5b602002015161026051808210156121e357600080fd5b8082039050905061024051600381106121fb57600080fd5b601660c052602060c0200155610260516101c0610240516003811061221f57600080fd5b6020020152610140610240516003811061223857600080fd5b60200201513b61224757600080fd5b60006000604463a9059cbb61028052336102a052610260516102c05261029c6000610140610240516003811061227c57600080fd5b60200201515af161228c57600080fd5b8151600101808352811415612141575b50506017546102405261024051610240516102205180820282158284830414176122c557600080fd5b809050905090506101a05180806122db57600080fd5b820490509050808210156122ee57600080fd5b808203905090506017556101c051610260526101e05161028052610200516102a0526101a0516004358082101561232457600080fd5b808203905090506102c052337fd6cc314a0b1e3b2579f8e64248e82434072e8271290eef8ad0886709304195f56080610260a26000602355005b633883e1198114156123f757341561237557600080fd5b60643560011c1561238557600080fd5b60206102206084633883e11961014052600480356101605280602001356101805280604001356101a052506064356101c05261015c73cfb3cfeae8c3f39aecdf7ec275a00d29eca085355afa6123da57600080fd5b601f3d116123e757600080fd5b6000506102205160005260206000f35b634fb08c5e81141561253d57341561240e57600080fd5b60403661014037610140516101605160065801613a18565b610180526101a052610160526101405261018080808080516101c0525050602081019050808080516101e052505050506101c08051610140528060200151610160525061014051610160516101405161018052610160516101a052604060046101c037600061020052610200516101e0516101c0516101a0516101805160065801615777565b61026052610280526102a0526102c0526102e05261030052610160526101405261026080808080516103205250506020810190508080805161034052505060208101905080808051610360525050602081019050808080808051610380525050602081019050808080516103a0525050602081019050808080516103c0525050505050506103205160005260206000f35b63f1dc3cc981141561298a576023541561255657600080fd5b6001602355341561256657600080fd5b601e541561257357600080fd5b60403661014037610140516101605160065801613a18565b610180526101a052610160526101405261018080808080516101c0525050602081019050808080516101e052505050506101c08051610140528060200151610160525060c036610180376101405161016051610180516101a0516101c0516101e051610200516102205161014051610240526101605161026052604060046102803760016102c0526102c0516102a05161028051610260516102405160065801615777565b610320526103405261036052610380526103a0526103c05261022052610200526101e0526101c0526101a05261018052610160526101405261032080808080516103e052505060208101905080808051610400525050602081019050808080516104205250506020810190508080808080516104405250506020810190508080805161046052505060208101905080808051610480525050505050506103e080516101805280602001516101c05280604001516101a0528060600180516101e05280602001516102005280604001516102205250506044356101805110151515612759576308c379a0610240526020610260526008610280527f536c6970706167650000000000000000000000000000000000000000000000006102a05261028050606461025cfd5b6024356003811061276957600080fd5b601660c052602060c020018054610180518082101561278757600080fd5b8082039050905081555060206102e060446379cc67906102405233610260526004356102805261025c600073ca3d75ac011bf5ad07a98d02f18225f9bd9a6bdf5af16127d257600080fd5b601f3d116127df57600080fd5b6000506102e0516127ef57600080fd5b6101405161016051610180516101a0516101c0516101e0516102005161022051610140516102405261016051610260526101e05161028052610200516102a052610220516102c0526024356102e0526101c051610300526101a0516103205261032051610300516102e0516102c0516102a051610280516102605161024051600658016143e0565b61022052610200526101e0526101c0526101a05261018052610160526101405260005073dac17f958d2ee523a2206206994597c13d831ec761024052732260fac5e5542a773aa44fbcfedf7c193bc2c5996102605273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc261028052610240602435600381106128f857600080fd5b60200201513b61290757600080fd5b60006000604463a9059cbb6102a052336102c052610180516102e0526102bc60006102406024356003811061293b57600080fd5b60200201515af161294b57600080fd5b604060046102a037610180516102e052337f5ad056f2e28a8cec232015406b843668c1e36cda598127ec3b8c59b8c72773a060606102a0a26000602355005b63c93f49e88114156129c657602354156129a357600080fd5b600160235534156129b357600080fd5b60065801613e71565b6000506000602355005b635e248072811415612c015734156129dd57600080fd5b60185433146129eb57600080fd5b6006546201517f818183011015612a0157600080fd5b808201905090504211612a1357600080fd5b426201517f818183011015612a2757600080fd5b8082019050905060443511612a3b57600080fd5b60403661014037610140516101605160065801613a18565b610180526101a052610160526101405261018080808080516101c0525050602081019050808080516101e052505050506101c0805161014052806020015161016052506101405160801b610180526101605161018051176101805260043560648082028215828483041417612ac757600080fd5b809050905090506101a052600060043511612ae157600080fd5b620f424060043510612af257600080fd5b6402540be3ff60243511612b0557600080fd5b662386f26fc1000160243510612b1a57600080fd5b610140516101a0511015612b5d57610140516101a051600a8082028215828483041417612b4657600080fd5b809050905090501015612b5857600080fd5b612b8d565b61014051600a8082028215828483041417612b7757600080fd5b809050905090506101a0511115612b8d57600080fd5b61018051600455426006556101a05160801b6101c0526024356101c051176101c0526044356007556101c051600555610140516101e0526101a051610200524261022052604435610240527f7dce008c7221b9d42f26174f7435e50f9cc8f502c57019724c090b546415a02960806101e0a1005b63244c7c2e811415612ced573415612c1857600080fd5b6018543314612c2657600080fd5b60403661014037610140516101605160065801613a18565b610180526101a052610160526101405261018080808080516101c0525050602081019050808080516101e052505050506101c0805161014052806020015161016052506101405160801b610180526101605161018051176101805261018051600455610180516005554260065542600755610140516101a052610160516101c052426101e0527f5f0e7fba3d100c9e19446e1c92fe436f0a9a22fe99669360e4fdd6d3de2fc28460606101a0a1005b63a43c3351811415613021573415612d0457600080fd5b6018543314612d1257600080fd5b60215415612d1f57600080fd5b60e06004610140377fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610160511815612d7d5764012a05f2016101605110612d6657600080fd5b6207a11f6101605111612d7857600080fd5b612d85565b601154610160525b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610140511415612db857601054610140525b61016051610140511115612dcb57600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610180511815612e0f576402540be4016101805110612e0a57600080fd5b612e17565b601254610180525b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101a0511815612e735760006101a05111612e5257600080fd5b6c100000000000000000000000006101a05110612e6e57600080fd5b612e7b565b600a546101a0525b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101c0511815612ebd57610140516101c05111612eb857600080fd5b612ec5565b6008546101c0525b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101e0511415612ef857600c546101e0525b6101c0516101e0511115612f0b57600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610200511815612f5d5760006102005111612f4657600080fd5b62093a806102005110612f5857600080fd5b612f65565b600e54610200525b426203f480818183011015612f7957600080fd5b8082019050905061022052610220516021556101805160155561014051601355610160516014556101a051600b556101c0516009556101e051600d5561020051600f556101805161024052610140516102605261016051610280526101a0516102a0526101c0516102c0526101e0516102e0526102005161030052610220517f913fde9a37e1f8ab67876a4d0ce80790d764fcfc5692f4529526df9c6bdde55360e0610240a2005b632a7dd7cd811415613165576023541561303a57600080fd5b6001602355341561304a57600080fd5b601854331461305857600080fd5b60215442101561306757600080fd5b60006021541861307657600080fd5b6000602155601554610140526101405160125418156130ab576101405160065801613e71565b61014052600050610140516012555b60135461016052610160516010556014546101805261018051601155600b546101a0526101a051600a556009546101c0526101c051600855600d546101e0526101e051600c55600f546102005261020051600e556101405161022052610160516102405261018051610260526101a051610280526101c0516102a0526101e0516102c052610200516102e0527f1c65bbdc939f346e5d6f0bde1f072819947438d4fc7b182cc59c2f6dc550408760e0610220a16000602355005b63226840fb81141561319157341561317c57600080fd5b601854331461318a57600080fd5b6000602155005b636b441a4081141561322e5734156131a857600080fd5b60043560a01c156131b857600080fd5b60185433146131c657600080fd5b602054156131d357600080fd5b426203f4808181830110156131e757600080fd5b808201905090506101405261014051602055600435601955600435610140517f181aa3aa17d4cbf99265dd4443eba009433d3cde79d60164fde1d1a192beb93560006000a3005b636a1c05ae8114156132b057341561324557600080fd5b601854331461325357600080fd5b60205442101561326257600080fd5b60006020541861327157600080fd5b60006020556019546101405261014051601855610140517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60006000a2005b6386fbf1938114156132dc5734156132c757600080fd5b60185433146132d557600080fd5b6000602055005b63e36988538114156133165734156132f357600080fd5b601854331461330157600080fd5b42601f541161330f57600080fd5b6001601e55005b633046f97281141561334257341561332d57600080fd5b601854331461333b57600080fd5b6000601e55005b637242e52481141561337f57341561335957600080fd5b60043560a01c1561336957600080fd5b601854331461337757600080fd5b600435602255005b636112c7478114156133a257341561339657600080fd5b60035460005260206000f35b63204fe3d58114156133c55734156133b957600080fd5b60045460005260206000f35b63f30cfad58114156133e85734156133dc57600080fd5b60055460005260206000f35b63e89876ff81141561340b5734156133ff57600080fd5b60065460005260206000f35b63f9ed959781141561342e57341561342257600080fd5b60075460005260206000f35b6303b736e081141561345157341561344557600080fd5b60085460005260206000f35b6373fb971181141561347457341561346857600080fd5b60095460005260206000f35b6372d4f0e281141561349757341561348b57600080fd5b600a5460005260206000f35b63d7c3dcbe8114156134ba5734156134ae57600080fd5b600b5460005260206000f35b63083812e58114156134dd5734156134d157600080fd5b600c5460005260206000f35b634ea12c7d8114156135005734156134f457600080fd5b600d5460005260206000f35b63662b627481141561352357341561351757600080fd5b600e5460005260206000f35b630c5e23d481141561354657341561353a57600080fd5b600f5460005260206000f35b6392526c0c81141561356957341561355d57600080fd5b60105460005260206000f35b63ee8de67581141561358c57341561358057600080fd5b60115460005260206000f35b63fee3f7f98114156135af5734156135a357600080fd5b60125460005260206000f35b637cf9aedc8114156135d25734156135c657600080fd5b60135460005260206000f35b637d1b060c8114156135f55734156135e957600080fd5b60145460005260206000f35b63e382446281141561361857341561360c57600080fd5b60155460005260206000f35b634903b0d181141561365457341561362f57600080fd5b6004356003811061363f57600080fd5b601660c052602060c020015460005260206000f35b630f529ba281141561367757341561366b57600080fd5b60175460005260206000f35b638da5cb5b81141561369a57341561368e57600080fd5b60185460005260206000f35b631ec0cdc18114156136bd5734156136b157600080fd5b60195460005260206000f35b637ba1a74d8114156136e05734156136d457600080fd5b601a5460005260206000f35b630b7b594b8114156137035734156136f757600080fd5b601b5460005260206000f35b630c46b72a81141561372657341561371a57600080fd5b601c5460005260206000f35b639c868ac081141561374957341561373d57600080fd5b601e5460005260206000f35b632a42689681141561376c57341561376057600080fd5b601f5460005260206000f35b63e0a0b58681141561378f57341561378357600080fd5b60205460005260206000f35b63405e28f88114156137b25734156137a657600080fd5b60215460005260206000f35b636e42e4d28114156137d55734156137c957600080fd5b60225460005260206000f35b505b005b610180526101405261016052600261014051106137f557600080fd5b6fffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8061014051600160ff1b811061383b57600080fd5b808202821582848305141761384f57600080fd5b80905090509050600081121561386d5761016051816000031c613874565b61016051811b5b90501660005260005161018051565b6101405260168060c052602060c020546101605260018160c052602060c02001546101805260028160c052602060c02001546101a052506000546101c05264e8d4a510006101e0526402540be40061020052600161022052610160805164e8d4a5100080820282158284830414176138fa57600080fd5b8090509050905081525061024060016002818352015b6fffffffffffffffffffffffffffffffff6101c051166101e0610240516003811061393a57600080fd5b6020020151808202821582848304141761395357600080fd5b8090509050905061026052610160610240516003811061397257600080fd5b602002015161026051808202821582848304141761398f57600080fd5b80905090509050670de0b6b3a76400008082049050905061016061024051600381106139ba57600080fd5b60200201526101c05160801c6101c0525b8151600101808352811415613910575b50506060610240525b6000610240511115156139f657613a12565b60206102405103610160015160206102405103610240526139e4565b61014051565b6101405260075461016052600554610180526fffffffffffffffffffffffffffffffff61018051166101a0526101805160801c6101c05261016051421015613bd5576004546101e0526006546102005261016080516102005180821015613a7e57600080fd5b80820390509050815250426102005180821015613a9a57600080fd5b80820390509050610200526101e05160801c610160516102005180821015613ac157600080fd5b808203905090508082028215828483041417613adc57600080fd5b809050905090506101c051610200518082028215828483041417613aff57600080fd5b80905090509050818183011015613b1557600080fd5b80820190509050610160518080613b2b57600080fd5b8204905090506101c0526fffffffffffffffffffffffffffffffff6101e05116610160516102005180821015613b6057600080fd5b808203905090508082028215828483041417613b7b57600080fd5b809050905090506101a051610200518082028215828483041417613b9e57600080fd5b80905090509050818183011015613bb457600080fd5b80820190509050610160518080613bca57600080fd5b8204905090506101a0525b6102206101c05181526101a0518160200152506040610260525b600061026051111515613c0157613c1d565b6020610260510361022001516020610260510361026052613bef565b61014051565b6101a05261014052610160526101805260206102c0608463fa18042d6101e052610140516102005261016051610220526101805161024052600a54610260526101fc73656dd75d33a6241a0c4c2368eb00441ad3113ec05afa613c8557600080fd5b601f3d11613c9257600080fd5b6000506102c0516101c0526010546101c0518082028215828483041417613cb857600080fd5b80905090509050601154670de0b6b3a76400006101c05180821015613cdc57600080fd5b808203905090508082028215828483041417613cf757600080fd5b80905090509050818183011015613d0d57600080fd5b80820190509050670de0b6b3a7640000808204905090506000526000516101a051565b61016052610140526060366101803761014051600380820490509050610180526000546101e05261020060016002818352015b61014051670de0b6b3a76400008082028215828483041417613d8457600080fd5b8090509050905060036fffffffffffffffffffffffffffffffff6101e051168082028215828483041417613db757600080fd5b809050905090508080613dc957600080fd5b8204905090506101806102005160038110613de357600080fd5b60200201526101e05160801c6101e0525b8151600101808352811415613d63575b505060206102c0606463bad1dc266102005261018051610220526101a051610240526101c0516102605261021c73656dd75d33a6241a0c4c2368eb00441ad3113ec05afa613e5157600080fd5b601f3d11613e5e57600080fd5b6000506102c05160005260005161016051565b6101405260225461016052601a5461018052601c546101a05261018051601b5480821015613e9e57600080fd5b808203905090506012548082028215828483041417613ebc57600080fd5b809050905090506404a817c800808204905090506101c05260006101c05111156143a0576101a051670de0b6b3a76400008082028215828483041417613f0157600080fd5b809050905090506101a0516101c05180821015613f1d57600080fd5b808203905090508080613f2f57600080fd5b820490509050670de0b6b3a764000080821015613f4b57600080fd5b808203905090506101e05260206102c06044636962f8456102205261016051610240526101e0516102605261023c600073ca3d75ac011bf5ad07a98d02f18225f9bd9a6bdf5af1613f9b57600080fd5b601f3d11613fa857600080fd5b6000506102c0516102005260206102a060046318160ddd6102405261025c73ca3d75ac011bf5ad07a98d02f18225f9bd9a6bdf5afa613fe657600080fd5b601f3d11613ff357600080fd5b6000506102a0516102205273dac17f958d2ee523a2206206994597c13d831ec761024052732260fac5e5542a773aa44fbcfedf7c193bc2c5996102605273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2610280526102a060006003818352015b602061034060246370a082316102c052306102e0526102dc6102406102a0516003811061408157600080fd5b60200201515afa61409157600080fd5b601f3d1161409e57600080fd5b600050610340516102a051600381106140b657600080fd5b601660c052602060c02001555b8151600101808352811415614055575b50506040366102a0376101406102e0525b6102e0515160206102e051016102e0526102e06102e0511015614106576140e4565b60065801613a18565b61030052610320526102c06102e0525b6102e0515260206102e051036102e0526101406102e0511015156141425761411f565b610300808080805161034052505060208101905080808051610360525050505061034080516102a05280602001516102c05250610140610340525b6103405151602061034051016103405261034061034051101561419f5761417d565b60065801613883565b61036052610380526103a052610320610340525b61034051526020610340510361034052610140610340511015156141df576141bc565b61036080516102e05280602001516103005280604001516103205250602061046060a463c7fab708610360526102a051610380526102c0516103a0526102e0516103c052610300516103e052610320516104005261037c73656dd75d33a6241a0c4c2368eb00441ad3113ec05afa61425657600080fd5b601f3d1161426357600080fd5b6000506104605161034052670de0b6b3a7640000610140610380525b610380515160206103805101610380526103806103805110156142a15761427f565b610340516103a0526103a05160065801613d30565b61040052610360610380525b61038051526020610380510361038052610140610380511015156142e5576142c2565b6104005180820282158284830414176142fd57600080fd5b8090509050905061022051808061431357600080fd5b8204905090506103605261036051601c55610360516101805181818301101561433b57600080fd5b808201905090506101a0518082101561435357600080fd5b808203905090506101805261018051601b5561018051601a556102005161038052610160517f6059a38198b1dc42b3791087d1ff0fbd72b3179553c25f678cd246f52ffaaf596020610380a25b61014051566143d8575b610240526000610220526101405261016052610180526101a0526101c0526101e0526102005260005061440c565b60001561440c575b610240526101405261016052610180526101a0526101c0526101e052610200526102205260005061440c565b61018036610260376001546103e05261040060006002818352015b6fffffffffffffffffffffffffffffffff6103e05116610260610400516002811061445157600080fd5b60200201526103e05160801c6103e0525b8151600101808352811415614427575b5050600354610400526002546103e05261042060006002818352015b6fffffffffffffffffffffffffffffffff6103e051166102a061042051600281106144b857600080fd5b60200201526103e05160801c6103e0525b815160010180835281141561448e575b50504261040051101561471e57600e54610420526020610500604463571bae3f6104605242610400518082101561450f57600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761453357600080fd5b8090509050905061042051808061454957600080fd5b820490509050610480526402540be4006104a05261047c73656dd75d33a6241a0c4c2368eb00441ad3113ec05afa61458057600080fd5b601f3d1161458d57600080fd5b600050610500516104405260006103e05261046060006002818352015b6102a061046051600281106145be57600080fd5b6020020151670de0b6b3a764000061044051808210156145dd57600080fd5b8082039050905080820282158284830414176145f857600080fd5b80905090509050610260610460516002811061461357600080fd5b602002015161044051808202821582848304141761463057600080fd5b8090509050905081818301101561464657600080fd5b80820190509050670de0b6b3a764000080820490509050610260610460516002811061467157600080fd5b60200201525b81516001018083528114156145aa575b505061046060006002818352015b6103e05160801b6103e052610260600161046051808210156146b657600080fd5b80820390509050600281106146ca57600080fd5b6020020151610480526fffffffffffffffffffffffffffffffff61048051106146f257600080fd5b6103e05161048051176103e0525b8151600101808352811415614695575b50506103e051600155426003555b61022051610420526102205115156147a457602061054060a463c7fab7086104405261014051610460526101605161048052610180516104a0526101a0516104c0526101c0516104e05261045c73656dd75d33a6241a0c4c2368eb00441ad3113ec05afa61478b57600080fd5b601f3d1161479857600080fd5b60005061054051610420525b6000546103e05261044060006002818352015b6fffffffffffffffffffffffffffffffff6103e051166102e061044051600281106147e157600080fd5b60200201526103e05160801c6103e0525b81516001018083528114156147b7575b505060006102005111156148e45760006101e051111561485457610200516102a06101e05160018082101561483657600080fd5b808203905090506002811061484a57600080fd5b60200201526148df565b61044060006002818352015b6102a0610440516002811061487457600080fd5b6020020151670de0b6b3a7640000808202821582848304141761489657600080fd5b809050905090506102005180806148ac57600080fd5b8204905090506102a061044051600281106148c657600080fd5b60200201525b8151600101808352811415614860575b50505b614a8f565b61018051610440526101a051610460526101c0516104805261044051620f4240808204905090506104a05261044080516104a05181818301101561492757600080fd5b808201905090508152506104c060006002818352015b6102e06104c0516002811061495157600080fd5b60200201516104a051808202821582848304141761496e57600080fd5b809050905090506101806104c051600181818301101561498d57600080fd5b80820190509050600381106149a157600080fd5b6020020151602061062060e46336bc88556104e05261014051610500526101605161052052610440516105405261046051610560526104805161058052610420516105a0526104c05160018181830110156149fb57600080fd5b808201905090506105c0526104fc73656dd75d33a6241a0c4c2368eb00441ad3113ec05afa614a2957600080fd5b601f3d11614a3657600080fd5b6000506106205180821015614a4a57600080fd5b808203905090508080614a5c57600080fd5b8204905090506102a06104c05160028110614a7657600080fd5b60200201525b815160010180835281141561493d575b50505b60006103e05261044060006002818352015b6103e05160801b6103e0526102a060016104405180821015614ac257600080fd5b8082039050905060028110614ad657600080fd5b6020020151610460526fffffffffffffffffffffffffffffffff6104605110614afe57600080fd5b6103e05161046051176103e0525b8151600101808352811415614aa1575b50506103e05160025560206104c060046318160ddd6104605261047c73ca3d75ac011bf5ad07a98d02f18225f9bd9a6bdf5afa614b5857600080fd5b601f3d11614b6557600080fd5b6000506104c05161044052601a5461046052601c54610480526104a060006002818352015b6102606104a05160028110614b9e57600080fd5b6020020151670de0b6b3a76400008082028215828483041417614bc057600080fd5b809050905090506102e06104a05160028110614bdb57600080fd5b60200201518080614beb57600080fd5b8204905090506104c052670de0b6b3a76400006104c0511115614c32576104c08051670de0b6b3a764000080821015614c2357600080fd5b80820390509050815250614c58565b670de0b6b3a76400006104c05180821015614c4c57600080fd5b808203905090506104c0525b6103c080517001000000000000000000000000000000006104c05110614c7d57600080fd5b60026104c0510a818183011015614c9357600080fd5b808201905090508152505b8151600101808352811415614b8a575b505061042051600380820490509050610320526104a060006002818352015b61042051670de0b6b3a76400008082028215828483041417614cee57600080fd5b8090509050905060036102e06104a05160028110614d0b57600080fd5b60200201518082028215828483041417614d2457600080fd5b809050905090508080614d3657600080fd5b8204905090506103206104a0516001818183011015614d5457600080fd5b8082019050905060038110614d6857600080fd5b60200201525b8151600101808352811415614ccd575b5050670de0b6b3a76400006104a052670de0b6b3a76400006104c0526000610480511115614ed95760206105c0606463bad1dc266105005261032051610520526103405161054052610360516105605261051c73656dd75d33a6241a0c4c2368eb00441ad3113ec05afa614df157600080fd5b601f3d11614dfe57600080fd5b6000506105c0516104e052670de0b6b3a76400006104e0518082028215828483041417614e2a57600080fd5b80905090509050610440518080614e4057600080fd5b8204905090506104c052610460516104c0518082028215828483041417614e6657600080fd5b80905090509050610480518080614e7c57600080fd5b8204905090506104a052610480516104c0511015614ed9576308c379a0610500526020610520526004610540527f4c6f7373000000000000000000000000000000000000000000000000000000006105605261054050606461051cfd5b6104a051601a55601d546104e0526104e0511515614f5f576104a051670de0b6b3a764000080821015614f0b57600080fd5b808203905090506002808204905090506509184e72a000818183011015614f3157600080fd5b808201905090506104c051670de0b6b3a764000080821015614f5257600080fd5b8082039050905011614f62565b60005b15614f735760016104e0526001601d555b6104e05115614fbf5770010000000000000000000000000000000060085410614f9b57600080fd5b60026008540a6103c0511115614fb75760006104805111614fba565b60005b614fc2565b60005b156155265760206105806024634e60b141610500526103c051670de0b6b3a7640000808204905090506105205261051c73656dd75d33a6241a0c4c2368eb00441ad3113ec05afa61501257600080fd5b601f3d1161501f57600080fd5b600050610580516103c052600c546105005261052060006002818352015b6102e0610520516002811061505157600080fd5b60200201516103c051610500518082101561506b57600080fd5b80820390509050808202821582848304141761508657600080fd5b809050905090506105005161026061052051600281106150a557600080fd5b602002015180820282158284830414176150be57600080fd5b809050905090508181830110156150d457600080fd5b808201905090506103c05180806150ea57600080fd5b820490509050610380610520516002811061510457600080fd5b60200201525b815160010180835281141561503d575b505061018051610320526101a051610340526101c0516103605261052060006002818352015b61018061052051600181818301101561515857600080fd5b808201905090506003811061516c57600080fd5b6020020151610380610520516002811061518557600080fd5b6020020151808202821582848304141761519e57600080fd5b809050905090506102e061052051600281106151b957600080fd5b602002015180806151c957600080fd5b8204905090506103206105205160018181830110156151e757600080fd5b80820190509050600381106151fb57600080fd5b60200201525b8151600101808352811415615140575b5050602061064060a463c7fab7086105405261014051610560526101605161058052610320516105a052610340516105c052610360516105e05261055c73656dd75d33a6241a0c4c2368eb00441ad3113ec05afa61526e57600080fd5b601f3d1161527b57600080fd5b6000506106405161052052610520516003808204905090506103205261054060006002818352015b61052051670de0b6b3a764000080820282158284830414176152c457600080fd5b80905090509050600361038061054051600281106152e157600080fd5b602002015180820282158284830414176152fa57600080fd5b80905090509050808061530c57600080fd5b82049050905061032061054051600181818301101561532a57600080fd5b808201905090506003811061533e57600080fd5b60200201525b81516001018083528114156152a3575b5050670de0b6b3a76400006020610600606463bad1dc266105405261032051610560526103405161058052610360516105a05261055c73656dd75d33a6241a0c4c2368eb00441ad3113ec05afa6153aa57600080fd5b601f3d116153b757600080fd5b6000506106005180820282158284830414176153d257600080fd5b809050905090506104405180806153e857600080fd5b82049050905061048052670de0b6b3a764000061048051111561546a576104a051670de0b6b3a76400008082101561541f57600080fd5b80820390509050600261048051670de0b6b3a76400008082101561544257600080fd5b80820390509050808202821582848304141761545d57600080fd5b809050905090501161546d565b60005b156155205760006103e05261054060006002818352015b6103e05160801b6103e052610380600161054051808210156154a557600080fd5b80820390509050600281106154b957600080fd5b6020020151610560526fffffffffffffffffffffffffffffffff61056051106154e157600080fd5b6103e05161056051176103e0525b8151600101808352811415615484575b50506103e0516000556105205160175561048051601c556102405156615526565b6000601d555b610420516017556104c051601c5561024051565b610200526101405261016052610180526101a0526101c0526101e0526101405161016051610180516101a0516101c0516101e05161020051610220516101a051610240526101c051610260526101e0516102805261028051610260516102405160065801613c23565b6102e05261022052610200526101e0526101c0526101a0526101805261016052610140526102e051600380820282158284830414176155e157600080fd5b809050905090506008808204905090506102205260006102405261028060006003818352015b6020610280510261014001516102605261024080516102605181818301101561562f57600080fd5b808201905090508152505b8151600101808352811415615607575b505061024051600380820490509050610260526000610280526102c060006003818352015b60206102c0510261014001516102a052610260516102a05111156156cc5761028080516102a05161026051808210156156a757600080fd5b808203905090508181830110156156bd57600080fd5b80820190509050815250615707565b6102808051610260516102a051808210156156e657600080fd5b808203905090508181830110156156fc57600080fd5b808201905090508152505b815160010180835281141561566f575b50506102205161028051808202821582848304141761573557600080fd5b8090509050905061024051808061574b57600080fd5b820490509050620186a081818301101561576457600080fd5b8082019050905060005260005161020051565b6101e0526101405261016052610180526101a0526101c05260175461020052610200516102205260206102c060046318160ddd6102605261027c73ca3d75ac011bf5ad07a98d02f18225f9bd9a6bdf5afa6157d157600080fd5b601f3d116157de57600080fd5b6000506102c05161024052610240516101805111156157fc57600080fd5b60036101a0511061580c57600080fd5b60168060c052602060c020546102605260018160c052602060c02001546102805260028160c052602060c02001546102a0525064e8d4a510006102c0526402540be4006102e0526001610300526c0c9f2c9cd04674edea40000000610320526001156159c557600054610340526102c0805161026051808202821582848304141761589657600080fd5b8090509050905081525061036060016002818352015b6fffffffffffffffffffffffffffffffff610340511661038052610360516101a051141561591157610380516102c06101a051600381106158ec57600080fd5b6020020151808202821582848304141761590557600080fd5b80905090509050610320525b6102c0610360516003811061592557600080fd5b6020020151610260610360516003811061593e57600080fd5b6020020151808202821582848304141761595757600080fd5b8090509050905061038051808202821582848304141761597657600080fd5b80905090509050670de0b6b3a7640000808204905090506102c061036051600381106159a157600080fd5b60200201526103405160801c610340525b81516001018083528114156158ac575b50505b610140610360525b610360515160206103605101610360526103606103605110156159ef576159cd565b6102c051610380526102e0516103a052610300516103c0526103c0516103a0516103805160065801613c23565b61042052610340610360525b6103605152602061036051036103605261014061036051101515615a4b57615a28565b610420516103405261018051610200518082028215828483041417615a6f57600080fd5b80905090509050610240518080615a8557600080fd5b8204905090506103605261020080516103605161034051610360518082028215828483041417615ab457600080fd5b809050905090506404a817c800808204905090506001818183011015615ad957600080fd5b8082019050905080821015615aed57600080fd5b8082039050905080821015615b0157600080fd5b8082039050905081525060206104e060e46336bc88556103a052610140516103c052610160516103e0526102c051610400526102e05161042052610300516104405261020051610460526101a051610480526103bc73656dd75d33a6241a0c4c2368eb00441ad3113ec05afa615b7657600080fd5b601f3d11615b8357600080fd5b6000506104e051610380526102c06101a05160038110615ba257600080fd5b60200201516103805180821015615bb857600080fd5b80820390509050670de0b6b3a76400008082028215828483041417615bdc57600080fd5b80905090509050610320518080615bf257600080fd5b8204905090506103a052610380516102c06101a05160038110615c1457600080fd5b602002015260006103c0526101c05115615c4c57620186a06103a0511115615c4457620186a06101805111615c47565b60005b615c4f565b60005b15615f665760006103e05264e8d4a51000610400526402540be40061042052600161044052604036610460376002546104a0526104c060006002818352015b6fffffffffffffffffffffffffffffffff6104a051166104606104c05160028110615cb857600080fd5b60200201526104a05160801c6104a0525b8151600101808352811415615c8e575b50506104c060006003818352015b6101a0516104c0511815615e0d576104c0511515615d47576103e080516102605164e8d4a510008082028215828483041417615d2257600080fd5b80905090509050818183011015615d3857600080fd5b80820190509050815250615e0d565b6103e080516102606104c05160038110615d6057600080fd5b60200201516104606104c051600180821015615d7b57600080fd5b8082039050905060028110615d8f57600080fd5b60200201518082028215828483041417615da857600080fd5b809050905090506104006104c05160038110615dc357600080fd5b60200201518082028215828483041417615ddc57600080fd5b80905090509050670de0b6b3a764000080820490509050818183011015615e0257600080fd5b808201905090508152505b8151600101808352811415615ce7575b50506103e051610360518082028215828483041417615e3b57600080fd5b80905090509050610220518080615e5157600080fd5b8204905090506103e0526103e051670de0b6b3a76400008082028215828483041417615e7c57600080fd5b809050905090506103a0516104006101a05160038110615e9b57600080fd5b60200201518082028215828483041417615eb457600080fd5b80905090509050610360516102606101a05160038110615ed357600080fd5b60200201518082028215828483041417615eec57600080fd5b809050905090506104006101a05160038110615f0757600080fd5b60200201518082028215828483041417615f2057600080fd5b80905090509050610220518080615f3657600080fd5b82049050905080821015615f4957600080fd5b808203905090508080615f5b57600080fd5b8204905090506103c0525b6104a06103a05181526103c0518160200152610200518160400152806060016102c05181526102e0518160200152610300518160400152505060c0610560525b600061056051111515615fb857615fd4565b602061056051036104a001516020610560510361056052615fa6565b6101e05156
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000babe61887f1de2713c6f97e567623453d3c79f670000000000000000000000000000000000000000000000000000000000000e3d00000000000000000000000000000000000000000000000000003faa25225fff00000000000000000000000000000000000000000000000000000000003d09000000000000000000000000000000000000000000000000000000000002625a000000000000000000000000000000000000000000000000000009f295cd5f0000000000000000000000000000000000000000000000000000002386f26fc100000000000000000000000000000000000000000000000000000005543df729c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002580000000000000000000000000000000000000000000007da7d8434a71000000000000000000000000000000000000000000000000000008ba6039972fcc80000
-----Decoded View---------------
Arg [0] : owner (address): 0xbabe61887f1de2713c6f97e567623453d3C79f67
Arg [1] : A (uint256): 3645
Arg [2] : gamma (uint256): 69999999999999
Arg [3] : mid_fee (uint256): 4000000
Arg [4] : out_fee (uint256): 40000000
Arg [5] : price_threshold (uint256): 2800000000000000
Arg [6] : fee_gamma (uint256): 10000000000000000
Arg [7] : adjustment_step (uint256): 1500000000000000
Arg [8] : admin_fee (uint256): 0
Arg [9] : ma_half_time (uint256): 600
Arg [10] : initial_prices (uint256[2]): 37086999999999998164992,2576060000000000131072
-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 000000000000000000000000babe61887f1de2713c6f97e567623453d3c79f67
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000e3d
Arg [2] : 00000000000000000000000000000000000000000000000000003faa25225fff
Arg [3] : 00000000000000000000000000000000000000000000000000000000003d0900
Arg [4] : 0000000000000000000000000000000000000000000000000000000002625a00
Arg [5] : 0000000000000000000000000000000000000000000000000009f295cd5f0000
Arg [6] : 000000000000000000000000000000000000000000000000002386f26fc10000
Arg [7] : 0000000000000000000000000000000000000000000000000005543df729c000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000258
Arg [10] : 0000000000000000000000000000000000000000000007da7d8434a710000000
Arg [11] : 00000000000000000000000000000000000000000000008ba6039972fcc80000
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.