Latest 25 from a total of 44,898 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Claim_admin_fees | 24565747 | 2 hrs ago | IN | 0 ETH | 0.0003443 | ||||
| Exchange | 24565522 | 3 hrs ago | IN | 0 ETH | 0.0000408 | ||||
| Exchange | 24560064 | 21 hrs ago | IN | 0 ETH | 0.00000989 | ||||
| Claim_admin_fees | 24558571 | 26 hrs ago | IN | 0 ETH | 0.00035917 | ||||
| Exchange | 24557706 | 29 hrs ago | IN | 0 ETH | 0.00005408 | ||||
| Exchange | 24557086 | 31 hrs ago | IN | 0 ETH | 0.0000132 | ||||
| Exchange | 24555855 | 35 hrs ago | IN | 0 ETH | 0.0000183 | ||||
| Remove_liquidity | 24551970 | 2 days ago | IN | 0 ETH | 0.00000824 | ||||
| Claim_admin_fees | 24551414 | 2 days ago | IN | 0 ETH | 0.00036689 | ||||
| Claim_admin_fees | 24544241 | 3 days ago | IN | 0 ETH | 0.00033398 | ||||
| Exchange | 24543926 | 3 days ago | IN | 0 ETH | 0.0000144 | ||||
| Claim_admin_fees | 24537070 | 4 days ago | IN | 0 ETH | 0.00037999 | ||||
| Exchange | 24530811 | 4 days ago | IN | 0 ETH | 0.00002315 | ||||
| Claim_admin_fees | 24529912 | 5 days ago | IN | 0 ETH | 0.00038655 | ||||
| Exchange | 24527535 | 5 days ago | IN | 0 ETH | 0.00006309 | ||||
| Exchange | 24527454 | 5 days ago | IN | 0 ETH | 0.00006163 | ||||
| Claim_admin_fees | 24522736 | 6 days ago | IN | 0 ETH | 0.00038911 | ||||
| Claim_admin_fees | 24515567 | 7 days ago | IN | 0 ETH | 0.00033452 | ||||
| Remove_liquidity | 24512576 | 7 days ago | IN | 0 ETH | 0.0000096 | ||||
| Claim_admin_fees | 24508389 | 8 days ago | IN | 0 ETH | 0.00034464 | ||||
| Exchange | 24507127 | 8 days ago | IN | 0 ETH | 0.00001094 | ||||
| Exchange | 24504873 | 8 days ago | IN | 0 ETH | 0.00001073 | ||||
| 0x87395540 | 24501298 | 9 days ago | IN | 0 ETH | 0.00000126 | ||||
| 0x87395540 | 24501296 | 9 days ago | IN | 0 ETH | 0.00000138 | ||||
| 0x87395540 | 24501265 | 9 days ago | IN | 0 ETH | 0.00000107 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Deposit | 24566195 | 53 mins ago | 0.25588918 ETH | ||||
| Exchange | 24566195 | 53 mins ago | 0.25588918 ETH | ||||
| Transfer | 24565296 | 3 hrs ago | 0.10398296 ETH | ||||
| Transfer | 24565296 | 3 hrs ago | 0.10398296 ETH | ||||
| Transfer | 24564972 | 4 hrs ago | 0.00103449 ETH | ||||
| Transfer | 24564972 | 4 hrs ago | 0.00103449 ETH | ||||
| Transfer | 24564712 | 5 hrs ago | 1.01978607 ETH | ||||
| Transfer | 24564712 | 5 hrs ago | 1.01978607 ETH | ||||
| Transfer | 24564699 | 5 hrs ago | 1.01884355 ETH | ||||
| Transfer | 24564699 | 5 hrs ago | 1.01884355 ETH | ||||
| Transfer | 24562650 | 12 hrs ago | 0.0170193 ETH | ||||
| Transfer | 24562650 | 12 hrs ago | 0.0170193 ETH | ||||
| Deposit | 24562546 | 13 hrs ago | 0.505 ETH | ||||
| Exchange | 24562546 | 13 hrs ago | 0.505 ETH | ||||
| Transfer | 24562473 | 13 hrs ago | 1.06006844 ETH | ||||
| Transfer | 24562473 | 13 hrs ago | 1.06006844 ETH | ||||
| Transfer | 24562446 | 13 hrs ago | 0.26820213 ETH | ||||
| Transfer | 24562446 | 13 hrs ago | 0.26820213 ETH | ||||
| Transfer | 24562059 | 14 hrs ago | 0.01473282 ETH | ||||
| Transfer | 24562059 | 14 hrs ago | 0.01473282 ETH | ||||
| Deposit | 24561434 | 16 hrs ago | 0.006 ETH | ||||
| Exchange | 24561434 | 16 hrs ago | 0.006 ETH | ||||
| Transfer | 24561121 | 17 hrs ago | 0.02084648 ETH | ||||
| Transfer | 24561121 | 17 hrs ago | 0.02084648 ETH | ||||
| Deposit | 24561114 | 17 hrs ago | 0.02912445 ETH |
Loading...
Loading
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/BTC/ETH 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
allowed_extra_profit: uint256
adjustment_step: uint256
ma_half_time: uint256
event NewParameters:
admin_fee: uint256
mid_fee: uint256
out_fee: uint256
fee_gamma: uint256
allowed_extra_profit: uint256
adjustment_step: uint256
ma_half_time: uint256
event RampAgamma:
initial_A: uint256
future_A: uint256
initial_gamma: uint256
future_gamma: 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
PRECISION: constant(uint256) = 10 ** 18 # The precision to convert to
A_MULTIPLIER: constant(uint256) = 10000
# These addresses are replaced by the deployer
math: constant(address) = 0x8F68f4810CcE3194B6cB6F3d50fa58c2c9bDD1d5
token: constant(address) = 0xc4AD29ba4B3c580e6D59105FFf484999997675Ff
views: constant(address) = 0x40745803C2faA8E8402E2Ae935933D07cA8f355c
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)
allowed_extra_profit: public(uint256) # 2 * 10**12 - recommended value
future_allowed_extra_profit: 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) = 10 * 10 ** 9
MAX_A: constant(uint256) = 10000 * A_MULTIPLIER * N_COINS**N_COINS
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
# 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]) = [
1000000000000,
10000000000,
1,
]
INF_COINS: constant(uint256) = 15
@external
def __init__(
owner: address,
admin_fee_receiver: address,
A: uint256,
gamma: uint256,
mid_fee: uint256,
out_fee: uint256,
allowed_extra_profit: 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, 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.allowed_extra_profit = allowed_extra_profit
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 = admin_fee_receiver
@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[2]:
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
t2: uint256 = t1 - t0
A1 = (shift(A_gamma_0, -128) * t2 + A1 * t0) / t1
gamma1 = (bitwise_and(A_gamma_0, 2**128-1) * t2 + gamma1 * t0) / t1
return [A1, gamma1]
@view
@external
def A() -> uint256:
return self._A_gamma()[0]
@view
@external
def gamma() -> uint256:
return self._A_gamma()[1]
@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():
A_gamma: uint256[2] = self._A_gamma()
xcp_profit: uint256 = self.xcp_profit
xcp_profit_a: uint256 = self.xcp_profit_a
# Gulp here
_coins: address[N_COINS] = coins
for i in range(N_COINS):
self.balances[i] = ERC20(_coins[i]).balanceOf(self)
vprice: uint256 = self.virtual_price
if xcp_profit > xcp_profit_a:
fees: uint256 = (xcp_profit - xcp_profit_a) * self.admin_fee / (2 * 10**10)
if fees > 0:
receiver: address = self.admin_fee_receiver
frac: uint256 = vprice * 10**18 / (vprice - fees) - 10**18
claimed: uint256 = CurveToken(token).mint_relative(receiver, frac)
xcp_profit -= fees*2
self.xcp_profit = xcp_profit
log ClaimAdminFee(receiver, claimed)
total_supply: uint256 = CurveToken(token).totalSupply()
# Recalculate D b/c we gulped
D: uint256 = Math(math).newton_D(A_gamma[0], A_gamma[1], self.xp())
self.D = D
self.virtual_price = 10**18 * self.get_xcp(D) / total_supply
if xcp_profit > xcp_profit_a:
self.xcp_profit_a = xcp_profit
@internal
def tweak_price(A_gamma: uint256[2],
_xp: uint256[N_COINS], i: uint256, p_i: uint256,
new_D: uint256):
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])
# 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[0], A_gamma[1], _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[0], A_gamma[1], __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
# 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
t: uint256 = self.future_A_gamma_time
if virtual_price < old_virtual_price and t == 0:
raise "Loss"
if t == 1:
self.future_A_gamma_time = 0
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 + self.allowed_extra_profit):
# (re-arrange for gas efficiency)
if not needs_adjustment and (virtual_price * 2 - 10**18 > xcp_profit + 2*self.allowed_extra_profit):
needs_adjustment = True
self.not_adjusted = True
if needs_adjustment:
adjustment_step: uint256 = self.adjustment_step
norm: uint256 = 0
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
if norm > adjustment_step ** 2 and old_virtual_price > 0:
norm = Math(math).sqrt_int(norm / 10**18) # Need to convert to 1e18 units!
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[0], A_gamma[1], 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):
if (old_virtual_price > 10**18) and (2 * old_virtual_price - 10**18 > xcp_profit):
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_gamma: uint256[2] = 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]
x0: uint256 = xp[i]
xp[i] = x0 + dx
self.balances[i] = xp[i]
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: uint256 = precisions[i]
# In case ramp is happening
if True:
t: uint256 = self.future_A_gamma_time
if t > 0:
x0 *= prec_i
if i > 0:
x0 = x0 * price_scale[i-1] / PRECISION
x1: uint256 = xp[i] # Back up old value in xp
xp[i] = x0
self.D = Math(math).newton_D(A_gamma[0], A_gamma[1], xp)
xp[i] = x1 # And restore
if block.timestamp >= t:
self.future_A_gamma_time = 1
prec_j: uint256 = precisions[j]
dy = xp[j] - Math(math).newton_y(A_gamma[0], A_gamma[1], 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)
y *= prec_j
if j > 0:
y = y * price_scale[j-1] / PRECISION
xp[j] = y
# Calculate price
if dx > 10**5 and dy > 10**5:
_dx: uint256 = dx * prec_i
_dy: uint256 = dy * prec_j
if i != 0 and j != 0:
p = bitwise_and(
shift(self.last_prices_packed, -PRICE_SIZE * convert(i-1, int256)),
PRICE_MASK
) * _dx / _dy # * PRICE_PRECISION_MUL
elif i == 0:
p = _dx * 10**18 / _dy
else: # j == 0
p = _dy * 10**18 / _dx
ix = i
self.tweak_price(A_gamma, xp, ix, p, 0)
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_gamma: uint256[2] = self._A_gamma()
_coins: address[N_COINS] = coins
xp: uint256[N_COINS] = self.balances
amountsp: uint256[N_COINS] = empty(uint256[N_COINS])
xx: uint256[N_COINS] = empty(uint256[N_COINS])
d_token: uint256 = 0
d_token_fee: uint256 = 0
old_D: uint256 = 0
ix: uint256 = INF_COINS
if True: # Scope to avoid having extra variables in memory later
xp_old: uint256[N_COINS] = xp
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]
xp_old[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
xp_old[i] = xp_old[i] * price_scale / PRECISION
packed_prices = shift(packed_prices, -PRICE_SIZE)
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])
amountsp[i] = xp[i] - xp_old[i]
if ix == INF_COINS:
ix = i
else:
ix = INF_COINS-1
assert ix != INF_COINS # dev: no coins to add
t: uint256 = self.future_A_gamma_time
if t > 0:
old_D = Math(math).newton_D(A_gamma[0], A_gamma[1], xp_old)
if block.timestamp >= t:
self.future_A_gamma_time = 1
else:
old_D = self.D
D: uint256 = Math(math).newton_D(A_gamma[0], A_gamma[1], xp)
token_supply: uint256 = CurveToken(token).totalSupply()
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
if d_token > 10**5:
if ix < N_COINS:
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
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()
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_gamma: uint256[2], token_amount: uint256, i: uint256, update_D: bool,
calc_price: bool) -> (uint256, uint256, uint256, uint256[N_COINS]):
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
D0: uint256 = 0
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)
if update_D:
D0 = Math(math).newton_D(A_gamma[0], A_gamma[1], xp)
else:
D0 = self.D
D: uint256 = D0
# 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[0], A_gamma[1], 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:
return self._calc_withdraw_one_coin(self._A_gamma(), token_amount, i, True, 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_gamma: uint256[2] = self._A_gamma()
dy: uint256 = 0
D: uint256 = 0
p: uint256 = 0
xp: uint256[N_COINS] = empty(uint256[N_COINS])
future_A_gamma_time: uint256 = self.future_A_gamma_time
dy, p, D, xp = self._calc_withdraw_one_coin(A_gamma, token_amount, i, (future_A_gamma_time > 0), True)
assert dy >= min_amount, "Slippage"
if block.timestamp >= future_A_gamma_time:
self.future_A_gamma_time = 1
self.balances[i] -= dy
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
A_gamma: uint256[2] = self._A_gamma()
initial_A_gamma: uint256 = shift(A_gamma[0], 128)
initial_A_gamma = bitwise_or(initial_A_gamma, A_gamma[1])
assert future_A > 0
assert future_A < MAX_A+1
assert future_gamma > MIN_GAMMA-1
assert future_gamma < MAX_GAMMA+1
ratio: uint256 = 10**18 * future_A / A_gamma[0]
assert ratio < 10**18 * MAX_A_CHANGE + 1
assert ratio > 10**18 / MAX_A_CHANGE - 1
ratio = 10**18 * future_gamma / A_gamma[1]
assert ratio < 10**18 * MAX_A_CHANGE + 1
assert ratio > 10**18 / MAX_A_CHANGE - 1
self.initial_A_gamma = initial_A_gamma
self.initial_A_gamma_time = block.timestamp
future_A_gamma: uint256 = shift(future_A, 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(A_gamma[0], future_A, A_gamma[1], future_gamma, block.timestamp, future_time)
@external
def stop_ramp_A_gamma():
assert msg.sender == self.owner # dev: only owner
A_gamma: uint256[2] = self._A_gamma()
current_A_gamma: uint256 = shift(A_gamma[0], 128)
current_A_gamma = bitwise_or(current_A_gamma, A_gamma[1])
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(A_gamma[0], A_gamma[1], block.timestamp)
@external
def commit_new_parameters(
_new_mid_fee: uint256,
_new_out_fee: uint256,
_new_admin_fee: uint256,
_new_fee_gamma: uint256,
_new_allowed_extra_profit: 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_allowed_extra_profit: uint256 = _new_allowed_extra_profit
new_adjustment_step: uint256 = _new_adjustment_step
new_ma_half_time: uint256 = _new_ma_half_time
# Fees
if new_out_fee < MAX_FEE+1:
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_FEE:
new_mid_fee = self.mid_fee
assert new_mid_fee <= new_out_fee # dev: mid-fee is too high
if new_admin_fee > MAX_ADMIN_FEE:
new_admin_fee = self.admin_fee
# AMM parameters
if new_fee_gamma < 10**18:
assert new_fee_gamma > 0 # dev: fee_gamma out of range [1 .. 10**18]
else:
new_fee_gamma = self.fee_gamma
if new_allowed_extra_profit > 10**18:
new_allowed_extra_profit = self.allowed_extra_profit
if new_adjustment_step > 10**18:
new_adjustment_step = self.adjustment_step
# MA
if new_ma_half_time < 7*86400:
assert new_ma_half_time > 0 # dev: MA time should be longer than 1 second
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_allowed_extra_profit = new_allowed_extra_profit
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_allowed_extra_profit, 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
allowed_extra_profit: uint256 = self.future_allowed_extra_profit
self.allowed_extra_profit = allowed_extra_profit
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,
allowed_extra_profit, 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":"allowed_extra_profit","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":"allowed_extra_profit","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_gamma","type":"uint256","indexed":false},{"name":"future_gamma","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":"admin_fee_receiver","type":"address"},{"name":"A","type":"uint256"},{"name":"gamma","type":"uint256"},{"name":"mid_fee","type":"uint256"},{"name":"out_fee","type":"uint256"},{"name":"allowed_extra_profit","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":597},{"stateMutability":"view","type":"function","name":"gamma","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":11991},{"stateMutability":"view","type":"function","name":"fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":21673},{"stateMutability":"view","type":"function","name":"fee_calc","inputs":[{"name":"xp","type":"uint256[3]"}],"outputs":[{"name":"","type":"uint256"}],"gas":11096},{"stateMutability":"view","type":"function","name":"get_virtual_price","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":11582},{"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":3122},{"stateMutability":"view","type":"function","name":"calc_token_fee","inputs":[{"name":"amounts","type":"uint256[3]"},{"name":"xp","type":"uint256[3]"}],"outputs":[{"name":"","type":"uint256"}],"gas":26582},{"stateMutability":"nonpayable","type":"function","name":"add_liquidity","inputs":[{"name":"amounts","type":"uint256[3]"},{"name":"min_mint_amount","type":"uint256"}],"outputs":[],"gas":738687},{"stateMutability":"nonpayable","type":"function","name":"remove_liquidity","inputs":[{"name":"_amount","type":"uint256"},{"name":"min_amounts","type":"uint256[3]"}],"outputs":[],"gas":233981},{"stateMutability":"view","type":"function","name":"calc_token_amount","inputs":[{"name":"amounts","type":"uint256[3]"},{"name":"deposit","type":"bool"}],"outputs":[{"name":"","type":"uint256"}],"gas":3429},{"stateMutability":"view","type":"function","name":"calc_withdraw_one_coin","inputs":[{"name":"token_amount","type":"uint256"},{"name":"i","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":13432},{"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":648579},{"stateMutability":"nonpayable","type":"function","name":"claim_admin_fees","inputs":[],"outputs":[],"gas":389808},{"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":163102},{"stateMutability":"nonpayable","type":"function","name":"stop_ramp_A_gamma","inputs":[],"outputs":[],"gas":157247},{"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_allowed_extra_profit","type":"uint256"},{"name":"_new_adjustment_step","type":"uint256"},{"name":"_new_ma_half_time","type":"uint256"}],"outputs":[],"gas":306190},{"stateMutability":"nonpayable","type":"function","name":"apply_new_parameters","inputs":[],"outputs":[],"gas":683438},{"stateMutability":"nonpayable","type":"function","name":"revert_new_parameters","inputs":[],"outputs":[],"gas":23222},{"stateMutability":"nonpayable","type":"function","name":"commit_transfer_ownership","inputs":[{"name":"_owner","type":"address"}],"outputs":[],"gas":77260},{"stateMutability":"nonpayable","type":"function","name":"apply_transfer_ownership","inputs":[],"outputs":[],"gas":65937},{"stateMutability":"nonpayable","type":"function","name":"revert_transfer_ownership","inputs":[],"outputs":[],"gas":23312},{"stateMutability":"nonpayable","type":"function","name":"kill_me","inputs":[],"outputs":[],"gas":40535},{"stateMutability":"nonpayable","type":"function","name":"unkill_me","inputs":[],"outputs":[],"gas":23372},{"stateMutability":"nonpayable","type":"function","name":"set_admin_fee_receiver","inputs":[{"name":"_admin_fee_receiver","type":"address"}],"outputs":[],"gas":38505},{"stateMutability":"view","type":"function","name":"last_prices_timestamp","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3378},{"stateMutability":"view","type":"function","name":"initial_A_gamma","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3408},{"stateMutability":"view","type":"function","name":"future_A_gamma","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3438},{"stateMutability":"view","type":"function","name":"initial_A_gamma_time","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3468},{"stateMutability":"view","type":"function","name":"future_A_gamma_time","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3498},{"stateMutability":"view","type":"function","name":"allowed_extra_profit","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3528},{"stateMutability":"view","type":"function","name":"future_allowed_extra_profit","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3558},{"stateMutability":"view","type":"function","name":"fee_gamma","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3588},{"stateMutability":"view","type":"function","name":"future_fee_gamma","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3618},{"stateMutability":"view","type":"function","name":"adjustment_step","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3648},{"stateMutability":"view","type":"function","name":"future_adjustment_step","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3678},{"stateMutability":"view","type":"function","name":"ma_half_time","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3708},{"stateMutability":"view","type":"function","name":"future_ma_half_time","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3738},{"stateMutability":"view","type":"function","name":"mid_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3768},{"stateMutability":"view","type":"function","name":"out_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3798},{"stateMutability":"view","type":"function","name":"admin_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3828},{"stateMutability":"view","type":"function","name":"future_mid_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3858},{"stateMutability":"view","type":"function","name":"future_out_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3888},{"stateMutability":"view","type":"function","name":"future_admin_fee","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3918},{"stateMutability":"view","type":"function","name":"balances","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":4057},{"stateMutability":"view","type":"function","name":"D","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3978},{"stateMutability":"view","type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":4008},{"stateMutability":"view","type":"function","name":"future_owner","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":4038},{"stateMutability":"view","type":"function","name":"xcp_profit","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":4068},{"stateMutability":"view","type":"function","name":"xcp_profit_a","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":4098},{"stateMutability":"view","type":"function","name":"virtual_price","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":4128},{"stateMutability":"view","type":"function","name":"is_killed","inputs":[],"outputs":[{"name":"","type":"bool"}],"gas":4158},{"stateMutability":"view","type":"function","name":"kill_deadline","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":4188},{"stateMutability":"view","type":"function","name":"transfer_ownership_deadline","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":4218},{"stateMutability":"view","type":"function","name":"admin_actions_deadline","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":4248},{"stateMutability":"view","type":"function","name":"admin_fee_receiver","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":4278}]Contract Creation Code
6101a06160fb6101403960206160fb60c03960c05160a01c1561002157600080fd5b602060206160fb0160c03960c05160a01c1561003c57600080fd5b610140516018556101805160801b6102e0526101a0516102e051176102e0526102e0516004556102e0516005556101c0516010556101e0516011556102005160085561022051600a5561024051600c556102605160125560006103005261032060006002818352015b6103005160801b610300526102a0600161032051808210156100c657600080fd5b80820390509050600281106100da57600080fd5b6020020151610340526fffffffffffffffffffffffffffffffff610340511061010257600080fd5b610300516103405117610300525b81516001018083528114156100a5575b50506103005160005561030051600155610300516002554260035561028051600e55670de0b6b3a7640000601b5542624f1a0081818301101561016257600080fd5b80820190509050601f55610160516022556160e356600436101561000d57613762565b600035601c52600051635b41b90881141561002d5760006101405261005e565b63394747c58114156100595760843560011c1561004957600080fd5b602060846101403760005061005e565b610e29565b6023541561006b57600080fd5b6001602355601e541561007d57600080fd5b6024356004351861008d57600080fd5b60036004351061009c57600080fd5b6003602435106100ab57600080fd5b6000604435116100ba57600080fd5b610140516101605161018051600658016139a3565b6101a0526101c0526101805261016052610140526101a08051610160528060200151610180525060168060c052602060c020546101a05260018160c052602060c02001546101c05260028160c052602060c02001546101e052506024356102005260403661022037600115610d2b5773dac17f958d2ee523a2206206994597c13d831ec761026052732260fac5e5542a773aa44fbcfedf7c193bc2c5996102805273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26102a0526002600435141561019d57610140516101a0565b60005b1561020a5760443534146101b357600080fd5b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc23b6101d257600080fd5b60006000600463d0e30db06102c0526102dc3473c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af161020557600080fd5b61027f565b341561021557600080fd5b6102606004356003811061022857600080fd5b60200201513b61023757600080fd5b6000600060646323b872dd6102c052336102e0523061030052604435610320526102dc60006102606004356003811061026f57600080fd5b60200201515af161027f57600080fd5b6101a06024356003811061029257600080fd5b60200201516102c0526101a0600435600381106102ae57600080fd5b60200201516102e0526102e0516044358181830110156102cd57600080fd5b808201905090506101a0600435600381106102e757600080fd5b60200201526101a0600435600381106102ff57600080fd5b60200201516004356003811061031457600080fd5b601660c052602060c0200155604036610300376000546103405261036060006002818352015b6fffffffffffffffffffffffffffffffff6103405116610300610360516002811061036457600080fd5b60200201526103405160801c610340525b815160010180835281141561033a575b505064e8d4a51000610360526402540be4006103805260016103a0526101a0805164e8d4a5100080820282158284830414176103c057600080fd5b809050905090508152506103c060016002818352015b6101a06103c051600381106103ea57600080fd5b60200201516103006103c05160018082101561040557600080fd5b808203905090506002811061041957600080fd5b6020020151808202821582848304141761043257600080fd5b809050905090506103606103c0516003811061044d57600080fd5b6020020151808202821582848304141761046657600080fd5b80905090509050670de0b6b3a7640000808204905090506101a06103c0516003811061049157600080fd5b60200201525b81516001018083528114156103d6575b5050610360600435600381106104bc57600080fd5b60200201516103c05260011561064b576007546103e05260006103e051111561064b576102e080516103c05180820282158284830414176104fc57600080fd5b8090509050905081525060006004351115610573576102e05161030060043560018082101561052a57600080fd5b808203905090506002811061053e57600080fd5b6020020151808202821582848304141761055757600080fd5b80905090509050670de0b6b3a7640000808204905090506102e0525b6101a06004356003811061058657600080fd5b6020020151610400526102e0516101a0600435600381106105a657600080fd5b6020020152602061052060a463c7fab70861042052610160516104405261018051610460526101a051610480526101c0516104a0526101e0516104c05261043c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa61060657600080fd5b601f3d1161061357600080fd5b60005061052051601755610400516101a06004356003811061063457600080fd5b60200201526103e0514210151561064b5760016007555b6103606024356003811061065e57600080fd5b60200201516103e0526101a06024356003811061067a57600080fd5b6020020151602061054060e46336bc885561040052610160516104205261018051610440526101a051610460526101c051610480526101e0516104a0526017546104c0526024356104e05261041c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa6106e857600080fd5b601f3d116106f557600080fd5b600050610540518082101561070957600080fd5b80820390509050610240526101a06024356003811061072757600080fd5b602002018051610240518082101561073e57600080fd5b80820390509050815250610240805160018082101561075c57600080fd5b80820390509050815250600060243511156107dd5761024051670de0b6b3a7640000808202821582848304141761079257600080fd5b809050905090506103006024356001808210156107ae57600080fd5b80820390509050600281106107c257600080fd5b602002015180806107d257600080fd5b820490509050610240525b61024080516103e05180806107f157600080fd5b8204905090508152506102408051610140610400525b6104005151602061040051016104005261040061040051101561082957610807565b6101a051610420526101c051610440526101e0516104605261046051610440516104205160065801613b9b565b6104c0526103e0610400525b610400515260206104005103610400526101406104005110151561088557610862565b6104c0516102405180820282158284830414176108a157600080fd5b809050905090506402540be40080820490509050808210156108c257600080fd5b808203905090508152506064356102405110151515610920576308c379a0610400526020610420526008610440527f536c6970706167650000000000000000000000000000000000000000000000006104605261044050606461041cfd5b6102c08051610240518082101561093657600080fd5b808203905090508152506102c0516024356003811061095457600080fd5b601660c052602060c0200155600260243514156109745761014051610977565b60005b15610a1c5773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc23b61099b57600080fd5b600060006024632e1a7d4d61040052610240516104205261041c600073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af16109d757600080fd5b6000610400526104008051602001806104408284600060045af16109fa57600080fd5b5050600060006104405161046061024051335af1610a1757600080fd5b610a82565b61026060243560038110610a2f57600080fd5b60200201513b610a3e57600080fd5b60006000604463a9059cbb610400523361042052610240516104405261041c600061026060243560038110610a7257600080fd5b60200201515af1610a8257600080fd5b6102c080516103e0518082028215828483041417610a9f57600080fd5b8090509050905081525060006024351115610b16576102c051610300602435600180821015610acd57600080fd5b8082039050905060028110610ae157600080fd5b60200201518082028215828483041417610afa57600080fd5b80905090509050670de0b6b3a7640000808204905090506102c0525b6102c0516101a060243560038110610b2d57600080fd5b6020020152620186a06044351115610b4d57620186a06102405111610b50565b60005b15610d2b576044356103c0518082028215828483041417610b7057600080fd5b8090509050905061040052610240516103e0518082028215828483041417610b9757600080fd5b809050905090506104205260006004351815610bb95760006024351415610bbc565b60005b15610c93576fffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80600435600180821015610c0557600080fd5b80820390509050600160ff1b8110610c1c57600080fd5b8082028215828483051417610c3057600080fd5b809050905090506000811215610c4d57600254816000031c610c53565b600254811b5b905016610400518082028215828483041417610c6e57600080fd5b80905090509050610420518080610c8457600080fd5b82049050905061022052610d2b565b6004351515610ce25761040051670de0b6b3a76400008082028215828483041417610cbd57600080fd5b80905090509050610420518080610cd357600080fd5b82049050905061022052610d2b565b61042051670de0b6b3a76400008082028215828483041417610d0357600080fd5b80905090509050610400518080610d1957600080fd5b82049050905061022052600435610200525b6101405161016051610180516101a0516101c0516101e051610200516102205161024051610160516102605261018051610280526101a0516102a0526101c0516102c0526101e0516102e052610200516103005261022051610320526000610340526103405161032051610300516102e0516102c0516102a0516102805161026051600658016142cf565b6102405261022052610200526101e0526101c0526101a05261018052610160526101405260005060043561026052604435610280526024356102a052610240516102c052337fb2e76ae99761dc136e598d4a629bb347eccb9532a5f8bbd72e18467c3c34cc986080610260a26000602355005b6368727653811415610e70573415610e4057600080fd5b6004356101405260015461016052610160516101405160065801613764565b6101c0526101c05160005260206000f35b63a3f7cdd5811415610eb7573415610e8757600080fd5b6004356101405260005461016052610160516101405160065801613764565b6101c0526101c05160005260206000f35b6359189017811415610efe573415610ece57600080fd5b6004356101405260025461016052610160516101405160065801613764565b6101c0526101c05160005260206000f35b63fc0c546a811415610f33573415610f1557600080fd5b73c4ad29ba4b3c580e6d59105fff484999997675ff60005260206000f35b63c6610657811415610fb6573415610f4a57600080fd5b73dac17f958d2ee523a2206206994597c13d831ec761014052732260fac5e5542a773aa44fbcfedf7c193bc2c5996101605273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26101805261014060043560038110610fa857600080fd5b602002015160005260206000f35b63f446c1d0811415610feb573415610fcd57600080fd5b600658016139a3565b61014052610160526101405160005260206000f35b63b137392981141561102357341561100257600080fd5b600658016139a3565b61014052610160526101406020015160005260206000f35b63ddca3f438114156110d957341561103a57600080fd5b6006580161380e565b61014052610160526101805261014080516101a05280602001516101c05280604001516101e052506101405161016051610180516101a0516101c0516101e0516101a051610200526101c051610220526101e0516102405261024051610220516102005160065801613b9b565b6102a0526101e0526101c0526101a0526101805261016052610140526102a05160005260206000f35b63572e56258114156111315734156110f057600080fd5b60048035610140528060200135610160528060400135610180525061018051610160516101405160065801613b9b565b6101e0526101e05160005260206000f35b63bb7b8b808114156111e957341561114857600080fd5b670de0b6b3a7640000601754610140526101405160065801613ca8565b6101a0526101a051808202821582848304141761118157600080fd5b80905090509050602061022060046318160ddd6101c0526101dc73c4ad29ba4b3c580e6d59105fff484999997675ff5afa6111bb57600080fd5b601f3d116111c857600080fd5b6000506102205180806111da57600080fd5b82049050905060005260206000f35b63556d6e9f81141561125857341561120057600080fd5b6020610200606463556d6e9f61014052606060046101603761015c7340745803c2faa8e8402e2ae935933d07ca8f355c5afa61123b57600080fd5b601f3d1161124857600080fd5b6000506102005160005260206000f35b63cde699fa8114156112d757341561126f57600080fd5b600480356101405280602001356101605280604001356101805250606480356101a05280602001356101c05280604001356101e052506101e0516101c0516101a0516101805161016051610140516006580161543f565b610240526102405160005260206000f35b634515cef38114156120a757602354156112f057600080fd5b6001602355341561130057600080fd5b601e541561130d57600080fd5b6101405161016051600658016139a3565b610180526101a05261016052610140526101808051610140528060200151610160525073dac17f958d2ee523a2206206994597c13d831ec761018052732260fac5e5542a773aa44fbcfedf7c193bc2c5996101a05273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26101c05260168060c052602060c020546101e05260018160c052602060c02001546102005260028160c052602060c020015461022052506101203661024037600f6103605260011561184c576101e05161038052610200516103a052610220516103c0526103e060006003818352015b6101e06103e0516003811061140c57600080fd5b602002015160046103e0516003811061142457600080fd5b602002013581818301101561143857600080fd5b8082019050905061040052610400516101e06103e0516003811061145b57600080fd5b6020020152610400516103e0516003811061147557600080fd5b601660c052602060c02001555b81516001018083528114156113f8575b50506101e0516102a052610200516102c052610220516102e05264e8d4a510006103e0526402540be40061040052600161042052600054610440526101e0805164e8d4a5100080820282158284830414176114ec57600080fd5b80905090509050815250610380805164e8d4a51000808202821582848304141761151557600080fd5b8090509050905081525061046060016002818352015b6fffffffffffffffffffffffffffffffff61044051166103e0610460516003811061155557600080fd5b6020020151808202821582848304141761156e57600080fd5b80905090509050610480526101e0610460516003811061158d57600080fd5b60200201516104805180820282158284830414176115aa57600080fd5b80905090509050670de0b6b3a7640000808204905090506101e061046051600381106115d557600080fd5b602002015261038061046051600381106115ee57600080fd5b602002015161048051808202821582848304141761160b57600080fd5b80905090509050670de0b6b3a764000080820490509050610380610460516003811061163657600080fd5b60200201526104405160801c610440525b815160010180835281141561152b575b505061046060006003818352015b60006004610460516003811061167a57600080fd5b6020020135111561178557610180610460516003811061169957600080fd5b60200201513b6116a857600080fd5b6000600060646323b872dd61048052336104a052306104c052600461046051600381106116d457600080fd5b60200201356104e05261049c600061018061046051600381106116f657600080fd5b60200201515af161170657600080fd5b6101e0610460516003811061171a57600080fd5b6020020151610380610460516003811061173357600080fd5b60200201518082101561174557600080fd5b80820390509050610240610460516003811061176057600080fd5b6020020152600f61036051141561177e576104605161036052611785565b600e610360525b8151600101808352811415611665575b5050600f61036051186117a757600080fd5b60075461046052600061046051111561184457602061058060a463c7fab70861048052610140516104a052610160516104c052610380516104e0526103a051610500526103c0516105205261049c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa61181557600080fd5b601f3d1161182257600080fd5b6000506105805161034052610460514210151561183f5760016007555b61184c565b601754610340525b60206104a060a463c7fab7086103a052610140516103c052610160516103e0526101e05161040052610200516104205261022051610440526103bc738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa6118a757600080fd5b601f3d116118b457600080fd5b6000506104a05161038052602061042060046318160ddd6103c0526103dc73c4ad29ba4b3c580e6d59105fff484999997675ff5afa6118f257600080fd5b601f3d116118ff57600080fd5b600050610420516103a052600061034051111561196f576103a05161038051808202821582848304141761193257600080fd5b8090509050905061034051808061194857600080fd5b8204905090506103a0518082101561195f57600080fd5b80820390509050610300526119e6565b6101406103c0525b6103c0515160206103c051016103c0526103c06103c051101561199957611977565b610380516103e0526103e05160065801613ca8565b610440526103a06103c0525b6103c0515260206103c051036103c0526101406103c0511015156119dd576119ba565b61044051610300525b600061030051116119f657600080fd5b6000610340511115611f96576101406103c0525b6103c0515160206103c051016103c0526103c06103c0511015611a2c57611a0a565b610240516103e052610260516104005261028051610420526101e051610440526102005161046052610220516104805261048051610460516104405161042051610400516103e0516006580161543f565b6104e0526103a06103c0525b6103c0515260206103c051036103c0526101406103c051101515611aac57611a89565b6104e051610300518082028215828483041417611ac857600080fd5b809050905090506402540be400808204905090506001818183011015611aed57600080fd5b808201905090506103205261030080516103205180821015611b0e57600080fd5b808203905090508152506103a0805161030051818183011015611b3057600080fd5b80820190509050815250602061046060446340c10f196103c052336103e05261030051610400526103dc600073c4ad29ba4b3c580e6d59105fff484999997675ff5af1611b7c57600080fd5b601f3d11611b8957600080fd5b6000506104605060006103c052620186a0610300511115611ed0576003610360511015611ed0576060366103e0376002546104405264e8d4a51000610460526402540be4006104805260016104a0526104c060006002818352015b6fffffffffffffffffffffffffffffffff61044051166104006104c05160028110611c0e57600080fd5b60200201526104405160801c610440525b8151600101808352811415611be4575b50506104c060006003818352015b610360516104c0511815611d63576104c0511515611c9d576103e080516102a05164e8d4a510008082028215828483041417611c7857600080fd5b80905090509050818183011015611c8e57600080fd5b80820190509050815250611d63565b6103e080516102a06104c05160038110611cb657600080fd5b60200201516104006104c051600180821015611cd157600080fd5b8082039050905060028110611ce557600080fd5b60200201518082028215828483041417611cfe57600080fd5b809050905090506104606104c05160038110611d1957600080fd5b60200201518082028215828483041417611d3257600080fd5b80905090509050670de0b6b3a764000080820490509050818183011015611d5857600080fd5b808201905090508152505b8151600101808352811415611c3d575b50506103e051610300518082028215828483041417611d9157600080fd5b809050905090506103a0518080611da757600080fd5b8204905090506103e0526103e051670de0b6b3a76400008082028215828483041417611dd257600080fd5b8090509050905060046103605160038110611dec57600080fd5b60200201356104606103605160038110611e0557600080fd5b60200201518082028215828483041417611e1e57600080fd5b80905090509050610300516102a06103605160038110611e3d57600080fd5b60200201518082028215828483041417611e5657600080fd5b809050905090506104606103605160038110611e7157600080fd5b60200201518082028215828483041417611e8a57600080fd5b809050905090506103a0518080611ea057600080fd5b82049050905080821015611eb357600080fd5b808203905090508080611ec557600080fd5b8204905090506103c0525b6101406103e0525b6103e0515160206103e051016103e0526103e06103e0511015611efa57611ed8565b610140516104005261016051610420526101e0516104405261020051610460526102205161048052610360516104a0526103c0516104c052610380516104e0526104e0516104c0516104a0516104805161046051610440516104205161040051600658016142cf565b6103c06103e0525b6103e0515260206103e051036103e0526101406103e051101515611f8e57611f6b565b60005061200c565b61038051601755670de0b6b3a7640000601c55670de0b6b3a7640000601a55602061046060446340c10f196103c052336103e05261030051610400526103dc600073c4ad29ba4b3c580e6d59105fff484999997675ff5af1611ff757600080fd5b601f3d1161200457600080fd5b600050610460505b6064356103005110151515612060576308c379a06103c05260206103e0526008610400527f536c697070616765000000000000000000000000000000000000000000000000610420526104005060646103dcfd5b606060046103c03761032051610420526103a05161044052337f96b486485420b963edd3fdec0b0195730035600feb7de6f544383d7950fa97ee60a06103c0a26000602355005b63ecb586a581141561243457602354156120c057600080fd5b600160235534156120d057600080fd5b73dac17f958d2ee523a2206206994597c13d831ec761014052732260fac5e5542a773aa44fbcfedf7c193bc2c5996101605273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc261018052602061022060046318160ddd6101c0526101dc73c4ad29ba4b3c580e6d59105fff484999997675ff5afa61214e57600080fd5b601f3d1161215b57600080fd5b600050610220516101a052602061026060446379cc67906101c052336101e052600435610200526101dc600073c4ad29ba4b3c580e6d59105fff484999997675ff5af16121a757600080fd5b601f3d116121b457600080fd5b6000506102605060168060c052602060c020546101c05260018160c052602060c02001546101e05260028160c052602060c0200154610200525060043560018082101561220057600080fd5b808203905090506102205261024060006003818352015b6101c0610240516003811061222b57600080fd5b602002015161022051808202821582848304141761224857600080fd5b809050905090506101a051808061225e57600080fd5b820490509050610260526024610240516003811061227b57600080fd5b602002013561026051101561228f57600080fd5b6101c061024051600381106122a357600080fd5b602002015161026051808210156122b957600080fd5b8082039050905061024051600381106122d157600080fd5b601660c052602060c0200155610260516101c061024051600381106122f557600080fd5b6020020152610140610240516003811061230e57600080fd5b60200201513b61231d57600080fd5b60006000604463a9059cbb61028052336102a052610260516102c05261029c6000610140610240516003811061235257600080fd5b60200201515af161236257600080fd5b8151600101808352811415612217575b505060175461024052610240516102405161022051808202821582848304141761239b57600080fd5b809050905090506101a05180806123b157600080fd5b820490509050808210156123c457600080fd5b808203905090506017556101c051610260526101e05161028052610200516102a0526101a051600435808210156123fa57600080fd5b808203905090506102c052337fd6cc314a0b1e3b2579f8e64248e82434072e8271290eef8ad0886709304195f56080610260a26000602355005b633883e1198114156124cd57341561244b57600080fd5b60643560011c1561245b57600080fd5b60206102206084633883e11961014052600480356101605280602001356101805280604001356101a052506064356101c05261015c7340745803c2faa8e8402e2ae935933d07ca8f355c5afa6124b057600080fd5b601f3d116124bd57600080fd5b6000506102205160005260206000f35b634fb08c5e8114156125f65734156124e457600080fd5b600658016139a3565b610140526101605261014080516101805280602001516101a052506101405161016051610180516101a051610180516101c0526101a0516101e0526040600461020037600161024052600061026052610260516102405161022051610200516101e0516101c0516006580161567c565b6102c0526102e052610300526103205261034052610360526101a0526101805261016052610140526102c08080808051610380525050602081019050808080516103a0525050602081019050808080516103c05250506020810190508080808080516103e05250506020810190508080805161040052505060208101905080808051610420525050505050506103805160005260206000f35b63f1dc3cc9811415612a4b576023541561260f57600080fd5b6001602355341561261f57600080fd5b601e541561262c57600080fd5b6101405161016051600658016139a3565b610180526101a05261016052610140526101808051610140528060200151610160525060c03661018037600754610240526101405161016051610180516101a0516101c0516101e05161020051610220516102405161014051610260526101605161028052604060046102a037600061024051116102e052600161030052610300516102e0516102c0516102a05161028051610260516006580161567c565b61036052610380526103a0526103c0526103e052610400526102405261022052610200526101e0526101c0526101a05261018052610160526101405261036080808080516104205250506020810190508080805161044052505060208101905080808051610460525050602081019050808080808051610480525050602081019050808080516104a0525050602081019050808080516104c05250505050505061042080516101805280602001516101c05280604001516101a0528060600180516101e05280602001516102005280604001516102205250506044356101805110151515612809576308c379a06102605260206102805260086102a0527f536c6970706167650000000000000000000000000000000000000000000000006102c0526102a050606461027cfd5b610240514210151561281b5760016007555b6024356003811061282b57600080fd5b601660c052602060c020018054610180518082101561284957600080fd5b80820390509050815550602061030060446379cc67906102605233610280526004356102a05261027c600073c4ad29ba4b3c580e6d59105fff484999997675ff5af161289457600080fd5b601f3d116128a157600080fd5b600050610300506101405161016051610180516101a0516101c0516101e051610200516102205161024051610140516102605261016051610280526101e0516102a052610200516102c052610220516102e052602435610300526101c051610320526101a051610340526103405161032051610300516102e0516102c0516102a0516102805161026051600658016142cf565b6102405261022052610200526101e0526101c0526101a05261018052610160526101405260005073dac17f958d2ee523a2206206994597c13d831ec761026052732260fac5e5542a773aa44fbcfedf7c193bc2c5996102805273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26102a052610260602435600381106129b957600080fd5b60200201513b6129c857600080fd5b60006000604463a9059cbb6102c052336102e05261018051610300526102dc6000610260602435600381106129fc57600080fd5b60200201515af1612a0c57600080fd5b604060046102c0376101805161030052337f5ad056f2e28a8cec232015406b843668c1e36cda598127ec3b8c59b8c72773a060606102c0a26000602355005b63c93f49e8811415612a875760235415612a6457600080fd5b60016023553415612a7457600080fd5b60065801613de9565b6000506000602355005b635e248072811415612cee573415612a9e57600080fd5b6018543314612aac57600080fd5b6006546201517f818183011015612ac257600080fd5b808201905090504211612ad457600080fd5b426201517f818183011015612ae857600080fd5b8082019050905060443511612afc57600080fd5b6101405161016051600658016139a3565b610180526101a0526101605261014052610180805161014052806020015161016052506101405160801b6101805261016051610180511761018052600060043511612b5757600080fd5b63a0eebb0160043510612b6957600080fd5b6402540be3ff60243511612b7c57600080fd5b662386f26fc1000160243510612b9157600080fd5b670de0b6b3a76400006004358082028215828483041417612bb157600080fd5b80905090509050610140518080612bc757600080fd5b8204905090506101a052678ac7230489e800016101a05110612be857600080fd5b67016345785d89ffff6101a05111612bff57600080fd5b670de0b6b3a76400006024358082028215828483041417612c1f57600080fd5b80905090509050610160518080612c3557600080fd5b8204905090506101a052678ac7230489e800016101a05110612c5657600080fd5b67016345785d89ffff6101a05111612c6d57600080fd5b610180516004554260065560043560801b6101c0526024356101c051176101c0526044356007556101c051600555610140516101e052600435610200526101605161022052602435610240524261026052604435610280527fe35f0559b0642164e286b30df2077ec3a05426617a25db7578fd20ba39a6cd0560c06101e0a1005b63244c7c2e811415612db3573415612d0557600080fd5b6018543314612d1357600080fd5b6101405161016051600658016139a3565b610180526101a0526101605261014052610180805161014052806020015161016052506101405160801b610180526101605161018051176101805261018051600455610180516005554260065542600755610140516101a052610160516101c052426101e0527f5f0e7fba3d100c9e19446e1c92fe436f0a9a22fe99669360e4fdd6d3de2fc28460606101a0a1005b63a43c3351811415612fac573415612dca57600080fd5b6018543314612dd857600080fd5b60215415612de557600080fd5b60e06004610140376402540be401610160511015612e14576207a11f6101605111612e0f57600080fd5b612e1c565b601154610160525b6402540be400610140511115612e3457601054610140525b61016051610140511115612e4757600080fd5b6402540be400610180511115612e5f57601254610180525b670de0b6b3a76400006101a0511015612e875760006101a05111612e8257600080fd5b612e8f565b600a546101a0525b670de0b6b3a76400006101c0511115612eaa576008546101c0525b670de0b6b3a76400006101e0511115612ec557600c546101e0525b62093a80610200511015612ee85760006102005111612ee357600080fd5b612ef0565b600e54610200525b426203f480818183011015612f0457600080fd5b8082019050905061022052610220516021556101805160155561014051601355610160516014556101a051600b556101c0516009556101e051600d5561020051600f556101805161024052610140516102605261016051610280526101a0516102a0526101c0516102c0526101e0516102e0526102005161030052610220517f913fde9a37e1f8ab67876a4d0ce80790d764fcfc5692f4529526df9c6bdde55360e0610240a2005b632a7dd7cd8114156130f05760235415612fc557600080fd5b60016023553415612fd557600080fd5b6018543314612fe357600080fd5b602154421015612ff257600080fd5b60006021541861300157600080fd5b600060215560155461014052610140516012541815613036576101405160065801613de9565b61014052600050610140516012555b60135461016052610160516010556014546101805261018051601155600b546101a0526101a051600a556009546101c0526101c051600855600d546101e0526101e051600c55600f546102005261020051600e556101405161022052610160516102405261018051610260526101a051610280526101c0516102a0526101e0516102c052610200516102e0527f1c65bbdc939f346e5d6f0bde1f072819947438d4fc7b182cc59c2f6dc550408760e0610220a16000602355005b63226840fb81141561311c57341561310757600080fd5b601854331461311557600080fd5b6000602155005b636b441a408114156131b957341561313357600080fd5b60043560a01c1561314357600080fd5b601854331461315157600080fd5b6020541561315e57600080fd5b426203f48081818301101561317257600080fd5b808201905090506101405261014051602055600435601955600435610140517f181aa3aa17d4cbf99265dd4443eba009433d3cde79d60164fde1d1a192beb93560006000a3005b636a1c05ae81141561323b5734156131d057600080fd5b60185433146131de57600080fd5b6020544210156131ed57600080fd5b6000602054186131fc57600080fd5b60006020556019546101405261014051601855610140517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60006000a2005b6386fbf19381141561326757341561325257600080fd5b601854331461326057600080fd5b6000602055005b63e36988538114156132a157341561327e57600080fd5b601854331461328c57600080fd5b42601f541161329a57600080fd5b6001601e55005b633046f9728114156132cd5734156132b857600080fd5b60185433146132c657600080fd5b6000601e55005b637242e52481141561330a5734156132e457600080fd5b60043560a01c156132f457600080fd5b601854331461330257600080fd5b600435602255005b636112c74781141561332d57341561332157600080fd5b60035460005260206000f35b63204fe3d581141561335057341561334457600080fd5b60045460005260206000f35b63f30cfad581141561337357341561336757600080fd5b60055460005260206000f35b63e89876ff81141561339657341561338a57600080fd5b60065460005260206000f35b63f9ed95978114156133b95734156133ad57600080fd5b60075460005260206000f35b6349fe9e778114156133dc5734156133d057600080fd5b60085460005260206000f35b63727ced578114156133ff5734156133f357600080fd5b60095460005260206000f35b6372d4f0e281141561342257341561341657600080fd5b600a5460005260206000f35b63d7c3dcbe81141561344557341561343957600080fd5b600b5460005260206000f35b63083812e581141561346857341561345c57600080fd5b600c5460005260206000f35b634ea12c7d81141561348b57341561347f57600080fd5b600d5460005260206000f35b63662b62748114156134ae5734156134a257600080fd5b600e5460005260206000f35b630c5e23d48114156134d15734156134c557600080fd5b600f5460005260206000f35b6392526c0c8114156134f45734156134e857600080fd5b60105460005260206000f35b63ee8de67581141561351757341561350b57600080fd5b60115460005260206000f35b63fee3f7f981141561353a57341561352e57600080fd5b60125460005260206000f35b637cf9aedc81141561355d57341561355157600080fd5b60135460005260206000f35b637d1b060c81141561358057341561357457600080fd5b60145460005260206000f35b63e38244628114156135a357341561359757600080fd5b60155460005260206000f35b634903b0d18114156135df5734156135ba57600080fd5b600435600381106135ca57600080fd5b601660c052602060c020015460005260206000f35b630f529ba28114156136025734156135f657600080fd5b60175460005260206000f35b638da5cb5b81141561362557341561361957600080fd5b60185460005260206000f35b631ec0cdc181141561364857341561363c57600080fd5b60195460005260206000f35b637ba1a74d81141561366b57341561365f57600080fd5b601a5460005260206000f35b630b7b594b81141561368e57341561368257600080fd5b601b5460005260206000f35b630c46b72a8114156136b15734156136a557600080fd5b601c5460005260206000f35b639c868ac08114156136d45734156136c857600080fd5b601e5460005260206000f35b632a4268968114156136f75734156136eb57600080fd5b601f5460005260206000f35b63e0a0b58681141561371a57341561370e57600080fd5b60205460005260206000f35b63405e28f881141561373d57341561373157600080fd5b60215460005260206000f35b636e42e4d281141561376057341561375457600080fd5b60225460005260206000f35b505b005b6101805261014052610160526002610140511061378057600080fd5b6fffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8061014051600160ff1b81106137c657600080fd5b80820282158284830514176137da57600080fd5b8090509050905060008112156137f85761016051816000031c6137ff565b61016051811b5b90501660005260005161018051565b6101405260168060c052602060c020546101605260018160c052602060c02001546101805260028160c052602060c02001546101a052506000546101c05264e8d4a510006101e0526402540be40061020052600161022052610160805164e8d4a51000808202821582848304141761388557600080fd5b8090509050905081525061024060016002818352015b6fffffffffffffffffffffffffffffffff6101c051166101e061024051600381106138c557600080fd5b602002015180820282158284830414176138de57600080fd5b809050905090506102605261016061024051600381106138fd57600080fd5b602002015161026051808202821582848304141761391a57600080fd5b80905090509050670de0b6b3a764000080820490509050610160610240516003811061394557600080fd5b60200201526101c05160801c6101c0525b815160010180835281141561389b575b50506060610240525b6000610240511115156139815761399d565b602061024051036101600151602061024051036102405261396f565b61014051565b6101405260075461016052600554610180526fffffffffffffffffffffffffffffffff61018051166101a0526101805160801c6101c05261016051421015613b50576004546101e0526006546102005261016080516102005180821015613a0957600080fd5b80820390509050815250426102005180821015613a2557600080fd5b8082039050905061020052610160516102005180821015613a4557600080fd5b80820390509050610220526101e05160801c610220518082028215828483041417613a6f57600080fd5b809050905090506101c051610200518082028215828483041417613a9257600080fd5b80905090509050818183011015613aa857600080fd5b80820190509050610160518080613abe57600080fd5b8204905090506101c0526fffffffffffffffffffffffffffffffff6101e05116610220518082028215828483041417613af657600080fd5b809050905090506101a051610200518082028215828483041417613b1957600080fd5b80905090509050818183011015613b2f57600080fd5b80820190509050610160518080613b4557600080fd5b8204905090506101a0525b6101c051610200526101a0516102205260406101e0525b60006101e051111515613b7957613b95565b60206101e05103610200015160206101e051036101e052613b67565b61014051565b6101a05261014052610160526101805260206102c0608463fa18042d6101e052610140516102005261016051610220526101805161024052600a54610260526101fc738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa613bfd57600080fd5b601f3d11613c0a57600080fd5b6000506102c0516101c0526010546101c0518082028215828483041417613c3057600080fd5b80905090509050601154670de0b6b3a76400006101c05180821015613c5457600080fd5b808203905090508082028215828483041417613c6f57600080fd5b80905090509050818183011015613c8557600080fd5b80820190509050670de0b6b3a7640000808204905090506000526000516101a051565b61016052610140526060366101803761014051600380820490509050610180526000546101e05261020060016002818352015b61014051670de0b6b3a76400008082028215828483041417613cfc57600080fd5b8090509050905060036fffffffffffffffffffffffffffffffff6101e051168082028215828483041417613d2f57600080fd5b809050905090508080613d4157600080fd5b8204905090506101806102005160038110613d5b57600080fd5b60200201526101e05160801c6101e0525b8151600101808352811415613cdb575b505060206102c0606463bad1dc266102005261018051610220526101a051610240526101c0516102605261021c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa613dc957600080fd5b601f3d11613dd657600080fd5b6000506102c05160005260005161016051565b61014052610140516101605161018051600658016139a3565b6101a0526101c0526101805261016052610140526101a080516101605280602001516101805250601a546101a052601b546101c05273dac17f958d2ee523a2206206994597c13d831ec76101e052732260fac5e5542a773aa44fbcfedf7c193bc2c5996102005273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26102205261024060006003818352015b60206102e060246370a0823161026052306102805261027c6101e06102405160038110613eba57600080fd5b60200201515afa613eca57600080fd5b601f3d11613ed757600080fd5b6000506102e0516102405160038110613eef57600080fd5b601660c052602060c02001555b8151600101808352811415613e8e575b5050601c54610240526101c0516101a05111156140cc576101a0516101c05180821015613f3857600080fd5b808203905090506012548082028215828483041417613f5657600080fd5b809050905090506404a817c800808204905090506102605260006102605111156140cc576022546102805261024051670de0b6b3a76400008082028215828483041417613fa257600080fd5b80905090509050610240516102605180821015613fbe57600080fd5b808203905090508080613fd057600080fd5b820490509050670de0b6b3a764000080821015613fec57600080fd5b808203905090506102a05260206103806044636962f8456102e05261028051610300526102a051610320526102fc600073c4ad29ba4b3c580e6d59105fff484999997675ff5af161403c57600080fd5b601f3d1161404957600080fd5b600050610380516102c0526101a08051610260516002808202821582848304141761407357600080fd5b809050905090508082101561408757600080fd5b808203905090508152506101a051601a556102c0516102e052610280517f6059a38198b1dc42b3791087d1ff0fbd72b3179553c25f678cd246f52ffaaf5960206102e0a25b60206102e060046318160ddd6102805261029c73c4ad29ba4b3c580e6d59105fff484999997675ff5afa6140ff57600080fd5b601f3d1161410c57600080fd5b6000506102e05161026052602061040060a463c7fab70861030052610160516103205261018051610340526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516006580161380e565b6102a0526102c0526102e05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526102a080516103605280602001516103805280604001516103a0525061031c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa6141e357600080fd5b601f3d116141f057600080fd5b600050610400516102805261028051601755670de0b6b3a76400006101405161016051610180516101a0516101c0516101e0516102005161022051610240516102605161028051610280516102a0526102a05160065801613ca8565b6103005261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261030051808202821582848304141761429457600080fd5b809050905090506102605180806142aa57600080fd5b820490509050601c556101c0516101a05111156142c9576101a051601b555b61014051565b610240526101405261016052610180526101a0526101c0526101e052610200526102205261016036610260376001546103c0526103e060006002818352015b6fffffffffffffffffffffffffffffffff6103c051166102606103e0516002811061433857600080fd5b60200201526103c05160801c6103c0525b815160010180835281141561430e575b50506003546103e0526002546103c05261040060006002818352015b6fffffffffffffffffffffffffffffffff6103c051166102a0610400516002811061439f57600080fd5b60200201526103c05160801c6103c0525b8151600101808352811415614375575b5050426103e051101561460557600e546104005260206104e0604463571bae3f61044052426103e051808210156143f657600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761441a57600080fd5b8090509050905061040051808061443057600080fd5b820490509050610460526402540be4006104805261045c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa61446757600080fd5b601f3d1161447457600080fd5b6000506104e0516104205260006103c05261044060006002818352015b6102a061044051600281106144a557600080fd5b6020020151670de0b6b3a764000061042051808210156144c457600080fd5b8082039050905080820282158284830414176144df57600080fd5b8090509050905061026061044051600281106144fa57600080fd5b602002015161042051808202821582848304141761451757600080fd5b8090509050905081818301101561452d57600080fd5b80820190509050670de0b6b3a764000080820490509050610260610440516002811061455857600080fd5b60200201525b8151600101808352811415614491575b505061044060006002818352015b6103c05160801b6103c0526102606001610440518082101561459d57600080fd5b80820390509050600281106145b157600080fd5b6020020151610460526fffffffffffffffffffffffffffffffff61046051106145d957600080fd5b6103c05161046051176103c0525b815160010180835281141561457c575b50506103c051600155426003555b610220516104005261022051151561468b57602061052060a463c7fab708610420526101405161044052610160516104605261018051610480526101a0516104a0526101c0516104c05261043c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa61467257600080fd5b601f3d1161467f57600080fd5b60005061052051610400525b6000546103c05261042060006002818352015b6fffffffffffffffffffffffffffffffff6103c051166102e061042051600281106146c857600080fd5b60200201526103c05160801c6103c0525b815160010180835281141561469e575b505060006102005111156147cb5760006101e051111561473b57610200516102a06101e05160018082101561471d57600080fd5b808203905090506002811061473157600080fd5b60200201526147c6565b61042060006002818352015b6102a0610420516002811061475b57600080fd5b6020020151670de0b6b3a7640000808202821582848304141761477d57600080fd5b8090509050905061020051808061479357600080fd5b8204905090506102a061042051600281106147ad57600080fd5b60200201525b8151600101808352811415614747575b50505b614976565b61018051610420526101a051610440526101c0516104605261042051620f4240808204905090506104805261042080516104805181818301101561480e57600080fd5b808201905090508152506104a060006002818352015b6102e06104a0516002811061483857600080fd5b602002015161048051808202821582848304141761485557600080fd5b809050905090506101806104a051600181818301101561487457600080fd5b808201905090506003811061488857600080fd5b6020020151602061060060e46336bc88556104c052610140516104e052610160516105005261042051610520526104405161054052610460516105605261040051610580526104a05160018181830110156148e257600080fd5b808201905090506105a0526104dc738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa61491057600080fd5b601f3d1161491d57600080fd5b600050610600518082101561493157600080fd5b80820390509050808061494357600080fd5b8204905090506102a06104a0516002811061495d57600080fd5b60200201525b8151600101808352811415614824575b50505b60006103c05261042060006002818352015b6103c05160801b6103c0526102a0600161042051808210156149a957600080fd5b80820390509050600281106149bd57600080fd5b6020020151610440526fffffffffffffffffffffffffffffffff61044051106149e557600080fd5b6103c05161044051176103c0525b8151600101808352811415614988575b50506103c05160025560206104a060046318160ddd6104405261045c73c4ad29ba4b3c580e6d59105fff484999997675ff5afa614a3f57600080fd5b601f3d11614a4c57600080fd5b6000506104a05161042052601a5461044052601c5461046052610400516003808204905090506103205261048060006002818352015b61040051670de0b6b3a76400008082028215828483041417614aa357600080fd5b8090509050905060036102e06104805160028110614ac057600080fd5b60200201518082028215828483041417614ad957600080fd5b809050905090508080614aeb57600080fd5b820490509050610320610480516001818183011015614b0957600080fd5b8082019050905060038110614b1d57600080fd5b60200201525b8151600101808352811415614a82575b5050670de0b6b3a764000061048052670de0b6b3a76400006104a0526000610460511115614cb95760206105a0606463bad1dc266104e0526103205161050052610340516105205261036051610540526104fc738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa614ba657600080fd5b601f3d11614bb357600080fd5b6000506105a0516104c052670de0b6b3a76400006104c0518082028215828483041417614bdf57600080fd5b80905090509050610420518080614bf557600080fd5b8204905090506104a052610440516104a0518082028215828483041417614c1b57600080fd5b80905090509050610460518080614c3157600080fd5b820490509050610480526007546104e052610460516104a0511015614c5a576104e05115614c5d565b60005b15614ca7576308c379a0610500526020610520526004610540527f4c6f7373000000000000000000000000000000000000000000000000000000006105605261054050606461051cfd5b60016104e0511415614cb95760006007555b61048051601a55601d546104c0526104c0511515614d4f576104805160026008548082028215828483041417614cee57600080fd5b80905090509050818183011015614d0457600080fd5b808201905090506104a05160028082028215828483041417614d2557600080fd5b80905090509050670de0b6b3a764000080821015614d4257600080fd5b8082039050905011614d52565b60005b15614d635760016104c0526001601d555b6104c0511561542b57600c546104e05260006105005261052060006002818352015b6102606105205160028110614d9957600080fd5b6020020151670de0b6b3a76400008082028215828483041417614dbb57600080fd5b809050905090506102e06105205160028110614dd657600080fd5b60200201518080614de657600080fd5b82049050905061054052670de0b6b3a7640000610540511115614e2d576105408051670de0b6b3a764000080821015614e1e57600080fd5b80820390509050815250614e53565b670de0b6b3a76400006105405180821015614e4757600080fd5b80820390509050610540525b61050080517001000000000000000000000000000000006105405110614e7857600080fd5b6002610540510a818183011015614e8e57600080fd5b808201905090508152505b8151600101808352811415614d85575b50507001000000000000000000000000000000006104e05110614ecb57600080fd5b60026104e0510a610500511115614ee85760006104605111614eeb565b60005b1561542b5760206105a06024634e60b1416105205261050051670de0b6b3a7640000808204905090506105405261053c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa614f3b57600080fd5b601f3d11614f4857600080fd5b6000506105a0516105005261052060006002818352015b6102e06105205160028110614f7357600080fd5b6020020151610500516104e05180821015614f8d57600080fd5b808203905090508082028215828483041417614fa857600080fd5b809050905090506104e0516102606105205160028110614fc757600080fd5b60200201518082028215828483041417614fe057600080fd5b80905090509050818183011015614ff657600080fd5b8082019050905061050051808061500c57600080fd5b820490509050610380610520516002811061502657600080fd5b60200201525b8151600101808352811415614f5f575b505061018051610320526101a051610340526101c0516103605261052060006002818352015b61018061052051600181818301101561507a57600080fd5b808201905090506003811061508e57600080fd5b602002015161038061052051600281106150a757600080fd5b602002015180820282158284830414176150c057600080fd5b809050905090506102e061052051600281106150db57600080fd5b602002015180806150eb57600080fd5b82049050905061032061052051600181818301101561510957600080fd5b808201905090506003811061511d57600080fd5b60200201525b8151600101808352811415615062575b5050602061064060a463c7fab7086105405261014051610560526101605161058052610320516105a052610340516105c052610360516105e05261055c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa61519057600080fd5b601f3d1161519d57600080fd5b6000506106405161052052610520516003808204905090506103205261054060006002818352015b61052051670de0b6b3a764000080820282158284830414176151e657600080fd5b809050905090506003610380610540516002811061520357600080fd5b6020020151808202821582848304141761521c57600080fd5b80905090509050808061522e57600080fd5b82049050905061032061054051600181818301101561524c57600080fd5b808201905090506003811061526057600080fd5b60200201525b81516001018083528114156151c5575b5050670de0b6b3a76400006020610600606463bad1dc266105405261032051610560526103405161058052610360516105a05261055c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa6152cc57600080fd5b601f3d116152d957600080fd5b6000506106005180820282158284830414176152f457600080fd5b8090509050905061042051808061530a57600080fd5b82049050905061046052670de0b6b3a764000061046051111561536f5761048051600261046051808202821582848304141761534557600080fd5b80905090509050670de0b6b3a76400008082101561536257600080fd5b8082039050905011615372565b60005b156154255760006103c05261054060006002818352015b6103c05160801b6103c052610380600161054051808210156153aa57600080fd5b80820390509050600281106153be57600080fd5b6020020151610560526fffffffffffffffffffffffffffffffff61056051106153e657600080fd5b6103c05161056051176103c0525b8151600101808352811415615389575b50506103c0516000556105205160175561046051601c55610240515661542b565b6000601d555b610400516017556104a051601c5561024051565b610200526101405261016052610180526101a0526101c0526101e0526101405161016051610180516101a0516101c0516101e05161020051610220516101a051610240526101c051610260526101e0516102805261028051610260516102405160065801613b9b565b6102e05261022052610200526101e0526101c0526101a0526101805261016052610140526102e051600380820282158284830414176154e657600080fd5b809050905090506008808204905090506102205260006102405261028060006003818352015b6020610280510261014001516102605261024080516102605181818301101561553457600080fd5b808201905090508152505b815160010180835281141561550c575b505061024051600380820490509050610260526000610280526102c060006003818352015b60206102c0510261014001516102a052610260516102a05111156155d15761028080516102a05161026051808210156155ac57600080fd5b808203905090508181830110156155c257600080fd5b8082019050905081525061560c565b6102808051610260516102a051808210156155eb57600080fd5b8082039050905081818301101561560157600080fd5b808201905090508152505b8151600101808352811415615574575b50506102205161028051808202821582848304141761563a57600080fd5b8090509050905061024051808061565057600080fd5b820490509050620186a081818301101561566957600080fd5b8082019050905060005260005161020051565b610200526101405261016052610180526101a0526101c0526101e05260206102a060046318160ddd6102405261025c73c4ad29ba4b3c580e6d59105fff484999997675ff5afa6156cb57600080fd5b601f3d116156d857600080fd5b6000506102a05161022052610220516101805111156156f657600080fd5b60036101a0511061570657600080fd5b60168060c052602060c020546102405260018160c052602060c02001546102605260028160c052602060c0200154610280525064e8d4a510006102a0526402540be4006102c05260016102e0526000610300526c0c9f2c9cd04674edea40000000610320526001156158c557600054610340526102a0805161024051808202821582848304141761579657600080fd5b8090509050905081525061036060016002818352015b6fffffffffffffffffffffffffffffffff610340511661038052610360516101a051141561581157610380516102a06101a051600381106157ec57600080fd5b6020020151808202821582848304141761580557600080fd5b80905090509050610320525b6102a0610360516003811061582557600080fd5b6020020151610240610360516003811061583e57600080fd5b6020020151808202821582848304141761585757600080fd5b8090509050905061038051808202821582848304141761587657600080fd5b80905090509050670de0b6b3a7640000808204905090506102a061036051600381106158a157600080fd5b60200201526103405160801c610340525b81516001018083528114156157ac575b50505b6101c0511561594657602061044060a463c7fab70861034052610140516103605261016051610380526102a0516103a0526102c0516103c0526102e0516103e05261035c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa61592957600080fd5b601f3d1161593657600080fd5b600050610440516103005261594e565b601754610300525b6103005161034052610140610380525b610380515160206103805101610380526103806103805110156159805761595e565b6102a0516103a0526102c0516103c0526102e0516103e0526103e0516103c0516103a05160065801613b9b565b61044052610360610380525b61038051526020610380510361038052610140610380511015156159dc576159b9565b610440516103605261018051610340518082028215828483041417615a0057600080fd5b80905090509050610220518080615a1657600080fd5b8204905090506103805261034080516103805161036051610380518082028215828483041417615a4557600080fd5b809050905090506404a817c800808204905090506001818183011015615a6a57600080fd5b8082019050905080821015615a7e57600080fd5b8082039050905080821015615a9257600080fd5b80820390509050815250602061050060e46336bc88556103c052610140516103e05261016051610400526102a051610420526102c051610440526102e0516104605261034051610480526101a0516104a0526103dc738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa615b0757600080fd5b601f3d11615b1457600080fd5b600050610500516103a0526102a06101a05160038110615b3357600080fd5b60200201516103a05180821015615b4957600080fd5b80820390509050670de0b6b3a76400008082028215828483041417615b6d57600080fd5b80905090509050610320518080615b8357600080fd5b8204905090506103c0526103a0516102a06101a05160038110615ba557600080fd5b602002015260006103e0526101e05115615bdd57620186a06103c0511115615bd557620186a06101805111615bd8565b60005b615be0565b60005b15615ef75760006104005264e8d4a51000610420526402540be40061044052600161046052604036610480376002546104c0526104e060006002818352015b6fffffffffffffffffffffffffffffffff6104c051166104806104e05160028110615c4957600080fd5b60200201526104c05160801c6104c0525b8151600101808352811415615c1f575b50506104e060006003818352015b6101a0516104e0511815615d9e576104e0511515615cd85761040080516102405164e8d4a510008082028215828483041417615cb357600080fd5b80905090509050818183011015615cc957600080fd5b80820190509050815250615d9e565b61040080516102406104e05160038110615cf157600080fd5b60200201516104806104e051600180821015615d0c57600080fd5b8082039050905060028110615d2057600080fd5b60200201518082028215828483041417615d3957600080fd5b809050905090506104206104e05160038110615d5457600080fd5b60200201518082028215828483041417615d6d57600080fd5b80905090509050670de0b6b3a764000080820490509050818183011015615d9357600080fd5b808201905090508152505b8151600101808352811415615c78575b505061040051610380518082028215828483041417615dcc57600080fd5b80905090509050610300518080615de257600080fd5b8204905090506104005261040051670de0b6b3a76400008082028215828483041417615e0d57600080fd5b809050905090506103c0516104206101a05160038110615e2c57600080fd5b60200201518082028215828483041417615e4557600080fd5b80905090509050610380516102406101a05160038110615e6457600080fd5b60200201518082028215828483041417615e7d57600080fd5b809050905090506104206101a05160038110615e9857600080fd5b60200201518082028215828483041417615eb157600080fd5b80905090509050610300518080615ec757600080fd5b82049050905080821015615eda57600080fd5b808203905090508080615eec57600080fd5b8204905090506103e0525b6104c06103c05181526103e0518160200152610340518160400152806060016102a05181526102c05181602001526102e0518160400152505060c0610580525b600061058051111515615f4957615f65565b602061058051036104c001516020610580510361058052615f37565b61020051565b6101786160e3036101786000396101786160e3036000f3000000000000000000000000babe61887f1de2713c6f97e567623453d3c79f67000000000000000000000000ecb456ea5365865ebab8a2661b0c503410e9b347000000000000000000000000000000000000000000000000000000000000d2f0000000000000000000000000000000000000000000000000000c6f3b40b6c0000000000000000000000000000000000000000000000000000000000000a7d8c00000000000000000000000000000000000000000000000000000000002aea540000000000000000000000000000000000000000000000000000001d1a94a20000000000000000000000000000000000000000000000000000001c6bf526340000000000000000000000000000000000000000000000000000001bda703f0a000000000000000000000000000000000000000000000000000000000012a05f20000000000000000000000000000000000000000000000000000000000000002580000000000000000000000000000000000000000000006e514c561b9fec00000000000000000000000000000000000000000000000000069eff91234645c0000
Deployed Bytecode
0x600436101561000d57613762565b600035601c52600051635b41b90881141561002d5760006101405261005e565b63394747c58114156100595760843560011c1561004957600080fd5b602060846101403760005061005e565b610e29565b6023541561006b57600080fd5b6001602355601e541561007d57600080fd5b6024356004351861008d57600080fd5b60036004351061009c57600080fd5b6003602435106100ab57600080fd5b6000604435116100ba57600080fd5b610140516101605161018051600658016139a3565b6101a0526101c0526101805261016052610140526101a08051610160528060200151610180525060168060c052602060c020546101a05260018160c052602060c02001546101c05260028160c052602060c02001546101e052506024356102005260403661022037600115610d2b5773dac17f958d2ee523a2206206994597c13d831ec761026052732260fac5e5542a773aa44fbcfedf7c193bc2c5996102805273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26102a0526002600435141561019d57610140516101a0565b60005b1561020a5760443534146101b357600080fd5b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc23b6101d257600080fd5b60006000600463d0e30db06102c0526102dc3473c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af161020557600080fd5b61027f565b341561021557600080fd5b6102606004356003811061022857600080fd5b60200201513b61023757600080fd5b6000600060646323b872dd6102c052336102e0523061030052604435610320526102dc60006102606004356003811061026f57600080fd5b60200201515af161027f57600080fd5b6101a06024356003811061029257600080fd5b60200201516102c0526101a0600435600381106102ae57600080fd5b60200201516102e0526102e0516044358181830110156102cd57600080fd5b808201905090506101a0600435600381106102e757600080fd5b60200201526101a0600435600381106102ff57600080fd5b60200201516004356003811061031457600080fd5b601660c052602060c0200155604036610300376000546103405261036060006002818352015b6fffffffffffffffffffffffffffffffff6103405116610300610360516002811061036457600080fd5b60200201526103405160801c610340525b815160010180835281141561033a575b505064e8d4a51000610360526402540be4006103805260016103a0526101a0805164e8d4a5100080820282158284830414176103c057600080fd5b809050905090508152506103c060016002818352015b6101a06103c051600381106103ea57600080fd5b60200201516103006103c05160018082101561040557600080fd5b808203905090506002811061041957600080fd5b6020020151808202821582848304141761043257600080fd5b809050905090506103606103c0516003811061044d57600080fd5b6020020151808202821582848304141761046657600080fd5b80905090509050670de0b6b3a7640000808204905090506101a06103c0516003811061049157600080fd5b60200201525b81516001018083528114156103d6575b5050610360600435600381106104bc57600080fd5b60200201516103c05260011561064b576007546103e05260006103e051111561064b576102e080516103c05180820282158284830414176104fc57600080fd5b8090509050905081525060006004351115610573576102e05161030060043560018082101561052a57600080fd5b808203905090506002811061053e57600080fd5b6020020151808202821582848304141761055757600080fd5b80905090509050670de0b6b3a7640000808204905090506102e0525b6101a06004356003811061058657600080fd5b6020020151610400526102e0516101a0600435600381106105a657600080fd5b6020020152602061052060a463c7fab70861042052610160516104405261018051610460526101a051610480526101c0516104a0526101e0516104c05261043c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa61060657600080fd5b601f3d1161061357600080fd5b60005061052051601755610400516101a06004356003811061063457600080fd5b60200201526103e0514210151561064b5760016007555b6103606024356003811061065e57600080fd5b60200201516103e0526101a06024356003811061067a57600080fd5b6020020151602061054060e46336bc885561040052610160516104205261018051610440526101a051610460526101c051610480526101e0516104a0526017546104c0526024356104e05261041c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa6106e857600080fd5b601f3d116106f557600080fd5b600050610540518082101561070957600080fd5b80820390509050610240526101a06024356003811061072757600080fd5b602002018051610240518082101561073e57600080fd5b80820390509050815250610240805160018082101561075c57600080fd5b80820390509050815250600060243511156107dd5761024051670de0b6b3a7640000808202821582848304141761079257600080fd5b809050905090506103006024356001808210156107ae57600080fd5b80820390509050600281106107c257600080fd5b602002015180806107d257600080fd5b820490509050610240525b61024080516103e05180806107f157600080fd5b8204905090508152506102408051610140610400525b6104005151602061040051016104005261040061040051101561082957610807565b6101a051610420526101c051610440526101e0516104605261046051610440516104205160065801613b9b565b6104c0526103e0610400525b610400515260206104005103610400526101406104005110151561088557610862565b6104c0516102405180820282158284830414176108a157600080fd5b809050905090506402540be40080820490509050808210156108c257600080fd5b808203905090508152506064356102405110151515610920576308c379a0610400526020610420526008610440527f536c6970706167650000000000000000000000000000000000000000000000006104605261044050606461041cfd5b6102c08051610240518082101561093657600080fd5b808203905090508152506102c0516024356003811061095457600080fd5b601660c052602060c0200155600260243514156109745761014051610977565b60005b15610a1c5773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc23b61099b57600080fd5b600060006024632e1a7d4d61040052610240516104205261041c600073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af16109d757600080fd5b6000610400526104008051602001806104408284600060045af16109fa57600080fd5b5050600060006104405161046061024051335af1610a1757600080fd5b610a82565b61026060243560038110610a2f57600080fd5b60200201513b610a3e57600080fd5b60006000604463a9059cbb610400523361042052610240516104405261041c600061026060243560038110610a7257600080fd5b60200201515af1610a8257600080fd5b6102c080516103e0518082028215828483041417610a9f57600080fd5b8090509050905081525060006024351115610b16576102c051610300602435600180821015610acd57600080fd5b8082039050905060028110610ae157600080fd5b60200201518082028215828483041417610afa57600080fd5b80905090509050670de0b6b3a7640000808204905090506102c0525b6102c0516101a060243560038110610b2d57600080fd5b6020020152620186a06044351115610b4d57620186a06102405111610b50565b60005b15610d2b576044356103c0518082028215828483041417610b7057600080fd5b8090509050905061040052610240516103e0518082028215828483041417610b9757600080fd5b809050905090506104205260006004351815610bb95760006024351415610bbc565b60005b15610c93576fffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80600435600180821015610c0557600080fd5b80820390509050600160ff1b8110610c1c57600080fd5b8082028215828483051417610c3057600080fd5b809050905090506000811215610c4d57600254816000031c610c53565b600254811b5b905016610400518082028215828483041417610c6e57600080fd5b80905090509050610420518080610c8457600080fd5b82049050905061022052610d2b565b6004351515610ce25761040051670de0b6b3a76400008082028215828483041417610cbd57600080fd5b80905090509050610420518080610cd357600080fd5b82049050905061022052610d2b565b61042051670de0b6b3a76400008082028215828483041417610d0357600080fd5b80905090509050610400518080610d1957600080fd5b82049050905061022052600435610200525b6101405161016051610180516101a0516101c0516101e051610200516102205161024051610160516102605261018051610280526101a0516102a0526101c0516102c0526101e0516102e052610200516103005261022051610320526000610340526103405161032051610300516102e0516102c0516102a0516102805161026051600658016142cf565b6102405261022052610200526101e0526101c0526101a05261018052610160526101405260005060043561026052604435610280526024356102a052610240516102c052337fb2e76ae99761dc136e598d4a629bb347eccb9532a5f8bbd72e18467c3c34cc986080610260a26000602355005b6368727653811415610e70573415610e4057600080fd5b6004356101405260015461016052610160516101405160065801613764565b6101c0526101c05160005260206000f35b63a3f7cdd5811415610eb7573415610e8757600080fd5b6004356101405260005461016052610160516101405160065801613764565b6101c0526101c05160005260206000f35b6359189017811415610efe573415610ece57600080fd5b6004356101405260025461016052610160516101405160065801613764565b6101c0526101c05160005260206000f35b63fc0c546a811415610f33573415610f1557600080fd5b73c4ad29ba4b3c580e6d59105fff484999997675ff60005260206000f35b63c6610657811415610fb6573415610f4a57600080fd5b73dac17f958d2ee523a2206206994597c13d831ec761014052732260fac5e5542a773aa44fbcfedf7c193bc2c5996101605273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26101805261014060043560038110610fa857600080fd5b602002015160005260206000f35b63f446c1d0811415610feb573415610fcd57600080fd5b600658016139a3565b61014052610160526101405160005260206000f35b63b137392981141561102357341561100257600080fd5b600658016139a3565b61014052610160526101406020015160005260206000f35b63ddca3f438114156110d957341561103a57600080fd5b6006580161380e565b61014052610160526101805261014080516101a05280602001516101c05280604001516101e052506101405161016051610180516101a0516101c0516101e0516101a051610200526101c051610220526101e0516102405261024051610220516102005160065801613b9b565b6102a0526101e0526101c0526101a0526101805261016052610140526102a05160005260206000f35b63572e56258114156111315734156110f057600080fd5b60048035610140528060200135610160528060400135610180525061018051610160516101405160065801613b9b565b6101e0526101e05160005260206000f35b63bb7b8b808114156111e957341561114857600080fd5b670de0b6b3a7640000601754610140526101405160065801613ca8565b6101a0526101a051808202821582848304141761118157600080fd5b80905090509050602061022060046318160ddd6101c0526101dc73c4ad29ba4b3c580e6d59105fff484999997675ff5afa6111bb57600080fd5b601f3d116111c857600080fd5b6000506102205180806111da57600080fd5b82049050905060005260206000f35b63556d6e9f81141561125857341561120057600080fd5b6020610200606463556d6e9f61014052606060046101603761015c7340745803c2faa8e8402e2ae935933d07ca8f355c5afa61123b57600080fd5b601f3d1161124857600080fd5b6000506102005160005260206000f35b63cde699fa8114156112d757341561126f57600080fd5b600480356101405280602001356101605280604001356101805250606480356101a05280602001356101c05280604001356101e052506101e0516101c0516101a0516101805161016051610140516006580161543f565b610240526102405160005260206000f35b634515cef38114156120a757602354156112f057600080fd5b6001602355341561130057600080fd5b601e541561130d57600080fd5b6101405161016051600658016139a3565b610180526101a05261016052610140526101808051610140528060200151610160525073dac17f958d2ee523a2206206994597c13d831ec761018052732260fac5e5542a773aa44fbcfedf7c193bc2c5996101a05273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26101c05260168060c052602060c020546101e05260018160c052602060c02001546102005260028160c052602060c020015461022052506101203661024037600f6103605260011561184c576101e05161038052610200516103a052610220516103c0526103e060006003818352015b6101e06103e0516003811061140c57600080fd5b602002015160046103e0516003811061142457600080fd5b602002013581818301101561143857600080fd5b8082019050905061040052610400516101e06103e0516003811061145b57600080fd5b6020020152610400516103e0516003811061147557600080fd5b601660c052602060c02001555b81516001018083528114156113f8575b50506101e0516102a052610200516102c052610220516102e05264e8d4a510006103e0526402540be40061040052600161042052600054610440526101e0805164e8d4a5100080820282158284830414176114ec57600080fd5b80905090509050815250610380805164e8d4a51000808202821582848304141761151557600080fd5b8090509050905081525061046060016002818352015b6fffffffffffffffffffffffffffffffff61044051166103e0610460516003811061155557600080fd5b6020020151808202821582848304141761156e57600080fd5b80905090509050610480526101e0610460516003811061158d57600080fd5b60200201516104805180820282158284830414176115aa57600080fd5b80905090509050670de0b6b3a7640000808204905090506101e061046051600381106115d557600080fd5b602002015261038061046051600381106115ee57600080fd5b602002015161048051808202821582848304141761160b57600080fd5b80905090509050670de0b6b3a764000080820490509050610380610460516003811061163657600080fd5b60200201526104405160801c610440525b815160010180835281141561152b575b505061046060006003818352015b60006004610460516003811061167a57600080fd5b6020020135111561178557610180610460516003811061169957600080fd5b60200201513b6116a857600080fd5b6000600060646323b872dd61048052336104a052306104c052600461046051600381106116d457600080fd5b60200201356104e05261049c600061018061046051600381106116f657600080fd5b60200201515af161170657600080fd5b6101e0610460516003811061171a57600080fd5b6020020151610380610460516003811061173357600080fd5b60200201518082101561174557600080fd5b80820390509050610240610460516003811061176057600080fd5b6020020152600f61036051141561177e576104605161036052611785565b600e610360525b8151600101808352811415611665575b5050600f61036051186117a757600080fd5b60075461046052600061046051111561184457602061058060a463c7fab70861048052610140516104a052610160516104c052610380516104e0526103a051610500526103c0516105205261049c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa61181557600080fd5b601f3d1161182257600080fd5b6000506105805161034052610460514210151561183f5760016007555b61184c565b601754610340525b60206104a060a463c7fab7086103a052610140516103c052610160516103e0526101e05161040052610200516104205261022051610440526103bc738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa6118a757600080fd5b601f3d116118b457600080fd5b6000506104a05161038052602061042060046318160ddd6103c0526103dc73c4ad29ba4b3c580e6d59105fff484999997675ff5afa6118f257600080fd5b601f3d116118ff57600080fd5b600050610420516103a052600061034051111561196f576103a05161038051808202821582848304141761193257600080fd5b8090509050905061034051808061194857600080fd5b8204905090506103a0518082101561195f57600080fd5b80820390509050610300526119e6565b6101406103c0525b6103c0515160206103c051016103c0526103c06103c051101561199957611977565b610380516103e0526103e05160065801613ca8565b610440526103a06103c0525b6103c0515260206103c051036103c0526101406103c0511015156119dd576119ba565b61044051610300525b600061030051116119f657600080fd5b6000610340511115611f96576101406103c0525b6103c0515160206103c051016103c0526103c06103c0511015611a2c57611a0a565b610240516103e052610260516104005261028051610420526101e051610440526102005161046052610220516104805261048051610460516104405161042051610400516103e0516006580161543f565b6104e0526103a06103c0525b6103c0515260206103c051036103c0526101406103c051101515611aac57611a89565b6104e051610300518082028215828483041417611ac857600080fd5b809050905090506402540be400808204905090506001818183011015611aed57600080fd5b808201905090506103205261030080516103205180821015611b0e57600080fd5b808203905090508152506103a0805161030051818183011015611b3057600080fd5b80820190509050815250602061046060446340c10f196103c052336103e05261030051610400526103dc600073c4ad29ba4b3c580e6d59105fff484999997675ff5af1611b7c57600080fd5b601f3d11611b8957600080fd5b6000506104605060006103c052620186a0610300511115611ed0576003610360511015611ed0576060366103e0376002546104405264e8d4a51000610460526402540be4006104805260016104a0526104c060006002818352015b6fffffffffffffffffffffffffffffffff61044051166104006104c05160028110611c0e57600080fd5b60200201526104405160801c610440525b8151600101808352811415611be4575b50506104c060006003818352015b610360516104c0511815611d63576104c0511515611c9d576103e080516102a05164e8d4a510008082028215828483041417611c7857600080fd5b80905090509050818183011015611c8e57600080fd5b80820190509050815250611d63565b6103e080516102a06104c05160038110611cb657600080fd5b60200201516104006104c051600180821015611cd157600080fd5b8082039050905060028110611ce557600080fd5b60200201518082028215828483041417611cfe57600080fd5b809050905090506104606104c05160038110611d1957600080fd5b60200201518082028215828483041417611d3257600080fd5b80905090509050670de0b6b3a764000080820490509050818183011015611d5857600080fd5b808201905090508152505b8151600101808352811415611c3d575b50506103e051610300518082028215828483041417611d9157600080fd5b809050905090506103a0518080611da757600080fd5b8204905090506103e0526103e051670de0b6b3a76400008082028215828483041417611dd257600080fd5b8090509050905060046103605160038110611dec57600080fd5b60200201356104606103605160038110611e0557600080fd5b60200201518082028215828483041417611e1e57600080fd5b80905090509050610300516102a06103605160038110611e3d57600080fd5b60200201518082028215828483041417611e5657600080fd5b809050905090506104606103605160038110611e7157600080fd5b60200201518082028215828483041417611e8a57600080fd5b809050905090506103a0518080611ea057600080fd5b82049050905080821015611eb357600080fd5b808203905090508080611ec557600080fd5b8204905090506103c0525b6101406103e0525b6103e0515160206103e051016103e0526103e06103e0511015611efa57611ed8565b610140516104005261016051610420526101e0516104405261020051610460526102205161048052610360516104a0526103c0516104c052610380516104e0526104e0516104c0516104a0516104805161046051610440516104205161040051600658016142cf565b6103c06103e0525b6103e0515260206103e051036103e0526101406103e051101515611f8e57611f6b565b60005061200c565b61038051601755670de0b6b3a7640000601c55670de0b6b3a7640000601a55602061046060446340c10f196103c052336103e05261030051610400526103dc600073c4ad29ba4b3c580e6d59105fff484999997675ff5af1611ff757600080fd5b601f3d1161200457600080fd5b600050610460505b6064356103005110151515612060576308c379a06103c05260206103e0526008610400527f536c697070616765000000000000000000000000000000000000000000000000610420526104005060646103dcfd5b606060046103c03761032051610420526103a05161044052337f96b486485420b963edd3fdec0b0195730035600feb7de6f544383d7950fa97ee60a06103c0a26000602355005b63ecb586a581141561243457602354156120c057600080fd5b600160235534156120d057600080fd5b73dac17f958d2ee523a2206206994597c13d831ec761014052732260fac5e5542a773aa44fbcfedf7c193bc2c5996101605273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc261018052602061022060046318160ddd6101c0526101dc73c4ad29ba4b3c580e6d59105fff484999997675ff5afa61214e57600080fd5b601f3d1161215b57600080fd5b600050610220516101a052602061026060446379cc67906101c052336101e052600435610200526101dc600073c4ad29ba4b3c580e6d59105fff484999997675ff5af16121a757600080fd5b601f3d116121b457600080fd5b6000506102605060168060c052602060c020546101c05260018160c052602060c02001546101e05260028160c052602060c0200154610200525060043560018082101561220057600080fd5b808203905090506102205261024060006003818352015b6101c0610240516003811061222b57600080fd5b602002015161022051808202821582848304141761224857600080fd5b809050905090506101a051808061225e57600080fd5b820490509050610260526024610240516003811061227b57600080fd5b602002013561026051101561228f57600080fd5b6101c061024051600381106122a357600080fd5b602002015161026051808210156122b957600080fd5b8082039050905061024051600381106122d157600080fd5b601660c052602060c0200155610260516101c061024051600381106122f557600080fd5b6020020152610140610240516003811061230e57600080fd5b60200201513b61231d57600080fd5b60006000604463a9059cbb61028052336102a052610260516102c05261029c6000610140610240516003811061235257600080fd5b60200201515af161236257600080fd5b8151600101808352811415612217575b505060175461024052610240516102405161022051808202821582848304141761239b57600080fd5b809050905090506101a05180806123b157600080fd5b820490509050808210156123c457600080fd5b808203905090506017556101c051610260526101e05161028052610200516102a0526101a051600435808210156123fa57600080fd5b808203905090506102c052337fd6cc314a0b1e3b2579f8e64248e82434072e8271290eef8ad0886709304195f56080610260a26000602355005b633883e1198114156124cd57341561244b57600080fd5b60643560011c1561245b57600080fd5b60206102206084633883e11961014052600480356101605280602001356101805280604001356101a052506064356101c05261015c7340745803c2faa8e8402e2ae935933d07ca8f355c5afa6124b057600080fd5b601f3d116124bd57600080fd5b6000506102205160005260206000f35b634fb08c5e8114156125f65734156124e457600080fd5b600658016139a3565b610140526101605261014080516101805280602001516101a052506101405161016051610180516101a051610180516101c0526101a0516101e0526040600461020037600161024052600061026052610260516102405161022051610200516101e0516101c0516006580161567c565b6102c0526102e052610300526103205261034052610360526101a0526101805261016052610140526102c08080808051610380525050602081019050808080516103a0525050602081019050808080516103c05250506020810190508080808080516103e05250506020810190508080805161040052505060208101905080808051610420525050505050506103805160005260206000f35b63f1dc3cc9811415612a4b576023541561260f57600080fd5b6001602355341561261f57600080fd5b601e541561262c57600080fd5b6101405161016051600658016139a3565b610180526101a05261016052610140526101808051610140528060200151610160525060c03661018037600754610240526101405161016051610180516101a0516101c0516101e05161020051610220516102405161014051610260526101605161028052604060046102a037600061024051116102e052600161030052610300516102e0516102c0516102a05161028051610260516006580161567c565b61036052610380526103a0526103c0526103e052610400526102405261022052610200526101e0526101c0526101a05261018052610160526101405261036080808080516104205250506020810190508080805161044052505060208101905080808051610460525050602081019050808080808051610480525050602081019050808080516104a0525050602081019050808080516104c05250505050505061042080516101805280602001516101c05280604001516101a0528060600180516101e05280602001516102005280604001516102205250506044356101805110151515612809576308c379a06102605260206102805260086102a0527f536c6970706167650000000000000000000000000000000000000000000000006102c0526102a050606461027cfd5b610240514210151561281b5760016007555b6024356003811061282b57600080fd5b601660c052602060c020018054610180518082101561284957600080fd5b80820390509050815550602061030060446379cc67906102605233610280526004356102a05261027c600073c4ad29ba4b3c580e6d59105fff484999997675ff5af161289457600080fd5b601f3d116128a157600080fd5b600050610300506101405161016051610180516101a0516101c0516101e051610200516102205161024051610140516102605261016051610280526101e0516102a052610200516102c052610220516102e052602435610300526101c051610320526101a051610340526103405161032051610300516102e0516102c0516102a0516102805161026051600658016142cf565b6102405261022052610200526101e0526101c0526101a05261018052610160526101405260005073dac17f958d2ee523a2206206994597c13d831ec761026052732260fac5e5542a773aa44fbcfedf7c193bc2c5996102805273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26102a052610260602435600381106129b957600080fd5b60200201513b6129c857600080fd5b60006000604463a9059cbb6102c052336102e05261018051610300526102dc6000610260602435600381106129fc57600080fd5b60200201515af1612a0c57600080fd5b604060046102c0376101805161030052337f5ad056f2e28a8cec232015406b843668c1e36cda598127ec3b8c59b8c72773a060606102c0a26000602355005b63c93f49e8811415612a875760235415612a6457600080fd5b60016023553415612a7457600080fd5b60065801613de9565b6000506000602355005b635e248072811415612cee573415612a9e57600080fd5b6018543314612aac57600080fd5b6006546201517f818183011015612ac257600080fd5b808201905090504211612ad457600080fd5b426201517f818183011015612ae857600080fd5b8082019050905060443511612afc57600080fd5b6101405161016051600658016139a3565b610180526101a0526101605261014052610180805161014052806020015161016052506101405160801b6101805261016051610180511761018052600060043511612b5757600080fd5b63a0eebb0160043510612b6957600080fd5b6402540be3ff60243511612b7c57600080fd5b662386f26fc1000160243510612b9157600080fd5b670de0b6b3a76400006004358082028215828483041417612bb157600080fd5b80905090509050610140518080612bc757600080fd5b8204905090506101a052678ac7230489e800016101a05110612be857600080fd5b67016345785d89ffff6101a05111612bff57600080fd5b670de0b6b3a76400006024358082028215828483041417612c1f57600080fd5b80905090509050610160518080612c3557600080fd5b8204905090506101a052678ac7230489e800016101a05110612c5657600080fd5b67016345785d89ffff6101a05111612c6d57600080fd5b610180516004554260065560043560801b6101c0526024356101c051176101c0526044356007556101c051600555610140516101e052600435610200526101605161022052602435610240524261026052604435610280527fe35f0559b0642164e286b30df2077ec3a05426617a25db7578fd20ba39a6cd0560c06101e0a1005b63244c7c2e811415612db3573415612d0557600080fd5b6018543314612d1357600080fd5b6101405161016051600658016139a3565b610180526101a0526101605261014052610180805161014052806020015161016052506101405160801b610180526101605161018051176101805261018051600455610180516005554260065542600755610140516101a052610160516101c052426101e0527f5f0e7fba3d100c9e19446e1c92fe436f0a9a22fe99669360e4fdd6d3de2fc28460606101a0a1005b63a43c3351811415612fac573415612dca57600080fd5b6018543314612dd857600080fd5b60215415612de557600080fd5b60e06004610140376402540be401610160511015612e14576207a11f6101605111612e0f57600080fd5b612e1c565b601154610160525b6402540be400610140511115612e3457601054610140525b61016051610140511115612e4757600080fd5b6402540be400610180511115612e5f57601254610180525b670de0b6b3a76400006101a0511015612e875760006101a05111612e8257600080fd5b612e8f565b600a546101a0525b670de0b6b3a76400006101c0511115612eaa576008546101c0525b670de0b6b3a76400006101e0511115612ec557600c546101e0525b62093a80610200511015612ee85760006102005111612ee357600080fd5b612ef0565b600e54610200525b426203f480818183011015612f0457600080fd5b8082019050905061022052610220516021556101805160155561014051601355610160516014556101a051600b556101c0516009556101e051600d5561020051600f556101805161024052610140516102605261016051610280526101a0516102a0526101c0516102c0526101e0516102e0526102005161030052610220517f913fde9a37e1f8ab67876a4d0ce80790d764fcfc5692f4529526df9c6bdde55360e0610240a2005b632a7dd7cd8114156130f05760235415612fc557600080fd5b60016023553415612fd557600080fd5b6018543314612fe357600080fd5b602154421015612ff257600080fd5b60006021541861300157600080fd5b600060215560155461014052610140516012541815613036576101405160065801613de9565b61014052600050610140516012555b60135461016052610160516010556014546101805261018051601155600b546101a0526101a051600a556009546101c0526101c051600855600d546101e0526101e051600c55600f546102005261020051600e556101405161022052610160516102405261018051610260526101a051610280526101c0516102a0526101e0516102c052610200516102e0527f1c65bbdc939f346e5d6f0bde1f072819947438d4fc7b182cc59c2f6dc550408760e0610220a16000602355005b63226840fb81141561311c57341561310757600080fd5b601854331461311557600080fd5b6000602155005b636b441a408114156131b957341561313357600080fd5b60043560a01c1561314357600080fd5b601854331461315157600080fd5b6020541561315e57600080fd5b426203f48081818301101561317257600080fd5b808201905090506101405261014051602055600435601955600435610140517f181aa3aa17d4cbf99265dd4443eba009433d3cde79d60164fde1d1a192beb93560006000a3005b636a1c05ae81141561323b5734156131d057600080fd5b60185433146131de57600080fd5b6020544210156131ed57600080fd5b6000602054186131fc57600080fd5b60006020556019546101405261014051601855610140517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60006000a2005b6386fbf19381141561326757341561325257600080fd5b601854331461326057600080fd5b6000602055005b63e36988538114156132a157341561327e57600080fd5b601854331461328c57600080fd5b42601f541161329a57600080fd5b6001601e55005b633046f9728114156132cd5734156132b857600080fd5b60185433146132c657600080fd5b6000601e55005b637242e52481141561330a5734156132e457600080fd5b60043560a01c156132f457600080fd5b601854331461330257600080fd5b600435602255005b636112c74781141561332d57341561332157600080fd5b60035460005260206000f35b63204fe3d581141561335057341561334457600080fd5b60045460005260206000f35b63f30cfad581141561337357341561336757600080fd5b60055460005260206000f35b63e89876ff81141561339657341561338a57600080fd5b60065460005260206000f35b63f9ed95978114156133b95734156133ad57600080fd5b60075460005260206000f35b6349fe9e778114156133dc5734156133d057600080fd5b60085460005260206000f35b63727ced578114156133ff5734156133f357600080fd5b60095460005260206000f35b6372d4f0e281141561342257341561341657600080fd5b600a5460005260206000f35b63d7c3dcbe81141561344557341561343957600080fd5b600b5460005260206000f35b63083812e581141561346857341561345c57600080fd5b600c5460005260206000f35b634ea12c7d81141561348b57341561347f57600080fd5b600d5460005260206000f35b63662b62748114156134ae5734156134a257600080fd5b600e5460005260206000f35b630c5e23d48114156134d15734156134c557600080fd5b600f5460005260206000f35b6392526c0c8114156134f45734156134e857600080fd5b60105460005260206000f35b63ee8de67581141561351757341561350b57600080fd5b60115460005260206000f35b63fee3f7f981141561353a57341561352e57600080fd5b60125460005260206000f35b637cf9aedc81141561355d57341561355157600080fd5b60135460005260206000f35b637d1b060c81141561358057341561357457600080fd5b60145460005260206000f35b63e38244628114156135a357341561359757600080fd5b60155460005260206000f35b634903b0d18114156135df5734156135ba57600080fd5b600435600381106135ca57600080fd5b601660c052602060c020015460005260206000f35b630f529ba28114156136025734156135f657600080fd5b60175460005260206000f35b638da5cb5b81141561362557341561361957600080fd5b60185460005260206000f35b631ec0cdc181141561364857341561363c57600080fd5b60195460005260206000f35b637ba1a74d81141561366b57341561365f57600080fd5b601a5460005260206000f35b630b7b594b81141561368e57341561368257600080fd5b601b5460005260206000f35b630c46b72a8114156136b15734156136a557600080fd5b601c5460005260206000f35b639c868ac08114156136d45734156136c857600080fd5b601e5460005260206000f35b632a4268968114156136f75734156136eb57600080fd5b601f5460005260206000f35b63e0a0b58681141561371a57341561370e57600080fd5b60205460005260206000f35b63405e28f881141561373d57341561373157600080fd5b60215460005260206000f35b636e42e4d281141561376057341561375457600080fd5b60225460005260206000f35b505b005b6101805261014052610160526002610140511061378057600080fd5b6fffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8061014051600160ff1b81106137c657600080fd5b80820282158284830514176137da57600080fd5b8090509050905060008112156137f85761016051816000031c6137ff565b61016051811b5b90501660005260005161018051565b6101405260168060c052602060c020546101605260018160c052602060c02001546101805260028160c052602060c02001546101a052506000546101c05264e8d4a510006101e0526402540be40061020052600161022052610160805164e8d4a51000808202821582848304141761388557600080fd5b8090509050905081525061024060016002818352015b6fffffffffffffffffffffffffffffffff6101c051166101e061024051600381106138c557600080fd5b602002015180820282158284830414176138de57600080fd5b809050905090506102605261016061024051600381106138fd57600080fd5b602002015161026051808202821582848304141761391a57600080fd5b80905090509050670de0b6b3a764000080820490509050610160610240516003811061394557600080fd5b60200201526101c05160801c6101c0525b815160010180835281141561389b575b50506060610240525b6000610240511115156139815761399d565b602061024051036101600151602061024051036102405261396f565b61014051565b6101405260075461016052600554610180526fffffffffffffffffffffffffffffffff61018051166101a0526101805160801c6101c05261016051421015613b50576004546101e0526006546102005261016080516102005180821015613a0957600080fd5b80820390509050815250426102005180821015613a2557600080fd5b8082039050905061020052610160516102005180821015613a4557600080fd5b80820390509050610220526101e05160801c610220518082028215828483041417613a6f57600080fd5b809050905090506101c051610200518082028215828483041417613a9257600080fd5b80905090509050818183011015613aa857600080fd5b80820190509050610160518080613abe57600080fd5b8204905090506101c0526fffffffffffffffffffffffffffffffff6101e05116610220518082028215828483041417613af657600080fd5b809050905090506101a051610200518082028215828483041417613b1957600080fd5b80905090509050818183011015613b2f57600080fd5b80820190509050610160518080613b4557600080fd5b8204905090506101a0525b6101c051610200526101a0516102205260406101e0525b60006101e051111515613b7957613b95565b60206101e05103610200015160206101e051036101e052613b67565b61014051565b6101a05261014052610160526101805260206102c0608463fa18042d6101e052610140516102005261016051610220526101805161024052600a54610260526101fc738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa613bfd57600080fd5b601f3d11613c0a57600080fd5b6000506102c0516101c0526010546101c0518082028215828483041417613c3057600080fd5b80905090509050601154670de0b6b3a76400006101c05180821015613c5457600080fd5b808203905090508082028215828483041417613c6f57600080fd5b80905090509050818183011015613c8557600080fd5b80820190509050670de0b6b3a7640000808204905090506000526000516101a051565b61016052610140526060366101803761014051600380820490509050610180526000546101e05261020060016002818352015b61014051670de0b6b3a76400008082028215828483041417613cfc57600080fd5b8090509050905060036fffffffffffffffffffffffffffffffff6101e051168082028215828483041417613d2f57600080fd5b809050905090508080613d4157600080fd5b8204905090506101806102005160038110613d5b57600080fd5b60200201526101e05160801c6101e0525b8151600101808352811415613cdb575b505060206102c0606463bad1dc266102005261018051610220526101a051610240526101c0516102605261021c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa613dc957600080fd5b601f3d11613dd657600080fd5b6000506102c05160005260005161016051565b61014052610140516101605161018051600658016139a3565b6101a0526101c0526101805261016052610140526101a080516101605280602001516101805250601a546101a052601b546101c05273dac17f958d2ee523a2206206994597c13d831ec76101e052732260fac5e5542a773aa44fbcfedf7c193bc2c5996102005273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26102205261024060006003818352015b60206102e060246370a0823161026052306102805261027c6101e06102405160038110613eba57600080fd5b60200201515afa613eca57600080fd5b601f3d11613ed757600080fd5b6000506102e0516102405160038110613eef57600080fd5b601660c052602060c02001555b8151600101808352811415613e8e575b5050601c54610240526101c0516101a05111156140cc576101a0516101c05180821015613f3857600080fd5b808203905090506012548082028215828483041417613f5657600080fd5b809050905090506404a817c800808204905090506102605260006102605111156140cc576022546102805261024051670de0b6b3a76400008082028215828483041417613fa257600080fd5b80905090509050610240516102605180821015613fbe57600080fd5b808203905090508080613fd057600080fd5b820490509050670de0b6b3a764000080821015613fec57600080fd5b808203905090506102a05260206103806044636962f8456102e05261028051610300526102a051610320526102fc600073c4ad29ba4b3c580e6d59105fff484999997675ff5af161403c57600080fd5b601f3d1161404957600080fd5b600050610380516102c0526101a08051610260516002808202821582848304141761407357600080fd5b809050905090508082101561408757600080fd5b808203905090508152506101a051601a556102c0516102e052610280517f6059a38198b1dc42b3791087d1ff0fbd72b3179553c25f678cd246f52ffaaf5960206102e0a25b60206102e060046318160ddd6102805261029c73c4ad29ba4b3c580e6d59105fff484999997675ff5afa6140ff57600080fd5b601f3d1161410c57600080fd5b6000506102e05161026052602061040060a463c7fab70861030052610160516103205261018051610340526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516006580161380e565b6102a0526102c0526102e05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526102a080516103605280602001516103805280604001516103a0525061031c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa6141e357600080fd5b601f3d116141f057600080fd5b600050610400516102805261028051601755670de0b6b3a76400006101405161016051610180516101a0516101c0516101e0516102005161022051610240516102605161028051610280516102a0526102a05160065801613ca8565b6103005261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261030051808202821582848304141761429457600080fd5b809050905090506102605180806142aa57600080fd5b820490509050601c556101c0516101a05111156142c9576101a051601b555b61014051565b610240526101405261016052610180526101a0526101c0526101e052610200526102205261016036610260376001546103c0526103e060006002818352015b6fffffffffffffffffffffffffffffffff6103c051166102606103e0516002811061433857600080fd5b60200201526103c05160801c6103c0525b815160010180835281141561430e575b50506003546103e0526002546103c05261040060006002818352015b6fffffffffffffffffffffffffffffffff6103c051166102a0610400516002811061439f57600080fd5b60200201526103c05160801c6103c0525b8151600101808352811415614375575b5050426103e051101561460557600e546104005260206104e0604463571bae3f61044052426103e051808210156143f657600080fd5b80820390509050670de0b6b3a7640000808202821582848304141761441a57600080fd5b8090509050905061040051808061443057600080fd5b820490509050610460526402540be4006104805261045c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa61446757600080fd5b601f3d1161447457600080fd5b6000506104e0516104205260006103c05261044060006002818352015b6102a061044051600281106144a557600080fd5b6020020151670de0b6b3a764000061042051808210156144c457600080fd5b8082039050905080820282158284830414176144df57600080fd5b8090509050905061026061044051600281106144fa57600080fd5b602002015161042051808202821582848304141761451757600080fd5b8090509050905081818301101561452d57600080fd5b80820190509050670de0b6b3a764000080820490509050610260610440516002811061455857600080fd5b60200201525b8151600101808352811415614491575b505061044060006002818352015b6103c05160801b6103c0526102606001610440518082101561459d57600080fd5b80820390509050600281106145b157600080fd5b6020020151610460526fffffffffffffffffffffffffffffffff61046051106145d957600080fd5b6103c05161046051176103c0525b815160010180835281141561457c575b50506103c051600155426003555b610220516104005261022051151561468b57602061052060a463c7fab708610420526101405161044052610160516104605261018051610480526101a0516104a0526101c0516104c05261043c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa61467257600080fd5b601f3d1161467f57600080fd5b60005061052051610400525b6000546103c05261042060006002818352015b6fffffffffffffffffffffffffffffffff6103c051166102e061042051600281106146c857600080fd5b60200201526103c05160801c6103c0525b815160010180835281141561469e575b505060006102005111156147cb5760006101e051111561473b57610200516102a06101e05160018082101561471d57600080fd5b808203905090506002811061473157600080fd5b60200201526147c6565b61042060006002818352015b6102a0610420516002811061475b57600080fd5b6020020151670de0b6b3a7640000808202821582848304141761477d57600080fd5b8090509050905061020051808061479357600080fd5b8204905090506102a061042051600281106147ad57600080fd5b60200201525b8151600101808352811415614747575b50505b614976565b61018051610420526101a051610440526101c0516104605261042051620f4240808204905090506104805261042080516104805181818301101561480e57600080fd5b808201905090508152506104a060006002818352015b6102e06104a0516002811061483857600080fd5b602002015161048051808202821582848304141761485557600080fd5b809050905090506101806104a051600181818301101561487457600080fd5b808201905090506003811061488857600080fd5b6020020151602061060060e46336bc88556104c052610140516104e052610160516105005261042051610520526104405161054052610460516105605261040051610580526104a05160018181830110156148e257600080fd5b808201905090506105a0526104dc738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa61491057600080fd5b601f3d1161491d57600080fd5b600050610600518082101561493157600080fd5b80820390509050808061494357600080fd5b8204905090506102a06104a0516002811061495d57600080fd5b60200201525b8151600101808352811415614824575b50505b60006103c05261042060006002818352015b6103c05160801b6103c0526102a0600161042051808210156149a957600080fd5b80820390509050600281106149bd57600080fd5b6020020151610440526fffffffffffffffffffffffffffffffff61044051106149e557600080fd5b6103c05161044051176103c0525b8151600101808352811415614988575b50506103c05160025560206104a060046318160ddd6104405261045c73c4ad29ba4b3c580e6d59105fff484999997675ff5afa614a3f57600080fd5b601f3d11614a4c57600080fd5b6000506104a05161042052601a5461044052601c5461046052610400516003808204905090506103205261048060006002818352015b61040051670de0b6b3a76400008082028215828483041417614aa357600080fd5b8090509050905060036102e06104805160028110614ac057600080fd5b60200201518082028215828483041417614ad957600080fd5b809050905090508080614aeb57600080fd5b820490509050610320610480516001818183011015614b0957600080fd5b8082019050905060038110614b1d57600080fd5b60200201525b8151600101808352811415614a82575b5050670de0b6b3a764000061048052670de0b6b3a76400006104a0526000610460511115614cb95760206105a0606463bad1dc266104e0526103205161050052610340516105205261036051610540526104fc738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa614ba657600080fd5b601f3d11614bb357600080fd5b6000506105a0516104c052670de0b6b3a76400006104c0518082028215828483041417614bdf57600080fd5b80905090509050610420518080614bf557600080fd5b8204905090506104a052610440516104a0518082028215828483041417614c1b57600080fd5b80905090509050610460518080614c3157600080fd5b820490509050610480526007546104e052610460516104a0511015614c5a576104e05115614c5d565b60005b15614ca7576308c379a0610500526020610520526004610540527f4c6f7373000000000000000000000000000000000000000000000000000000006105605261054050606461051cfd5b60016104e0511415614cb95760006007555b61048051601a55601d546104c0526104c0511515614d4f576104805160026008548082028215828483041417614cee57600080fd5b80905090509050818183011015614d0457600080fd5b808201905090506104a05160028082028215828483041417614d2557600080fd5b80905090509050670de0b6b3a764000080821015614d4257600080fd5b8082039050905011614d52565b60005b15614d635760016104c0526001601d555b6104c0511561542b57600c546104e05260006105005261052060006002818352015b6102606105205160028110614d9957600080fd5b6020020151670de0b6b3a76400008082028215828483041417614dbb57600080fd5b809050905090506102e06105205160028110614dd657600080fd5b60200201518080614de657600080fd5b82049050905061054052670de0b6b3a7640000610540511115614e2d576105408051670de0b6b3a764000080821015614e1e57600080fd5b80820390509050815250614e53565b670de0b6b3a76400006105405180821015614e4757600080fd5b80820390509050610540525b61050080517001000000000000000000000000000000006105405110614e7857600080fd5b6002610540510a818183011015614e8e57600080fd5b808201905090508152505b8151600101808352811415614d85575b50507001000000000000000000000000000000006104e05110614ecb57600080fd5b60026104e0510a610500511115614ee85760006104605111614eeb565b60005b1561542b5760206105a06024634e60b1416105205261050051670de0b6b3a7640000808204905090506105405261053c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa614f3b57600080fd5b601f3d11614f4857600080fd5b6000506105a0516105005261052060006002818352015b6102e06105205160028110614f7357600080fd5b6020020151610500516104e05180821015614f8d57600080fd5b808203905090508082028215828483041417614fa857600080fd5b809050905090506104e0516102606105205160028110614fc757600080fd5b60200201518082028215828483041417614fe057600080fd5b80905090509050818183011015614ff657600080fd5b8082019050905061050051808061500c57600080fd5b820490509050610380610520516002811061502657600080fd5b60200201525b8151600101808352811415614f5f575b505061018051610320526101a051610340526101c0516103605261052060006002818352015b61018061052051600181818301101561507a57600080fd5b808201905090506003811061508e57600080fd5b602002015161038061052051600281106150a757600080fd5b602002015180820282158284830414176150c057600080fd5b809050905090506102e061052051600281106150db57600080fd5b602002015180806150eb57600080fd5b82049050905061032061052051600181818301101561510957600080fd5b808201905090506003811061511d57600080fd5b60200201525b8151600101808352811415615062575b5050602061064060a463c7fab7086105405261014051610560526101605161058052610320516105a052610340516105c052610360516105e05261055c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa61519057600080fd5b601f3d1161519d57600080fd5b6000506106405161052052610520516003808204905090506103205261054060006002818352015b61052051670de0b6b3a764000080820282158284830414176151e657600080fd5b809050905090506003610380610540516002811061520357600080fd5b6020020151808202821582848304141761521c57600080fd5b80905090509050808061522e57600080fd5b82049050905061032061054051600181818301101561524c57600080fd5b808201905090506003811061526057600080fd5b60200201525b81516001018083528114156151c5575b5050670de0b6b3a76400006020610600606463bad1dc266105405261032051610560526103405161058052610360516105a05261055c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa6152cc57600080fd5b601f3d116152d957600080fd5b6000506106005180820282158284830414176152f457600080fd5b8090509050905061042051808061530a57600080fd5b82049050905061046052670de0b6b3a764000061046051111561536f5761048051600261046051808202821582848304141761534557600080fd5b80905090509050670de0b6b3a76400008082101561536257600080fd5b8082039050905011615372565b60005b156154255760006103c05261054060006002818352015b6103c05160801b6103c052610380600161054051808210156153aa57600080fd5b80820390509050600281106153be57600080fd5b6020020151610560526fffffffffffffffffffffffffffffffff61056051106153e657600080fd5b6103c05161056051176103c0525b8151600101808352811415615389575b50506103c0516000556105205160175561046051601c55610240515661542b565b6000601d555b610400516017556104a051601c5561024051565b610200526101405261016052610180526101a0526101c0526101e0526101405161016051610180516101a0516101c0516101e05161020051610220516101a051610240526101c051610260526101e0516102805261028051610260516102405160065801613b9b565b6102e05261022052610200526101e0526101c0526101a0526101805261016052610140526102e051600380820282158284830414176154e657600080fd5b809050905090506008808204905090506102205260006102405261028060006003818352015b6020610280510261014001516102605261024080516102605181818301101561553457600080fd5b808201905090508152505b815160010180835281141561550c575b505061024051600380820490509050610260526000610280526102c060006003818352015b60206102c0510261014001516102a052610260516102a05111156155d15761028080516102a05161026051808210156155ac57600080fd5b808203905090508181830110156155c257600080fd5b8082019050905081525061560c565b6102808051610260516102a051808210156155eb57600080fd5b8082039050905081818301101561560157600080fd5b808201905090508152505b8151600101808352811415615574575b50506102205161028051808202821582848304141761563a57600080fd5b8090509050905061024051808061565057600080fd5b820490509050620186a081818301101561566957600080fd5b8082019050905060005260005161020051565b610200526101405261016052610180526101a0526101c0526101e05260206102a060046318160ddd6102405261025c73c4ad29ba4b3c580e6d59105fff484999997675ff5afa6156cb57600080fd5b601f3d116156d857600080fd5b6000506102a05161022052610220516101805111156156f657600080fd5b60036101a0511061570657600080fd5b60168060c052602060c020546102405260018160c052602060c02001546102605260028160c052602060c0200154610280525064e8d4a510006102a0526402540be4006102c05260016102e0526000610300526c0c9f2c9cd04674edea40000000610320526001156158c557600054610340526102a0805161024051808202821582848304141761579657600080fd5b8090509050905081525061036060016002818352015b6fffffffffffffffffffffffffffffffff610340511661038052610360516101a051141561581157610380516102a06101a051600381106157ec57600080fd5b6020020151808202821582848304141761580557600080fd5b80905090509050610320525b6102a0610360516003811061582557600080fd5b6020020151610240610360516003811061583e57600080fd5b6020020151808202821582848304141761585757600080fd5b8090509050905061038051808202821582848304141761587657600080fd5b80905090509050670de0b6b3a7640000808204905090506102a061036051600381106158a157600080fd5b60200201526103405160801c610340525b81516001018083528114156157ac575b50505b6101c0511561594657602061044060a463c7fab70861034052610140516103605261016051610380526102a0516103a0526102c0516103c0526102e0516103e05261035c738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa61592957600080fd5b601f3d1161593657600080fd5b600050610440516103005261594e565b601754610300525b6103005161034052610140610380525b610380515160206103805101610380526103806103805110156159805761595e565b6102a0516103a0526102c0516103c0526102e0516103e0526103e0516103c0516103a05160065801613b9b565b61044052610360610380525b61038051526020610380510361038052610140610380511015156159dc576159b9565b610440516103605261018051610340518082028215828483041417615a0057600080fd5b80905090509050610220518080615a1657600080fd5b8204905090506103805261034080516103805161036051610380518082028215828483041417615a4557600080fd5b809050905090506404a817c800808204905090506001818183011015615a6a57600080fd5b8082019050905080821015615a7e57600080fd5b8082039050905080821015615a9257600080fd5b80820390509050815250602061050060e46336bc88556103c052610140516103e05261016051610400526102a051610420526102c051610440526102e0516104605261034051610480526101a0516104a0526103dc738f68f4810cce3194b6cb6f3d50fa58c2c9bdd1d55afa615b0757600080fd5b601f3d11615b1457600080fd5b600050610500516103a0526102a06101a05160038110615b3357600080fd5b60200201516103a05180821015615b4957600080fd5b80820390509050670de0b6b3a76400008082028215828483041417615b6d57600080fd5b80905090509050610320518080615b8357600080fd5b8204905090506103c0526103a0516102a06101a05160038110615ba557600080fd5b602002015260006103e0526101e05115615bdd57620186a06103c0511115615bd557620186a06101805111615bd8565b60005b615be0565b60005b15615ef75760006104005264e8d4a51000610420526402540be40061044052600161046052604036610480376002546104c0526104e060006002818352015b6fffffffffffffffffffffffffffffffff6104c051166104806104e05160028110615c4957600080fd5b60200201526104c05160801c6104c0525b8151600101808352811415615c1f575b50506104e060006003818352015b6101a0516104e0511815615d9e576104e0511515615cd85761040080516102405164e8d4a510008082028215828483041417615cb357600080fd5b80905090509050818183011015615cc957600080fd5b80820190509050815250615d9e565b61040080516102406104e05160038110615cf157600080fd5b60200201516104806104e051600180821015615d0c57600080fd5b8082039050905060028110615d2057600080fd5b60200201518082028215828483041417615d3957600080fd5b809050905090506104206104e05160038110615d5457600080fd5b60200201518082028215828483041417615d6d57600080fd5b80905090509050670de0b6b3a764000080820490509050818183011015615d9357600080fd5b808201905090508152505b8151600101808352811415615c78575b505061040051610380518082028215828483041417615dcc57600080fd5b80905090509050610300518080615de257600080fd5b8204905090506104005261040051670de0b6b3a76400008082028215828483041417615e0d57600080fd5b809050905090506103c0516104206101a05160038110615e2c57600080fd5b60200201518082028215828483041417615e4557600080fd5b80905090509050610380516102406101a05160038110615e6457600080fd5b60200201518082028215828483041417615e7d57600080fd5b809050905090506104206101a05160038110615e9857600080fd5b60200201518082028215828483041417615eb157600080fd5b80905090509050610300518080615ec757600080fd5b82049050905080821015615eda57600080fd5b808203905090508080615eec57600080fd5b8204905090506103e0525b6104c06103c05181526103e0518160200152610340518160400152806060016102a05181526102c05181602001526102e0518160400152505060c0610580525b600061058051111515615f4957615f65565b602061058051036104c001516020610580510361058052615f37565b6102005156
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000babe61887f1de2713c6f97e567623453d3c79f67000000000000000000000000ecb456ea5365865ebab8a2661b0c503410e9b347000000000000000000000000000000000000000000000000000000000000d2f0000000000000000000000000000000000000000000000000000c6f3b40b6c0000000000000000000000000000000000000000000000000000000000000a7d8c00000000000000000000000000000000000000000000000000000000002aea540000000000000000000000000000000000000000000000000000001d1a94a20000000000000000000000000000000000000000000000000000001c6bf526340000000000000000000000000000000000000000000000000000001bda703f0a000000000000000000000000000000000000000000000000000000000012a05f20000000000000000000000000000000000000000000000000000000000000002580000000000000000000000000000000000000000000006e514c561b9fec00000000000000000000000000000000000000000000000000069eff91234645c0000
-----Decoded View---------------
Arg [0] : owner (address): 0xbabe61887f1de2713c6f97e567623453d3C79f67
Arg [1] : admin_fee_receiver (address): 0xeCb456EA5365865EbAb8a2661B0c503410e9B347
Arg [2] : A (uint256): 54000
Arg [3] : gamma (uint256): 3500000000000000
Arg [4] : mid_fee (uint256): 11000000
Arg [5] : out_fee (uint256): 45000000
Arg [6] : allowed_extra_profit (uint256): 2000000000000
Arg [7] : fee_gamma (uint256): 500000000000000
Arg [8] : adjustment_step (uint256): 490000000000000
Arg [9] : admin_fee (uint256): 5000000000
Arg [10] : ma_half_time (uint256): 600
Arg [11] : initial_prices (uint256[2]): 32560000000000000000000,1954200000000000000000
-----Encoded View---------------
13 Constructor Arguments found :
Arg [0] : 000000000000000000000000babe61887f1de2713c6f97e567623453d3c79f67
Arg [1] : 000000000000000000000000ecb456ea5365865ebab8a2661b0c503410e9b347
Arg [2] : 000000000000000000000000000000000000000000000000000000000000d2f0
Arg [3] : 000000000000000000000000000000000000000000000000000c6f3b40b6c000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000a7d8c0
Arg [5] : 0000000000000000000000000000000000000000000000000000000002aea540
Arg [6] : 000000000000000000000000000000000000000000000000000001d1a94a2000
Arg [7] : 0000000000000000000000000000000000000000000000000001c6bf52634000
Arg [8] : 0000000000000000000000000000000000000000000000000001bda703f0a000
Arg [9] : 000000000000000000000000000000000000000000000000000000012a05f200
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000258
Arg [11] : 0000000000000000000000000000000000000000000006e514c561b9fec00000
Arg [12] : 000000000000000000000000000000000000000000000069eff91234645c0000
Loading...
Loading
Loading...
Loading
Net Worth in USD
$10,467,676.91
Net Worth in ETH
5,306.519736
Token Allocations
USDT
33.49%
WBTC
33.27%
WETH
33.24%
Others
0.00%
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 33.49% | $1 | 3,505,387.7098 | $3,505,387.71 | |
| ETH | 33.27% | $66,455.8 | 52.4001 | $3,482,292.45 | |
| ETH | 33.24% | $1,973.38 | 1,763.3693 | $3,479,803.41 | |
| ETH | <0.01% | $1,973.38 | 0.0844 | $166.5 | |
| ETH | <0.01% | $51.11 | 0.5 | $25.55 | |
| ETH | <0.01% | $0.009992 | 40 | $0.3996 | |
| ETH | <0.01% | $0.006501 | 50.0029 | $0.325 | |
| ETH | <0.01% | $0.000241 | 1,000 | $0.2407 | |
| ETH | <0.01% | $0.00 | 0.0154 | $0.00 | |
| BASE | <0.01% | $1,974.86 | 0.00006495 | $0.128267 | |
| POL | <0.01% | $0.107442 | 0.00177469 | $0.000191 |
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.