ETH Price: $3,399.97 (+1.01%)

Contract

0xE76427463FdBacdD0e794e5Ea30269f30Dd9B8eB
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Transaction Hash
Method
Block
From
To
Invest Token For...141399662022-02-04 14:06:271056 days ago1643983587IN
0xE7642746...30Dd9B8eB
0.155 ETH0.06183616139.75443959
Invest Token For...140869262022-01-27 9:34:371065 days ago1643276077IN
0xE7642746...30Dd9B8eB
0.005 ETH0.0521886984.63301597
Add Liquidity Et...140165102022-01-16 12:28:071075 days ago1642336087IN
0xE7642746...30Dd9B8eB
0.00005247 ETH0.0422871899.0826454
Invest Token For...139630842022-01-08 6:11:191084 days ago1641622279IN
0xE7642746...30Dd9B8eB
0.005 ETH0.0457319979.34720079
Invest Token For...139614032022-01-08 0:00:481084 days ago1641600048IN
0xE7642746...30Dd9B8eB
0.005 ETH0.06863577105.22875592
Invest Token For...139613552022-01-07 23:51:571084 days ago1641599517IN
0xE7642746...30Dd9B8eB
0.04 ETH0.05548025125.89406594
Invest Token For...139419202022-01-04 23:18:081087 days ago1641338288IN
0xE7642746...30Dd9B8eB
0.005 ETH0.06752518141.02679886
Invest Token For...139095182021-12-30 22:57:291092 days ago1640905049IN
0xE7642746...30Dd9B8eB
0.005 ETH0.0406333583.92737039
Invest Token For...138961872021-12-28 21:36:331094 days ago1640727393IN
0xE7642746...30Dd9B8eB
3.005 ETH0.0508137594.04659934
Invest Token For...138961402021-12-28 21:25:521094 days ago1640726752IN
0xE7642746...30Dd9B8eB
0.505 ETH0.06439682109.82360734
Add Liquidity Et...138486032021-12-21 12:43:521101 days ago1640090632IN
0xE7642746...30Dd9B8eB
0.00192028 ETH0.0238021943.95669436
Invest Token For...137791572021-12-10 18:57:231112 days ago1639162643IN
0xE7642746...30Dd9B8eB
0.005 ETH0.0471106175.7557633
Invest Token For...137779972021-12-10 14:41:471112 days ago1639147307IN
0xE7642746...30Dd9B8eB
0.005 ETH0.0402922365.68768953
Invest Token For...137779552021-12-10 14:32:141112 days ago1639146734IN
0xE7642746...30Dd9B8eB
0.005 ETH0.0489931779.8726662
Invest Token For...137779352021-12-10 14:26:241112 days ago1639146384IN
0xE7642746...30Dd9B8eB
0.005 ETH0.0315515351.43787975
Invest Token For...137779002021-12-10 14:20:401112 days ago1639146040IN
0xE7642746...30Dd9B8eB
0.005 ETH0.042431970.37091597
Invest Token For...137778712021-12-10 14:13:561112 days ago1639145636IN
0xE7642746...30Dd9B8eB
0.005 ETH0.0416445667.24132305
Invest Token For...137778382021-12-10 14:05:461112 days ago1639145146IN
0xE7642746...30Dd9B8eB
0.005 ETH0.0334264653.73157286
Invest Token For...137777732021-12-10 13:50:471112 days ago1639144247IN
0xE7642746...30Dd9B8eB
0.005 ETH0.0415104267.02473242
Invest Token For...137777322021-12-10 13:41:361112 days ago1639143696IN
0xE7642746...30Dd9B8eB
0.005 ETH0.0311275550.26005235
Invest Token For...137776822021-12-10 13:32:101112 days ago1639143130IN
0xE7642746...30Dd9B8eB
0.005 ETH0.0314887751.33656565
Invest Token For...137775952021-12-10 13:13:001112 days ago1639141980IN
0xE7642746...30Dd9B8eB
0.005 ETH0.0326498953.22852451
Invest Token For...137775572021-12-10 13:04:081112 days ago1639141448IN
0xE7642746...30Dd9B8eB
0.005 ETH0.0423379968.3609651
Invest Token For...137775252021-12-10 12:54:491112 days ago1639140889IN
0xE7642746...30Dd9B8eB
0.005 ETH0.0348667356.04673795
Invest Token For...137772252021-12-10 11:50:491112 days ago1639137049IN
0xE7642746...30Dd9B8eB
0.005 ETH0.0301573948.69358367
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
141399662022-02-04 14:06:271056 days ago1643983587
0xE7642746...30Dd9B8eB
0.15 ETH
141399662022-02-04 14:06:271056 days ago1643983587
0xE7642746...30Dd9B8eB
0.005 ETH
140869262022-01-27 9:34:371065 days ago1643276077
0xE7642746...30Dd9B8eB
0.005 ETH
140165102022-01-16 12:28:071075 days ago1642336087
0xE7642746...30Dd9B8eB
354 wei
140165102022-01-16 12:28:071075 days ago1642336087
0xE7642746...30Dd9B8eB
354 wei
140165102022-01-16 12:28:071075 days ago1642336087
0xE7642746...30Dd9B8eB
0.00005247 ETH
139630842022-01-08 6:11:191084 days ago1641622279
0xE7642746...30Dd9B8eB
0.005 ETH
139614032022-01-08 0:00:481084 days ago1641600048
0xE7642746...30Dd9B8eB
0.005 ETH
139613552022-01-07 23:51:571084 days ago1641599517
0xE7642746...30Dd9B8eB
0.035 ETH
139613552022-01-07 23:51:571084 days ago1641599517
0xE7642746...30Dd9B8eB
0.005 ETH
139419202022-01-04 23:18:081087 days ago1641338288
0xE7642746...30Dd9B8eB
0.005 ETH
139095182021-12-30 22:57:291092 days ago1640905049
0xE7642746...30Dd9B8eB
0.005 ETH
138961872021-12-28 21:36:331094 days ago1640727393
0xE7642746...30Dd9B8eB
3 ETH
138961872021-12-28 21:36:331094 days ago1640727393
0xE7642746...30Dd9B8eB
0.005 ETH
138961402021-12-28 21:25:521094 days ago1640726752
0xE7642746...30Dd9B8eB
0.5 ETH
138961402021-12-28 21:25:521094 days ago1640726752
0xE7642746...30Dd9B8eB
0.005 ETH
138486032021-12-21 12:43:521101 days ago1640090632
0xE7642746...30Dd9B8eB
0 ETH
138486032021-12-21 12:43:521101 days ago1640090632
0xE7642746...30Dd9B8eB
0 ETH
138486032021-12-21 12:43:521101 days ago1640090632
0xE7642746...30Dd9B8eB
0.00192028 ETH
137791572021-12-10 18:57:231112 days ago1639162643
0xE7642746...30Dd9B8eB
0.005 ETH
137779972021-12-10 14:41:471112 days ago1639147307
0xE7642746...30Dd9B8eB
0.005 ETH
137779552021-12-10 14:32:141112 days ago1639146734
0xE7642746...30Dd9B8eB
0.005 ETH
137779352021-12-10 14:26:241112 days ago1639146384
0xE7642746...30Dd9B8eB
0.005 ETH
137779002021-12-10 14:20:401112 days ago1639146040
0xE7642746...30Dd9B8eB
0.005 ETH
137778712021-12-10 14:13:561112 days ago1639145636
0xE7642746...30Dd9B8eB
0.005 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Vyper_contract

Compiler Version
vyper:0.2.12

Optimization Enabled:
N/A

Other Settings:
default evmVersion, Apache-2.0 license

Contract Source Code (Vyper language format)

# Copyright (C) 2021 VolumeFi Software, Inc.

#  This program is free software: you can redistribute it and/or modify
#  it under the terms of the Apache 2.0 License. 
#  This program is distributed WITHOUT ANY WARRANTY without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#  @author VolumeFi, Software Inc.
#  @notice This Vyper contract adds liquidity to any Uniswap V3 pool using ETH or any ERC20 Token.
#  SPDX-License-Identifier: Apache-2.0

# @version ^0.2.12

struct MintParams:
    token0: address
    token1: address
    fee: uint256
    tickLower: int128
    tickUpper: int128
    amount0Desired: uint256
    amount1Desired: uint256
    amount0Min: uint256
    amount1Min: uint256
    recipient: address
    deadline: uint256

struct SingleMintParams:
    token0: address
    token1: address
    fee: uint256
    tickLower: int128
    tickUpper: int128
    sqrtPriceAX96: uint256
    sqrtPriceBX96: uint256
    liquidityMin: uint256
    recipient: address
    deadline: uint256

struct ModifyParams:
    fee: uint256
    tickLower: int128
    tickUpper: int128
    recipient: address
    deadline: uint256

interface ERC20:
    def allowance(_owner: address, _spender: address) -> uint256: view

interface ERC721:
    def transferFrom(_from: address, _to: address, _tokenId: uint256): payable

interface NonfungiblePositionManager:
    def burn(tokenId: uint256): payable

interface UniswapV2Factory:
    def getPair(tokenA: address, tokenB: address) -> address: view

interface UniswapV2Pair:
    def token0() -> address: view
    def token1() -> address: view
    def getReserves() -> (uint256, uint256, uint256): view
    def mint(to: address) -> uint256: nonpayable

interface WrappedEth:
    def deposit(): payable
    def withdraw(amount: uint256): nonpayable

event AddedLiquidity:
    tokenId: indexed(uint256)
    token0: indexed(address)
    token1: indexed(address)
    liquidity: uint256
    amount0: uint256
    amount1: uint256

event NFLPModified:
    oldTokenId: indexed(uint256)
    newTokenId: indexed(uint256)

event Paused:
    paused: bool

event FeeChanged:
    newFee: uint256

NONFUNGIBLEPOSITIONMANAGER: constant(address) = 0xC36442b4a4522E871399CD717aBDD847Ab11FE88
UNISWAPV3FACTORY: constant(address) = 0x1F98431c8aD98523631AE4a59f267346ea31F984

UNISWAPV2FACTORY: constant(address) = 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f
UNISWAPV2ROUTER02: constant(address) = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D

VETH: constant(address) = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE
WETH: constant(address) = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2

APPROVE_MID: constant(Bytes[4]) = method_id("approve(address,uint256)")
TRANSFER_MID: constant(Bytes[4]) = method_id("transfer(address,uint256)")
TRANSFERFROM_MID: constant(Bytes[4]) = method_id("transferFrom(address,address,uint256)")
CAIPIN_MID: constant(Bytes[4]) = method_id("createAndInitializePoolIfNecessary(address,address,uint24,uint160)")
GETPOOL_MID: constant(Bytes[4]) = method_id("getPool(address,address,uint24)")
SLOT0_MID: constant(Bytes[4]) = method_id("slot0()")
MINT_MID: constant(Bytes[4]) = method_id("mint((address,address,uint24,int24,int24,uint256,uint256,uint256,uint256,address,uint256))")
POSITIONS_MID: constant(Bytes[4]) = method_id("positions(uint256)")
INCREASELIQUIDITY_MID: constant(Bytes[4]) = method_id("increaseLiquidity((uint256,uint256,uint256,uint256,uint256,uint256))")
DECREASELIQUIDITY_MID: constant(Bytes[4]) = method_id("decreaseLiquidity((uint256,uint128,uint256,uint256,uint256))")
COLLECT_MID: constant(Bytes[4]) = method_id("collect((uint256,address,uint128,uint128))")
SWAPETFT_MID: constant(Bytes[4]) = method_id("swapExactTokensForTokens(uint256,uint256,address[],address,uint256)")

paused: public(bool)
admin: public(address)
feeAddress: public(address)
feeAmount: public(uint256)

@external
def __init__():
    self.paused = False
    self.admin = msg.sender
    self.feeAddress = 0xf29399fB3311082d9F8e62b988cBA44a5a98ebeD
    self.feeAmount = 5 * 10 ** 15

@internal
@pure
def uintSqrt(x: uint256) -> uint256:
    if x > 3:
        z: uint256 = (x + 1) / 2
        y: uint256 = x
        for i in range(256):
            if y == z:
                return y
            y = z
            z = (x / z + z) / 2
        raise "Did not coverage"
    elif x == 0:
        return 0
    else:
        return 1

@internal
def safeApprove(_token: address, _spender: address, _value: uint256):
    _response: Bytes[32] = raw_call(
        _token,
        concat(
            APPROVE_MID,
            convert(_spender, bytes32),
            convert(_value, bytes32)
        ),
        max_outsize=32
    )  # dev: failed approve
    if len(_response) > 0:
        assert convert(_response, bool), "Approve failed"  # dev: failed approve

@internal
def safeTransfer(_token: address, _to: address, _value: uint256):
    _response: Bytes[32] = raw_call(
        _token,
        concat(
            TRANSFER_MID,
            convert(_to, bytes32),
            convert(_value, bytes32)
        ),
        max_outsize=32
    )  # dev: failed transfer
    if len(_response) > 0:
        assert convert(_response, bool), "Transfer failed"  # dev: failed transfer

@internal
def safeTransferFrom(_token: address, _from: address, _to: address, _value: uint256):
    _response: Bytes[32] = raw_call(
        _token,
        concat(
            TRANSFERFROM_MID,
            convert(_from, bytes32),
            convert(_to, bytes32),
            convert(_value, bytes32)
        ),
        max_outsize=32
    )  # dev: failed transferFrom
    if len(_response) > 0:
        assert convert(_response, bool), "TransferFrom failed"  # dev: failed transferFrom

@internal
def addLiquidity(_tokenId: uint256, sender: address, uniV3Params: MintParams, _sqrtPriceX96: uint256 = 0) -> (uint256, uint256, uint256):
    self.safeApprove(uniV3Params.token0, NONFUNGIBLEPOSITIONMANAGER, uniV3Params.amount0Desired)
    self.safeApprove(uniV3Params.token1, NONFUNGIBLEPOSITIONMANAGER, uniV3Params.amount1Desired)
    if _tokenId == 0:
        sqrtPriceX96: uint256 = _sqrtPriceX96
        _response32: Bytes[32] = empty(Bytes[32])
        if sqrtPriceX96 == 0:
            _response32 = raw_call(
                UNISWAPV3FACTORY,
                concat(
                    GETPOOL_MID,
                    convert(uniV3Params.token0, bytes32),
                    convert(uniV3Params.token1, bytes32),
                    convert(uniV3Params.fee, bytes32)
                ),
                max_outsize=32,
                is_static_call=True
            )
            pool: address = convert(convert(_response32, bytes32), address)
            assert pool != ZERO_ADDRESS, "Pool does not exist"
            _response224: Bytes[224] = raw_call(
                pool,
                SLOT0_MID,
                max_outsize=224,
                is_static_call=True
            )
            sqrtPriceX96 = convert(slice(_response224, 0, 32), uint256)
            assert sqrtPriceX96 != 0, "Pool does not initialized"

        _response32 = raw_call(
            NONFUNGIBLEPOSITIONMANAGER,
            concat(
                CAIPIN_MID,
                convert(uniV3Params.token0, bytes32),
                convert(uniV3Params.token1, bytes32),
                convert(uniV3Params.fee, bytes32),
                convert(sqrtPriceX96, bytes32)
            ),
            max_outsize=32
        )
        assert convert(convert(_response32, bytes32), address) != ZERO_ADDRESS, "Create Or Init Pool failed"
        _response128: Bytes[128] = raw_call(
            NONFUNGIBLEPOSITIONMANAGER,
            concat(
                MINT_MID,
                convert(uniV3Params.token0, bytes32),
                convert(uniV3Params.token1, bytes32),
                convert(uniV3Params.fee, bytes32),
                convert(uniV3Params.tickLower, bytes32),
                convert(uniV3Params.tickUpper, bytes32),
                convert(uniV3Params.amount0Desired, bytes32),
                convert(uniV3Params.amount1Desired, bytes32),
                convert(uniV3Params.amount0Min, bytes32),
                convert(uniV3Params.amount1Min, bytes32),
                convert(uniV3Params.recipient, bytes32),
                convert(uniV3Params.deadline, bytes32)
            ),
            max_outsize=128
        )
        tokenId: uint256 = convert(slice(_response128, 0, 32), uint256)
        liquidity: uint256 = convert(slice(_response128, 32, 32), uint256)
        amount0: uint256 = convert(slice(_response128, 64, 32), uint256)
        amount1: uint256 = convert(slice(_response128, 96, 32), uint256)
        log AddedLiquidity(tokenId, uniV3Params.token0, uniV3Params.token1, liquidity, amount0, amount1)
        return (amount0, amount1, liquidity)
    else:
        liquidity: uint256 = 0
        amount0: uint256 = 0
        amount1: uint256 = 0
        _response96: Bytes[96] = raw_call(
            NONFUNGIBLEPOSITIONMANAGER,
            concat(
                INCREASELIQUIDITY_MID,
                convert(_tokenId, bytes32),
                convert(uniV3Params.amount0Desired, bytes32),
                convert(uniV3Params.amount1Desired, bytes32),
                convert(uniV3Params.amount0Min, bytes32),
                convert(uniV3Params.amount1Min, bytes32),
                convert(uniV3Params.deadline, bytes32)
            ),
            max_outsize=96
        )
        liquidity = convert(slice(_response96, 0, 32), uint256)
        amount0 = convert(slice(_response96, 32, 32), uint256)
        amount1 = convert(slice(_response96, 64, 32), uint256)
        log AddedLiquidity(_tokenId, uniV3Params.token0, uniV3Params.token1, liquidity, amount0, amount1)
        return (amount0, amount1, liquidity)

@external
@payable
@nonreentrant('lock')
def addLiquidityEthForUniV3(_tokenId: uint256, uniV3Params: MintParams):
    assert not self.paused, "Paused"
    assert convert(uniV3Params.token0, uint256) < convert(uniV3Params.token1, uint256), "Unsorted tokens"
    if uniV3Params.token0 == WETH:
        if msg.value > uniV3Params.amount0Desired:
            send(msg.sender, msg.value - uniV3Params.amount0Desired)
        else:
            assert msg.value == uniV3Params.amount0Desired, "Eth not enough"
        WrappedEth(WETH).deposit(value=uniV3Params.amount0Desired)
        self.safeTransferFrom(uniV3Params.token1, msg.sender, self, uniV3Params.amount1Desired)
        amount0: uint256 = 0
        amount1: uint256 = 0
        liquidity: uint256 = 0
        (amount0, amount1, liquidity) = self.addLiquidity(_tokenId, msg.sender, uniV3Params)
        amount0 = uniV3Params.amount0Desired - amount0
        amount1 = uniV3Params.amount1Desired - amount1
        if amount0 > 0:
            WrappedEth(WETH).withdraw(amount0)
            send(msg.sender, amount0)
            self.safeApprove(uniV3Params.token0, NONFUNGIBLEPOSITIONMANAGER, 0)
        if amount1 > 0:
            self.safeTransfer(uniV3Params.token1, msg.sender, amount1)
            self.safeApprove(uniV3Params.token1, NONFUNGIBLEPOSITIONMANAGER, 0)
    else:
        assert uniV3Params.token1 == WETH, "Not Eth Pair"
        if msg.value > uniV3Params.amount1Desired:
            send(msg.sender, msg.value - uniV3Params.amount1Desired)
        else:
            assert msg.value == uniV3Params.amount1Desired, "Eth not enough"
        WrappedEth(WETH).deposit(value=uniV3Params.amount1Desired)
        self.safeTransferFrom(uniV3Params.token0, msg.sender, self, uniV3Params.amount0Desired)
        amount0: uint256 = 0
        amount1: uint256 = 0
        liquidity: uint256 = 0
        (amount0, amount1, liquidity) = self.addLiquidity(_tokenId, msg.sender, uniV3Params)
        amount0 = uniV3Params.amount0Desired - amount0
        amount1 = uniV3Params.amount1Desired - amount1
        if amount0 > 0:
            self.safeTransfer(uniV3Params.token0, msg.sender, amount0)
            self.safeApprove(uniV3Params.token0, NONFUNGIBLEPOSITIONMANAGER, 0)
        if amount1 > 0:
            WrappedEth(WETH).withdraw(amount1)
            send(msg.sender, amount1)
            self.safeApprove(uniV3Params.token1, NONFUNGIBLEPOSITIONMANAGER, 0)

@external
@nonreentrant('lock')
def addLiquidityForUniV3(_tokenId: uint256, uniV3Params: MintParams):
    assert not self.paused, "Paused"
    assert convert(uniV3Params.token0, uint256) < convert(uniV3Params.token1, uint256), "Unsorted tokens"

    self.safeTransferFrom(uniV3Params.token0, msg.sender, self, uniV3Params.amount0Desired)
    self.safeTransferFrom(uniV3Params.token1, msg.sender, self, uniV3Params.amount1Desired)

    amount0: uint256 = 0
    amount1: uint256 = 0
    liquidity: uint256 = 0
    (amount0, amount1, liquidity) = self.addLiquidity(_tokenId, msg.sender, uniV3Params)
    amount0 = uniV3Params.amount0Desired - amount0
    amount1 = uniV3Params.amount1Desired - amount1
    if amount0 > 0:
        self.safeTransfer(uniV3Params.token0, msg.sender, amount0)
        self.safeApprove(uniV3Params.token0, NONFUNGIBLEPOSITIONMANAGER, 0)
    if amount1 > 0:
        self.safeTransfer(uniV3Params.token1, msg.sender, amount1)
        self.safeApprove(uniV3Params.token1, NONFUNGIBLEPOSITIONMANAGER, 0)

@external
@payable
@nonreentrant('lock')
def modifyPositionForUniV3NFLP(_tokenId: uint256, modifyParams: ModifyParams):
    assert _tokenId != 0, "Wrong Token ID"
    fee: uint256 = self.feeAmount
    if msg.value > fee:
        send(msg.sender, msg.value - fee)
    else:
        assert msg.value == fee, "Insufficient fee"
    send(self.feeAddress, fee)
    ERC721(NONFUNGIBLEPOSITIONMANAGER).transferFrom(msg.sender, self, _tokenId)
    
    _response384: Bytes[384] = raw_call(
        NONFUNGIBLEPOSITIONMANAGER,
        concat(
            POSITIONS_MID,
            convert(_tokenId, bytes32)
        ),
        max_outsize=384,
        is_static_call=True
    )
    token0: address = convert(convert(slice(_response384, 64, 32), uint256), address)
    token1: address = convert(convert(slice(_response384, 96, 32), uint256), address)
    liquidity: uint256 = convert(slice(_response384, 224, 32), uint256)
    
    _response64: Bytes[64] = raw_call(
        NONFUNGIBLEPOSITIONMANAGER,
        concat(
            DECREASELIQUIDITY_MID,
            convert(_tokenId, bytes32),
            convert(liquidity, bytes32),
            convert(0, bytes32),
            convert(0, bytes32),
            convert(modifyParams.deadline, bytes32)
        ),
        max_outsize=64
    )

    _response64 = raw_call(
        NONFUNGIBLEPOSITIONMANAGER,
        concat(
            COLLECT_MID,
            convert(_tokenId, bytes32),
            convert(self, bytes32),
            convert(2 ** 128 - 1, bytes32),
            convert(2 ** 128 - 1, bytes32)
        ),
        max_outsize=64
    )
    amount0: uint256 = convert(slice(_response64, 0, 32), uint256)
    amount1: uint256 = convert(slice(_response64, 32, 32), uint256)
    
    NonfungiblePositionManager(NONFUNGIBLEPOSITIONMANAGER).burn(_tokenId)

    sqrtPriceX96: uint256 = 0
    _response32: Bytes[32] = raw_call(
        UNISWAPV3FACTORY,
        concat(
            GETPOOL_MID,
            convert(token0, bytes32),
            convert(token1, bytes32),
            convert(modifyParams.fee, bytes32)
        ),
        max_outsize=32,
        is_static_call=True
    )
    pool: address = convert(convert(_response32, bytes32), address)
    if pool == ZERO_ADDRESS:
        sqrtPriceX96 = 2 ** 96 * self.uintSqrt(amount0) / self.uintSqrt(amount1)
    else:
        _response224: Bytes[224] = raw_call(
            pool,
            SLOT0_MID,
            max_outsize=224,
            is_static_call=True
        )
        sqrtPriceX96 = convert(slice(_response224, 0, 32), uint256)
        if sqrtPriceX96 == 0:
            sqrtPriceX96 = 2 ** 96 * self.uintSqrt(amount1) / self.uintSqrt(amount1)

    _response32 = raw_call(
        NONFUNGIBLEPOSITIONMANAGER,
        concat(
            CAIPIN_MID,
            convert(token0, bytes32),
            convert(token1, bytes32),
            convert(modifyParams.fee, bytes32),
            convert(sqrtPriceX96, bytes32)
        ),
        max_outsize=32
    )

    assert convert(convert(_response32, bytes32), address) != ZERO_ADDRESS, "Create Or Init Pool failed"

    self.safeApprove(token0, NONFUNGIBLEPOSITIONMANAGER, amount0)
    self.safeApprove(token1, NONFUNGIBLEPOSITIONMANAGER, amount1)

    _response128: Bytes[128] = raw_call(
        NONFUNGIBLEPOSITIONMANAGER,
        concat(
            MINT_MID,
            convert(token0, bytes32),
            convert(token1, bytes32),
            convert(modifyParams.fee, bytes32),
            convert(modifyParams.tickLower, bytes32),
            convert(modifyParams.tickUpper, bytes32),
            convert(amount0, bytes32),
            convert(amount1, bytes32),
            convert(0, bytes32),
            convert(0, bytes32),
            convert(msg.sender, bytes32),
            convert(modifyParams.deadline, bytes32)
        ),
        max_outsize=128
    )
    tokenId: uint256 = convert(slice(_response128, 0, 32), uint256)
    liquiditynew: uint256 = convert(slice(_response128, 32, 32), uint256)
    amount0new: uint256 = convert(slice(_response128, 64, 32), uint256)
    amount1new: uint256 = convert(slice(_response128, 96, 32), uint256)

    if amount0 > amount0new:
        self.safeTransfer(token0, msg.sender, amount0 - amount0new)
        self.safeApprove(token0, NONFUNGIBLEPOSITIONMANAGER, 0)
    if amount1 > amount1new:
        self.safeTransfer(token1, msg.sender, amount1 - amount1new)
        self.safeApprove(token1, NONFUNGIBLEPOSITIONMANAGER, 0)
    log NFLPModified(_tokenId, tokenId)

@internal
def _token2Token(fromToken: address, toToken: address, tokens2Trade: uint256, deadline: uint256) -> uint256:
    if fromToken == toToken:
        return tokens2Trade
    self.safeApprove(fromToken, UNISWAPV2ROUTER02, tokens2Trade)
    _response: Bytes[128] = raw_call(
        UNISWAPV2ROUTER02,
        concat(
            SWAPETFT_MID,
            convert(tokens2Trade, bytes32),
            convert(0, bytes32),
            convert(160, bytes32),
            convert(self, bytes32),
            convert(deadline, bytes32),
            convert(2, bytes32),
            convert(fromToken, bytes32),
            convert(toToken, bytes32)
        ),
        max_outsize=128
    )
    tokenBought: uint256 = convert(slice(_response, 96, 32), uint256)
    self.safeApprove(fromToken, UNISWAPV2ROUTER02, 0)
    assert tokenBought > 0, "Error Swapping Token"
    return tokenBought

# (X + fX') * (Y - Y') = X * Y
# Y' / (X_toinvest - X') = p^2 = P
# Quadratic equation solution for X'
@internal
@view
def _getUserInForSqrtPriceX96(reserveIn: uint256, reserveOut: uint256, priceX96: uint256, toInvest: uint256) -> uint256:
    b: uint256 = reserveIn + (reserveOut * 997 / 1000 * 2 ** 96 / priceX96) - toInvest * 997 / 1000
    return (self.uintSqrt(b * b + 4 * reserveIn * toInvest * 997 / 1000) - b) * 1000 / 1994

@internal
@pure
def _getPairTokens(pair: address) -> (address, address):
    token0: address = UniswapV2Pair(pair).token0()
    token1: address = UniswapV2Pair(pair).token1()
    return (token0, token1)

@internal
@view
def _getLiquidityInPool(midToken: address, pair: address) -> uint256:
    res0: uint256 = 0
    res1: uint256 = 0
    token0: address = ZERO_ADDRESS
    token1: address = ZERO_ADDRESS
    blockTimestampLast: uint256 = 0
    (res0, res1, blockTimestampLast) = UniswapV2Pair(pair).getReserves()
    (token0, token1) = self._getPairTokens(pair)
    if token0 == midToken:
        return res0
    else:
        return res1

@internal
@view
def _getMidToken(midToken: address, token0: address, token1: address) -> address:
    pair0: address = UniswapV2Factory(UNISWAPV2FACTORY).getPair(midToken, token0)
    pair1: address = UniswapV2Factory(UNISWAPV2FACTORY).getPair(midToken, token1)
    eth0: uint256 = self._getLiquidityInPool(midToken, pair0)
    eth1: uint256 = self._getLiquidityInPool(midToken, pair1)
    if eth0 > eth1:
        return token0
    else:
        return token1

@internal
@view
def _getVirtualPriceX96(sqrtPriceAX96: uint256, sqrtPriceX96: uint256, sqrtPriceBX96: uint256) -> uint256:
    ret: uint256 = (sqrtPriceBX96 - sqrtPriceX96) * 2 ** 96 / sqrtPriceBX96 * 2 ** 96 / sqrtPriceX96 * 2 ** 96 / (sqrtPriceX96 - sqrtPriceAX96)
    if ret > 2 ** 160:
        return 2 ** 160
    else:
        return ret

@external
@payable
@nonreentrant('lock')
def investTokenForUniPair(_token: address, amount: uint256, _tokenId: uint256, _uniV3Params: SingleMintParams):
    assert not self.paused, "Paused"
    assert amount > 0, "Invalid input amount"
    uniV3Params: MintParams = MintParams({
        token0: _uniV3Params.token0,
        token1: _uniV3Params.token1,
        fee: _uniV3Params.fee,
        tickLower: _uniV3Params.tickLower,
        tickUpper: _uniV3Params.tickUpper,
        amount0Desired: 0,
        amount1Desired: 0,
        amount0Min: 0,
        amount1Min: 0,
        recipient: _uniV3Params.recipient,
        deadline: _uniV3Params.deadline
    })
    assert convert(uniV3Params.token0, uint256) < convert(uniV3Params.token1, uint256), "Unsorted tokens"
    fee: uint256 = self.feeAmount
    assert msg.value >= fee, "Insufficient fee"
    send(self.feeAddress, fee)
    msg_value: uint256 = msg.value
    msg_value -= fee
    token: address = _token
    _response32: Bytes[32] = empty(Bytes[32])
    toInvest: uint256 = 0
    midToken: address = WETH
    if token == VETH or token == ZERO_ADDRESS:
        if msg_value > amount:
            send(msg.sender, msg_value - amount)
        else:
            assert msg_value >= amount, "Insufficient value"
        WrappedEth(WETH).deposit(value=amount)
        token = WETH
        toInvest = amount
    #invest Token
    else:
        self.safeTransferFrom(token, msg.sender, self, amount)
        if msg_value > 0:
            send(msg.sender, msg_value)
        if token == WETH:
            toInvest = amount
        elif token != uniV3Params.token0 and token != uniV3Params.token1:
            toInvest = self._token2Token(token, WETH, amount, uniV3Params.deadline)
        else:
            midToken = token
            toInvest = amount
    if uniV3Params.token0 != WETH and uniV3Params.token1 != WETH and token != uniV3Params.token0 and token != uniV3Params.token1:
        midToken = self._getMidToken(WETH, uniV3Params.token0, uniV3Params.token1)
        toInvest = self._token2Token(WETH, midToken, toInvest, uniV3Params.deadline)

    res0: uint256 = 0
    res1: uint256 = 0
    blockTimestampLast: uint256 = 0
    pair: address = UniswapV2Factory(UNISWAPV2FACTORY).getPair(uniV3Params.token0, uniV3Params.token1)
    endToken: address = ZERO_ADDRESS
    if midToken == uniV3Params.token0:
        (res0, res1, blockTimestampLast) = UniswapV2Pair(pair).getReserves()
        endToken = uniV3Params.token1
    else:
        (res1, res0, blockTimestampLast) = UniswapV2Pair(pair).getReserves()
        endToken = uniV3Params.token0

    sqrtPriceX96: uint256 = 0
    _response32 = raw_call(
        UNISWAPV3FACTORY,
        concat(
            GETPOOL_MID,
            convert(uniV3Params.token0, bytes32),
            convert(uniV3Params.token1, bytes32),
            convert(uniV3Params.fee, bytes32)
        ),
        max_outsize=32,
        is_static_call=True
    )
    pool: address = convert(convert(_response32, bytes32), address)
    assert pool != ZERO_ADDRESS, "Pool does not exist"
    _response224: Bytes[224] = raw_call(
        pool,
        SLOT0_MID,
        max_outsize=224,
        is_static_call=True
    )
    sqrtPriceX96 = convert(slice(_response224, 0, 32), uint256)
    assert sqrtPriceX96 != 0, "Pool does not initialized"
    retAmount: uint256 = 0
    swapAmount: uint256 = 0
    if sqrtPriceX96 <= _uniV3Params.sqrtPriceAX96:
        if convert(midToken, uint256) > convert(endToken, uint256):
            swapAmount = toInvest
    elif sqrtPriceX96 >= _uniV3Params.sqrtPriceBX96:
        if convert(midToken, uint256) < convert(endToken, uint256):
            swapAmount = toInvest
    else:
        virtualPriceX96: uint256 = self._getVirtualPriceX96(_uniV3Params.sqrtPriceAX96, sqrtPriceX96, _uniV3Params.sqrtPriceBX96)
        if convert(midToken, uint256) > convert(endToken, uint256):
            swapAmount = self._getUserInForSqrtPriceX96(res0, res1, virtualPriceX96, toInvest)
        else:
            swapAmount = self._getUserInForSqrtPriceX96(res0, res1, 2 ** 192 / virtualPriceX96, toInvest)

    if swapAmount > toInvest:
        swapAmount = toInvest

    if swapAmount > 0:
        retAmount = self._token2Token(midToken, endToken, swapAmount, uniV3Params.deadline)

    if uniV3Params.token0 == midToken:
        uniV3Params.amount0Desired = toInvest - swapAmount
        uniV3Params.amount1Desired = retAmount
    else:
        uniV3Params.amount1Desired = toInvest - swapAmount
        uniV3Params.amount0Desired = retAmount

    amount0: uint256 = 0
    amount1: uint256 = 0
    liquidity: uint256 = 0
    (amount0, amount1, liquidity) = self.addLiquidity(_tokenId, msg.sender, uniV3Params, sqrtPriceX96)
    assert liquidity >= _uniV3Params.liquidityMin, "High Slippage"
    amount0 = uniV3Params.amount0Desired - amount0
    amount1 = uniV3Params.amount1Desired - amount1
    if amount0 > 0:
        self.safeApprove(uniV3Params.token0, NONFUNGIBLEPOSITIONMANAGER, 0)
    if amount1 > 0:
        self.safeApprove(uniV3Params.token1, NONFUNGIBLEPOSITIONMANAGER, 0)

# Admin functions
@external
def pause(_paused: bool):
    assert msg.sender == self.admin, "Not admin"
    self.paused = _paused
    log Paused(_paused)

@external
def newAdmin(_admin: address):
    assert msg.sender == self.admin, "Not admin"
    self.admin = _admin

@external
def newFeeAmount(_feeAmount: uint256):
    assert msg.sender == self.admin, "Not admin"
    self.feeAmount = _feeAmount
    log FeeChanged(_feeAmount)

@external
def newFeeAddress(_feeAddress: address):
    assert msg.sender == self.admin, "Not admin"
    self.feeAddress = _feeAddress

@external
@nonreentrant('lock')
def batchWithdraw(token: address[8], amount: uint256[8], to: address[8]):
    assert msg.sender == self.admin, "Not admin"
    for i in range(8):
        if token[i] == VETH:
            send(to[i], amount[i])
        elif token[i] != ZERO_ADDRESS:
            self.safeTransfer(token[i], to[i], amount[i])

@external
@nonreentrant('lock')
def withdraw(token: address, amount: uint256, to: address):
    assert msg.sender == self.admin, "Not admin"
    if token == VETH:
        send(to, amount)
    elif token != ZERO_ADDRESS:
        self.safeTransfer(token, to, amount)

@external
@payable
def __default__():
    assert msg.sender == WETH, "can't receive Eth"

Contract Security Audit

Contract ABI

[{"name":"AddedLiquidity","inputs":[{"name":"tokenId","type":"uint256","indexed":true},{"name":"token0","type":"address","indexed":true},{"name":"token1","type":"address","indexed":true},{"name":"liquidity","type":"uint256","indexed":false},{"name":"amount0","type":"uint256","indexed":false},{"name":"amount1","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"NFLPModified","inputs":[{"name":"oldTokenId","type":"uint256","indexed":true},{"name":"newTokenId","type":"uint256","indexed":true}],"anonymous":false,"type":"event"},{"name":"Paused","inputs":[{"name":"paused","type":"bool","indexed":false}],"anonymous":false,"type":"event"},{"name":"FeeChanged","inputs":[{"name":"newFee","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"stateMutability":"nonpayable","type":"constructor","inputs":[],"outputs":[]},{"stateMutability":"payable","type":"function","name":"addLiquidityEthForUniV3","inputs":[{"name":"_tokenId","type":"uint256"},{"name":"uniV3Params","type":"tuple","components":[{"name":"token0","type":"address"},{"name":"token1","type":"address"},{"name":"fee","type":"uint256"},{"name":"tickLower","type":"int128"},{"name":"tickUpper","type":"int128"},{"name":"amount0Desired","type":"uint256"},{"name":"amount1Desired","type":"uint256"},{"name":"amount0Min","type":"uint256"},{"name":"amount1Min","type":"uint256"},{"name":"recipient","type":"address"},{"name":"deadline","type":"uint256"}]}],"outputs":[],"gas":314603},{"stateMutability":"nonpayable","type":"function","name":"addLiquidityForUniV3","inputs":[{"name":"_tokenId","type":"uint256"},{"name":"uniV3Params","type":"tuple","components":[{"name":"token0","type":"address"},{"name":"token1","type":"address"},{"name":"fee","type":"uint256"},{"name":"tickLower","type":"int128"},{"name":"tickUpper","type":"int128"},{"name":"amount0Desired","type":"uint256"},{"name":"amount1Desired","type":"uint256"},{"name":"amount0Min","type":"uint256"},{"name":"amount1Min","type":"uint256"},{"name":"recipient","type":"address"},{"name":"deadline","type":"uint256"}]}],"outputs":[],"gas":218568},{"stateMutability":"payable","type":"function","name":"modifyPositionForUniV3NFLP","inputs":[{"name":"_tokenId","type":"uint256"},{"name":"modifyParams","type":"tuple","components":[{"name":"fee","type":"uint256"},{"name":"tickLower","type":"int128"},{"name":"tickUpper","type":"int128"},{"name":"recipient","type":"address"},{"name":"deadline","type":"uint256"}]}],"outputs":[],"gas":623761},{"stateMutability":"payable","type":"function","name":"investTokenForUniPair","inputs":[{"name":"_token","type":"address"},{"name":"amount","type":"uint256"},{"name":"_tokenId","type":"uint256"},{"name":"_uniV3Params","type":"tuple","components":[{"name":"token0","type":"address"},{"name":"token1","type":"address"},{"name":"fee","type":"uint256"},{"name":"tickLower","type":"int128"},{"name":"tickUpper","type":"int128"},{"name":"sqrtPriceAX96","type":"uint256"},{"name":"sqrtPriceBX96","type":"uint256"},{"name":"liquidityMin","type":"uint256"},{"name":"recipient","type":"address"},{"name":"deadline","type":"uint256"}]}],"outputs":[],"gas":850715},{"stateMutability":"nonpayable","type":"function","name":"pause","inputs":[{"name":"_paused","type":"bool"}],"outputs":[],"gas":39131},{"stateMutability":"nonpayable","type":"function","name":"newAdmin","inputs":[{"name":"_admin","type":"address"}],"outputs":[],"gas":37814},{"stateMutability":"nonpayable","type":"function","name":"newFeeAmount","inputs":[{"name":"_feeAmount","type":"uint256"}],"outputs":[],"gas":39091},{"stateMutability":"nonpayable","type":"function","name":"newFeeAddress","inputs":[{"name":"_feeAddress","type":"address"}],"outputs":[],"gas":37874},{"stateMutability":"nonpayable","type":"function","name":"batchWithdraw","inputs":[{"name":"token","type":"address[8]"},{"name":"amount","type":"uint256[8]"},{"name":"to","type":"address[8]"}],"outputs":[],"gas":352187},{"stateMutability":"nonpayable","type":"function","name":"withdraw","inputs":[{"name":"token","type":"address"},{"name":"amount","type":"uint256"},{"name":"to","type":"address"}],"outputs":[],"gas":96487},{"stateMutability":"payable","type":"fallback"},{"stateMutability":"view","type":"function","name":"paused","inputs":[],"outputs":[{"name":"","type":"bool"}],"gas":2778},{"stateMutability":"view","type":"function","name":"admin","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":2808},{"stateMutability":"view","type":"function","name":"feeAddress","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":2838},{"stateMutability":"view","type":"function","name":"feeAmount","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":2868}]

60006000553360015573f29399fb3311082d9f8e62b988cba44a5a98ebed6002556611c37937e08000600355615c7056600436101561000d57613c6d565b600035601c5260005163f1ea417c81141561096d576004541561002f57600080fd5b6001600455600054151515610083576308c379a0610140526020610160526006610180527f50617573656400000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6044356024351015156100d5576308c379a061014052602061016052600f610180527f556e736f7274656420746f6b656e7300000000000000000000000000000000006101a05261018050606461015cfd5b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260243514156104fd5760c43534111561012f5760006000600060003460c4358082101561011657600080fd5b80820390509050336000f161012a57600080fd5b61017f565b60c4353414151561017f576308c379a061014052602061016052600e610180527f457468206e6f7420656e6f7567680000000000000000000000000000000000006101a05261018050606461015cfd5b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc23b61019e57600080fd5b60006000600463d0e30db06101405261015c60c43573c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af16101d357600080fd5b604435610140523361016052306101805260e4356101a0526101a05161018051610160516101405160065801614147565b600050606036610140376101405161016051610180516004356101a052336101c0526101e0602480358252806020013582602001528060400135826040015280606001358260600152806080013582608001528060a001358260a001528060c001358260c001528060e001358260e00152806101000135826101000152806101200135826101200152806101400135826101400152505061032051610300516102e0516102c0516102a05161028051610260516102405161022051610200516101e0516101c0516101a051600658016142fc565b610380526103a0526103c05261018052610160526101405261038080808080516103e0525050602081019050808080516104005250506020810190508080805161042052505050506103e08051610140528060200151610160528060400151610180525060c435610140518082101561035057600080fd5b808203905090506101405260e435610160518082101561036f57600080fd5b808203905090506101605260006101405111156104515773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc23b6103a557600080fd5b600060006024632e1a7d4d6101a052610140516101c0526101bc600073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af16103e157600080fd5b600060006000600061014051336000f16103fa57600080fd5b6101405161016051610180516024356101a05273c36442b4a4522e871399cd717abdd847ab11fe886101c05260006101e0526101e0516101c0516101a05160065801613e13565b6101805261016052610140526000505b60006101605111156104f8576101405161016051610180516044356101a052336101c052610160516101e0526101e0516101c0516101a05160065801613fad565b6101805261016052610140526000506101405161016051610180516044356101a05273c36442b4a4522e871399cd717abdd847ab11fe886101c05260006101e0526101e0516101c0516101a05160065801613e13565b6101805261016052610140526000505b610966565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2604435141515610561576308c379a061014052602061016052600c610180527f4e6f7420457468205061697200000000000000000000000000000000000000006101a05261018050606461015cfd5b60e43534111561059d5760006000600060003460e4358082101561058457600080fd5b80820390509050336000f161059857600080fd5b6105ed565b60e435341415156105ed576308c379a061014052602061016052600e610180527f457468206e6f7420656e6f7567680000000000000000000000000000000000006101a05261018050606461015cfd5b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc23b61060c57600080fd5b60006000600463d0e30db06101405261015c60e43573c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af161064157600080fd5b602435610140523361016052306101805260c4356101a0526101a05161018051610160516101405160065801614147565b600050606036610140376101405161016051610180516004356101a052336101c0526101e0602480358252806020013582602001528060400135826040015280606001358260600152806080013582608001528060a001358260a001528060c001358260c001528060e001358260e00152806101000135826101000152806101200135826101200152806101400135826101400152505061032051610300516102e0516102c0516102a05161028051610260516102405161022051610200516101e0516101c0516101a051600658016142fc565b610380526103a0526103c05261018052610160526101405261038080808080516103e0525050602081019050808080516104005250506020810190508080805161042052505050506103e08051610140528060200151610160528060400151610180525060c43561014051808210156107be57600080fd5b808203905090506101405260e43561016051808210156107dd57600080fd5b8082039050905061016052600061014051111561088f576101405161016051610180516024356101a052336101c052610140516101e0526101e0516101c0516101a05160065801613fad565b6101805261016052610140526000506101405161016051610180516024356101a05273c36442b4a4522e871399cd717abdd847ab11fe886101c05260006101e0526101e0516101c0516101a05160065801613e13565b6101805261016052610140526000505b60006101605111156109665773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc23b6108ba57600080fd5b600060006024632e1a7d4d6101a052610160516101c0526101bc600073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af16108f657600080fd5b600060006000600061016051336000f161090f57600080fd5b6101405161016051610180516044356101a05273c36442b4a4522e871399cd717abdd847ab11fe886101c05260006101e0526101e0516101c0516101a05160065801613e13565b6101805261016052610140526000505b6000600455005b63e9b723ee811415611ef9576004541561098657600080fd5b60016004556000600435141515156109dd576308c379a061014052602061016052600e610180527f57726f6e6720546f6b656e2049440000000000000000000000000000000000006101a05261018050606461015cfd5b6003546101405261014051341115610a22576000600060006000346101405180821015610a0957600080fd5b80820390509050336000f1610a1d57600080fd5b610a73565b6101405134141515610a73576308c379a06101605260206101805260106101a0527f496e73756666696369656e7420666565000000000000000000000000000000006101c0526101a050606461017cfd5b6000600060006000610140516002546000f1610a8e57600080fd5b73c36442b4a4522e871399cd717abdd847ab11fe883b610aad57600080fd5b6000600060646323b872dd610160523361018052306101a0526004356101c05261017c600073c36442b4a4522e871399cd717abdd847ab11fe885af1610af257600080fd5b60006004610320527f99fbab88000000000000000000000000000000000000000000000000000000006103405261032060048060208461038001018260208501600060045af1505080518201915050600435602082610380010152602081019050806103805261038090508051602001806104008284600060045af1610b7757600080fd5b50506101806104a06104005161042073c36442b4a4522e871399cd717abdd847ab11fe885afa610ba657600080fd5b6101803d80821115610bb85780610bba565b815b90509050610480526104808051602001806101608284600060045af1610bdf57600080fd5b5050604060206020820661052001610160518284011115610bff57600080fd5b610180806105408260206020880688030161016001600060045af1505081815280905090509050806020015160008251806020901315610c3e57600080fd5b8091901215610c4c57600080fd5b806020036101000a82049050905090508060a01c15610c6a57600080fd5b80905061032052606060206020820661054001610160518284011115610c8f57600080fd5b610180806105608260206020880688030161016001600060045af1505081815280905090509050806020015160008251806020901315610cce57600080fd5b8091901215610cdc57600080fd5b806020036101000a82049050905090508060a01c15610cfa57600080fd5b8090506103405260e060206020820661056001610160518284011115610d1f57600080fd5b610180806105808260206020880688030161016001600060045af1505081815280905090509050806020015160008251806020901315610d5e57600080fd5b8091901215610d6c57600080fd5b806020036101000a82049050905090506103605260006004610400527f0c49ccbe000000000000000000000000000000000000000000000000000000006104205261040060048060208461046001018260208501600060045af1505080518201915050600435602082610460010152602081019050610360516020826104600101526020810190506000602082610460010152602081019050600060208261046001015260208101905060a435602082610460010152602081019050806104605261046090508051602001806105608284600060045af1610e4c57600080fd5b5050604061068061056051610580600073c36442b4a4522e871399cd717abdd847ab11fe885af1610e7c57600080fd5b60403d80821115610e8d5780610e8f565b815b90509050610660526106608051602001806103808284600060045af1610eb457600080fd5b505060006004610400527ffc6f7865000000000000000000000000000000000000000000000000000000006104205261040060048060208461046001018260208501600060045af1505080518201915050600435602082610460010152602081019050306020826104600101526020810190506fffffffffffffffffffffffffffffffff6020826104600101526020810190506fffffffffffffffffffffffffffffffff602082610460010152602081019050806104605261046090508051602001806105408284600060045af1610f8b57600080fd5b5050604061064061054051610560600073c36442b4a4522e871399cd717abdd847ab11fe885af1610fbb57600080fd5b60403d80821115610fcc5780610fce565b815b90509050610620526106208051602001806103808284600060045af1610ff357600080fd5b505060006020602082066104c00161038051828401111561101357600080fd5b6040806104e08260206020880688030161038001600060045af150508181528090509050905080602001516000825180602090131561105157600080fd5b809190121561105f57600080fd5b806020036101000a82049050905090506104005260206020602082066104e00161038051828401111561109157600080fd5b6040806105008260206020880688030161038001600060045af15050818152809050905090508060200151600082518060209013156110cf57600080fd5b80919012156110dd57600080fd5b806020036101000a82049050905090506104205273c36442b4a4522e871399cd717abdd847ab11fe883b61111057600080fd5b6000600060246342966c68610440526004356104605261045c600073c36442b4a4522e871399cd717abdd847ab11fe885af161114b57600080fd5b600061044052600060046104c0527f1698ee82000000000000000000000000000000000000000000000000000000006104e0526104c060048060208461052001018260208501600060045af15050805182019150506103205160208261052001015260208101905061034051602082610520010152602081019050602435602082610520010152602081019050806105205261052090508051602001806105e08284600060045af16111fc57600080fd5b505060206106c06105e051610600731f98431c8ad98523631ae4a59f267346ea31f9845afa61122a57600080fd5b60203d8082111561123b578061123d565b815b905090506106a0526106a08051602001806104608284600060045af161126257600080fd5b5050610480518060a01c1561127657600080fd5b8090506104c0526104c05115156113ae576c010000000000000000000000006101406104e0525b6104e0515160206104e051016104e0526104e06104e05110156112bf5761129d565b61040051610500526105005160065801613cd1565b610560526104c06104e0525b6104e0515260206104e051036104e0526101406104e051101515611303576112e0565b61056051808202821582848304141761131b57600080fd5b80905090509050610140610580525b6105805151602061058051016105805261058061058051101561134c5761132a565b610420516105a0526105a05160065801613cd1565b61060052610560610580525b61058051526020610580510361058052610140610580511015156113905761136d565b61060051808061139f57600080fd5b820490509050610440526115f8565b6004610600527f3850c7bd00000000000000000000000000000000000000000000000000000000610620526106008051602001806106608284600060045af16113f657600080fd5b505060e06106e0610660516106806104c0515afa61141357600080fd5b60e03d808211156114245780611426565b815b905090506106c0526106c08051602001806104e08284600060045af161144b57600080fd5b50506000602060208206610740016104e051828401111561146b57600080fd5b60e080610760826020602088068803016104e001600060045af15050818152809050905090508060200151600082518060209013156114a957600080fd5b80919012156114b757600080fd5b806020036101000a8204905090509050610440526104405115156115f8576c01000000000000000000000000610140610600525b6106005151602061060051016106005261060061060051101561150d576114eb565b61042051610620526106205160065801613cd1565b610680526105e0610600525b61060051526020610600510361060052610140610600511015156115515761152e565b61068051808202821582848304141761156957600080fd5b809050905090506101406106a0525b6106a0515160206106a051016106a0526106a06106a051101561159a57611578565b610420516106c0526106c05160065801613cd1565b610720526106806106a0525b6106a0515260206106a051036106a0526101406106a0511015156115de576115bb565b6107205180806115ed57600080fd5b820490509050610440525b600060046104e0527f13ead56200000000000000000000000000000000000000000000000000000000610500526104e060048060208461054001018260208501600060045af1505080518201915050610320516020826105400101526020810190506103405160208261054001015260208101905060243560208261054001015260208101905061044051602082610540010152602081019050806105405261054090508051602001806106208284600060045af16116b657600080fd5b5050602061072061062051610640600073c36442b4a4522e871399cd717abdd847ab11fe885af16116e657600080fd5b60203d808211156116f757806116f9565b815b90509050610700526107008051602001806104608284600060045af161171e57600080fd5b50506000610480518060a01c1561173457600080fd5b80905014151515611784576308c379a06104e052602061050052601a610520527f437265617465204f7220496e697420506f6f6c206661696c6564000000000000610540526105205060646104fcfd5b6101406104e0525b6104e0515160206104e051016104e0526104e06104e05110156117ae5761178c565b610320516105005273c36442b4a4522e871399cd717abdd847ab11fe8861052052610400516105405261054051610520516105005160065801613e13565b6104c06104e0525b6104e0515260206104e051036104e0526101406104e051101515611817576117f4565b6000506101406104e0525b6104e0515160206104e051016104e0526104e06104e051101561184457611822565b610340516105005273c36442b4a4522e871399cd717abdd847ab11fe8861052052610420516105405261054051610520516105005160065801613e13565b6104c06104e0525b6104e0515260206104e051036104e0526101406104e0511015156118ad5761188a565b600050600060046105a0527f88316456000000000000000000000000000000000000000000000000000000006105c0526105a060048060208461060001018260208501600060045af150508051820191505061032051602082610600010152602081019050610340516020826106000101526020810190506024356020826106000101526020810190506044356020826106000101526020810190506064356020826106000101526020810190506104005160208261060001015260208101905061042051602082610600010152602081019050600060208261060001015260208101905060006020826106000101526020810190503360208261060001015260208101905060a435602082610600010152602081019050806106005261060090508051602001806107c08284600060045af16119e957600080fd5b505060806109a06107c0516107e0600073c36442b4a4522e871399cd717abdd847ab11fe885af1611a1957600080fd5b60803d80821115611a2a5780611a2c565b815b90509050610980526109808051602001806104e08284600060045af1611a5157600080fd5b505060006020602082066106a0016104e0518284011115611a7157600080fd5b6080806106c0826020602088068803016104e001600060045af1505081815280905090509050806020015160008251806020901315611aaf57600080fd5b8091901215611abd57600080fd5b806020036101000a82049050905090506105a05260206020602082066106c0016104e0518284011115611aef57600080fd5b6080806106e0826020602088068803016104e001600060045af1505081815280905090509050806020015160008251806020901315611b2d57600080fd5b8091901215611b3b57600080fd5b806020036101000a82049050905090506105c05260406020602082066106e0016104e0518284011115611b6d57600080fd5b608080610700826020602088068803016104e001600060045af1505081815280905090509050806020015160008251806020901315611bab57600080fd5b8091901215611bb957600080fd5b806020036101000a82049050905090506105e0526060602060208206610700016104e0518284011115611beb57600080fd5b608080610720826020602088068803016104e001600060045af1505081815280905090509050806020015160008251806020901315611c2957600080fd5b8091901215611c3757600080fd5b806020036101000a8204905090509050610600526105e051610400511115611d8857610140610620525b61062051516020610620510161062052610620610620511015611c8357611c61565b61032051610640523361066052610400516105e05180821015611ca557600080fd5b808203905090506106805261068051610660516106405160065801613fad565b610600610620525b6106205152602061062051036106205261014061062051101515611cf057611ccd565b600050610140610620525b61062051516020610620510161062052610620610620511015611d1d57611cfb565b610320516106405273c36442b4a4522e871399cd717abdd847ab11fe886106605260006106805261068051610660516106405160065801613e13565b610600610620525b6106205152602061062051036106205261014061062051101515611d8457611d61565b6000505b61060051610420511115611ec557610140610620525b61062051516020610620510161062052610620610620511015611dc057611d9e565b61034051610640523361066052610420516106005180821015611de257600080fd5b808203905090506106805261068051610660516106405160065801613fad565b610600610620525b6106205152602061062051036106205261014061062051101515611e2d57611e0a565b600050610140610620525b61062051516020610620510161062052610620610620511015611e5a57611e38565b610340516106405273c36442b4a4522e871399cd717abdd847ab11fe886106605260006106805261068051610660516106405160065801613e13565b610600610620525b6106205152602061062051036106205261014061062051101515611ec157611e9e565b6000505b6105a0516004357f6820c77d3eecf3f60a3c9b5ca02dfa0810415527df890f06d8a29412f96b693060006000a36000600455005b63e4c4ad988114156132615760045415611f1257600080fd5b600160045560043560a01c15611f2757600080fd5b600054151515611f76576308c379a0610140526020610160526006610180527f50617573656400000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6000602435111515611fc7576308c379a0610140526020610160526014610180527f496e76616c696420696e70757420616d6f756e740000000000000000000000006101a05261018050606461015cfd5b6101406064358152608435816020015260a435816040015260c435816060015260e435816080015260008160a0015260008160c0015260008160e0015260008161010001526101643581610120015261018435816101400152506101605161014051101515612075576308c379a06102a05260206102c052600f6102e0527f556e736f7274656420746f6b656e730000000000000000000000000000000000610300526102e05060646102bcfd5b6003546102a0526102a05134101515156120ce576308c379a06102c05260206102e0526010610300527f496e73756666696369656e742066656500000000000000000000000000000000610320526103005060646102dcfd5b60006000600060006102a0516002546000f16120e957600080fd5b346102c0526102c080516102a0518082101561210457600080fd5b808203905090508152506004356102e0526000602036610300375060006103605273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26103805273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102e051141561216457600161216a565b6102e051155b1561227e576024356102c05111156121b15760006000600060006102c0516024358082101561219857600080fd5b80820390509050336000f16121ac57600080fd5b612205565b6024356102c05110151515612205576308c379a06103a05260206103c05260126103e0527f496e73756666696369656e742076616c75650000000000000000000000000000610400526103e05060646103bcfd5b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc23b61222457600080fd5b60006000600463d0e30db06103a0526103bc60243573c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af161225957600080fd5b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26102e052602435610360526124c2565b6101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610320516103405161036051610380516102e0516103a052336103c052306103e05260243561040052610400516103e0516103c0516103a05160065801614147565b61038052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405260005060006102c05111156123705760006000600060006102c051336000f161237057600080fd5b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26102e051141561239b57602435610360526124c2565b610140516102e05118156123b857610160516102e05114156123bb565b60005b156124b2576101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610320516103405161036051610380516102e0516103a05273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26103c0526024356103e0526102805161040052610400516103e0516103c0516103a05160065801615163565b6104605261038052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261046051610360526124c2565b6102e05161038052602435610360525b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc261014051181561252d5773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc261016051181561252557610140516102e051181561251d57610160516102e0511415612520565b60005b612528565b60005b612530565b60005b15612706576101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e051610300516103205161034051610360516103805173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26103a052610140516103c052610160516103e0526103e0516103c0516103a0516006580161591a565b6104405261038052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261044051610380526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e051610300516103205161034051610360516103805173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26103a052610380516103c052610360516103e0526102805161040052610400516103e0516103c0516103a05160065801615163565b6104605261038052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261046051610360525b6060366103a03760206104c0604463e6a43905610420526101405161044052610160516104605261043c735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f5afa61275057600080fd5b601f3d1161275d57600080fd5b6000506104c05161040052600061042052610140516103805114156128075760606104a06004630902f1ac6104405261045c610400515afa61279e57600080fd5b605f3d116127ab57600080fd5b6104a080808080516105005250506020810190508080805161052052505060208101905080808051610540525050505060005061050080516103a05280602001516103c05280604001516103e05250610160516104205261288e565b60606104a06004630902f1ac6104405261045c610400515afa61282957600080fd5b605f3d1161283657600080fd5b6104a080808080516105005250506020810190508080805161052052505060208101905080808051610540525050505060005061050080516103c05280602001516103a05280604001516103e0525061014051610420525b60006104405260006004610460527f1698ee8200000000000000000000000000000000000000000000000000000000610480526104606004806020846104c001018260208501600060045af1505080518201915050610140516020826104c0010152602081019050610160516020826104c0010152602081019050610180516020826104c0010152602081019050806104c0526104c090508051602001806105808284600060045af161294057600080fd5b50506020610660610580516105a0731f98431c8ad98523631ae4a59f267346ea31f9845afa61296e57600080fd5b60203d8082111561297f5780612981565b815b90509050610640526106408051602001806103008284600060045af16129a657600080fd5b5050610320518060a01c156129ba57600080fd5b8090506104605260006104605114151515612a14576308c379a06104805260206104a05260136104c0527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006104e0526104c050606461049cfd5b60046105a0527f3850c7bd000000000000000000000000000000000000000000000000000000006105c0526105a08051602001806106008284600060045af1612a5c57600080fd5b505060e061068061060051610620610460515afa612a7957600080fd5b60e03d80821115612a8a5780612a8c565b815b90509050610660526106608051602001806104808284600060045af1612ab157600080fd5b505060006020602082066106e001610480518284011115612ad157600080fd5b60e0806107008260206020880688030161048001600060045af1505081815280905090509050806020015160008251806020901315612b0f57600080fd5b8091901215612b1d57600080fd5b806020036101000a82049050905090506104405260006104405114151515612b84576308c379a06105a05260206105c05260196105e0527f506f6f6c20646f6573206e6f7420696e697469616c697a656400000000000000610600526105e05060646105bcfd5b6040366105a0376101043561044051111515612bb65761042051610380511115612bb157610360516105c0525b612de2565b6101243561044051101515612be15761042051610380511015612bdc57610360516105c0525b612de2565b610140610600525b61060051516020610600510161060052610600610600511015612c0b57612be9565b61010435610620526104405161064052610124356106605261066051610640516106205160065801615ae6565b6106c0526105e0610600525b6106005152602061060051036106005261014061060051101515612c6757612c44565b6106c0516105e05261042051610380511115612d1c57610140610600525b61060051516020610600510161060052610600610600511015612ca757612c85565b6103a051610620526103c051610640526105e05161066052610360516106805261068051610660516106405161062051600658016154e9565b6106e0526105e0610600525b6106005152602061060051036106005261014061060051101515612d0f57612cec565b6106e0516105c052612de2565b610140610600525b61060051516020610600510161060052610600610600511015612d4657612d24565b6103a051610620526103c0516106405278010000000000000000000000000000000000000000000000006105e0518080612d7f57600080fd5b82049050905061066052610360516106805261068051610660516106405161062051600658016154e9565b6106e0526105e0610600525b6106005152602061060051036106005261014061060051101515612dd957612db6565b6106e0516105c0525b610360516105c0511115612df957610360516105c0525b60006105c0511115612ea0576101406105e0525b6105e0515160206105e051016105e0526105e06105e0511015612e2f57612e0d565b610380516106005261042051610620526105c0516106405261028051610660526106605161064051610620516106005160065801615163565b6106c0526105c06105e0525b6105e0515260206105e051036105e0526101406105e051101515612e9757612e74565b6106c0516105a0525b61038051610140511415612edb57610360516105c05180821015612ec357600080fd5b808203905090506101e0526105a05161020052612f04565b610360516105c05180821015612ef057600080fd5b80820390509050610200526105a0516101e0525b6060366105e037610140610640525b61064051516020610640510161064052610640610640511015612f3557612f13565b6044356106605233610680526106a061014080518252806020015182602001528060400151826040015280606001518260600152806080015182608001528060a001518260a001528060c001518260c001528060e001518260e0015280610100015182610100015280610120015182610120015280610140015182610140015250506104405161080052610800516107e0516107c0516107a05161078051610760516107405161072051610700516106e0516106c0516106a05161068051610660516006580161434a565b61086052610880526108a052610620610640525b610640515260206106405103610640526101406106405110151561303757613014565b61086080808080516108c0525050602081019050808080516108e05250506020810190508080805161090052505050506108c080516105e052806020015161060052806040015161062052506101443561062051101515156130d8576308c379a061064052602061066052600d610680527f4869676820536c697070616765000000000000000000000000000000000000006106a05261068050606461065cfd5b6101e0516105e051808210156130ed57600080fd5b808203905090506105e05261020051610600518082101561310d57600080fd5b808203905090506106005260006105e05111156131b957610140610640525b6106405151602061064051016106405261064061064051101561314e5761312c565b610140516106605273c36442b4a4522e871399cd717abdd847ab11fe886106805260006106a0526106a051610680516106605160065801613e13565b610620610640525b61064051526020610640510361064052610140610640511015156131b557613192565b6000505b600061060051111561325a57610140610640525b610640515160206106405101610640526106406106405110156131ef576131cd565b610160516106605273c36442b4a4522e871399cd717abdd847ab11fe886106805260006106a0526106a051610680516106605160065801613e13565b610620610640525b610640515260206106405103610640526101406106405110151561325657613233565b6000505b6000600455005b63dd2bb8e181141561365b576004541561327a57600080fd5b6001600455341561328a57600080fd5b6000541515156132d9576308c379a0610140526020610160526006610180527f50617573656400000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b60443560243510151561332b576308c379a061014052602061016052600f610180527f556e736f7274656420746f6b656e7300000000000000000000000000000000006101a05261018050606461015cfd5b602435610140523361016052306101805260c4356101a0526101a05161018051610160516101405160065801614147565b600050604435610140523361016052306101805260e4356101a0526101a05161018051610160516101405160065801614147565b600050606036610140376101405161016051610180516004356101a052336101c0526101e0602480358252806020013582602001528060400135826040015280606001358260600152806080013582608001528060a001358260a001528060c001358260c001528060e001358260e00152806101000135826101000152806101200135826101200152806101400135826101400152505061032051610300516102e0516102c0516102a05161028051610260516102405161022051610200516101e0516101c0516101a051600658016142fc565b610380526103a0526103c05261018052610160526101405261038080808080516103e0525050602081019050808080516104005250506020810190508080805161042052505050506103e08051610140528060200151610160528060400151610180525060c43561014051808210156134dc57600080fd5b808203905090506101405260e43561016051808210156134fb57600080fd5b808203905090506101605260006101405111156135ad576101405161016051610180516024356101a052336101c052610140516101e0526101e0516101c0516101a05160065801613fad565b6101805261016052610140526000506101405161016051610180516024356101a05273c36442b4a4522e871399cd717abdd847ab11fe886101c05260006101e0526101e0516101c0516101a05160065801613e13565b6101805261016052610140526000505b6000610160511115613654576101405161016051610180516044356101a052336101c052610160516101e0526101e0516101c0516101a05160065801613fad565b6101805261016052610140526000506101405161016051610180516044356101a05273c36442b4a4522e871399cd717abdd847ab11fe886101c05260006101e0526101e0516101c0516101a05160065801613e13565b6101805261016052610140526000505b6000600455005b6302329a2981141561370857341561367257600080fd5b60043560011c1561368257600080fd5b600154331415156136d2576308c379a0610140526020610160526009610180527f4e6f742061646d696e00000000000000000000000000000000000000000000006101a05261018050606461015cfd5b600435600055600435610140527f0e2fb031ee032dc02d8011dc50b816eb450cf856abd8261680dac74f72165bd26020610140a1005b63a6ba31c181141561378757341561371f57600080fd5b60043560a01c1561372f57600080fd5b6001543314151561377f576308c379a0610140526020610160526009610180527f4e6f742061646d696e00000000000000000000000000000000000000000000006101a05261018050606461015cfd5b600435600155005b63361bc0ca81141561382457341561379e57600080fd5b600154331415156137ee576308c379a0610140526020610160526009610180527f4e6f742061646d696e00000000000000000000000000000000000000000000006101a05261018050606461015cfd5b600435600355600435610140527f6bbc57480a46553fa4d156ce702beef5f3ad66303b0ed1a5d4cb44966c6584c36020610140a1005b63775507568114156138a357341561383b57600080fd5b60043560a01c1561384b57600080fd5b6001543314151561389b576308c379a0610140526020610160526009610180527f4e6f742061646d696e00000000000000000000000000000000000000000000006101a05261018050606461015cfd5b600435600255005b63f42ce21c811415613ac957600454156138bc57600080fd5b600160045534156138cc57600080fd5b6000610120525b610120516004013560a01c156138e857600080fd5b6020610120510161012052610100610120511015613905576138d3565b6000610120525b61012051610204013560a01c1561392257600080fd5b602061012051016101205261010061012051101561393f5761390c565b6001543314151561398f576308c379a0610140526020610160526009610180527f4e6f742061646d696e00000000000000000000000000000000000000000000006101a05261018050606461015cfd5b61014060006008818352015b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee600461014051600881106139c357600080fd5b60200201351415613a1957600060006000600061010461014051600881106139ea57600080fd5b60200201356102046101405160088110613a0357600080fd5b60200201356000f1613a1457600080fd5b613ab0565b600060046101405160088110613a2e57600080fd5b60200201351815613ab0576101405160046101405160088110613a5057600080fd5b6020020135610160526102046101405160088110613a6d57600080fd5b6020020135610180526101046101405160088110613a8a57600080fd5b60200201356101a0526101a051610180516101605160065801613fad565b610140526000505b815160010180835281141561399b575b50506000600455005b6369328dec811415613bdf5760045415613ae257600080fd5b60016004553415613af257600080fd5b60043560a01c15613b0257600080fd5b60443560a01c15613b1257600080fd5b60015433141515613b62576308c379a0610140526020610160526009610180527f4e6f742061646d696e00000000000000000000000000000000000000000000006101a05261018050606461015cfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6004351415613b9f5760006000600060006024356044356000f1613b9a57600080fd5b613bd8565b60006004351815613bd85760043561014052604435610160526024356101805261018051610160516101405160065801613fad565b6000505b6000600455005b635c975abb811415613c02573415613bf657600080fd5b60005460005260206000f35b63f851a440811415613c25573415613c1957600080fd5b60015460005260206000f35b6341275358811415613c48573415613c3c57600080fd5b60025460005260206000f35b6369e15404811415613c6b573415613c5f57600080fd5b60035460005260206000f35b505b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc233141515613ccf576308c379a0610140526020610160526011610180527f63616e27742072656365697665204574680000000000000000000000000000006101a05261018050606461015cfd5b005b61016052610140526003610140511115613de757610140516001818183011015613cfa57600080fd5b8082019050905060028082049050905061018052610140516101a0526101c06000610100818352015b610180516101a0511415613d43576101a051600052505060005161016051565b610180516101a05261014051610180518080613d5e57600080fd5b82049050905061018051818183011015613d7757600080fd5b80820190509050600280820490509050610180525b8151600101808352811415613d23575b50506308c379a06101c05260206101e0526010610200527f446964206e6f7420636f76657261676500000000000000000000000000000000610220526102005060646101dcfd613e11565b610140511515613e035760006000526000516101605156613e11565b600160005260005161016051565b005b6101a05261014052610160526101805260006004610220527f095ea7b3000000000000000000000000000000000000000000000000000000006102405261022060048060208461028001018260208501600060045af15050805182019150506101605160208261028001015260208101905061018051602082610280010152602081019050806102805261028090508051602001806103208284600060045af1613ebc57600080fd5b505060206103e0610320516103406000610140515af1613edb57600080fd5b60203d80821115613eec5780613eee565b815b905090506103c0526103c08051602001806101c08284600060045af1613f1357600080fd5b505060006101c0511115613fa7576101c0806020015160008251806020901315613f3c57600080fd5b8091901215613f4a57600080fd5b806020036101000a820490509050905015151515613fa7576308c379a061022052602061024052600e610260527f417070726f7665206661696c65640000000000000000000000000000000000006102805261026050606461023cfd5b6101a051565b6101a05261014052610160526101805260006004610220527fa9059cbb000000000000000000000000000000000000000000000000000000006102405261022060048060208461028001018260208501600060045af15050805182019150506101605160208261028001015260208101905061018051602082610280010152602081019050806102805261028090508051602001806103208284600060045af161405657600080fd5b505060206103e0610320516103406000610140515af161407557600080fd5b60203d808211156140865780614088565b815b905090506103c0526103c08051602001806101c08284600060045af16140ad57600080fd5b505060006101c0511115614141576101c08060200151600082518060209013156140d657600080fd5b80919012156140e457600080fd5b806020036101000a820490509050905015151515614141576308c379a061022052602061024052600f610260527f5472616e73666572206661696c656400000000000000000000000000000000006102805261026050606461023cfd5b6101a051565b6101c0526101405261016052610180526101a05260006004610240527f23b872dd00000000000000000000000000000000000000000000000000000000610260526102406004806020846102a001018260208501600060045af1505080518201915050610160516020826102a0010152602081019050610180516020826102a00101526020810190506101a0516020826102a0010152602081019050806102a0526102a090508051602001806103608284600060045af161420757600080fd5b50506020610440610360516103806000610140515af161422657600080fd5b60203d808211156142375780614239565b815b90509050610420526104208051602001806101e08284600060045af161425e57600080fd5b505060006101e05111156142f2576101e080602001516000825180602090131561428757600080fd5b809190121561429557600080fd5b806020036101000a8204905090509050151515156142f2576308c379a0610240526020610260526013610280527f5472616e7366657246726f6d206661696c6564000000000000000000000000006102a05261028050606461025cfd5b6101c05156614342575b6103005260006102e0526101405261016052610180526101a0526101c0526101e05261020052610220526102405261026052610280526102a0526102c05260005061438e565b60001561438e575b610300526101405261016052610180526101a0526101c0526101e05261020052610220526102405261026052610280526102a0526102c0526102e05260005061438e565b6101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610180516103205273c36442b4a4522e871399cd717abdd847ab11fe8861034052610220516103605261036051610340516103205160065801613e13565b610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526000506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e051610300516101a0516103205273c36442b4a4522e871399cd717abdd847ab11fe8861034052610240516103605261036051610340516103205160065801613e13565b610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052600050610140511515614def576102e05161032052600060203661034037506103205115156148165760006004610480527f1698ee82000000000000000000000000000000000000000000000000000000006104a0526104806004806020846104e001018260208501600060045af1505080518201915050610180516020826104e00101526020810190506101a0516020826104e00101526020810190506101c0516020826104e0010152602081019050806104e0526104e090508051602001806105a08284600060045af16145d257600080fd5b505060206106806105a0516105c0731f98431c8ad98523631ae4a59f267346ea31f9845afa61460057600080fd5b60203d808211156146115780614613565b815b90509050610660526106608051602001806103408284600060045af161463857600080fd5b5050610360518060a01c1561464c57600080fd5b8090506103a05260006103a051141515156146a6576308c379a06104805260206104a05260136104c0527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006104e0526104c050606461049cfd5b60046105a0527f3850c7bd000000000000000000000000000000000000000000000000000000006105c0526105a08051602001806106008284600060045af16146ee57600080fd5b505060e0610680610600516106206103a0515afa61470b57600080fd5b60e03d8082111561471c578061471e565b815b90509050610660526106608051602001806104808284600060045af161474357600080fd5b505060006020602082066106e00161048051828401111561476357600080fd5b60e0806107008260206020880688030161048001600060045af15050818152809050905090508060200151600082518060209013156147a157600080fd5b80919012156147af57600080fd5b806020036101000a82049050905090506103205260006103205114151515614816576308c379a06105a05260206105c05260196105e0527f506f6f6c20646f6573206e6f7420696e697469616c697a656400000000000000610600526105e05060646105bcfd5b60006004610480527f13ead562000000000000000000000000000000000000000000000000000000006104a0526104806004806020846104e001018260208501600060045af1505080518201915050610180516020826104e00101526020810190506101a0516020826104e00101526020810190506101c0516020826104e0010152602081019050610320516020826104e0010152602081019050806104e0526104e090508051602001806105c08284600060045af16148d557600080fd5b505060206106c06105c0516105e0600073c36442b4a4522e871399cd717abdd847ab11fe885af161490557600080fd5b60203d808211156149165780614918565b815b905090506106a0526106a08051602001806103408284600060045af161493d57600080fd5b50506000610360518060a01c1561495357600080fd5b809050141515156149a3576308c379a06104805260206104a052601a6104c0527f437265617465204f7220496e697420506f6f6c206661696c65640000000000006104e0526104c050606461049cfd5b60006004610540527f8831645600000000000000000000000000000000000000000000000000000000610560526105406004806020846105a001018260208501600060045af1505080518201915050610180516020826105a00101526020810190506101a0516020826105a00101526020810190506101c0516020826105a00101526020810190506101e0516020826105a0010152602081019050610200516020826105a0010152602081019050610220516020826105a0010152602081019050610240516020826105a0010152602081019050610260516020826105a0010152602081019050610280516020826105a00101526020810190506102a0516020826105a00101526020810190506102c0516020826105a0010152602081019050806105a0526105a090508051602001806107608284600060045af1614ae757600080fd5b5050608061094061076051610780600073c36442b4a4522e871399cd717abdd847ab11fe885af1614b1757600080fd5b60803d80821115614b285780614b2a565b815b90509050610920526109208051602001806104808284600060045af1614b4f57600080fd5b5050600060206020820661062001610480518284011115614b6f57600080fd5b6080806106408260206020880688030161048001600060045af1505081815280905090509050806020015160008251806020901315614bad57600080fd5b8091901215614bbb57600080fd5b806020036101000a82049050905090506103a052602060206020820661062001610480518284011115614bed57600080fd5b6080806106408260206020880688030161048001600060045af1505081815280905090509050806020015160008251806020901315614c2b57600080fd5b8091901215614c3957600080fd5b806020036101000a82049050905090506103c052604060206020820661062001610480518284011115614c6b57600080fd5b6080806106408260206020880688030161048001600060045af1505081815280905090509050806020015160008251806020901315614ca957600080fd5b8091901215614cb757600080fd5b806020036101000a82049050905090506103e052606060206020820661062001610480518284011115614ce957600080fd5b6080806106408260206020880688030161048001600060045af1505081815280905090509050806020015160008251806020901315614d2757600080fd5b8091901215614d3557600080fd5b806020036101000a8204905090509050610400526103c051610540526103e0516105605261040051610580526101a051610180516103a0517f8608f0d1a9f263ba6515609d93d7510949b8477690ce655f3b813420049d3d846060610540a46105a06103e05181526104005181602001526103c0518160400152506060610600525b600061060051111515614dc957614de5565b602061060051036105a001516020610600510361060052614db7565b6103005156615161565b6060366103203760006004610420527f219f5d17000000000000000000000000000000000000000000000000000000006104405261042060048060208461048001018260208501600060045af150508051820191505061014051602082610480010152602081019050610220516020826104800101526020810190506102405160208261048001015260208101905061026051602082610480010152602081019050610280516020826104800101526020810190506102c051602082610480010152602081019050806104805261048090508051602001806105a08284600060045af1614edb57600080fd5b505060606106e06105a0516105c0600073c36442b4a4522e871399cd717abdd847ab11fe885af1614f0b57600080fd5b60603d80821115614f1c5780614f1e565b815b905090506106c0526106c08051602001806103808284600060045af1614f4357600080fd5b505060006020602082066104e001610380518284011115614f6357600080fd5b6060806105008260206020880688030161038001600060045af1505081815280905090509050806020015160008251806020901315614fa157600080fd5b8091901215614faf57600080fd5b806020036101000a82049050905090506103205260206020602082066104e001610380518284011115614fe157600080fd5b6060806105008260206020880688030161038001600060045af150508181528090509050905080602001516000825180602090131561501f57600080fd5b809190121561502d57600080fd5b806020036101000a82049050905090506103405260406020602082066104e00161038051828401111561505f57600080fd5b6060806105008260206020880688030161038001600060045af150508181528090509050905080602001516000825180602090131561509d57600080fd5b80919012156150ab57600080fd5b806020036101000a8204905090509050610360526103205161042052610340516104405261036051610460526101a05161018051610140517f8608f0d1a9f263ba6515609d93d7510949b8477690ce655f3b813420049d3d846060610420a46104806103405181526103605181602001526103205181604001525060606104e0525b60006104e05111151561513f5761515b565b60206104e05103610480015160206104e051036104e05261512d565b61030051565b005b6101c0526101405261016052610180526101a0526101605161014051141561519557610180516000526000516101c051565b6101405161016051610180516101a0516101c051610140516101e052737a250d5630b4cf539739df2c5dacb4c659f2488d61020052610180516102205261022051610200516101e05160065801613e13565b6101c0526101a052610180526101605261014052600050600060046102a0527f38ed1739000000000000000000000000000000000000000000000000000000006102c0526102a060048060208461030001018260208501600060045af150508051820191505061018051602082610300010152602081019050600060208261030001015260208101905060a0602082610300010152602081019050306020826103000101526020810190506101a05160208261030001015260208101905060026020826103000101526020810190506101405160208261030001015260208101905061016051602082610300010152602081019050806103005261030090508051602001806104608284600060045af161530057600080fd5b505060806105e0610460516104806000737a250d5630b4cf539739df2c5dacb4c659f2488d5af161533057600080fd5b60803d808211156153415780615343565b815b905090506105c0526105c08051602001806101e08284600060045af161536857600080fd5b505060606020602082066103a0016101e051828401111561538857600080fd5b6080806103c0826020602088068803016101e001600060045af15050818152809050905090508060200151600082518060209013156153c657600080fd5b80919012156153d457600080fd5b806020036101000a82049050905090506102a0526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a051610140516102c052737a250d5630b4cf539739df2c5dacb4c659f2488d6102e052600061030052610300516102e0516102c05160065801613e13565b6102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405260005060006102a0511115156154d9576308c379a06102c05260206102e0526014610300527f4572726f72205377617070696e6720546f6b656e000000000000000000000000610320526103005060646102dcfd5b6102a0516000526000516101c051565b6101c0526101405261016052610180526101a05261014051610160516103e5808202821582848304141761551c57600080fd5b809050905090506103e8808204905090506c01000000000000000000000000808202821582848304141761554f57600080fd5b8090509050905061018051808061556557600080fd5b82049050905081818301101561557a57600080fd5b808201905090506101a0516103e5808202821582848304141761559c57600080fd5b809050905090506103e880820490509050808210156155ba57600080fd5b808203905090506101e0526101405161016051610180516101a0516101c0516101e0516101e0516101e05180820282158284830414176155f957600080fd5b80905090509050600461014051808202821582848304141761561a57600080fd5b809050905090506101a051808202821582848304141761563957600080fd5b809050905090506103e5808202821582848304141761565757600080fd5b809050905090506103e88082049050905081818301101561567757600080fd5b80820190509050610200526102005160065801613cd1565b610260526101e0526101c0526101a052610180526101605261014052610260516101e051808210156156c057600080fd5b808203905090506103e880820282158284830414176156de57600080fd5b809050905090506107ca808204905090506000526000516101c051565b610160526101405260206102006004630dfe16816101a0526101bc610140515afa61572557600080fd5b601f3d1161573257600080fd5b60005061020051610180526020610220600463d21220a76101c0526101dc610140515afa61575f57600080fd5b601f3d1161576c57600080fd5b600050610220516101a0526102006101805181526101a0518160200152506040610240525b6000610240511115156157a3576157bf565b6020610240510361020001516020610240510361024052615791565b61016051565b61018052610140526101605260a0366101a03760606102a06004630902f1ac6102405261025c610160515afa6157fa57600080fd5b605f3d1161580757600080fd5b6102a080808080516103005250506020810190508080805161032052505060208101905080808051610340525050505060005061030080516101a05280602001516101c052806040015161022052506101405161016051610180516101a0516101c0516101e0516102005161022051610160516102405261024051600658016156fb565b6102a0526102c05261022052610200526101e0526101c0526101a0526101805261016052610140526102a080808080516102e05250506020810190508080805161030052505050506102e080516101e05280602001516102005250610140516101e0511415615908576101a0516000526000516101805156615918565b6101c05160005260005161018051565b005b6101a0526101405261016052610180526020610280604463e6a439056101e052610140516102005261016051610220526101fc735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f5afa61596d57600080fd5b601f3d1161597a57600080fd5b600050610280516101c05260206102a0604463e6a43905610200526101405161022052610180516102405261021c735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f5afa6159c857600080fd5b601f3d116159d557600080fd5b6000506102a0516101e0526101405161016051610180516101a0516101c0516101e0516102005161014051610220526101c051610240526102405161022051600658016157c5565b6102a052610200526101e0526101c0526101a0526101805261016052610140526102a051610200526101405161016051610180516101a0516101c0516101e051610200516102205161014051610240526101e051610260526102605161024051600658016157c5565b6102c05261022052610200526101e0526101c0526101a0526101805261016052610140526102c0516102205261022051610200511115615ad457610160516000526000516101a05156615ae4565b610180516000526000516101a051565b005b6101a052610140526101605261018052610180516101605180821015615b0b57600080fd5b808203905090506c010000000000000000000000008082028215828483041417615b3457600080fd5b80905090509050610180518080615b4a57600080fd5b8204905090506c010000000000000000000000008082028215828483041417615b7257600080fd5b80905090509050610160518080615b8857600080fd5b8204905090506c010000000000000000000000008082028215828483041417615bb057600080fd5b80905090509050610160516101405180821015615bcc57600080fd5b808203905090508080615bde57600080fd5b8204905090506101c052740100000000000000000000000000000000000000006101c0511115615c2e57740100000000000000000000000000000000000000006000526000516101a05156615c3e565b6101c0516000526000516101a051565b005b610030615c7003610030600039610030615c70036000f3

Deployed Bytecode

0x600436101561000d57613c6d565b600035601c5260005163f1ea417c81141561096d576004541561002f57600080fd5b6001600455600054151515610083576308c379a0610140526020610160526006610180527f50617573656400000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6044356024351015156100d5576308c379a061014052602061016052600f610180527f556e736f7274656420746f6b656e7300000000000000000000000000000000006101a05261018050606461015cfd5b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260243514156104fd5760c43534111561012f5760006000600060003460c4358082101561011657600080fd5b80820390509050336000f161012a57600080fd5b61017f565b60c4353414151561017f576308c379a061014052602061016052600e610180527f457468206e6f7420656e6f7567680000000000000000000000000000000000006101a05261018050606461015cfd5b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc23b61019e57600080fd5b60006000600463d0e30db06101405261015c60c43573c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af16101d357600080fd5b604435610140523361016052306101805260e4356101a0526101a05161018051610160516101405160065801614147565b600050606036610140376101405161016051610180516004356101a052336101c0526101e0602480358252806020013582602001528060400135826040015280606001358260600152806080013582608001528060a001358260a001528060c001358260c001528060e001358260e00152806101000135826101000152806101200135826101200152806101400135826101400152505061032051610300516102e0516102c0516102a05161028051610260516102405161022051610200516101e0516101c0516101a051600658016142fc565b610380526103a0526103c05261018052610160526101405261038080808080516103e0525050602081019050808080516104005250506020810190508080805161042052505050506103e08051610140528060200151610160528060400151610180525060c435610140518082101561035057600080fd5b808203905090506101405260e435610160518082101561036f57600080fd5b808203905090506101605260006101405111156104515773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc23b6103a557600080fd5b600060006024632e1a7d4d6101a052610140516101c0526101bc600073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af16103e157600080fd5b600060006000600061014051336000f16103fa57600080fd5b6101405161016051610180516024356101a05273c36442b4a4522e871399cd717abdd847ab11fe886101c05260006101e0526101e0516101c0516101a05160065801613e13565b6101805261016052610140526000505b60006101605111156104f8576101405161016051610180516044356101a052336101c052610160516101e0526101e0516101c0516101a05160065801613fad565b6101805261016052610140526000506101405161016051610180516044356101a05273c36442b4a4522e871399cd717abdd847ab11fe886101c05260006101e0526101e0516101c0516101a05160065801613e13565b6101805261016052610140526000505b610966565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2604435141515610561576308c379a061014052602061016052600c610180527f4e6f7420457468205061697200000000000000000000000000000000000000006101a05261018050606461015cfd5b60e43534111561059d5760006000600060003460e4358082101561058457600080fd5b80820390509050336000f161059857600080fd5b6105ed565b60e435341415156105ed576308c379a061014052602061016052600e610180527f457468206e6f7420656e6f7567680000000000000000000000000000000000006101a05261018050606461015cfd5b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc23b61060c57600080fd5b60006000600463d0e30db06101405261015c60e43573c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af161064157600080fd5b602435610140523361016052306101805260c4356101a0526101a05161018051610160516101405160065801614147565b600050606036610140376101405161016051610180516004356101a052336101c0526101e0602480358252806020013582602001528060400135826040015280606001358260600152806080013582608001528060a001358260a001528060c001358260c001528060e001358260e00152806101000135826101000152806101200135826101200152806101400135826101400152505061032051610300516102e0516102c0516102a05161028051610260516102405161022051610200516101e0516101c0516101a051600658016142fc565b610380526103a0526103c05261018052610160526101405261038080808080516103e0525050602081019050808080516104005250506020810190508080805161042052505050506103e08051610140528060200151610160528060400151610180525060c43561014051808210156107be57600080fd5b808203905090506101405260e43561016051808210156107dd57600080fd5b8082039050905061016052600061014051111561088f576101405161016051610180516024356101a052336101c052610140516101e0526101e0516101c0516101a05160065801613fad565b6101805261016052610140526000506101405161016051610180516024356101a05273c36442b4a4522e871399cd717abdd847ab11fe886101c05260006101e0526101e0516101c0516101a05160065801613e13565b6101805261016052610140526000505b60006101605111156109665773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc23b6108ba57600080fd5b600060006024632e1a7d4d6101a052610160516101c0526101bc600073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af16108f657600080fd5b600060006000600061016051336000f161090f57600080fd5b6101405161016051610180516044356101a05273c36442b4a4522e871399cd717abdd847ab11fe886101c05260006101e0526101e0516101c0516101a05160065801613e13565b6101805261016052610140526000505b6000600455005b63e9b723ee811415611ef9576004541561098657600080fd5b60016004556000600435141515156109dd576308c379a061014052602061016052600e610180527f57726f6e6720546f6b656e2049440000000000000000000000000000000000006101a05261018050606461015cfd5b6003546101405261014051341115610a22576000600060006000346101405180821015610a0957600080fd5b80820390509050336000f1610a1d57600080fd5b610a73565b6101405134141515610a73576308c379a06101605260206101805260106101a0527f496e73756666696369656e7420666565000000000000000000000000000000006101c0526101a050606461017cfd5b6000600060006000610140516002546000f1610a8e57600080fd5b73c36442b4a4522e871399cd717abdd847ab11fe883b610aad57600080fd5b6000600060646323b872dd610160523361018052306101a0526004356101c05261017c600073c36442b4a4522e871399cd717abdd847ab11fe885af1610af257600080fd5b60006004610320527f99fbab88000000000000000000000000000000000000000000000000000000006103405261032060048060208461038001018260208501600060045af1505080518201915050600435602082610380010152602081019050806103805261038090508051602001806104008284600060045af1610b7757600080fd5b50506101806104a06104005161042073c36442b4a4522e871399cd717abdd847ab11fe885afa610ba657600080fd5b6101803d80821115610bb85780610bba565b815b90509050610480526104808051602001806101608284600060045af1610bdf57600080fd5b5050604060206020820661052001610160518284011115610bff57600080fd5b610180806105408260206020880688030161016001600060045af1505081815280905090509050806020015160008251806020901315610c3e57600080fd5b8091901215610c4c57600080fd5b806020036101000a82049050905090508060a01c15610c6a57600080fd5b80905061032052606060206020820661054001610160518284011115610c8f57600080fd5b610180806105608260206020880688030161016001600060045af1505081815280905090509050806020015160008251806020901315610cce57600080fd5b8091901215610cdc57600080fd5b806020036101000a82049050905090508060a01c15610cfa57600080fd5b8090506103405260e060206020820661056001610160518284011115610d1f57600080fd5b610180806105808260206020880688030161016001600060045af1505081815280905090509050806020015160008251806020901315610d5e57600080fd5b8091901215610d6c57600080fd5b806020036101000a82049050905090506103605260006004610400527f0c49ccbe000000000000000000000000000000000000000000000000000000006104205261040060048060208461046001018260208501600060045af1505080518201915050600435602082610460010152602081019050610360516020826104600101526020810190506000602082610460010152602081019050600060208261046001015260208101905060a435602082610460010152602081019050806104605261046090508051602001806105608284600060045af1610e4c57600080fd5b5050604061068061056051610580600073c36442b4a4522e871399cd717abdd847ab11fe885af1610e7c57600080fd5b60403d80821115610e8d5780610e8f565b815b90509050610660526106608051602001806103808284600060045af1610eb457600080fd5b505060006004610400527ffc6f7865000000000000000000000000000000000000000000000000000000006104205261040060048060208461046001018260208501600060045af1505080518201915050600435602082610460010152602081019050306020826104600101526020810190506fffffffffffffffffffffffffffffffff6020826104600101526020810190506fffffffffffffffffffffffffffffffff602082610460010152602081019050806104605261046090508051602001806105408284600060045af1610f8b57600080fd5b5050604061064061054051610560600073c36442b4a4522e871399cd717abdd847ab11fe885af1610fbb57600080fd5b60403d80821115610fcc5780610fce565b815b90509050610620526106208051602001806103808284600060045af1610ff357600080fd5b505060006020602082066104c00161038051828401111561101357600080fd5b6040806104e08260206020880688030161038001600060045af150508181528090509050905080602001516000825180602090131561105157600080fd5b809190121561105f57600080fd5b806020036101000a82049050905090506104005260206020602082066104e00161038051828401111561109157600080fd5b6040806105008260206020880688030161038001600060045af15050818152809050905090508060200151600082518060209013156110cf57600080fd5b80919012156110dd57600080fd5b806020036101000a82049050905090506104205273c36442b4a4522e871399cd717abdd847ab11fe883b61111057600080fd5b6000600060246342966c68610440526004356104605261045c600073c36442b4a4522e871399cd717abdd847ab11fe885af161114b57600080fd5b600061044052600060046104c0527f1698ee82000000000000000000000000000000000000000000000000000000006104e0526104c060048060208461052001018260208501600060045af15050805182019150506103205160208261052001015260208101905061034051602082610520010152602081019050602435602082610520010152602081019050806105205261052090508051602001806105e08284600060045af16111fc57600080fd5b505060206106c06105e051610600731f98431c8ad98523631ae4a59f267346ea31f9845afa61122a57600080fd5b60203d8082111561123b578061123d565b815b905090506106a0526106a08051602001806104608284600060045af161126257600080fd5b5050610480518060a01c1561127657600080fd5b8090506104c0526104c05115156113ae576c010000000000000000000000006101406104e0525b6104e0515160206104e051016104e0526104e06104e05110156112bf5761129d565b61040051610500526105005160065801613cd1565b610560526104c06104e0525b6104e0515260206104e051036104e0526101406104e051101515611303576112e0565b61056051808202821582848304141761131b57600080fd5b80905090509050610140610580525b6105805151602061058051016105805261058061058051101561134c5761132a565b610420516105a0526105a05160065801613cd1565b61060052610560610580525b61058051526020610580510361058052610140610580511015156113905761136d565b61060051808061139f57600080fd5b820490509050610440526115f8565b6004610600527f3850c7bd00000000000000000000000000000000000000000000000000000000610620526106008051602001806106608284600060045af16113f657600080fd5b505060e06106e0610660516106806104c0515afa61141357600080fd5b60e03d808211156114245780611426565b815b905090506106c0526106c08051602001806104e08284600060045af161144b57600080fd5b50506000602060208206610740016104e051828401111561146b57600080fd5b60e080610760826020602088068803016104e001600060045af15050818152809050905090508060200151600082518060209013156114a957600080fd5b80919012156114b757600080fd5b806020036101000a8204905090509050610440526104405115156115f8576c01000000000000000000000000610140610600525b6106005151602061060051016106005261060061060051101561150d576114eb565b61042051610620526106205160065801613cd1565b610680526105e0610600525b61060051526020610600510361060052610140610600511015156115515761152e565b61068051808202821582848304141761156957600080fd5b809050905090506101406106a0525b6106a0515160206106a051016106a0526106a06106a051101561159a57611578565b610420516106c0526106c05160065801613cd1565b610720526106806106a0525b6106a0515260206106a051036106a0526101406106a0511015156115de576115bb565b6107205180806115ed57600080fd5b820490509050610440525b600060046104e0527f13ead56200000000000000000000000000000000000000000000000000000000610500526104e060048060208461054001018260208501600060045af1505080518201915050610320516020826105400101526020810190506103405160208261054001015260208101905060243560208261054001015260208101905061044051602082610540010152602081019050806105405261054090508051602001806106208284600060045af16116b657600080fd5b5050602061072061062051610640600073c36442b4a4522e871399cd717abdd847ab11fe885af16116e657600080fd5b60203d808211156116f757806116f9565b815b90509050610700526107008051602001806104608284600060045af161171e57600080fd5b50506000610480518060a01c1561173457600080fd5b80905014151515611784576308c379a06104e052602061050052601a610520527f437265617465204f7220496e697420506f6f6c206661696c6564000000000000610540526105205060646104fcfd5b6101406104e0525b6104e0515160206104e051016104e0526104e06104e05110156117ae5761178c565b610320516105005273c36442b4a4522e871399cd717abdd847ab11fe8861052052610400516105405261054051610520516105005160065801613e13565b6104c06104e0525b6104e0515260206104e051036104e0526101406104e051101515611817576117f4565b6000506101406104e0525b6104e0515160206104e051016104e0526104e06104e051101561184457611822565b610340516105005273c36442b4a4522e871399cd717abdd847ab11fe8861052052610420516105405261054051610520516105005160065801613e13565b6104c06104e0525b6104e0515260206104e051036104e0526101406104e0511015156118ad5761188a565b600050600060046105a0527f88316456000000000000000000000000000000000000000000000000000000006105c0526105a060048060208461060001018260208501600060045af150508051820191505061032051602082610600010152602081019050610340516020826106000101526020810190506024356020826106000101526020810190506044356020826106000101526020810190506064356020826106000101526020810190506104005160208261060001015260208101905061042051602082610600010152602081019050600060208261060001015260208101905060006020826106000101526020810190503360208261060001015260208101905060a435602082610600010152602081019050806106005261060090508051602001806107c08284600060045af16119e957600080fd5b505060806109a06107c0516107e0600073c36442b4a4522e871399cd717abdd847ab11fe885af1611a1957600080fd5b60803d80821115611a2a5780611a2c565b815b90509050610980526109808051602001806104e08284600060045af1611a5157600080fd5b505060006020602082066106a0016104e0518284011115611a7157600080fd5b6080806106c0826020602088068803016104e001600060045af1505081815280905090509050806020015160008251806020901315611aaf57600080fd5b8091901215611abd57600080fd5b806020036101000a82049050905090506105a05260206020602082066106c0016104e0518284011115611aef57600080fd5b6080806106e0826020602088068803016104e001600060045af1505081815280905090509050806020015160008251806020901315611b2d57600080fd5b8091901215611b3b57600080fd5b806020036101000a82049050905090506105c05260406020602082066106e0016104e0518284011115611b6d57600080fd5b608080610700826020602088068803016104e001600060045af1505081815280905090509050806020015160008251806020901315611bab57600080fd5b8091901215611bb957600080fd5b806020036101000a82049050905090506105e0526060602060208206610700016104e0518284011115611beb57600080fd5b608080610720826020602088068803016104e001600060045af1505081815280905090509050806020015160008251806020901315611c2957600080fd5b8091901215611c3757600080fd5b806020036101000a8204905090509050610600526105e051610400511115611d8857610140610620525b61062051516020610620510161062052610620610620511015611c8357611c61565b61032051610640523361066052610400516105e05180821015611ca557600080fd5b808203905090506106805261068051610660516106405160065801613fad565b610600610620525b6106205152602061062051036106205261014061062051101515611cf057611ccd565b600050610140610620525b61062051516020610620510161062052610620610620511015611d1d57611cfb565b610320516106405273c36442b4a4522e871399cd717abdd847ab11fe886106605260006106805261068051610660516106405160065801613e13565b610600610620525b6106205152602061062051036106205261014061062051101515611d8457611d61565b6000505b61060051610420511115611ec557610140610620525b61062051516020610620510161062052610620610620511015611dc057611d9e565b61034051610640523361066052610420516106005180821015611de257600080fd5b808203905090506106805261068051610660516106405160065801613fad565b610600610620525b6106205152602061062051036106205261014061062051101515611e2d57611e0a565b600050610140610620525b61062051516020610620510161062052610620610620511015611e5a57611e38565b610340516106405273c36442b4a4522e871399cd717abdd847ab11fe886106605260006106805261068051610660516106405160065801613e13565b610600610620525b6106205152602061062051036106205261014061062051101515611ec157611e9e565b6000505b6105a0516004357f6820c77d3eecf3f60a3c9b5ca02dfa0810415527df890f06d8a29412f96b693060006000a36000600455005b63e4c4ad988114156132615760045415611f1257600080fd5b600160045560043560a01c15611f2757600080fd5b600054151515611f76576308c379a0610140526020610160526006610180527f50617573656400000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6000602435111515611fc7576308c379a0610140526020610160526014610180527f496e76616c696420696e70757420616d6f756e740000000000000000000000006101a05261018050606461015cfd5b6101406064358152608435816020015260a435816040015260c435816060015260e435816080015260008160a0015260008160c0015260008160e0015260008161010001526101643581610120015261018435816101400152506101605161014051101515612075576308c379a06102a05260206102c052600f6102e0527f556e736f7274656420746f6b656e730000000000000000000000000000000000610300526102e05060646102bcfd5b6003546102a0526102a05134101515156120ce576308c379a06102c05260206102e0526010610300527f496e73756666696369656e742066656500000000000000000000000000000000610320526103005060646102dcfd5b60006000600060006102a0516002546000f16120e957600080fd5b346102c0526102c080516102a0518082101561210457600080fd5b808203905090508152506004356102e0526000602036610300375060006103605273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26103805273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102e051141561216457600161216a565b6102e051155b1561227e576024356102c05111156121b15760006000600060006102c0516024358082101561219857600080fd5b80820390509050336000f16121ac57600080fd5b612205565b6024356102c05110151515612205576308c379a06103a05260206103c05260126103e0527f496e73756666696369656e742076616c75650000000000000000000000000000610400526103e05060646103bcfd5b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc23b61222457600080fd5b60006000600463d0e30db06103a0526103bc60243573c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af161225957600080fd5b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26102e052602435610360526124c2565b6101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610320516103405161036051610380516102e0516103a052336103c052306103e05260243561040052610400516103e0516103c0516103a05160065801614147565b61038052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405260005060006102c05111156123705760006000600060006102c051336000f161237057600080fd5b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26102e051141561239b57602435610360526124c2565b610140516102e05118156123b857610160516102e05114156123bb565b60005b156124b2576101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610320516103405161036051610380516102e0516103a05273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26103c0526024356103e0526102805161040052610400516103e0516103c0516103a05160065801615163565b6104605261038052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261046051610360526124c2565b6102e05161038052602435610360525b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc261014051181561252d5773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc261016051181561252557610140516102e051181561251d57610160516102e0511415612520565b60005b612528565b60005b612530565b60005b15612706576101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e051610300516103205161034051610360516103805173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26103a052610140516103c052610160516103e0526103e0516103c0516103a0516006580161591a565b6104405261038052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261044051610380526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e051610300516103205161034051610360516103805173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26103a052610380516103c052610360516103e0526102805161040052610400516103e0516103c0516103a05160065801615163565b6104605261038052610360526103405261032052610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261046051610360525b6060366103a03760206104c0604463e6a43905610420526101405161044052610160516104605261043c735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f5afa61275057600080fd5b601f3d1161275d57600080fd5b6000506104c05161040052600061042052610140516103805114156128075760606104a06004630902f1ac6104405261045c610400515afa61279e57600080fd5b605f3d116127ab57600080fd5b6104a080808080516105005250506020810190508080805161052052505060208101905080808051610540525050505060005061050080516103a05280602001516103c05280604001516103e05250610160516104205261288e565b60606104a06004630902f1ac6104405261045c610400515afa61282957600080fd5b605f3d1161283657600080fd5b6104a080808080516105005250506020810190508080805161052052505060208101905080808051610540525050505060005061050080516103c05280602001516103a05280604001516103e0525061014051610420525b60006104405260006004610460527f1698ee8200000000000000000000000000000000000000000000000000000000610480526104606004806020846104c001018260208501600060045af1505080518201915050610140516020826104c0010152602081019050610160516020826104c0010152602081019050610180516020826104c0010152602081019050806104c0526104c090508051602001806105808284600060045af161294057600080fd5b50506020610660610580516105a0731f98431c8ad98523631ae4a59f267346ea31f9845afa61296e57600080fd5b60203d8082111561297f5780612981565b815b90509050610640526106408051602001806103008284600060045af16129a657600080fd5b5050610320518060a01c156129ba57600080fd5b8090506104605260006104605114151515612a14576308c379a06104805260206104a05260136104c0527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006104e0526104c050606461049cfd5b60046105a0527f3850c7bd000000000000000000000000000000000000000000000000000000006105c0526105a08051602001806106008284600060045af1612a5c57600080fd5b505060e061068061060051610620610460515afa612a7957600080fd5b60e03d80821115612a8a5780612a8c565b815b90509050610660526106608051602001806104808284600060045af1612ab157600080fd5b505060006020602082066106e001610480518284011115612ad157600080fd5b60e0806107008260206020880688030161048001600060045af1505081815280905090509050806020015160008251806020901315612b0f57600080fd5b8091901215612b1d57600080fd5b806020036101000a82049050905090506104405260006104405114151515612b84576308c379a06105a05260206105c05260196105e0527f506f6f6c20646f6573206e6f7420696e697469616c697a656400000000000000610600526105e05060646105bcfd5b6040366105a0376101043561044051111515612bb65761042051610380511115612bb157610360516105c0525b612de2565b6101243561044051101515612be15761042051610380511015612bdc57610360516105c0525b612de2565b610140610600525b61060051516020610600510161060052610600610600511015612c0b57612be9565b61010435610620526104405161064052610124356106605261066051610640516106205160065801615ae6565b6106c0526105e0610600525b6106005152602061060051036106005261014061060051101515612c6757612c44565b6106c0516105e05261042051610380511115612d1c57610140610600525b61060051516020610600510161060052610600610600511015612ca757612c85565b6103a051610620526103c051610640526105e05161066052610360516106805261068051610660516106405161062051600658016154e9565b6106e0526105e0610600525b6106005152602061060051036106005261014061060051101515612d0f57612cec565b6106e0516105c052612de2565b610140610600525b61060051516020610600510161060052610600610600511015612d4657612d24565b6103a051610620526103c0516106405278010000000000000000000000000000000000000000000000006105e0518080612d7f57600080fd5b82049050905061066052610360516106805261068051610660516106405161062051600658016154e9565b6106e0526105e0610600525b6106005152602061060051036106005261014061060051101515612dd957612db6565b6106e0516105c0525b610360516105c0511115612df957610360516105c0525b60006105c0511115612ea0576101406105e0525b6105e0515160206105e051016105e0526105e06105e0511015612e2f57612e0d565b610380516106005261042051610620526105c0516106405261028051610660526106605161064051610620516106005160065801615163565b6106c0526105c06105e0525b6105e0515260206105e051036105e0526101406105e051101515612e9757612e74565b6106c0516105a0525b61038051610140511415612edb57610360516105c05180821015612ec357600080fd5b808203905090506101e0526105a05161020052612f04565b610360516105c05180821015612ef057600080fd5b80820390509050610200526105a0516101e0525b6060366105e037610140610640525b61064051516020610640510161064052610640610640511015612f3557612f13565b6044356106605233610680526106a061014080518252806020015182602001528060400151826040015280606001518260600152806080015182608001528060a001518260a001528060c001518260c001528060e001518260e0015280610100015182610100015280610120015182610120015280610140015182610140015250506104405161080052610800516107e0516107c0516107a05161078051610760516107405161072051610700516106e0516106c0516106a05161068051610660516006580161434a565b61086052610880526108a052610620610640525b610640515260206106405103610640526101406106405110151561303757613014565b61086080808080516108c0525050602081019050808080516108e05250506020810190508080805161090052505050506108c080516105e052806020015161060052806040015161062052506101443561062051101515156130d8576308c379a061064052602061066052600d610680527f4869676820536c697070616765000000000000000000000000000000000000006106a05261068050606461065cfd5b6101e0516105e051808210156130ed57600080fd5b808203905090506105e05261020051610600518082101561310d57600080fd5b808203905090506106005260006105e05111156131b957610140610640525b6106405151602061064051016106405261064061064051101561314e5761312c565b610140516106605273c36442b4a4522e871399cd717abdd847ab11fe886106805260006106a0526106a051610680516106605160065801613e13565b610620610640525b61064051526020610640510361064052610140610640511015156131b557613192565b6000505b600061060051111561325a57610140610640525b610640515160206106405101610640526106406106405110156131ef576131cd565b610160516106605273c36442b4a4522e871399cd717abdd847ab11fe886106805260006106a0526106a051610680516106605160065801613e13565b610620610640525b610640515260206106405103610640526101406106405110151561325657613233565b6000505b6000600455005b63dd2bb8e181141561365b576004541561327a57600080fd5b6001600455341561328a57600080fd5b6000541515156132d9576308c379a0610140526020610160526006610180527f50617573656400000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b60443560243510151561332b576308c379a061014052602061016052600f610180527f556e736f7274656420746f6b656e7300000000000000000000000000000000006101a05261018050606461015cfd5b602435610140523361016052306101805260c4356101a0526101a05161018051610160516101405160065801614147565b600050604435610140523361016052306101805260e4356101a0526101a05161018051610160516101405160065801614147565b600050606036610140376101405161016051610180516004356101a052336101c0526101e0602480358252806020013582602001528060400135826040015280606001358260600152806080013582608001528060a001358260a001528060c001358260c001528060e001358260e00152806101000135826101000152806101200135826101200152806101400135826101400152505061032051610300516102e0516102c0516102a05161028051610260516102405161022051610200516101e0516101c0516101a051600658016142fc565b610380526103a0526103c05261018052610160526101405261038080808080516103e0525050602081019050808080516104005250506020810190508080805161042052505050506103e08051610140528060200151610160528060400151610180525060c43561014051808210156134dc57600080fd5b808203905090506101405260e43561016051808210156134fb57600080fd5b808203905090506101605260006101405111156135ad576101405161016051610180516024356101a052336101c052610140516101e0526101e0516101c0516101a05160065801613fad565b6101805261016052610140526000506101405161016051610180516024356101a05273c36442b4a4522e871399cd717abdd847ab11fe886101c05260006101e0526101e0516101c0516101a05160065801613e13565b6101805261016052610140526000505b6000610160511115613654576101405161016051610180516044356101a052336101c052610160516101e0526101e0516101c0516101a05160065801613fad565b6101805261016052610140526000506101405161016051610180516044356101a05273c36442b4a4522e871399cd717abdd847ab11fe886101c05260006101e0526101e0516101c0516101a05160065801613e13565b6101805261016052610140526000505b6000600455005b6302329a2981141561370857341561367257600080fd5b60043560011c1561368257600080fd5b600154331415156136d2576308c379a0610140526020610160526009610180527f4e6f742061646d696e00000000000000000000000000000000000000000000006101a05261018050606461015cfd5b600435600055600435610140527f0e2fb031ee032dc02d8011dc50b816eb450cf856abd8261680dac74f72165bd26020610140a1005b63a6ba31c181141561378757341561371f57600080fd5b60043560a01c1561372f57600080fd5b6001543314151561377f576308c379a0610140526020610160526009610180527f4e6f742061646d696e00000000000000000000000000000000000000000000006101a05261018050606461015cfd5b600435600155005b63361bc0ca81141561382457341561379e57600080fd5b600154331415156137ee576308c379a0610140526020610160526009610180527f4e6f742061646d696e00000000000000000000000000000000000000000000006101a05261018050606461015cfd5b600435600355600435610140527f6bbc57480a46553fa4d156ce702beef5f3ad66303b0ed1a5d4cb44966c6584c36020610140a1005b63775507568114156138a357341561383b57600080fd5b60043560a01c1561384b57600080fd5b6001543314151561389b576308c379a0610140526020610160526009610180527f4e6f742061646d696e00000000000000000000000000000000000000000000006101a05261018050606461015cfd5b600435600255005b63f42ce21c811415613ac957600454156138bc57600080fd5b600160045534156138cc57600080fd5b6000610120525b610120516004013560a01c156138e857600080fd5b6020610120510161012052610100610120511015613905576138d3565b6000610120525b61012051610204013560a01c1561392257600080fd5b602061012051016101205261010061012051101561393f5761390c565b6001543314151561398f576308c379a0610140526020610160526009610180527f4e6f742061646d696e00000000000000000000000000000000000000000000006101a05261018050606461015cfd5b61014060006008818352015b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee600461014051600881106139c357600080fd5b60200201351415613a1957600060006000600061010461014051600881106139ea57600080fd5b60200201356102046101405160088110613a0357600080fd5b60200201356000f1613a1457600080fd5b613ab0565b600060046101405160088110613a2e57600080fd5b60200201351815613ab0576101405160046101405160088110613a5057600080fd5b6020020135610160526102046101405160088110613a6d57600080fd5b6020020135610180526101046101405160088110613a8a57600080fd5b60200201356101a0526101a051610180516101605160065801613fad565b610140526000505b815160010180835281141561399b575b50506000600455005b6369328dec811415613bdf5760045415613ae257600080fd5b60016004553415613af257600080fd5b60043560a01c15613b0257600080fd5b60443560a01c15613b1257600080fd5b60015433141515613b62576308c379a0610140526020610160526009610180527f4e6f742061646d696e00000000000000000000000000000000000000000000006101a05261018050606461015cfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6004351415613b9f5760006000600060006024356044356000f1613b9a57600080fd5b613bd8565b60006004351815613bd85760043561014052604435610160526024356101805261018051610160516101405160065801613fad565b6000505b6000600455005b635c975abb811415613c02573415613bf657600080fd5b60005460005260206000f35b63f851a440811415613c25573415613c1957600080fd5b60015460005260206000f35b6341275358811415613c48573415613c3c57600080fd5b60025460005260206000f35b6369e15404811415613c6b573415613c5f57600080fd5b60035460005260206000f35b505b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc233141515613ccf576308c379a0610140526020610160526011610180527f63616e27742072656365697665204574680000000000000000000000000000006101a05261018050606461015cfd5b005b61016052610140526003610140511115613de757610140516001818183011015613cfa57600080fd5b8082019050905060028082049050905061018052610140516101a0526101c06000610100818352015b610180516101a0511415613d43576101a051600052505060005161016051565b610180516101a05261014051610180518080613d5e57600080fd5b82049050905061018051818183011015613d7757600080fd5b80820190509050600280820490509050610180525b8151600101808352811415613d23575b50506308c379a06101c05260206101e0526010610200527f446964206e6f7420636f76657261676500000000000000000000000000000000610220526102005060646101dcfd613e11565b610140511515613e035760006000526000516101605156613e11565b600160005260005161016051565b005b6101a05261014052610160526101805260006004610220527f095ea7b3000000000000000000000000000000000000000000000000000000006102405261022060048060208461028001018260208501600060045af15050805182019150506101605160208261028001015260208101905061018051602082610280010152602081019050806102805261028090508051602001806103208284600060045af1613ebc57600080fd5b505060206103e0610320516103406000610140515af1613edb57600080fd5b60203d80821115613eec5780613eee565b815b905090506103c0526103c08051602001806101c08284600060045af1613f1357600080fd5b505060006101c0511115613fa7576101c0806020015160008251806020901315613f3c57600080fd5b8091901215613f4a57600080fd5b806020036101000a820490509050905015151515613fa7576308c379a061022052602061024052600e610260527f417070726f7665206661696c65640000000000000000000000000000000000006102805261026050606461023cfd5b6101a051565b6101a05261014052610160526101805260006004610220527fa9059cbb000000000000000000000000000000000000000000000000000000006102405261022060048060208461028001018260208501600060045af15050805182019150506101605160208261028001015260208101905061018051602082610280010152602081019050806102805261028090508051602001806103208284600060045af161405657600080fd5b505060206103e0610320516103406000610140515af161407557600080fd5b60203d808211156140865780614088565b815b905090506103c0526103c08051602001806101c08284600060045af16140ad57600080fd5b505060006101c0511115614141576101c08060200151600082518060209013156140d657600080fd5b80919012156140e457600080fd5b806020036101000a820490509050905015151515614141576308c379a061022052602061024052600f610260527f5472616e73666572206661696c656400000000000000000000000000000000006102805261026050606461023cfd5b6101a051565b6101c0526101405261016052610180526101a05260006004610240527f23b872dd00000000000000000000000000000000000000000000000000000000610260526102406004806020846102a001018260208501600060045af1505080518201915050610160516020826102a0010152602081019050610180516020826102a00101526020810190506101a0516020826102a0010152602081019050806102a0526102a090508051602001806103608284600060045af161420757600080fd5b50506020610440610360516103806000610140515af161422657600080fd5b60203d808211156142375780614239565b815b90509050610420526104208051602001806101e08284600060045af161425e57600080fd5b505060006101e05111156142f2576101e080602001516000825180602090131561428757600080fd5b809190121561429557600080fd5b806020036101000a8204905090509050151515156142f2576308c379a0610240526020610260526013610280527f5472616e7366657246726f6d206661696c6564000000000000000000000000006102a05261028050606461025cfd5b6101c05156614342575b6103005260006102e0526101405261016052610180526101a0526101c0526101e05261020052610220526102405261026052610280526102a0526102c05260005061438e565b60001561438e575b610300526101405261016052610180526101a0526101c0526101e05261020052610220526102405261026052610280526102a0526102c0526102e05260005061438e565b6101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610180516103205273c36442b4a4522e871399cd717abdd847ab11fe8861034052610220516103605261036051610340516103205160065801613e13565b610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526000506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e051610300516101a0516103205273c36442b4a4522e871399cd717abdd847ab11fe8861034052610240516103605261036051610340516103205160065801613e13565b610300526102e0526102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052600050610140511515614def576102e05161032052600060203661034037506103205115156148165760006004610480527f1698ee82000000000000000000000000000000000000000000000000000000006104a0526104806004806020846104e001018260208501600060045af1505080518201915050610180516020826104e00101526020810190506101a0516020826104e00101526020810190506101c0516020826104e0010152602081019050806104e0526104e090508051602001806105a08284600060045af16145d257600080fd5b505060206106806105a0516105c0731f98431c8ad98523631ae4a59f267346ea31f9845afa61460057600080fd5b60203d808211156146115780614613565b815b90509050610660526106608051602001806103408284600060045af161463857600080fd5b5050610360518060a01c1561464c57600080fd5b8090506103a05260006103a051141515156146a6576308c379a06104805260206104a05260136104c0527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006104e0526104c050606461049cfd5b60046105a0527f3850c7bd000000000000000000000000000000000000000000000000000000006105c0526105a08051602001806106008284600060045af16146ee57600080fd5b505060e0610680610600516106206103a0515afa61470b57600080fd5b60e03d8082111561471c578061471e565b815b90509050610660526106608051602001806104808284600060045af161474357600080fd5b505060006020602082066106e00161048051828401111561476357600080fd5b60e0806107008260206020880688030161048001600060045af15050818152809050905090508060200151600082518060209013156147a157600080fd5b80919012156147af57600080fd5b806020036101000a82049050905090506103205260006103205114151515614816576308c379a06105a05260206105c05260196105e0527f506f6f6c20646f6573206e6f7420696e697469616c697a656400000000000000610600526105e05060646105bcfd5b60006004610480527f13ead562000000000000000000000000000000000000000000000000000000006104a0526104806004806020846104e001018260208501600060045af1505080518201915050610180516020826104e00101526020810190506101a0516020826104e00101526020810190506101c0516020826104e0010152602081019050610320516020826104e0010152602081019050806104e0526104e090508051602001806105c08284600060045af16148d557600080fd5b505060206106c06105c0516105e0600073c36442b4a4522e871399cd717abdd847ab11fe885af161490557600080fd5b60203d808211156149165780614918565b815b905090506106a0526106a08051602001806103408284600060045af161493d57600080fd5b50506000610360518060a01c1561495357600080fd5b809050141515156149a3576308c379a06104805260206104a052601a6104c0527f437265617465204f7220496e697420506f6f6c206661696c65640000000000006104e0526104c050606461049cfd5b60006004610540527f8831645600000000000000000000000000000000000000000000000000000000610560526105406004806020846105a001018260208501600060045af1505080518201915050610180516020826105a00101526020810190506101a0516020826105a00101526020810190506101c0516020826105a00101526020810190506101e0516020826105a0010152602081019050610200516020826105a0010152602081019050610220516020826105a0010152602081019050610240516020826105a0010152602081019050610260516020826105a0010152602081019050610280516020826105a00101526020810190506102a0516020826105a00101526020810190506102c0516020826105a0010152602081019050806105a0526105a090508051602001806107608284600060045af1614ae757600080fd5b5050608061094061076051610780600073c36442b4a4522e871399cd717abdd847ab11fe885af1614b1757600080fd5b60803d80821115614b285780614b2a565b815b90509050610920526109208051602001806104808284600060045af1614b4f57600080fd5b5050600060206020820661062001610480518284011115614b6f57600080fd5b6080806106408260206020880688030161048001600060045af1505081815280905090509050806020015160008251806020901315614bad57600080fd5b8091901215614bbb57600080fd5b806020036101000a82049050905090506103a052602060206020820661062001610480518284011115614bed57600080fd5b6080806106408260206020880688030161048001600060045af1505081815280905090509050806020015160008251806020901315614c2b57600080fd5b8091901215614c3957600080fd5b806020036101000a82049050905090506103c052604060206020820661062001610480518284011115614c6b57600080fd5b6080806106408260206020880688030161048001600060045af1505081815280905090509050806020015160008251806020901315614ca957600080fd5b8091901215614cb757600080fd5b806020036101000a82049050905090506103e052606060206020820661062001610480518284011115614ce957600080fd5b6080806106408260206020880688030161048001600060045af1505081815280905090509050806020015160008251806020901315614d2757600080fd5b8091901215614d3557600080fd5b806020036101000a8204905090509050610400526103c051610540526103e0516105605261040051610580526101a051610180516103a0517f8608f0d1a9f263ba6515609d93d7510949b8477690ce655f3b813420049d3d846060610540a46105a06103e05181526104005181602001526103c0518160400152506060610600525b600061060051111515614dc957614de5565b602061060051036105a001516020610600510361060052614db7565b6103005156615161565b6060366103203760006004610420527f219f5d17000000000000000000000000000000000000000000000000000000006104405261042060048060208461048001018260208501600060045af150508051820191505061014051602082610480010152602081019050610220516020826104800101526020810190506102405160208261048001015260208101905061026051602082610480010152602081019050610280516020826104800101526020810190506102c051602082610480010152602081019050806104805261048090508051602001806105a08284600060045af1614edb57600080fd5b505060606106e06105a0516105c0600073c36442b4a4522e871399cd717abdd847ab11fe885af1614f0b57600080fd5b60603d80821115614f1c5780614f1e565b815b905090506106c0526106c08051602001806103808284600060045af1614f4357600080fd5b505060006020602082066104e001610380518284011115614f6357600080fd5b6060806105008260206020880688030161038001600060045af1505081815280905090509050806020015160008251806020901315614fa157600080fd5b8091901215614faf57600080fd5b806020036101000a82049050905090506103205260206020602082066104e001610380518284011115614fe157600080fd5b6060806105008260206020880688030161038001600060045af150508181528090509050905080602001516000825180602090131561501f57600080fd5b809190121561502d57600080fd5b806020036101000a82049050905090506103405260406020602082066104e00161038051828401111561505f57600080fd5b6060806105008260206020880688030161038001600060045af150508181528090509050905080602001516000825180602090131561509d57600080fd5b80919012156150ab57600080fd5b806020036101000a8204905090509050610360526103205161042052610340516104405261036051610460526101a05161018051610140517f8608f0d1a9f263ba6515609d93d7510949b8477690ce655f3b813420049d3d846060610420a46104806103405181526103605181602001526103205181604001525060606104e0525b60006104e05111151561513f5761515b565b60206104e05103610480015160206104e051036104e05261512d565b61030051565b005b6101c0526101405261016052610180526101a0526101605161014051141561519557610180516000526000516101c051565b6101405161016051610180516101a0516101c051610140516101e052737a250d5630b4cf539739df2c5dacb4c659f2488d61020052610180516102205261022051610200516101e05160065801613e13565b6101c0526101a052610180526101605261014052600050600060046102a0527f38ed1739000000000000000000000000000000000000000000000000000000006102c0526102a060048060208461030001018260208501600060045af150508051820191505061018051602082610300010152602081019050600060208261030001015260208101905060a0602082610300010152602081019050306020826103000101526020810190506101a05160208261030001015260208101905060026020826103000101526020810190506101405160208261030001015260208101905061016051602082610300010152602081019050806103005261030090508051602001806104608284600060045af161530057600080fd5b505060806105e0610460516104806000737a250d5630b4cf539739df2c5dacb4c659f2488d5af161533057600080fd5b60803d808211156153415780615343565b815b905090506105c0526105c08051602001806101e08284600060045af161536857600080fd5b505060606020602082066103a0016101e051828401111561538857600080fd5b6080806103c0826020602088068803016101e001600060045af15050818152809050905090508060200151600082518060209013156153c657600080fd5b80919012156153d457600080fd5b806020036101000a82049050905090506102a0526101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a051610140516102c052737a250d5630b4cf539739df2c5dacb4c659f2488d6102e052600061030052610300516102e0516102c05160065801613e13565b6102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405260005060006102a0511115156154d9576308c379a06102c05260206102e0526014610300527f4572726f72205377617070696e6720546f6b656e000000000000000000000000610320526103005060646102dcfd5b6102a0516000526000516101c051565b6101c0526101405261016052610180526101a05261014051610160516103e5808202821582848304141761551c57600080fd5b809050905090506103e8808204905090506c01000000000000000000000000808202821582848304141761554f57600080fd5b8090509050905061018051808061556557600080fd5b82049050905081818301101561557a57600080fd5b808201905090506101a0516103e5808202821582848304141761559c57600080fd5b809050905090506103e880820490509050808210156155ba57600080fd5b808203905090506101e0526101405161016051610180516101a0516101c0516101e0516101e0516101e05180820282158284830414176155f957600080fd5b80905090509050600461014051808202821582848304141761561a57600080fd5b809050905090506101a051808202821582848304141761563957600080fd5b809050905090506103e5808202821582848304141761565757600080fd5b809050905090506103e88082049050905081818301101561567757600080fd5b80820190509050610200526102005160065801613cd1565b610260526101e0526101c0526101a052610180526101605261014052610260516101e051808210156156c057600080fd5b808203905090506103e880820282158284830414176156de57600080fd5b809050905090506107ca808204905090506000526000516101c051565b610160526101405260206102006004630dfe16816101a0526101bc610140515afa61572557600080fd5b601f3d1161573257600080fd5b60005061020051610180526020610220600463d21220a76101c0526101dc610140515afa61575f57600080fd5b601f3d1161576c57600080fd5b600050610220516101a0526102006101805181526101a0518160200152506040610240525b6000610240511115156157a3576157bf565b6020610240510361020001516020610240510361024052615791565b61016051565b61018052610140526101605260a0366101a03760606102a06004630902f1ac6102405261025c610160515afa6157fa57600080fd5b605f3d1161580757600080fd5b6102a080808080516103005250506020810190508080805161032052505060208101905080808051610340525050505060005061030080516101a05280602001516101c052806040015161022052506101405161016051610180516101a0516101c0516101e0516102005161022051610160516102405261024051600658016156fb565b6102a0526102c05261022052610200526101e0526101c0526101a0526101805261016052610140526102a080808080516102e05250506020810190508080805161030052505050506102e080516101e05280602001516102005250610140516101e0511415615908576101a0516000526000516101805156615918565b6101c05160005260005161018051565b005b6101a0526101405261016052610180526020610280604463e6a439056101e052610140516102005261016051610220526101fc735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f5afa61596d57600080fd5b601f3d1161597a57600080fd5b600050610280516101c05260206102a0604463e6a43905610200526101405161022052610180516102405261021c735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f5afa6159c857600080fd5b601f3d116159d557600080fd5b6000506102a0516101e0526101405161016051610180516101a0516101c0516101e0516102005161014051610220526101c051610240526102405161022051600658016157c5565b6102a052610200526101e0526101c0526101a0526101805261016052610140526102a051610200526101405161016051610180516101a0516101c0516101e051610200516102205161014051610240526101e051610260526102605161024051600658016157c5565b6102c05261022052610200526101e0526101c0526101a0526101805261016052610140526102c0516102205261022051610200511115615ad457610160516000526000516101a05156615ae4565b610180516000526000516101a051565b005b6101a052610140526101605261018052610180516101605180821015615b0b57600080fd5b808203905090506c010000000000000000000000008082028215828483041417615b3457600080fd5b80905090509050610180518080615b4a57600080fd5b8204905090506c010000000000000000000000008082028215828483041417615b7257600080fd5b80905090509050610160518080615b8857600080fd5b8204905090506c010000000000000000000000008082028215828483041417615bb057600080fd5b80905090509050610160516101405180821015615bcc57600080fd5b808203905090508080615bde57600080fd5b8204905090506101c052740100000000000000000000000000000000000000006101c0511115615c2e57740100000000000000000000000000000000000000006000526000516101a05156615c3e565b6101c0516000526000516101a051565b00

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.