// SPDX-License-Identifier: MIT
pragma solidity 0.8.28;
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {IPoolManager} from "@uniswap/v4-core/src/interfaces/IPoolManager.sol";
import {IHooks} from "@uniswap/v4-core/src/interfaces/IHooks.sol";
import {IUnlockCallback} from "@uniswap/v4-core/src/interfaces/callback/IUnlockCallback.sol";
import {Hooks} from "@uniswap/v4-core/src/libraries/Hooks.sol";
import {LPFeeLibrary} from "@uniswap/v4-core/src/libraries/LPFeeLibrary.sol";
import {TickMath} from "@uniswap/v4-core/src/libraries/TickMath.sol";
import {PoolKey} from "@uniswap/v4-core/src/types/PoolKey.sol";
import {PoolId} from "@uniswap/v4-core/src/types/PoolId.sol";
import {Currency} from "@uniswap/v4-core/src/types/Currency.sol";
import {SwapParams} from "@uniswap/v4-core/src/types/PoolOperation.sol";
import {BalanceDelta} from "@uniswap/v4-core/src/types/BalanceDelta.sol";
import {IPositionManager} from "@uniswap/v4-periphery/src/interfaces/IPositionManager.sol";
import {Actions} from "@uniswap/v4-periphery/src/libraries/Actions.sol";
import {LiquidityAmounts} from "@uniswap/v4-periphery/src/libraries/LiquidityAmounts.sol";
import {IAllowanceTransfer} from "permit2/src/interfaces/IAllowanceTransfer.sol";
import {LittleJohnToken} from "./LittleJohnToken.sol";
import {LittleJohnHook} from "./LittleJohnHook.sol";
import {LpLockerV4} from "./LpLockerV4.sol";
/**
* LaunchFactory — one transaction fires a complete LittleJohn Instant Launch
* on Uniswap v4 (Robinhood Chain pairs launch pools against NATIVE ETH,
* currency0 == address(0)):
*
* 1. deploy LittleJohnToken (fixed supply, no mint fn, no owner),
* 2. register the pool's immutable fee/sell-lock config on the hook,
* 3. initialize the v4 pool (dynamic-fee flag, LittleJohnHook attached),
* 4. mint ONE single-sided position holding the entire supply, range
* [minUsableTick, initialTick], owner = a fresh per-launch LpLockerV4
* (the NFT is BORN inside the locker — it never passes through any
* other owner, so there is no window in which it could be diverted),
* 5. optional atomic dev-buy: the creator's ETH (msg.value) is swapped
* into the token immediately after LP placement, tokens to the creator.
*
* STARTING PRICE / MCAP: the client computes `initialTick` from the wizard's
* startingMcapUsd (Clanker's tick-from-mcap pattern, see
* research/instant-launch-mcap-and-v4-hooks.md). Orientation on this chain:
* the token is currency1, so tick = log1.0001(token per ETH) — a HIGHER tick
* is a CHEAPER token (lower mcap). The factory enforces immutable sanity
* bounds [minInitialTick, maxInitialTick] set at deploy from the research
* band (min $2.5k / max $1M equivalents at deploy-time ETH/USD) so a
* fat-fingered tick cannot create a $0 or $10B launch. Supply is FIXED so
* the tick <-> mcap mapping is bijective (Clanker fixes supply for the same
* reason).
*
* RUG-PROOF INVARIANTS enforced here (bounds re-checked by the hook):
* - poolFeeBps hard cap 5% (MAX_STATIC_FEE_BPS), decay start capped at 40%
* (MAX_START_FEE_BPS, the global fee ceiling — operator directive 2026-07-09)
* and start >= end, decay window <= 1h, sell-lock bounded and creator-only.
* - Every LAUNCH is immutable after createLaunch: the hook config registers
* once; the locker's recipients/split are immutable and the position NFT can
* never leave it. The factory itself is Ownable with EXACTLY ONE owner
* power: setProtocolFeeRecipient, which redirects where FUTURE launches'
* protocol fees accrue (each launch bakes the value into its LpLockerV4
* immutably at creation, so existing launches can never be touched). There
* are no other setters and no upgrade path. The approved mainnet manifest
* deliberately separates the operator owner from the protocol fee recipient.
*
* TIME: block.timestamp everywhere. Robinhood Chain is Arbitrum Orbit/Nitro —
* block.number is an L1 estimate and is never used.
*/
contract LaunchFactory is IUnlockCallback, ReentrancyGuard, Ownable {
using SafeERC20 for IERC20;
// ---------- launch constants ----------
/// Fixed supply per launch: 1,000,000,000 tokens, 18 decimals. Fixed so
/// initialTick <-> starting mcap is bijective (see header).
uint256 public constant TOKEN_SUPPLY = 1_000_000_000e18;
/// Flat anti-spam fee paid once per launch. Immutable by bytecode: no setter.
uint256 public constant LAUNCH_FEE = 0.0045 ether;
uint8 public constant TOKEN_DECIMALS = 18;
/// One spacing for all launch pools; initialTick must be a multiple.
int24 public constant TICK_SPACING = 200;
/// Protocol's share of launch-pool LP fees: 3333 bps = 1/3 (mirrors
/// FEES.PROTOCOL_FEE_SHARE in packages/contract).
uint16 public constant PROTOCOL_SHARE_BPS = 3333;
// invariant bounds (duplicated from the hook for cheap pre-checks;
// the hook re-enforces them — it does not trust this contract)
uint16 public constant MAX_STATIC_FEE_BPS = 500; // 5% hard fee cap
uint16 public constant MIN_STATIC_FEE_BPS = 100; // 1% operator revenue floor
uint16 public constant MAX_START_FEE_BPS = 4000; // 40% global fee ceiling
uint32 public constant MAX_DECAY_SECONDS = 3600;
uint32 public constant MAX_SELL_LOCK_SECONDS = 0;
// ---------- wiring (immutable, except the owner-settable protocol
// recipient for FUTURE launches — see protocolFeeRecipient below) ----------
IPoolManager public immutable poolManager;
IPositionManager public immutable positionManager;
IAllowanceTransfer public immutable permit2;
LittleJohnHook public immutable hook;
/// Protocol fee recipient baked into the locker of every FUTURE launch.
/// Owner-settable (Ownable, owner = deployer) so the operator can redirect
/// where NEW launches' protocol fees accrue — WITHOUT any power over
/// existing launches: each launch bakes THIS value into its LpLockerV4 at
/// creation, where it is immutable forever (LpLockerV4.protocol). Changing
/// it here affects only launches created AFTER the change; already-launched
/// tokens' fee recipients can never be redirected. The legacy `protocol()`
/// getter (below) still returns the current value, so the treasury panel,
/// keeper, and fork tests that read `protocol()` keep working unchanged.
address public protocolFeeRecipient;
/// Dedicated launch-fee wallet, immutable for the lifetime of this factory.
address public immutable launchFeeRecipient;
/// Tick sanity bounds (see header). minInitialTick = the $1M-equivalent
/// cap (expensive token), maxInitialTick = the $2.5k-equivalent floor.
int24 public immutable minInitialTick;
int24 public immutable maxInitialTick;
struct LaunchParams {
string name;
string symbol;
/// Starting spot tick (token per ETH, see header). Client-computed
/// from startingMcapUsd; must be spacing-aligned and inside bounds.
int24 initialTick;
/// Base pool trading fee in bps (this is the settled fee after any
/// decay window; the terminal "poolFeeBps" of the wizard).
uint16 poolFeeBps;
/// Anti-snipe decay opening fee in bps; 0 = decay off.
uint16 feeDecayStartBps;
/// Decay window in seconds; 0 = decay off.
uint32 feeDecayDurationSec;
/// Reserved legacy field; must be zero for every new launch.
uint32 sellLockSeconds;
}
struct DevBuyData {
PoolKey key;
uint256 ethIn;
address recipient;
}
/// Fee/sell-lock config is in the hook's LaunchRegistered event and the
/// starting tick in the PoolManager's Initialize event (same tx, same
/// poolId) — the indexer joins on poolId, keeping each emit small.
event LaunchCreated(
PoolId indexed poolId, address indexed creator, address token, address locker, uint256 positionTokenId
);
event DevBuyExecuted(PoolId indexed poolId, uint256 ethIn, uint256 tokensOut);
/// The owner redirected where FUTURE launches' protocol fees accrue. Existing
/// launches are unaffected (their locker recipient is immutable).
event ProtocolFeeRecipientChanged(address indexed previous, address indexed current);
event LaunchFeePaid(address indexed payer, address indexed recipient, uint256 amount);
error ZeroAddress();
error BadTickBounds();
error TickOutOfBounds(int24 tick, int24 min, int24 max);
error TickNotAligned(int24 tick, int24 spacing);
error FeeAboveCap(uint16 requested, uint16 cap);
error FeeBelowFloor(uint16 requested, uint16 floor);
error DecayGoesUp(uint16 startBps, uint16 endBps);
error DecayTooLong(uint32 requested, uint32 max);
error SellLockDisabled();
error HookFlagsWrong(address hookAddr);
error OnlyPoolManager();
error DevBuyReturnedNothing();
error RefundFailed();
error InsufficientLaunchFee(uint256 sent, uint256 required);
error LaunchFeeTransferFailed();
constructor(
IPoolManager poolManager_,
IPositionManager positionManager_,
IAllowanceTransfer permit2_,
address protocol_,
address launchFeeRecipient_,
int24 minInitialTick_,
int24 maxInitialTick_,
bytes32 hookSalt
) Ownable(msg.sender) {
if (
address(poolManager_) == address(0) || address(positionManager_) == address(0)
|| address(permit2_) == address(0) || protocol_ == address(0) || launchFeeRecipient_ == address(0)
) revert ZeroAddress();
if (
minInitialTick_ >= maxInitialTick_ || minInitialTick_ % TICK_SPACING != 0
|| maxInitialTick_ % TICK_SPACING != 0 || minInitialTick_ <= TickMath.minUsableTick(TICK_SPACING)
|| maxInitialTick_ >= TickMath.maxUsableTick(TICK_SPACING)
) revert BadTickBounds();
poolManager = poolManager_;
positionManager = positionManager_;
permit2 = permit2_;
protocolFeeRecipient = protocol_;
launchFeeRecipient = launchFeeRecipient_;
minInitialTick = minInitialTick_;
maxInitialTick = maxInitialTick_;
// The factory deploys its own hook with a mined CREATE2 salt so the
// hook's `factory` immutable is THIS address (no post-deploy wiring,
// no latch, nothing mutable). The deploy script / tests mine `hookSalt`
// with HookMiner against the predicted factory address.
hook = new LittleJohnHook{salt: hookSalt}(poolManager_, address(this));
if (
uint160(address(hook)) & Hooks.ALL_HOOK_MASK
!= uint160(
Hooks.BEFORE_INITIALIZE_FLAG | Hooks.BEFORE_SWAP_FLAG | Hooks.BEFORE_SWAP_RETURNS_DELTA_FLAG
| Hooks.AFTER_SWAP_FLAG | Hooks.AFTER_SWAP_RETURNS_DELTA_FLAG
)
) revert HookFlagsWrong(address(hook));
}
// ---------- protocol fee recipient (owner-settable, future launches only) ----------
/// Legacy getter preserved: the treasury panel, keeper, and fork tests read
/// `protocol()` on the factory to resolve the current protocol wallet. It now
/// returns the (settable) `protocolFeeRecipient`; selector is unchanged.
function protocol() external view returns (address) {
return protocolFeeRecipient;
}
/// Owner-only: redirect where FUTURE launches' protocol fees accrue. Does NOT
/// touch any existing launch — each launch baked the recipient into its
/// immutable LpLockerV4 at creation, so this only changes the value future
/// createLaunch calls bake in. Non-zero enforced.
function setProtocolFeeRecipient(address newRecipient) external onlyOwner {
if (newRecipient == address(0)) revert ZeroAddress();
address previous = protocolFeeRecipient;
protocolFeeRecipient = newRecipient;
emit ProtocolFeeRecipientChanged(previous, newRecipient);
}
/**
* Fire a launch. `msg.sender` is the creator (locker fee recipient +
* sell-lock subject). `msg.value` is the optional atomic dev-buy.
* Returns everything the caller/indexer needs to render the launch.
*/
function createLaunch(LaunchParams calldata p)
external
payable
nonReentrant
returns (address token, PoolId poolId, uint256 positionTokenId, address locker)
{
if (msg.value < LAUNCH_FEE) revert InsufficientLaunchFee(msg.value, LAUNCH_FEE);
_validate(p);
// 1. token: fixed supply minted to this factory, no mint fn, no owner
LittleJohnToken t = new LittleJohnToken(p.name, p.symbol, TOKEN_DECIMALS, TOKEN_SUPPLY, address(this));
token = address(t);
// native ETH (address(0)) sorts first: always currency0 on this chain
PoolKey memory key = PoolKey({
currency0: Currency.wrap(address(0)),
currency1: Currency.wrap(token),
fee: LPFeeLibrary.DYNAMIC_FEE_FLAG,
tickSpacing: TICK_SPACING,
hooks: IHooks(address(hook))
});
poolId = key.toId();
// 2. per-launch locker FIRST, so its address can be baked into the
// hook's immutable config (the hook mints the ETH-leg fee claim to
// it). The position NFT id is deterministic — nothing else mints on
// the posm between here and the mint in step 5, so nextTokenId holds.
positionTokenId = positionManager.nextTokenId();
LpLockerV4 lock = new LpLockerV4(
positionManager,
poolManager,
positionTokenId,
key.currency0,
key.currency1,
msg.sender,
protocolFeeRecipient, // CURRENT factory recipient, baked immutable into this locker
PROTOCOL_SHARE_BPS
);
locker = address(lock);
// 3. immutable per-pool config (hook re-validates every bound).
// Decay off => start == end == poolFeeBps so the curve is flat.
uint16 startBps = p.feeDecayDurationSec == 0 ? p.poolFeeBps : p.feeDecayStartBps;
hook.register(poolId, msg.sender, startBps, p.poolFeeBps, p.feeDecayDurationSec, p.sellLockSeconds, locker);
// 4. pool starts exactly at the creator-chosen tick
poolManager.initialize(key, TickMath.getSqrtPriceAtTick(p.initialTick));
// 5. single-sided position over [minUsableTick, initialTick] holding
// the whole supply, minted DIRECTLY into the locker
_mintFullSupplyPosition(key, p.initialTick, token, locker);
emit LaunchCreated(poolId, msg.sender, token, locker, positionTokenId);
// 6. optional atomic dev-buy with the creator's ETH
if (msg.value > LAUNCH_FEE) _devBuy(key, poolId, msg.value - LAUNCH_FEE);
// rounding dust from the liquidity math (a few wei of token at most)
// goes to the creator, so the factory ends the tx holding nothing.
// SafeERC20 (audit 2026-07-09 P2-1): our own OZ token reverts on a
// failed transfer and returns true, so this is benign — but use the
// checked path for uniformity with the rest of the factory.
uint256 dust = t.balanceOf(address(this));
if (dust > 0) IERC20(token).safeTransfer(msg.sender, dust);
(bool feePaid,) = launchFeeRecipient.call{value: LAUNCH_FEE}("");
if (!feePaid) revert LaunchFeeTransferFailed();
emit LaunchFeePaid(msg.sender, launchFeeRecipient, LAUNCH_FEE);
}
function _devBuy(PoolKey memory key, PoolId poolId, uint256 ethIn) internal {
(uint256 ethUsed, uint256 tokensOut) =
abi.decode(poolManager.unlock(abi.encode(DevBuyData(key, ethIn, msg.sender))), (uint256, uint256));
if (tokensOut == 0) revert DevBuyReturnedNothing();
if (ethIn > ethUsed) {
// price-limit leftover (cannot happen inside the bounds, kept for safety)
(bool ok,) = msg.sender.call{value: ethIn - ethUsed}("");
if (!ok) revert RefundFailed();
}
emit DevBuyExecuted(poolId, ethUsed, tokensOut);
}
/// Dev-buy execution inside the PoolManager unlock. Only the PoolManager
/// can call this, and it only runs while THIS contract holds the unlock.
function unlockCallback(bytes calldata data) external returns (bytes memory) {
if (msg.sender != address(poolManager)) revert OnlyPoolManager();
DevBuyData memory d = abi.decode(data, (DevBuyData));
// buy: ETH (currency0) in, token out => zeroForOne, exact-in
BalanceDelta delta = poolManager.swap(
d.key,
SwapParams({
zeroForOne: true, amountSpecified: -int256(d.ethIn), sqrtPriceLimitX96: TickMath.MIN_SQRT_PRICE + 1
}),
""
);
uint256 ethUsed = uint256(-int256(delta.amount0()));
uint256 tokensOut = uint256(uint128(delta.amount1()));
poolManager.take(d.key.currency1, d.recipient, tokensOut);
poolManager.settle{value: ethUsed}();
return abi.encode(ethUsed, tokensOut);
}
// ---------- internals ----------
function _validate(LaunchParams calldata p) internal view {
if (p.initialTick < minInitialTick || p.initialTick > maxInitialTick) {
revert TickOutOfBounds(p.initialTick, minInitialTick, maxInitialTick);
}
if (p.initialTick % TICK_SPACING != 0) revert TickNotAligned(p.initialTick, TICK_SPACING);
if (p.poolFeeBps < MIN_STATIC_FEE_BPS) revert FeeBelowFloor(p.poolFeeBps, MIN_STATIC_FEE_BPS);
if (p.poolFeeBps > MAX_STATIC_FEE_BPS) revert FeeAboveCap(p.poolFeeBps, MAX_STATIC_FEE_BPS);
if (p.feeDecayDurationSec > MAX_DECAY_SECONDS) revert DecayTooLong(p.feeDecayDurationSec, MAX_DECAY_SECONDS);
if (p.feeDecayDurationSec != 0) {
if (p.feeDecayStartBps > MAX_START_FEE_BPS) revert FeeAboveCap(p.feeDecayStartBps, MAX_START_FEE_BPS);
if (p.feeDecayStartBps < p.poolFeeBps) revert DecayGoesUp(p.feeDecayStartBps, p.poolFeeBps);
}
if (p.sellLockSeconds != 0) revert SellLockDisabled();
}
/// Mint the full-supply single-sided position (token side only: the
/// range sits entirely at/below spot, so amount0Max — the ETH side — is
/// zero) into the locker via the REAL PositionManager.
function _mintFullSupplyPosition(PoolKey memory key, int24 initialTick, address token, address locker) internal {
int24 tickLower = TickMath.minUsableTick(TICK_SPACING);
uint128 liquidity = LiquidityAmounts.getLiquidityForAmount1(
TickMath.getSqrtPriceAtTick(tickLower), TickMath.getSqrtPriceAtTick(initialTick), TOKEN_SUPPLY
);
// posm settles ERC20s through Permit2
IERC20(token).forceApprove(address(permit2), TOKEN_SUPPLY);
permit2.approve(token, address(positionManager), uint160(TOKEN_SUPPLY), uint48(block.timestamp));
bytes memory actions = abi.encodePacked(uint8(Actions.MINT_POSITION), uint8(Actions.SETTLE_PAIR));
bytes[] memory params = new bytes[](2);
params[0] = abi.encode(
key, tickLower, initialTick, uint256(liquidity), uint128(0), uint128(TOKEN_SUPPLY), locker, bytes("")
);
params[1] = abi.encode(key.currency0, key.currency1);
positionManager.modifyLiquidities(abi.encode(actions, params), block.timestamp);
IERC20(token).forceApprove(address(permit2), 0);
}
// NOTE (deliberate): no receive()/fallback — the factory can only hold
// ETH transiently inside createLaunch (msg.value), never at rest.
}[
{
"type": "constructor",
"inputs": [
{
"name": "poolManager_",
"type": "address",
"internalType": "contract IPoolManager"
},
{
"name": "positionManager_",
"type": "address",
"internalType": "contract IPositionManager"
},
{
"name": "permit2_",
"type": "address",
"internalType": "contract IAllowanceTransfer"
},
{
"name": "protocol_",
"type": "address",
"internalType": "address"
},
{
"name": "launchFeeRecipient_",
"type": "address",
"internalType": "address"
},
{
"name": "minInitialTick_",
"type": "int24",
"internalType": "int24"
},
{
"name": "maxInitialTick_",
"type": "int24",
"internalType": "int24"
},
{
"name": "hookSalt",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "nonpayable"
},
{
"name": "BadTickBounds",
"type": "error",
"inputs": []
},
{
"name": "DecayGoesUp",
"type": "error",
"inputs": [
{
"name": "startBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "endBps",
"type": "uint16",
"internalType": "uint16"
}
]
},
{
"name": "DecayTooLong",
"type": "error",
"inputs": [
{
"name": "requested",
"type": "uint32",
"internalType": "uint32"
},
{
"name": "max",
"type": "uint32",
"internalType": "uint32"
}
]
},
{
"name": "DevBuyReturnedNothing",
"type": "error",
"inputs": []
},
{
"name": "FeeAboveCap",
"type": "error",
"inputs": [
{
"name": "requested",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "cap",
"type": "uint16",
"internalType": "uint16"
}
]
},
{
"name": "FeeBelowFloor",
"type": "error",
"inputs": [
{
"name": "requested",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "floor",
"type": "uint16",
"internalType": "uint16"
}
]
},
{
"name": "HookFlagsWrong",
"type": "error",
"inputs": [
{
"name": "hookAddr",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "InsufficientLaunchFee",
"type": "error",
"inputs": [
{
"name": "sent",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "required",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "LaunchFeeTransferFailed",
"type": "error",
"inputs": []
},
{
"name": "OnlyPoolManager",
"type": "error",
"inputs": []
},
{
"name": "OwnableInvalidOwner",
"type": "error",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "OwnableUnauthorizedAccount",
"type": "error",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ReentrancyGuardReentrantCall",
"type": "error",
"inputs": []
},
{
"name": "RefundFailed",
"type": "error",
"inputs": []
},
{
"name": "SafeERC20FailedOperation",
"type": "error",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "SellLockDisabled",
"type": "error",
"inputs": []
},
{
"name": "TickNotAligned",
"type": "error",
"inputs": [
{
"name": "tick",
"type": "int24",
"internalType": "int24"
},
{
"name": "spacing",
"type": "int24",
"internalType": "int24"
}
]
},
{
"name": "TickOutOfBounds",
"type": "error",
"inputs": [
{
"name": "tick",
"type": "int24",
"internalType": "int24"
},
{
"name": "min",
"type": "int24",
"internalType": "int24"
},
{
"name": "max",
"type": "int24",
"internalType": "int24"
}
]
},
{
"name": "ZeroAddress",
"type": "error",
"inputs": []
},
{
"name": "DevBuyExecuted",
"type": "event",
"inputs": [
{
"name": "poolId",
"type": "bytes32",
"indexed": true,
"internalType": "PoolId"
},
{
"name": "ethIn",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "tokensOut",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "LaunchCreated",
"type": "event",
"inputs": [
{
"name": "poolId",
"type": "bytes32",
"indexed": true,
"internalType": "PoolId"
},
{
"name": "creator",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "token",
"type": "address",
"indexed": false,
"internalType": "address"
},
{
"name": "locker",
"type": "address",
"indexed": false,
"internalType": "address"
},
{
"name": "positionTokenId",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "LaunchFeePaid",
"type": "event",
"inputs": [
{
"name": "payer",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "recipient",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "OwnershipTransferred",
"type": "event",
"inputs": [
{
"name": "previousOwner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "ProtocolFeeRecipientChanged",
"type": "event",
"inputs": [
{
"name": "previous",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "current",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "LAUNCH_FEE",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "MAX_DECAY_SECONDS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint32",
"internalType": "uint32"
}
],
"stateMutability": "view"
},
{
"name": "MAX_SELL_LOCK_SECONDS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint32",
"internalType": "uint32"
}
],
"stateMutability": "view"
},
{
"name": "MAX_START_FEE_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "MAX_STATIC_FEE_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "MIN_STATIC_FEE_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "PROTOCOL_SHARE_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "TICK_SPACING",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "int24",
"internalType": "int24"
}
],
"stateMutability": "view"
},
{
"name": "TOKEN_DECIMALS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"stateMutability": "view"
},
{
"name": "TOKEN_SUPPLY",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "createLaunch",
"type": "function",
"inputs": [
{
"name": "p",
"type": "tuple",
"components": [
{
"name": "name",
"type": "string",
"internalType": "string"
},
{
"name": "symbol",
"type": "string",
"internalType": "string"
},
{
"name": "initialTick",
"type": "int24",
"internalType": "int24"
},
{
"name": "poolFeeBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "feeDecayStartBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "feeDecayDurationSec",
"type": "uint32",
"internalType": "uint32"
},
{
"name": "sellLockSeconds",
"type": "uint32",
"internalType": "uint32"
}
],
"internalType": "struct LaunchFactory.LaunchParams"
}
],
"outputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "poolId",
"type": "bytes32",
"internalType": "PoolId"
},
{
"name": "positionTokenId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "locker",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "payable"
},
{
"name": "hook",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract LittleJohnHook"
}
],
"stateMutability": "view"
},
{
"name": "launchFeeRecipient",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "maxInitialTick",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "int24",
"internalType": "int24"
}
],
"stateMutability": "view"
},
{
"name": "minInitialTick",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "int24",
"internalType": "int24"
}
],
"stateMutability": "view"
},
{
"name": "owner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "permit2",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IAllowanceTransfer"
}
],
"stateMutability": "view"
},
{
"name": "poolManager",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IPoolManager"
}
],
"stateMutability": "view"
},
{
"name": "positionManager",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IPositionManager"
}
],
"stateMutability": "view"
},
{
"name": "protocol",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "protocolFeeRecipient",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "renounceOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setProtocolFeeRecipient",
"type": "function",
"inputs": [
{
"name": "newRecipient",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "transferOwnership",
"type": "function",
"inputs": [
{
"name": "newOwner",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "unlockCallback",
"type": "function",
"inputs": [
{
"name": "data",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [
{
"name": "",
"type": "bytes",
"internalType": "bytes"
}
],
"stateMutability": "nonpayable"
}
]0x610160604052348015610010575f5ffd5b5060405161803c38038061803c83398101604081905261002f916102fa565b60015f55338061005957604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61006281610236565b506001600160a01b038816158061008057506001600160a01b038716155b8061009257506001600160a01b038616155b806100a457506001600160a01b038516155b806100b657506001600160a01b038416155b156100d45760405163d92e233d60e01b815260040160405180910390fd5b8160020b8360020b1215806100f557506100ef60c8846103a7565b60020b15155b8061010c575061010660c8836103a7565b60020b15155b80610126575061011c60c8610287565b60020b8360020b13155b80610140575061013660c86102a8565b60020b8260020b12155b1561015e57604051636c3f413f60e01b815260040160405180910390fd5b6001600160a01b0388811660805287811660a05286811660c052600280546001600160a01b0319168783161781559085166101005283810b6101205282900b610140526040518190899030906101b3906102c0565b6001600160a01b039283168152911660208201526040018190604051809103905ff59050801580156101e7573d5f5f3e3d5ffd5b506001600160a01b03811660e052613fff166120cc146102295760e051604051637c92391d60e01b81526001600160a01b039091166004820152602401610050565b50505050505050506103d4565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f81600281900b620d89e719816102a0576102a0610393565b050292915050565b5f81600281900b620d89e8816102a0576102a0610393565b61208480615fb883390190565b6001600160a01b03811681146102e1575f5ffd5b50565b8051600281900b81146102f5575f5ffd5b919050565b5f5f5f5f5f5f5f5f610100898b031215610312575f5ffd5b885161031d816102cd565b60208a015190985061032e816102cd565b60408a015190975061033f816102cd565b60608a0151909650610350816102cd565b60808a0151909550610361816102cd565b935061036f60a08a016102e4565b925061037d60c08a016102e4565b915060e089015190509295985092959890939650565b634e487b7160e01b5f52601260045260245ffd5b5f8260020b806103c557634e487b7160e01b5f52601260045260245ffd5b808360020b0791505092915050565b60805160a05160c05160e051610100516101205161014051615af96104bf5f395f8181610228015281816112d7015261137d01525f818161040d01528181611299015261135501525f818161048701528181610f1b0152610ff901525f818161031d015281816109e20152610be601525f81816101d001528181611a2001528181611ade0152611d6001525f81816102ea01528181610a1e01528181610aae01528181611a960152611c9c01525f8181610533015281816105d40152818161063d015281816107c40152818161081d01528181610acf01528181610d200152611e130152615af95ff3fe60806040526004361061018e575f3560e01c806392822047116100dc578063c7d1d9ca11610087578063dc4c90d311610062578063dc4c90d314610522578063e521cb9214610555578063e5b3af6114610574578063f2fde38b14610588575f5ffd5b8063c7d1d9ca146104a9578063c8040e64146104f8578063d246637b1461050d575f5ffd5b8063b152f6cf116100b7578063b152f6cf1461042f578063b53fa5251461044e578063bdac5f5f14610476575f5ffd5b806392822047146103bf578063a2267724146103e7578063a94be35a146103fc575f5ffd5b8063715018a61161013c5780638ce74426116101175780638ce744261461033f5780638da5cb5b1461036957806391dd734614610393575f5ffd5b8063715018a6146102c3578063791b98bc146102d95780637f5a7c7b1461030c575f5ffd5b806346ca626b1161016c57806346ca626b1461025d5780635b7f415c1461027157806364df049e14610297575f5ffd5b806309197a811461019257806312261ee7146101bf578063411e3ae214610217575b5f5ffd5b34801561019d575f5ffd5b506101ac660ffcb9e57d400081565b6040519081526020015b60405180910390f35b3480156101ca575f5ffd5b506101f27f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101b6565b348015610222575f5ffd5b5061024a7f000000000000000000000000000000000000000000000000000000000000000081565b60405160029190910b81526020016101b6565b348015610268575f5ffd5b5061024a60c881565b34801561027c575f5ffd5b50610285601281565b60405160ff90911681526020016101b6565b3480156102a2575f5ffd5b506002546101f29073ffffffffffffffffffffffffffffffffffffffff1681565b3480156102ce575f5ffd5b506102d76105a7565b005b3480156102e4575f5ffd5b506101f27f000000000000000000000000000000000000000000000000000000000000000081565b348015610317575f5ffd5b506101f27f000000000000000000000000000000000000000000000000000000000000000081565b34801561034a575f5ffd5b5060025473ffffffffffffffffffffffffffffffffffffffff166101f2565b348015610374575f5ffd5b5060015473ffffffffffffffffffffffffffffffffffffffff166101f2565b34801561039e575f5ffd5b506103b26103ad36600461242e565b6105ba565b6040516101b691906124e8565b3480156103ca575f5ffd5b506103d4610d0581565b60405161ffff90911681526020016101b6565b3480156103f2575f5ffd5b506103d46101f481565b348015610407575f5ffd5b5061024a7f000000000000000000000000000000000000000000000000000000000000000081565b34801561043a575f5ffd5b506101ac6b033b2e3c9fd0803ce800000081565b348015610459575f5ffd5b506104615f81565b60405163ffffffff90911681526020016101b6565b348015610481575f5ffd5b506101f27f000000000000000000000000000000000000000000000000000000000000000081565b6104bc6104b73660046124fa565b6108dc565b6040805173ffffffffffffffffffffffffffffffffffffffff9586168152602081019490945283019190915290911660608201526080016101b6565b348015610503575f5ffd5b506103d4610fa081565b348015610518575f5ffd5b50610461610e1081565b34801561052d575f5ffd5b506101f27f000000000000000000000000000000000000000000000000000000000000000081565b348015610560575f5ffd5b506102d761056f36600461255d565b61105f565b34801561057f575f5ffd5b506103d4606481565b348015610593575f5ffd5b506102d76105a236600461255d565b61112a565b6105af61118d565b6105b85f6111e0565b565b60603373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461062b576040517ff655705d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6106388385018561264e565b90505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f3cd914c835f01516040518060600160405280600115158152602001866020015161069d90612736565b81526020016106b26401000276a3600161276c565b73ffffffffffffffffffffffffffffffffffffffff168152506040518363ffffffff1660e01b81526004016106e8929190612798565b6020604051808303815f875af1158015610704573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107289190612864565b90505f6107358260801d90565b600f0b61074190612736565b90505f61074e83600f0b90565b84516020015160408087015190517f0b0d9c0900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff928316600482015290821660248201526fffffffffffffffffffffffffffffffff929092166044830181905292507f00000000000000000000000000000000000000000000000000000000000000001690630b0d9c09906064015f604051808303815f87803b158015610805575f5ffd5b505af1158015610817573d5f5f3e3d5ffd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166311da60b4836040518263ffffffff1660e01b815260040160206040518083038185885af1158015610886573d5f5f3e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906108ab9190612864565b5060408051602081018490529081018290526060016040516020818303038152906040529450505050505b92915050565b5f5f5f5f6108e8611256565b660ffcb9e57d400034101561093d576040517fc956dda2000000000000000000000000000000000000000000000000000000008152346004820152660ffcb9e57d400060248201526044015b60405180910390fd5b61094685611297565b5f610951868061287b565b61095e602089018961287b565b60126b033b2e3c9fd0803ce80000003060405161097a90612414565b61098a979695949392919061292a565b604051809103905ff0801580156109a3573d5f5f3e3d5ffd5b506040805160a0810182525f815273ffffffffffffffffffffffffffffffffffffffff8084166020830152628000009282019290925260c860608201527f00000000000000000000000000000000000000000000000000000000000000009091166080820152909550859150610a1a8160a0902090565b94507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166375794a3c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a85573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa99190612864565b93505f7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000086845f015185602001513360025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610d05604051610b2a90612421565b73ffffffffffffffffffffffffffffffffffffffff98891681529688166020880152604087019590955292861660608601529085166080850152841660a084015290921660c082015261ffff90911660e082015261010001604051809103905ff080158015610b9b573d5f5f3e3d5ffd5b5093508390505f610bb260c08a0160a08b01612989565b63ffffffff1615610bd257610bcd60a08a0160808b016129ac565b610be2565b610be260808a0160608b016129ac565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d281a8ba8833848d6060016020810190610c3691906129ac565b8e60a0016020810190610c499190612989565b8f60c0016020810190610c5c9190612989565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b168152600481019690965273ffffffffffffffffffffffffffffffffffffffff948516602487015261ffff938416604487015292909116606485015263ffffffff90811660848501521660a4830152881660c482015260e4015f604051808303815f87803b158015610cf5575f5ffd5b505af1158015610d07573d5f5f3e3d5ffd5b505073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169150636276cbbe905084610d62610d5d60608e0160408f016129cd565b6116d0565b6040518363ffffffff1660e01b8152600401610d7f9291906129e8565b6020604051808303815f875af1158015610d9b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dbf9190612a8e565b50610ddb83610dd460608c0160408d016129cd565b8a886119cd565b6040805173ffffffffffffffffffffffffffffffffffffffff8a8116825287166020820152908101879052339088907fe901fbd6823df116d8944e0ccc97c1204fa76994d3213880c1f5080bd66dab519060600160405180910390a3660ffcb9e57d4000341115610e6157610e618388610e5c660ffcb9e57d400034612aa9565b611d8f565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8616906370a0823190602401602060405180830381865afa158015610ecb573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eef9190612864565b90508015610f1857610f1873ffffffffffffffffffffffffffffffffffffffff8a163383611fea565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16660ffcb9e57d40006040515f6040518083038185875af1925050503d805f8114610f95576040519150601f19603f3d011682016040523d82523d5f602084013e610f9a565b606091505b5050905080610fd5576040517f3c2285ca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051660ffcb9e57d4000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169033907f4cef2d27cdf43d743c3c66401182e93989938e77d1be10f3ab9e6afdf799f8399060200160405180910390a350505050505061105860015f55565b9193509193565b61106761118d565b73ffffffffffffffffffffffffffffffffffffffff81166110b4576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f91e1f7681cd20e140c1b9ca733d5112019e41d298b69cd2fcf1f28db37f16dad905f90a35050565b61113261118d565b73ffffffffffffffffffffffffffffffffffffffff8116611181576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f6004820152602401610934565b61118a816111e0565b50565b60015473ffffffffffffffffffffffffffffffffffffffff1633146105b8576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610934565b6001805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60025f5403611291576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b7f000000000000000000000000000000000000000000000000000000000000000060020b6112cb60608301604084016129cd565b60020b128061130e57507f000000000000000000000000000000000000000000000000000000000000000060020b61130960608301604084016129cd565b60020b135b156113ac5761132360608201604083016129cd565b6040517f0cb005eb000000000000000000000000000000000000000000000000000000008152600291820b60048201527f0000000000000000000000000000000000000000000000000000000000000000820b60248201527f000000000000000000000000000000000000000000000000000000000000000090910b6044820152606401610934565b60c86113be60608301604084016129cd565b6113c89190612ae9565b60020b15611420576113e060608201604083016129cd565b6040517feacb2c9200000000000000000000000000000000000000000000000000000000815260029190910b600482015260c86024820152604401610934565b606461143260808301606084016129ac565b61ffff16101561148c5761144c60808201606083016129ac565b6040517fa5ecb6a600000000000000000000000000000000000000000000000000000000815261ffff909116600482015260646024820152604401610934565b6101f461149f60808301606084016129ac565b61ffff1611156114fa576114b960808201606083016129ac565b6040517f5ccbf4a500000000000000000000000000000000000000000000000000000000815261ffff90911660048201526101f46024820152604401610934565b610e1061150d60c0830160a08401612989565b63ffffffff16111561156c5761152960c0820160a08301612989565b6040517f504d684e00000000000000000000000000000000000000000000000000000000815263ffffffff9091166004820152610e106024820152604401610934565b61157c60c0820160a08301612989565b63ffffffff161561168357610fa061159a60a08301608084016129ac565b61ffff1611156115f5576115b460a08201608083016129ac565b6040517f5ccbf4a500000000000000000000000000000000000000000000000000000000815261ffff9091166004820152610fa06024820152604401610934565b61160560808201606083016129ac565b61ffff1661161960a08301608084016129ac565b61ffff1610156116835761163360a08201608083016129ac565b61164360808301606084016129ac565b6040517f5145779000000000000000000000000000000000000000000000000000000000815261ffff928316600482015291166024820152604401610934565b61169360e0820160c08301612989565b63ffffffff161561118a576040517ffa621b2000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60020b5f60ff82901d80830118620d89e8811115611712576117127f8b86327a0000000000000000000000000000000000000000000000000000000084612070565b7001fffcb933bd6fad37aa2d162d1a594001600182160270010000000000000000000000000000000018600282161561175b576ffff97272373d413259a46990580e213a0260801c5b600482161561177a576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615611799576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b60108216156117b8576fffcb9843d60f6159c9db58835c9266440260801c5b60208216156117d7576fff973b41fa98c081472e6896dfb254c00260801c5b60408216156117f6576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615611815576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615611835576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615611855576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615611875576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615611895576fe7159475a2c29b7443b29c7fa6e889d90260801c5b6110008216156118b5576fd097f3bdfd2022b8845ad8f792aa58250260801c5b6120008216156118d5576fa9f746462d870fdf8a65dc1f90e061e50260801c5b6140008216156118f5576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615611915576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615611936576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615611956576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615611975576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615611992576b048a170391f7dc42444e8fa20260801c5b5f8413156119bd577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff045b63ffffffff0160201c9392505050565b5f6119d860c861207f565b90505f611a026119e7836116d0565b6119f0876116d0565b6b033b2e3c9fd0803ce80000006120bc565b9050611a5173ffffffffffffffffffffffffffffffffffffffff85167f00000000000000000000000000000000000000000000000000000000000000006b033b2e3c9fd0803ce8000000612137565b6040517f87517c4500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301527f0000000000000000000000000000000000000000000000000000000000000000811660248301526b033b2e3c9fd0803ce8000000604483015265ffffffffffff421660648301527f000000000000000000000000000000000000000000000000000000000000000016906387517c45906084015f604051808303815f87803b158015611b1f575f5ffd5b505af1158015611b31573d5f5f3e3d5ffd5b5050604080517f020000000000000000000000000000000000000000000000000000000000000060208201527f0d000000000000000000000000000000000000000000000000000000000000006021820152815160028183038101825260228301818152608284019094529094505f9350906042015b6060815260200190600190039081611ba757505060408051602080820183525f8083529251939450611c05938c9389938d936fffffffffffffffffffffffffffffffff8b16936b033b2e3c9fd0803ce8000000928e92909101612b2f565b604051602081830303815290604052815f81518110611c2657611c26612c3b565b6020026020010181905250875f01518860200151604051602001611c6d92919073ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b60405160208183030381529060405281600181518110611c8f57611c8f612c3b565b60200260200101819052507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dd46508f8383604051602001611ce9929190612c68565b604051602081830303815290604052426040518363ffffffff1660e01b8152600401611d16929190612cfb565b5f604051808303815f87803b158015611d2d575f5ffd5b505af1158015611d3f573d5f5f3e3d5ffd5b50611d859250505073ffffffffffffffffffffffffffffffffffffffff87167f00000000000000000000000000000000000000000000000000000000000000005f612137565b5050505050505050565b60408051606080820183528582526020808301858152339385019384528451885173ffffffffffffffffffffffffffffffffffffffff90811682850152928901518316818701529488015162ffffff16858401529187015160020b608080860191909152870151811660a0850152905160c08401529051811660e08301525f9182917f000000000000000000000000000000000000000000000000000000000000000016906348c8949190610100016040516020818303038152906040526040518263ffffffff1660e01b8152600401611e6991906124e8565b5f604051808303815f875af1158015611e84573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611ec99190810190612d1c565b806020019051810190611edc9190612dce565b91509150805f03611f19576040517fa74a558500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81831115611fa8575f33611f2d8486612aa9565b6040515f81818185875af1925050503d805f8114611f66576040519150601f19603f3d011682016040523d82523d5f602084013e611f6b565b606091505b5050905080611fa6576040517ff0c49d4400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b604080518381526020810183905285917fbad0edeecc4024f79b12d622d3eedca76ed49cf1768589215953d37812c1d296910160405180910390a25050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83811660248301526044820183905261206b91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612214565b505050565b815f528060020b60045260245ffd5b5f81600281900b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff27618816120b4576120b4612abc565b050292915050565b5f8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1611156120f5579192915b61212d612128836c0100000000000000000000000087870373ffffffffffffffffffffffffffffffffffffffff166122b3565b61236e565b90505b9392505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b3000000000000000000000000000000000000000000000000000000001790526121c384826123b6565b61220e5760405173ffffffffffffffffffffffffffffffffffffffff84811660248301525f604483015261220491869182169063095ea7b390606401612024565b61220e8482612214565b50505050565b5f5f60205f8451602086015f885af180612233576040513d5f823e3d81fd5b50505f513d9150811561224a578060011415612264565b73ffffffffffffffffffffffffffffffffffffffff84163b155b1561220e576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610934565b5f838302817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff858709828110838203039150508084116122f1575f5ffd5b805f0361230357508290049050612130565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b806fffffffffffffffffffffffffffffffff811681146123b1576123b17f93dafdf10000000000000000000000000000000000000000000000000000000061240c565b919050565b5f5f5f5f60205f8651602088015f8a5af192503d91505f519050828015612402575081156123e75780600114612402565b5f8673ffffffffffffffffffffffffffffffffffffffff163b115b9695505050505050565b805f5260045ffd5b610ecd80612df183390190565b611e0680613cbe83390190565b5f5f6020838503121561243f575f5ffd5b823567ffffffffffffffff811115612455575f5ffd5b8301601f81018513612465575f5ffd5b803567ffffffffffffffff81111561247b575f5ffd5b85602082840101111561248c575f5ffd5b6020919091019590945092505050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f612130602083018461249c565b5f6020828403121561250a575f5ffd5b813567ffffffffffffffff811115612520575f5ffd5b820160e08185031215612130575f5ffd5b73ffffffffffffffffffffffffffffffffffffffff8116811461118a575f5ffd5b80356123b181612531565b5f6020828403121561256d575f5ffd5b813561213081612531565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516060810167ffffffffffffffff811182821017156125c8576125c8612578565b60405290565b60405160a0810167ffffffffffffffff811182821017156125c8576125c8612578565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561263857612638612578565b604052919050565b8060020b811461118a575f5ffd5b5f81830360e081128015612660575f5ffd5b506126696125a5565b60a0821215612676575f5ffd5b61267e6125ce565b9150833561268b81612531565b8252602084013561269b81612531565b6020830152604084013562ffffff811681146126b5575f5ffd5b604083015260608401356126c881612640565b606083015260808401356126db81612531565b608083015290815260a083013560208201819052906126fc60c08501612552565b6040820152949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7f8000000000000000000000000000000000000000000000000000000000000000820361276657612766612709565b505f0390565b73ffffffffffffffffffffffffffffffffffffffff81811683821601908111156108d6576108d6612709565b612817818473ffffffffffffffffffffffffffffffffffffffff815116825273ffffffffffffffffffffffffffffffffffffffff602082015116602083015262ffffff6040820151166040830152606081015160020b606083015273ffffffffffffffffffffffffffffffffffffffff60808201511660808301525050565b8151151560a0820152602082015160c082015260409091015173ffffffffffffffffffffffffffffffffffffffff1660e082015261012061010082018190525f9082015261014001919050565b5f60208284031215612874575f5ffd5b5051919050565b5f5f83357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126128ae575f5ffd5b83018035915067ffffffffffffffff8211156128c8575f5ffd5b6020019150368190038213156128dc575f5ffd5b9250929050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60a081525f61293d60a08301898b6128e3565b828103602084015261295081888a6128e3565b60ff9690961660408401525050606081019290925273ffffffffffffffffffffffffffffffffffffffff16608090910152949350505050565b5f60208284031215612999575f5ffd5b813563ffffffff81168114612130575f5ffd5b5f602082840312156129bc575f5ffd5b813561ffff81168114612130575f5ffd5b5f602082840312156129dd575f5ffd5b813561213081612640565b60c08101612a6b828573ffffffffffffffffffffffffffffffffffffffff815116825273ffffffffffffffffffffffffffffffffffffffff602082015116602083015262ffffff6040820151166040830152606081015160020b606083015273ffffffffffffffffffffffffffffffffffffffff60808201511660808301525050565b73ffffffffffffffffffffffffffffffffffffffff831660a08301529392505050565b5f60208284031215612a9e575f5ffd5b815161213081612640565b818103818111156108d6576108d6612709565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f8260020b80612b20577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b808360020b0791505092915050565b612bae818a73ffffffffffffffffffffffffffffffffffffffff815116825273ffffffffffffffffffffffffffffffffffffffff602082015116602083015262ffffff6040820151166040830152606081015160020b606083015273ffffffffffffffffffffffffffffffffffffffff60808201511660808301525050565b8760020b60a08201528660020b60c08201528560e08201526fffffffffffffffffffffffffffffffff85166101008201526fffffffffffffffffffffffffffffffff841661012082015273ffffffffffffffffffffffffffffffffffffffff83166101408201526101806101608201525f612c2d61018083018461249c565b9a9950505050505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b604081525f612c7a604083018561249c565b828103602084015280845180835260208301915060208160051b840101602087015f5b83811015612ced577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018552612cd783835161249c565b6020958601959093509190910190600101612c9d565b509098975050505050505050565b604081525f612d0d604083018561249c565b90508260208301529392505050565b5f60208284031215612d2c575f5ffd5b815167ffffffffffffffff811115612d42575f5ffd5b8201601f81018413612d52575f5ffd5b805167ffffffffffffffff811115612d6c57612d6c612578565b612d9d60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016125f1565b818152856020838501011115612db1575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b5f5f60408385031215612ddf575f5ffd5b50508051602090910151909290915056fe60a060405234801561000f575f5ffd5b50604051610ecd380380610ecd83398101604081905261002e916102f3565b8484600361003c838261041c565b506004610049828261041c565b5050506001600160a01b03811661009c5760405162461bcd60e51b815260206004820152601260248201527113128e881e995c9bc81c9958da5c1a595b9d60721b60448201526064015b60405180910390fd5b5f82116100dd5760405162461bcd60e51b815260206004820152600f60248201526e4c4a3a207a65726f20737570706c7960881b6044820152606401610093565b60ff83166080526100ee81836100f8565b50505050506104fb565b6001600160a01b0382166101215760405163ec442f0560e01b81525f6004820152602401610093565b61012c5f8383610130565b5050565b6001600160a01b03831661015a578060025f82825461014f91906104d6565b909155506101ca9050565b6001600160a01b0383165f90815260208190526040902054818110156101ac5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610093565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b0382166101e657600280548290039055610204565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161024991815260200190565b60405180910390a3505050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112610279575f5ffd5b81516001600160401b0381111561029257610292610256565b604051601f8201601f19908116603f011681016001600160401b03811182821017156102c0576102c0610256565b6040528181528382016020018510156102d7575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f5f5f5f5f60a08688031215610307575f5ffd5b85516001600160401b0381111561031c575f5ffd5b6103288882890161026a565b602088015190965090506001600160401b03811115610345575f5ffd5b6103518882890161026a565b945050604086015160ff81168114610367575f5ffd5b6060870151608088015191945092506001600160a01b038116811461038a575f5ffd5b809150509295509295909350565b600181811c908216806103ac57607f821691505b6020821081036103ca57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561041757805f5260205f20601f840160051c810160208510156103f55750805b601f840160051c820191505b81811015610414575f8155600101610401565b50505b505050565b81516001600160401b0381111561043557610435610256565b610449816104438454610398565b846103d0565b6020601f82116001811461047b575f83156104645750848201515b5f19600385901b1c1916600184901b178455610414565b5f84815260208120601f198516915b828110156104aa578785015182556020948501946001909201910161048a565b50848210156104c757868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b808201808211156104f557634e487b7160e01b5f52601160045260245ffd5b92915050565b6080516109ba6105135f395f61013501526109ba5ff3fe608060405234801561000f575f5ffd5b50600436106100c4575f3560e01c806351431d4f1161007d57806395d89b411161005857806395d89b411461020c578063a9059cbb14610214578063dd62ed3e14610227575f5ffd5b806351431d4f1461015f57806364e5229f1461019b57806370a08231146101d7575f5ffd5b806318160ddd116100ad57806318160ddd1461010957806323b872dd1461011b578063313ce5671461012e575f5ffd5b806306fdde03146100c8578063095ea7b3146100e6575b5f5ffd5b6100d061026c565b6040516100dd91906107cd565b60405180910390f35b6100f96100f4366004610848565b6102fc565b60405190151581526020016100dd565b6002545b6040519081526020016100dd565b6100f9610129366004610870565b610315565b60405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020016100dd565b6100d06040518060400160405280601581526020017f68747470733a2f2f6c6974746c656a6f686e2e6767000000000000000000000081525081565b6100d06040518060400160405280600881526020017f4f70656e42656c6c00000000000000000000000000000000000000000000000081525081565b61010d6101e53660046108aa565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6100d0610338565b6100f9610222366004610848565b610347565b61010d6102353660046108ca565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b60606003805461027b906108fb565b80601f01602080910402602001604051908101604052809291908181526020018280546102a7906108fb565b80156102f25780601f106102c9576101008083540402835291602001916102f2565b820191905f5260205f20905b8154815290600101906020018083116102d557829003601f168201915b5050505050905090565b5f33610309818585610354565b60019150505b92915050565b5f33610322858285610366565b61032d858585610438565b506001949350505050565b60606004805461027b906108fb565b5f33610309818585610438565b61036183838360016104e1565b505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146104325781811015610424576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101829052604481018390526064015b60405180910390fd5b61043284848484035f6104e1565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610487576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f600482015260240161041b565b73ffffffffffffffffffffffffffffffffffffffff82166104d6576040517fec442f050000000000000000000000000000000000000000000000000000000081525f600482015260240161041b565b610361838383610626565b73ffffffffffffffffffffffffffffffffffffffff8416610530576040517fe602df050000000000000000000000000000000000000000000000000000000081525f600482015260240161041b565b73ffffffffffffffffffffffffffffffffffffffff831661057f576040517f94280d620000000000000000000000000000000000000000000000000000000081525f600482015260240161041b565b73ffffffffffffffffffffffffffffffffffffffff8085165f9081526001602090815260408083209387168352929052208290558015610432578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161061891815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff831661065d578060025f828254610652919061094c565b9091555061070d9050565b73ffffffffffffffffffffffffffffffffffffffff83165f90815260208190526040902054818110156106e2576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602481018290526044810183905260640161041b565b73ffffffffffffffffffffffffffffffffffffffff84165f9081526020819052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff821661073657600280548290039055610761565b73ffffffffffffffffffffffffffffffffffffffff82165f9081526020819052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516107c091815260200190565b60405180910390a3505050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610843575f5ffd5b919050565b5f5f60408385031215610859575f5ffd5b61086283610820565b946020939093013593505050565b5f5f5f60608486031215610882575f5ffd5b61088b84610820565b925061089960208501610820565b929592945050506040919091013590565b5f602082840312156108ba575f5ffd5b6108c382610820565b9392505050565b5f5f604083850312156108db575f5ffd5b6108e483610820565b91506108f260208401610820565b90509250929050565b600181811c9082168061090f57607f821691505b602082108103610946577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b8082018082111561030f577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffdfea264697066735822122014980c0624aeb7a437044617872b3df2a6dcfe3ece23f28f24a143907d5cecc564736f6c634300081c0033610180604052348015610010575f5ffd5b50604051611e06380380611e0683398101604081905261002f91610145565b60015f556001600160a01b038816158061005057506001600160a01b038716155b8061006257506001600160a01b038316155b8061007457506001600160a01b038216155b156100925760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0384166100b95760405163d92e233d60e01b815260040160405180910390fd5b61ffff811615806100d0575061271061ffff821610155b156100ee576040516311c56c8960e01b815260040160405180910390fd5b6001600160a01b0397881660805295871660a05260c09490945291851661014052841661016052831660e0529091166101005261ffff16610120526101ec565b6001600160a01b0381168114610142575f5ffd5b50565b5f5f5f5f5f5f5f5f610100898b03121561015d575f5ffd5b88516101688161012e565b60208a01519098506101798161012e565b60408a015160608b015191985096506101918161012e565b60808a01519095506101a28161012e565b60a08a01519094506101b38161012e565b60c08a01519093506101c48161012e565b60e08a015190925061ffff811681146101db575f5ffd5b809150509295985092959890939650565b60805160a05160c05160e05161010051610120516101405161016051611b106102f65f395f8181610160015281816108a9015281816109e901528181610b770152610bf301525f81816102e6015281816107c80152818161087d015281816109c801528181610b430152610bca01525f818161024c015261104301525f81816103190152818161046a01528181610f95015281816110e4015261117d01525f81816101030152818161042901528181610fd50152818161122901526112c201525f818161039f015261096f01525f81816103d20152818161067f01528181610721015281816107fd01528181610de40152610e6f01525f81816102b30152610a750152611b105ff3fe6080604052600436106100e7575f3560e01c806379f1232b11610087578063c879657211610057578063c87965721461037a578063ceefe5d11461038e578063dc4c90d3146103c1578063e1a45218146103f4575f5ffd5b806379f1232b146102d55780638ce744261461030857806391dd73461461033b578063a0cf0aea14610367575f5ffd5b806328079e4a116100c257806328079e4a146101f757806337ed3f1e1461023b57806351cff8d914610281578063791b98bc146102a2575f5ffd5b806302d05d3f146100f257806310d737b81461014f578063150b7a0214610182575f5ffd5b366100ee57005b5f5ffd5b3480156100fd575f5ffd5b506101257f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561015a575f5ffd5b506101257f000000000000000000000000000000000000000000000000000000000000000081565b34801561018d575f5ffd5b506101c661019c36600461162d565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610146565b348015610202575f5ffd5b5061022d610211366004611697565b600160209081525f928352604080842090915290825290205481565b604051908152602001610146565b348015610246575f5ffd5b5061026e7f000000000000000000000000000000000000000000000000000000000000000081565b60405161ffff9091168152602001610146565b34801561028c575f5ffd5b506102a061029b3660046116c8565b610409565b005b3480156102ad575f5ffd5b506101257f000000000000000000000000000000000000000000000000000000000000000081565b3480156102e0575f5ffd5b506101257f000000000000000000000000000000000000000000000000000000000000000081565b348015610313575f5ffd5b506101257f000000000000000000000000000000000000000000000000000000000000000081565b348015610346575f5ffd5b5061035a6103553660046116e1565b610665565b604051610146919061176c565b348015610372575f5ffd5b506101255f81565b348015610385575f5ffd5b506102a061086f565b348015610399575f5ffd5b5061022d7f000000000000000000000000000000000000000000000000000000000000000081565b3480156103cc575f5ffd5b506101257f000000000000000000000000000000000000000000000000000000000000000081565b3480156103ff575f5ffd5b5061026e61271081565b610411610c26565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161480159061048d57503373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614155b156104c4576040517f37762a6d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b335f90815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff851684529091528120549081900361052e576040517f797dba5400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b335f90815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff861680855292528220919091556105ea576040515f90339083908381818185875af1925050503d805f81146105a4576040519150601f19603f3d011682016040523d82523d5f602084013e6105a9565b606091505b50509050806105e4576040517f6d963f8800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5061060b565b61060b73ffffffffffffffffffffffffffffffffffffffff83163383610c67565b60405181815273ffffffffffffffffffffffffffffffffffffffff83169033907fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb9060200160405180910390a35061066260015f55565b50565b60603373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106d6576040517fae18210a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6106e38385018561177e565b6040517ff5298aca0000000000000000000000000000000000000000000000000000000081523060048201525f6024820152604481018290529091507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063f5298aca906064015f604051808303815f87803b158015610777575f5ffd5b505af1158015610789573d5f5f3e3d5ffd5b50506040517f0b0d9c0900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152306024830152604482018590527f0000000000000000000000000000000000000000000000000000000000000000169250630b0d9c0991506064015f604051808303815f87803b158015610840575f5ffd5b505af1158015610852573d5f5f3e3d5ffd5b5050505060405180602001604052805f8152509150505b92915050565b610877610c26565b5f6108a17f0000000000000000000000000000000000000000000000000000000000000000610cf9565b90505f6108cd7f0000000000000000000000000000000000000000000000000000000000000000610cf9565b604080517f010000000000000000000000000000000000000000000000000000000000000060208201527f1100000000000000000000000000000000000000000000000000000000000000602182015281516002818303810182526022830181815260828401909452939450925f92916042015b606081526020019060019003908161094157505060408051602080820183525f808352925193945061099a937f0000000000000000000000000000000000000000000000000000000000000000939283928392016117c2565b604051602081830303815290604052815f815181106109bb576109bb61181b565b60200260200101819052507f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030604051602001610a469392919073ffffffffffffffffffffffffffffffffffffffff93841681529183166020830152909116604082015260600190565b60405160208183030381529060405281600181518110610a6857610a6861181b565b60200260200101819052507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dd46508f8383604051602001610ac2929190611848565b604051602081830303815290604052426040518363ffffffff1660e01b8152600401610aef9291906118db565b5f604051808303815f87803b158015610b06575f5ffd5b505af1158015610b18573d5f5f3e3d5ffd5b505050507f49d512bf9cb224241c05691e73eb9fab078cf350c7dbcbcf66788f1fc0cc8b0b84610b677f0000000000000000000000000000000000000000000000000000000000000000610cf9565b610b719190611929565b84610b9b7f0000000000000000000000000000000000000000000000000000000000000000610cf9565b610ba59190611929565b6040805192835260208301919091520160405180910390a1610bc5610dae565b610bee7f0000000000000000000000000000000000000000000000000000000000000000610f7e565b610c177f0000000000000000000000000000000000000000000000000000000000000000610f7e565b50505050610c2460015f55565b565b60025f5403610c61576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610cf4908490611369565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff821615610da7576040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610d7e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610da2919061193c565b610869565b4792915050565b6040517efdd58e0000000000000000000000000000000000000000000000000000000081523060048201525f60248201819052907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169062fdd58e90604401602060405180830381865afa158015610e3d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e61919061193c565b9050805f03610e6d5750565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166348c8949182604051602001610ebc91815260200190565b6040516020818303038152906040526040518263ffffffff1660e01b8152600401610ee7919061176c565b5f604051808303815f875af1158015610f02573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610f479190810190611953565b506040518181527f5206675f4abbe25801efb4cd9996c887b1529790b0ccb5b8e1d3598df9e330249060200160405180910390a150565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081165f908152600160208181526040808420868616808652908352818520547f00000000000000000000000000000000000000000000000000000000000000009096168552928252808420928452919052812054909161101391611a43565b90505f61101f83610cf9565b905081811161102d57505050565b5f6110388383611929565b90505f61271061106c7f000000000000000000000000000000000000000000000000000000000000000061ffff1684611a56565b6110769190611a6d565b90505f6110838284611929565b604080518281526020810185905291925073ffffffffffffffffffffffffffffffffffffffff8816917f60ce3cc2d133631eac66a476f14997a9fa682bd05a60dd993cf02285822d78d8910160405180910390a2811561121c575f611109877f000000000000000000000000000000000000000000000000000000000000000085611412565b90508015611166578673ffffffffffffffffffffffffffffffffffffffff167f4c96bcd0193ab402469b79efcedd5b112d7bfe5ef05f28e3299609128738ce1e8460405161115991815260200190565b60405180910390a261121a565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081165f908152600160209081526040808320938b16835292905290812080548592906111c9908490611a43565b909155505060405183815273ffffffffffffffffffffffffffffffffffffffff8816907fb1dd31259279c40f03801f2a0220c0cb7e5859eb0a0205a4b5d75a934b4475e29060200160405180910390a25b505b8015611361575f61124e877f000000000000000000000000000000000000000000000000000000000000000084611412565b905080156112ab578673ffffffffffffffffffffffffffffffffffffffff167f9f50225323bf3e91d345b270e096ff263d9706dd4521831da2433b7d3c5528518360405161129e91815260200190565b60405180910390a261135f565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081165f908152600160209081526040808320938b168352929052908120805484929061130e908490611a43565b909155505060405182815273ffffffffffffffffffffffffffffffffffffffff8816907f015d52525df6c50f9ece94e30e1754d3615b73e0487f9bb51a055a0ef1b0befb9060200160405180910390a25b505b505050505050565b5f5f60205f8451602086015f885af180611388576040513d5f823e3d81fd5b50505f513d9150811561139f5780600114156113b9565b73ffffffffffffffffffffffffffffffffffffffff84163b155b1561140c576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260240160405180910390fd5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff841661149a575f8373ffffffffffffffffffffffffffffffffffffffff168361c350906040515f60405180830381858888f193505050503d805f8114611489576040519150601f19603f3d011682016040523d82523d5f602084013e61148e565b606091505b509092506115b9915050565b60405173ffffffffffffffffffffffffffffffffffffffff8481166024830152604482018490525f918291871690606401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790525161154c9190611aa5565b5f604051808303815f865af19150503d805f8114611585576040519150601f19603f3d011682016040523d82523d5f602084013e61158a565b606091505b50915091508180156115b45750805115806115b45750808060200190518101906115b49190611abb565b925050505b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146115e3575f5ffd5b919050565b5f5f83601f8401126115f8575f5ffd5b50813567ffffffffffffffff81111561160f575f5ffd5b602083019150836020828501011115611626575f5ffd5b9250929050565b5f5f5f5f5f60808688031215611641575f5ffd5b61164a866115c0565b9450611658602087016115c0565b935060408601359250606086013567ffffffffffffffff81111561167a575f5ffd5b611686888289016115e8565b969995985093965092949392505050565b5f5f604083850312156116a8575f5ffd5b6116b1836115c0565b91506116bf602084016115c0565b90509250929050565b5f602082840312156116d8575f5ffd5b6115b9826115c0565b5f5f602083850312156116f2575f5ffd5b823567ffffffffffffffff811115611708575f5ffd5b611714858286016115e8565b90969095509350505050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f6115b96020830184611720565b5f6020828403121561178e575f5ffd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b8581528460208201526fffffffffffffffffffffffffffffffff841660408201526fffffffffffffffffffffffffffffffff8316606082015260a060808201525f61181060a0830184611720565b979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b604081525f61185a6040830185611720565b828103602084015280845180835260208301915060208160051b840101602087015f5b838110156118cd577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08684030185526118b7838351611720565b602095860195909350919091019060010161187d565b509098975050505050505050565b604081525f6118ed6040830185611720565b90508260208301529392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b81810381811115610869576108696118fc565b5f6020828403121561194c575f5ffd5b5051919050565b5f60208284031215611963575f5ffd5b815167ffffffffffffffff811115611979575f5ffd5b8201601f81018413611989575f5ffd5b805167ffffffffffffffff8111156119a3576119a3611795565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff82111715611a0f57611a0f611795565b604052818152828201602001861015611a26575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b80820180821115610869576108696118fc565b8082028115828204841417610869576108696118fc565b5f82611aa0577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b5f82518060208501845e5f920191825250919050565b5f60208284031215611acb575f5ffd5b815180151581146115b9575f5ffdfea26469706673582212208a3b3b1c408acf093c3c38774f8691fc93410bf4609349f663c3fdadb2fe263b64736f6c634300081c0033a26469706673582212204cc873ede9768f30fd7be87eb78eef7db89c062ebb605cef8c0009b5f8e8797d64736f6c634300081c003360c060405234801561000f575f5ffd5b5060405161208438038061208483398101604081905261002e916102ef565b6001600160a01b038216158061004b57506001600160a01b038116155b1561006957604051630636a15760e11b815260040160405180910390fd5b6001600160a01b03808316608052811660a05261016c30610167604080516101c0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081019190915250604080516101c08101825260018082525f60208301819052928201839052606082018390526080820183905260a0820183905260c0820181905260e0820181905261010082018390526101208201839052610140820181905261016082015261018081018290526101a081019190915290565b610173565b5050610327565b80511515612000831615151415806101975750602081015115156110008316151514155b806101ae5750604081015115156108008316151514155b806101c55750606081015115156104008316151514155b806101dc5750608081015115156102008316151514155b806101f3575060a081015115156101008316151514155b80610209575060c0810151151560808316151514155b8061021f575060e0810151151560408316151514155b806102365750610100810151151560208316151514155b8061024d5750610120810151151560108316151514155b806102645750610140810151151560088316151514155b8061027b5750610160810151151560048316151514155b806102925750610180810151151560028316151514155b806102a957506101a0810151151560018316151514155b156102bf576102bf630732d7b560e51b836102c3565b5050565b815f526001600160a01b03811660045260245ffd5b6001600160a01b03811681146102ec575f5ffd5b50565b5f5f60408385031215610300575f5ffd5b825161030b816102d8565b602084015190925061031c816102d8565b809150509250929050565b60805160a051611d046103805f395f818161032d0152818161096b0152818161101c015261155001525f81816103a001528181610505015281816107fe01528181610fc30152818161126601526114a80152611d045ff3fe608060405234801561000f575f5ffd5b50600436106100e5575f3560e01c8063c45a015511610088578063d281a8ba11610063578063d281a8ba14610386578063dc4c90d31461039b578063dc98354e146103c2578063e5b3af6114610406575f5ffd5b8063c45a015514610328578063c8040e6414610374578063d246637b1461037d575f5ffd5b8063836c336f116100c3578063836c336f1461029f578063a2267724146102b2578063b47b2fb1146102bb578063b53fa52514610309575f5ffd5b80631d8ef3ef146100e9578063575e24b4146101145780636ef616071461016a575b5f5ffd5b6100fc6100f736600461172b565b61040e565b60405161ffff90911681526020015b60405180910390f35b6101276101223660046117e1565b6104ea565b604080517fffffffff000000000000000000000000000000000000000000000000000000009094168452602084019290925262ffffff169082015260600161010b565b61029261017836600461172b565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810191909152505f9081526020818152604091829020825160e081018452815473ffffffffffffffffffffffffffffffffffffffff808216835264ffffffffff74010000000000000000000000000000000000000000830481169584019590955279010000000000000000000000000000000000000000000000000082049094169482019490945261ffff7e0100000000000000000000000000000000000000000000000000000000000090940484166060820152600190910154928316608082015263ffffffff6201000084041660a082015266010000000000009092041660c082015290565b60405161010b9190611858565b6100fc6102ad366004611921565b610730565b6100fc6101f481565b6102ce6102c9366004611969565b6107e4565b604080517fffffffff000000000000000000000000000000000000000000000000000000009093168352600f9190910b60208301520161010b565b61031362278d0081565b60405163ffffffff909116815260200161010b565b61034f7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161010b565b6100fc610fa081565b610313610e1081565b6103996103943660046119ea565b610953565b005b61034f7f000000000000000000000000000000000000000000000000000000000000000081565b6103d56103d0366004611a6a565b610faa565b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200161010b565b6100fc606481565b5f818152602081905260408120805474010000000000000000000000000000000000000000900464ffffffffff168203610474576040517faba4733900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805460018201546104e3917e01000000000000000000000000000000000000000000000000000000000000810461ffff90811692908116916201000090910463ffffffff16906102ad9074010000000000000000000000000000000000000000900464ffffffffff1642611ade565b9392505050565b5f80803373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461055c576040517fae18210a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8080610578610571368c90038c018c611b14565b60a0902090565b81526020808201929092526040015f20915061059690880188611bc7565b1580156105c757508054790100000000000000000000000000000000000000000000000000900464ffffffffff1615155b80156105f757508054790100000000000000000000000000000000000000000000000000900464ffffffffff1642105b80156106195750805473ffffffffffffffffffffffffffffffffffffffff1632145b1561067d5780546040517ffccb9d6e00000000000000000000000000000000000000000000000000000000815279010000000000000000000000000000000000000000000000000090910464ffffffffff1660048201526024015b60405180910390fd5b5f602088018035821391908290610694908b611bc7565b15151490505f826106a95789602001356106b6565b6106b660208b0135611be6565b90505f826106c4575f6106f7565b6106f7856106dc8e8036038101906105719190611b14565b8f858f5f0160208101906106f09190611bc7565b89156111a0565b7f575e24b4000000000000000000000000000000000000000000000000000000009e909d50624000009c509a5050505050505050505050565b5f63ffffffff8316158061074a57508263ffffffff168210155b156107565750826107dc565b815f036107645750836107dc565b5f61077661ffff808716908816611ade565b90505f61078a63ffffffff86166002611c1c565b600163ffffffff87168661079f866002611c1c565b6107a99190611c1c565b6107b39190611c33565b6107bd9190611ade565b6107c79190611c46565b90506107d78161ffff8916611ade565b925050505b949350505050565b5f803373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610855576040517fae18210a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60208701803582139190829061086c908a611bc7565b15151490505f81156108a9576108a45f8061088f610571368f90038f018f611b14565b81526020019081526020015f208c8b8b61130e565b610922565b5f6108b48960801d90565b905080600f0b5f146109205761091d5f5f6108d98e8036038101906105719190611b14565b81526020019081526020015f206108fa8d8036038101906105719190611b14565b8e610904856113c6565b8e5f0160208101906109169190611bc7565b89156113e2565b91505b505b7fb47b2fb1000000000000000000000000000000000000000000000000000000009b909a5098505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146109c2576040517f0c6d42ae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8616610a0f576040517f58f28cd400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610a5c576040517f0628c7c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8781526020819052604090205474010000000000000000000000000000000000000000900464ffffffffff1615610ac0576040517f3a81d6fc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606461ffff85161015610b0c576040517fa5ecb6a600000000000000000000000000000000000000000000000000000000815261ffff8516600482015260646024820152604401610674565b6101f461ffff85161115610b5a576040517f5ccbf4a500000000000000000000000000000000000000000000000000000000815261ffff851660048201526101f46024820152604401610674565b610fa061ffff86161115610ba8576040517f5ccbf4a500000000000000000000000000000000000000000000000000000000815261ffff86166004820152610fa06024820152604401610674565b8361ffff168561ffff161015610bf8576040517f5145779000000000000000000000000000000000000000000000000000000000815261ffff808716600483015285166024820152604401610674565b610e1063ffffffff84161115610c4a576040517f504d684e00000000000000000000000000000000000000000000000000000000815263ffffffff84166004820152610e106024820152604401610674565b63ffffffff8316158015610c6657508361ffff168561ffff1614155b15610c9d576040517f0849db0b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62278d0063ffffffff83161115610cf1576040517fd2417da500000000000000000000000000000000000000000000000000000000815263ffffffff8316600482015262278d006024820152604401610674565b5f4290505f6040518060e001604052808973ffffffffffffffffffffffffffffffffffffffff1681526020018364ffffffffff1681526020018563ffffffff165f14610d4c57610d4763ffffffff871685611c7e565b610d4e565b5f5b64ffffffffff1681526020018861ffff1681526020018761ffff1681526020018663ffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff168152509050805f5f8b81526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151815f0160146101000a81548164ffffffffff021916908364ffffffffff1602179055506040820151815f0160196101000a81548164ffffffffff021916908364ffffffffff1602179055506060820151815f01601e6101000a81548161ffff021916908361ffff1602179055506080820151816001015f6101000a81548161ffff021916908361ffff16021790555060a08201518160010160026101000a81548163ffffffff021916908363ffffffff16021790555060c08201518160010160066101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050508060c0015173ffffffffffffffffffffffffffffffffffffffff16815f015173ffffffffffffffffffffffffffffffffffffffff168a7fed2492da8add9b8989d638d4ce0547654d9757234bde28247b6eda82b3a412e0846060015185608001518660a001518760400151604051610f97949392919061ffff948516815292909316602083015263ffffffff16604082015264ffffffffff91909116606082015260800190565b60405180910390a4505050505050505050565b5f3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461101a576040517fae18210a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461109f576040517f0c6d42ae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f806110b361057136879003870187611b14565b815260208101919091526040015f9081205474010000000000000000000000000000000000000000900464ffffffffff16900361111c576040517faba4733900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61114161112f6060850160408601611c9b565b62ffffff1662ffffff16628000001490565b611177576040517fcf587f1400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b507fdc98354e000000000000000000000000000000000000000000000000000000009392505050565b5f5f6111ac888761154d565b90505f6111ba868386611628565b90505f8261ffff161180156111cd575080155b15611204576040517f75e4ec8300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018901546040517f156e29f6000000000000000000000000000000000000000000000000000000008152660100000000000090910473ffffffffffffffffffffffffffffffffffffffff90811660048301525f6024830152604482018390527f0000000000000000000000000000000000000000000000000000000000000000169063156e29f6906064015f604051808303815f87803b1580156112a7575f5ffd5b505af11580156112b9573d5f5f3e3d5ffd5b50506040805184815261ffff8616602082015288151593508b92507fe24de99d45e53bb15f2f041683ce976d9f01cc70b1cb688ecacd367c847eaf2a910160405180910390a360801b98975050505050505050565b5f602083013581139081611326578360200135611333565b6113336020850135611be6565b90505f61134b82611344898961154d565b8515611628565b90505f836113625761135d8284611c33565b611375565b61136c8284611ade565b61137590611be6565b9050806113828660801d90565b600f0b146113bc576040517fd39cf37700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050565b5f600f82900b8181126113d957806104e3565b6104e381611be6565b5f5f6113ee888761154d565b90505f6113fc868386611628565b90505f8261ffff1611801561140f575080155b15611446576040517f75e4ec8300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018901546040517f156e29f6000000000000000000000000000000000000000000000000000000008152660100000000000090910473ffffffffffffffffffffffffffffffffffffffff90811660048301525f6024830152604482018390527f0000000000000000000000000000000000000000000000000000000000000000169063156e29f6906064015f604051808303815f87803b1580156114e9575f5ffd5b505af11580156114fb573d5f5f3e3d5ffd5b50506040805184815261ffff8616602082015288151593508b92507fe24de99d45e53bb15f2f041683ce976d9f01cc70b1cb688ecacd367c847eaf2a910160405180910390a398975050505050505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146116155782546001840154611610917e01000000000000000000000000000000000000000000000000000000000000810461ffff90811692908116916201000090910463ffffffff16906102ad9074010000000000000000000000000000000000000000900464ffffffffff1642611ade565b61161f565b600183015461ffff165b90505b92915050565b5f8261ffff165f0361163b57505f6104e3565b81611656576116518461ffff8516612710611670565b6107dc565b6107dc8461ffff851661166b86612710611cb4565b61ffff165b5f838302817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff858709828110838203039150508084116116ae575f5ffd5b805f036116c0575082900490506104e3565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b5f6020828403121561173b575f5ffd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff81168114611763575f5ffd5b50565b803561177181611742565b919050565b5f60a08284031215611786575f5ffd5b50919050565b5f60608284031215611786575f5ffd5b5f5f83601f8401126117ac575f5ffd5b50813567ffffffffffffffff8111156117c3575f5ffd5b6020830191508360208285010111156117da575f5ffd5b9250929050565b5f5f5f5f5f61014086880312156117f6575f5ffd5b853561180181611742565b94506118108760208801611776565b935061181f8760c0880161178c565b925061012086013567ffffffffffffffff81111561183b575f5ffd5b6118478882890161179c565b969995985093965092949392505050565b5f60e08201905073ffffffffffffffffffffffffffffffffffffffff835116825264ffffffffff602084015116602083015264ffffffffff604084015116604083015261ffff606084015116606083015261ffff608084015116608083015260a08301516118ce60a084018263ffffffff169052565b5060c08301516118f660c084018273ffffffffffffffffffffffffffffffffffffffff169052565b5092915050565b803561ffff81168114611771575f5ffd5b803563ffffffff81168114611771575f5ffd5b5f5f5f5f60808587031215611934575f5ffd5b61193d856118fd565b935061194b602086016118fd565b92506119596040860161190e565b9396929550929360600135925050565b5f5f5f5f5f5f610160878903121561197f575f5ffd5b863561198a81611742565b95506119998860208901611776565b94506119a88860c0890161178c565b9350610120870135925061014087013567ffffffffffffffff8111156119cc575f5ffd5b6119d889828a0161179c565b979a9699509497509295939492505050565b5f5f5f5f5f5f5f60e0888a031215611a00575f5ffd5b873596506020880135611a1281611742565b9550611a20604089016118fd565b9450611a2e606089016118fd565b9350611a3c6080890161190e565b9250611a4a60a0890161190e565b915060c0880135611a5a81611742565b8091505092959891949750929550565b5f5f5f60e08486031215611a7c575f5ffd5b8335611a8781611742565b9250611a968560208601611776565b915060c0840135611aa681611742565b809150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8181038181111561162257611622611ab1565b803562ffffff81168114611771575f5ffd5b8035600281900b8114611771575f5ffd5b5f60a0828403128015611b25575f5ffd5b5060405160a0810167ffffffffffffffff81118282101715611b6e577f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604052611b7a83611766565b8152611b8860208401611766565b6020820152611b9960408401611af1565b6040820152611baa60608401611b03565b6060820152611bbb60808401611766565b60808201529392505050565b5f60208284031215611bd7575f5ffd5b813580151581146104e3575f5ffd5b5f7f80000000000000000000000000000000000000000000000000000000000000008203611c1657611c16611ab1565b505f0390565b808202811582820484141761162257611622611ab1565b8082018082111561162257611622611ab1565b5f82611c79577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b64ffffffffff818116838216019081111561162257611622611ab1565b5f60208284031215611cab575f5ffd5b61161f82611af1565b61ffff828116828216039081111561162257611622611ab156fea2646970667358221220de6163a7a34cabe6bd0387dff9999347fae2d12e720b48634cb0e14266efd33964736f6c634300081c00330000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095100000000000000000000000058daec3116aae6d93017baaea7749052e8a04fa7000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba3000000000000000000000000f05b6a883e8d8d54b28da0c5e74874604f57edad000000000000000000000000937542815377c160861addaadd5e4a793b252a7400000000000000000000000000000000000000000000000000000000000230f00000000000000000000000000000000000000000000000000000000000031a8800000000000000000000000000000000000000000000000000000000000058c6
0x60806040526004361061018e575f3560e01c806392822047116100dc578063c7d1d9ca11610087578063dc4c90d311610062578063dc4c90d314610522578063e521cb9214610555578063e5b3af6114610574578063f2fde38b14610588575f5ffd5b8063c7d1d9ca146104a9578063c8040e64146104f8578063d246637b1461050d575f5ffd5b8063b152f6cf116100b7578063b152f6cf1461042f578063b53fa5251461044e578063bdac5f5f14610476575f5ffd5b806392822047146103bf578063a2267724146103e7578063a94be35a146103fc575f5ffd5b8063715018a61161013c5780638ce74426116101175780638ce744261461033f5780638da5cb5b1461036957806391dd734614610393575f5ffd5b8063715018a6146102c3578063791b98bc146102d95780637f5a7c7b1461030c575f5ffd5b806346ca626b1161016c57806346ca626b1461025d5780635b7f415c1461027157806364df049e14610297575f5ffd5b806309197a811461019257806312261ee7146101bf578063411e3ae214610217575b5f5ffd5b34801561019d575f5ffd5b506101ac660ffcb9e57d400081565b6040519081526020015b60405180910390f35b3480156101ca575f5ffd5b506101f27f000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba381565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101b6565b348015610222575f5ffd5b5061024a7f0000000000000000000000000000000000000000000000000000000000031a8881565b60405160029190910b81526020016101b6565b348015610268575f5ffd5b5061024a60c881565b34801561027c575f5ffd5b50610285601281565b60405160ff90911681526020016101b6565b3480156102a2575f5ffd5b506002546101f29073ffffffffffffffffffffffffffffffffffffffff1681565b3480156102ce575f5ffd5b506102d76105a7565b005b3480156102e4575f5ffd5b506101f27f00000000000000000000000058daec3116aae6d93017baaea7749052e8a04fa781565b348015610317575f5ffd5b506101f27f00000000000000000000000023739445e76d83a40f87fe2fd6a53e73badf60cc81565b34801561034a575f5ffd5b5060025473ffffffffffffffffffffffffffffffffffffffff166101f2565b348015610374575f5ffd5b5060015473ffffffffffffffffffffffffffffffffffffffff166101f2565b34801561039e575f5ffd5b506103b26103ad36600461242e565b6105ba565b6040516101b691906124e8565b3480156103ca575f5ffd5b506103d4610d0581565b60405161ffff90911681526020016101b6565b3480156103f2575f5ffd5b506103d46101f481565b348015610407575f5ffd5b5061024a7f00000000000000000000000000000000000000000000000000000000000230f081565b34801561043a575f5ffd5b506101ac6b033b2e3c9fd0803ce800000081565b348015610459575f5ffd5b506104615f81565b60405163ffffffff90911681526020016101b6565b348015610481575f5ffd5b506101f27f000000000000000000000000937542815377c160861addaadd5e4a793b252a7481565b6104bc6104b73660046124fa565b6108dc565b6040805173ffffffffffffffffffffffffffffffffffffffff9586168152602081019490945283019190915290911660608201526080016101b6565b348015610503575f5ffd5b506103d4610fa081565b348015610518575f5ffd5b50610461610e1081565b34801561052d575f5ffd5b506101f27f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095181565b348015610560575f5ffd5b506102d761056f36600461255d565b61105f565b34801561057f575f5ffd5b506103d4606481565b348015610593575f5ffd5b506102d76105a236600461255d565b61112a565b6105af61118d565b6105b85f6111e0565b565b60603373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e40951161461062b576040517ff655705d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6106388385018561264e565b90505f7f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095173ffffffffffffffffffffffffffffffffffffffff1663f3cd914c835f01516040518060600160405280600115158152602001866020015161069d90612736565b81526020016106b26401000276a3600161276c565b73ffffffffffffffffffffffffffffffffffffffff168152506040518363ffffffff1660e01b81526004016106e8929190612798565b6020604051808303815f875af1158015610704573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107289190612864565b90505f6107358260801d90565b600f0b61074190612736565b90505f61074e83600f0b90565b84516020015160408087015190517f0b0d9c0900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff928316600482015290821660248201526fffffffffffffffffffffffffffffffff929092166044830181905292507f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409511690630b0d9c09906064015f604051808303815f87803b158015610805575f5ffd5b505af1158015610817573d5f5f3e3d5ffd5b505050507f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095173ffffffffffffffffffffffffffffffffffffffff166311da60b4836040518263ffffffff1660e01b815260040160206040518083038185885af1158015610886573d5f5f3e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906108ab9190612864565b5060408051602081018490529081018290526060016040516020818303038152906040529450505050505b92915050565b5f5f5f5f6108e8611256565b660ffcb9e57d400034101561093d576040517fc956dda2000000000000000000000000000000000000000000000000000000008152346004820152660ffcb9e57d400060248201526044015b60405180910390fd5b61094685611297565b5f610951868061287b565b61095e602089018961287b565b60126b033b2e3c9fd0803ce80000003060405161097a90612414565b61098a979695949392919061292a565b604051809103905ff0801580156109a3573d5f5f3e3d5ffd5b506040805160a0810182525f815273ffffffffffffffffffffffffffffffffffffffff8084166020830152628000009282019290925260c860608201527f00000000000000000000000023739445e76d83a40f87fe2fd6a53e73badf60cc9091166080820152909550859150610a1a8160a0902090565b94507f00000000000000000000000058daec3116aae6d93017baaea7749052e8a04fa773ffffffffffffffffffffffffffffffffffffffff166375794a3c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a85573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa99190612864565b93505f7f00000000000000000000000058daec3116aae6d93017baaea7749052e8a04fa77f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095186845f015185602001513360025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610d05604051610b2a90612421565b73ffffffffffffffffffffffffffffffffffffffff98891681529688166020880152604087019590955292861660608601529085166080850152841660a084015290921660c082015261ffff90911660e082015261010001604051809103905ff080158015610b9b573d5f5f3e3d5ffd5b5093508390505f610bb260c08a0160a08b01612989565b63ffffffff1615610bd257610bcd60a08a0160808b016129ac565b610be2565b610be260808a0160608b016129ac565b90507f00000000000000000000000023739445e76d83a40f87fe2fd6a53e73badf60cc73ffffffffffffffffffffffffffffffffffffffff1663d281a8ba8833848d6060016020810190610c3691906129ac565b8e60a0016020810190610c499190612989565b8f60c0016020810190610c5c9190612989565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b168152600481019690965273ffffffffffffffffffffffffffffffffffffffff948516602487015261ffff938416604487015292909116606485015263ffffffff90811660848501521660a4830152881660c482015260e4015f604051808303815f87803b158015610cf5575f5ffd5b505af1158015610d07573d5f5f3e3d5ffd5b505073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e40951169150636276cbbe905084610d62610d5d60608e0160408f016129cd565b6116d0565b6040518363ffffffff1660e01b8152600401610d7f9291906129e8565b6020604051808303815f875af1158015610d9b573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dbf9190612a8e565b50610ddb83610dd460608c0160408d016129cd565b8a886119cd565b6040805173ffffffffffffffffffffffffffffffffffffffff8a8116825287166020820152908101879052339088907fe901fbd6823df116d8944e0ccc97c1204fa76994d3213880c1f5080bd66dab519060600160405180910390a3660ffcb9e57d4000341115610e6157610e618388610e5c660ffcb9e57d400034612aa9565b611d8f565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8616906370a0823190602401602060405180830381865afa158015610ecb573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eef9190612864565b90508015610f1857610f1873ffffffffffffffffffffffffffffffffffffffff8a163383611fea565b5f7f000000000000000000000000937542815377c160861addaadd5e4a793b252a7473ffffffffffffffffffffffffffffffffffffffff16660ffcb9e57d40006040515f6040518083038185875af1925050503d805f8114610f95576040519150601f19603f3d011682016040523d82523d5f602084013e610f9a565b606091505b5050905080610fd5576040517f3c2285ca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051660ffcb9e57d4000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000937542815377c160861addaadd5e4a793b252a74169033907f4cef2d27cdf43d743c3c66401182e93989938e77d1be10f3ab9e6afdf799f8399060200160405180910390a350505050505061105860015f55565b9193509193565b61106761118d565b73ffffffffffffffffffffffffffffffffffffffff81166110b4576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f91e1f7681cd20e140c1b9ca733d5112019e41d298b69cd2fcf1f28db37f16dad905f90a35050565b61113261118d565b73ffffffffffffffffffffffffffffffffffffffff8116611181576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f6004820152602401610934565b61118a816111e0565b50565b60015473ffffffffffffffffffffffffffffffffffffffff1633146105b8576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610934565b6001805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60025f5403611291576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b7f00000000000000000000000000000000000000000000000000000000000230f060020b6112cb60608301604084016129cd565b60020b128061130e57507f0000000000000000000000000000000000000000000000000000000000031a8860020b61130960608301604084016129cd565b60020b135b156113ac5761132360608201604083016129cd565b6040517f0cb005eb000000000000000000000000000000000000000000000000000000008152600291820b60048201527f00000000000000000000000000000000000000000000000000000000000230f0820b60248201527f0000000000000000000000000000000000000000000000000000000000031a8890910b6044820152606401610934565b60c86113be60608301604084016129cd565b6113c89190612ae9565b60020b15611420576113e060608201604083016129cd565b6040517feacb2c9200000000000000000000000000000000000000000000000000000000815260029190910b600482015260c86024820152604401610934565b606461143260808301606084016129ac565b61ffff16101561148c5761144c60808201606083016129ac565b6040517fa5ecb6a600000000000000000000000000000000000000000000000000000000815261ffff909116600482015260646024820152604401610934565b6101f461149f60808301606084016129ac565b61ffff1611156114fa576114b960808201606083016129ac565b6040517f5ccbf4a500000000000000000000000000000000000000000000000000000000815261ffff90911660048201526101f46024820152604401610934565b610e1061150d60c0830160a08401612989565b63ffffffff16111561156c5761152960c0820160a08301612989565b6040517f504d684e00000000000000000000000000000000000000000000000000000000815263ffffffff9091166004820152610e106024820152604401610934565b61157c60c0820160a08301612989565b63ffffffff161561168357610fa061159a60a08301608084016129ac565b61ffff1611156115f5576115b460a08201608083016129ac565b6040517f5ccbf4a500000000000000000000000000000000000000000000000000000000815261ffff9091166004820152610fa06024820152604401610934565b61160560808201606083016129ac565b61ffff1661161960a08301608084016129ac565b61ffff1610156116835761163360a08201608083016129ac565b61164360808301606084016129ac565b6040517f5145779000000000000000000000000000000000000000000000000000000000815261ffff928316600482015291166024820152604401610934565b61169360e0820160c08301612989565b63ffffffff161561118a576040517ffa621b2000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60020b5f60ff82901d80830118620d89e8811115611712576117127f8b86327a0000000000000000000000000000000000000000000000000000000084612070565b7001fffcb933bd6fad37aa2d162d1a594001600182160270010000000000000000000000000000000018600282161561175b576ffff97272373d413259a46990580e213a0260801c5b600482161561177a576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615611799576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b60108216156117b8576fffcb9843d60f6159c9db58835c9266440260801c5b60208216156117d7576fff973b41fa98c081472e6896dfb254c00260801c5b60408216156117f6576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615611815576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615611835576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615611855576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615611875576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615611895576fe7159475a2c29b7443b29c7fa6e889d90260801c5b6110008216156118b5576fd097f3bdfd2022b8845ad8f792aa58250260801c5b6120008216156118d5576fa9f746462d870fdf8a65dc1f90e061e50260801c5b6140008216156118f5576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615611915576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615611936576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615611956576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615611975576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615611992576b048a170391f7dc42444e8fa20260801c5b5f8413156119bd577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff045b63ffffffff0160201c9392505050565b5f6119d860c861207f565b90505f611a026119e7836116d0565b6119f0876116d0565b6b033b2e3c9fd0803ce80000006120bc565b9050611a5173ffffffffffffffffffffffffffffffffffffffff85167f000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba36b033b2e3c9fd0803ce8000000612137565b6040517f87517c4500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301527f00000000000000000000000058daec3116aae6d93017baaea7749052e8a04fa7811660248301526b033b2e3c9fd0803ce8000000604483015265ffffffffffff421660648301527f000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba316906387517c45906084015f604051808303815f87803b158015611b1f575f5ffd5b505af1158015611b31573d5f5f3e3d5ffd5b5050604080517f020000000000000000000000000000000000000000000000000000000000000060208201527f0d000000000000000000000000000000000000000000000000000000000000006021820152815160028183038101825260228301818152608284019094529094505f9350906042015b6060815260200190600190039081611ba757505060408051602080820183525f8083529251939450611c05938c9389938d936fffffffffffffffffffffffffffffffff8b16936b033b2e3c9fd0803ce8000000928e92909101612b2f565b604051602081830303815290604052815f81518110611c2657611c26612c3b565b6020026020010181905250875f01518860200151604051602001611c6d92919073ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b60405160208183030381529060405281600181518110611c8f57611c8f612c3b565b60200260200101819052507f00000000000000000000000058daec3116aae6d93017baaea7749052e8a04fa773ffffffffffffffffffffffffffffffffffffffff1663dd46508f8383604051602001611ce9929190612c68565b604051602081830303815290604052426040518363ffffffff1660e01b8152600401611d16929190612cfb565b5f604051808303815f87803b158015611d2d575f5ffd5b505af1158015611d3f573d5f5f3e3d5ffd5b50611d859250505073ffffffffffffffffffffffffffffffffffffffff87167f000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba35f612137565b5050505050505050565b60408051606080820183528582526020808301858152339385019384528451885173ffffffffffffffffffffffffffffffffffffffff90811682850152928901518316818701529488015162ffffff16858401529187015160020b608080860191909152870151811660a0850152905160c08401529051811660e08301525f9182917f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095116906348c8949190610100016040516020818303038152906040526040518263ffffffff1660e01b8152600401611e6991906124e8565b5f604051808303815f875af1158015611e84573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611ec99190810190612d1c565b806020019051810190611edc9190612dce565b91509150805f03611f19576040517fa74a558500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81831115611fa8575f33611f2d8486612aa9565b6040515f81818185875af1925050503d805f8114611f66576040519150601f19603f3d011682016040523d82523d5f602084013e611f6b565b606091505b5050905080611fa6576040517ff0c49d4400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b604080518381526020810183905285917fbad0edeecc4024f79b12d622d3eedca76ed49cf1768589215953d37812c1d296910160405180910390a25050505050565b60405173ffffffffffffffffffffffffffffffffffffffff83811660248301526044820183905261206b91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612214565b505050565b815f528060020b60045260245ffd5b5f81600281900b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff27618816120b4576120b4612abc565b050292915050565b5f8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1611156120f5579192915b61212d612128836c0100000000000000000000000087870373ffffffffffffffffffffffffffffffffffffffff166122b3565b61236e565b90505b9392505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b3000000000000000000000000000000000000000000000000000000001790526121c384826123b6565b61220e5760405173ffffffffffffffffffffffffffffffffffffffff84811660248301525f604483015261220491869182169063095ea7b390606401612024565b61220e8482612214565b50505050565b5f5f60205f8451602086015f885af180612233576040513d5f823e3d81fd5b50505f513d9150811561224a578060011415612264565b73ffffffffffffffffffffffffffffffffffffffff84163b155b1561220e576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610934565b5f838302817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff858709828110838203039150508084116122f1575f5ffd5b805f0361230357508290049050612130565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b806fffffffffffffffffffffffffffffffff811681146123b1576123b17f93dafdf10000000000000000000000000000000000000000000000000000000061240c565b919050565b5f5f5f5f60205f8651602088015f8a5af192503d91505f519050828015612402575081156123e75780600114612402565b5f8673ffffffffffffffffffffffffffffffffffffffff163b115b9695505050505050565b805f5260045ffd5b610ecd80612df183390190565b611e0680613cbe83390190565b5f5f6020838503121561243f575f5ffd5b823567ffffffffffffffff811115612455575f5ffd5b8301601f81018513612465575f5ffd5b803567ffffffffffffffff81111561247b575f5ffd5b85602082840101111561248c575f5ffd5b6020919091019590945092505050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f612130602083018461249c565b5f6020828403121561250a575f5ffd5b813567ffffffffffffffff811115612520575f5ffd5b820160e08185031215612130575f5ffd5b73ffffffffffffffffffffffffffffffffffffffff8116811461118a575f5ffd5b80356123b181612531565b5f6020828403121561256d575f5ffd5b813561213081612531565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516060810167ffffffffffffffff811182821017156125c8576125c8612578565b60405290565b60405160a0810167ffffffffffffffff811182821017156125c8576125c8612578565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561263857612638612578565b604052919050565b8060020b811461118a575f5ffd5b5f81830360e081128015612660575f5ffd5b506126696125a5565b60a0821215612676575f5ffd5b61267e6125ce565b9150833561268b81612531565b8252602084013561269b81612531565b6020830152604084013562ffffff811681146126b5575f5ffd5b604083015260608401356126c881612640565b606083015260808401356126db81612531565b608083015290815260a083013560208201819052906126fc60c08501612552565b6040820152949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7f8000000000000000000000000000000000000000000000000000000000000000820361276657612766612709565b505f0390565b73ffffffffffffffffffffffffffffffffffffffff81811683821601908111156108d6576108d6612709565b612817818473ffffffffffffffffffffffffffffffffffffffff815116825273ffffffffffffffffffffffffffffffffffffffff602082015116602083015262ffffff6040820151166040830152606081015160020b606083015273ffffffffffffffffffffffffffffffffffffffff60808201511660808301525050565b8151151560a0820152602082015160c082015260409091015173ffffffffffffffffffffffffffffffffffffffff1660e082015261012061010082018190525f9082015261014001919050565b5f60208284031215612874575f5ffd5b5051919050565b5f5f83357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126128ae575f5ffd5b83018035915067ffffffffffffffff8211156128c8575f5ffd5b6020019150368190038213156128dc575f5ffd5b9250929050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60a081525f61293d60a08301898b6128e3565b828103602084015261295081888a6128e3565b60ff9690961660408401525050606081019290925273ffffffffffffffffffffffffffffffffffffffff16608090910152949350505050565b5f60208284031215612999575f5ffd5b813563ffffffff81168114612130575f5ffd5b5f602082840312156129bc575f5ffd5b813561ffff81168114612130575f5ffd5b5f602082840312156129dd575f5ffd5b813561213081612640565b60c08101612a6b828573ffffffffffffffffffffffffffffffffffffffff815116825273ffffffffffffffffffffffffffffffffffffffff602082015116602083015262ffffff6040820151166040830152606081015160020b606083015273ffffffffffffffffffffffffffffffffffffffff60808201511660808301525050565b73ffffffffffffffffffffffffffffffffffffffff831660a08301529392505050565b5f60208284031215612a9e575f5ffd5b815161213081612640565b818103818111156108d6576108d6612709565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f8260020b80612b20577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b808360020b0791505092915050565b612bae818a73ffffffffffffffffffffffffffffffffffffffff815116825273ffffffffffffffffffffffffffffffffffffffff602082015116602083015262ffffff6040820151166040830152606081015160020b606083015273ffffffffffffffffffffffffffffffffffffffff60808201511660808301525050565b8760020b60a08201528660020b60c08201528560e08201526fffffffffffffffffffffffffffffffff85166101008201526fffffffffffffffffffffffffffffffff841661012082015273ffffffffffffffffffffffffffffffffffffffff83166101408201526101806101608201525f612c2d61018083018461249c565b9a9950505050505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b604081525f612c7a604083018561249c565b828103602084015280845180835260208301915060208160051b840101602087015f5b83811015612ced577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018552612cd783835161249c565b6020958601959093509190910190600101612c9d565b509098975050505050505050565b604081525f612d0d604083018561249c565b90508260208301529392505050565b5f60208284031215612d2c575f5ffd5b815167ffffffffffffffff811115612d42575f5ffd5b8201601f81018413612d52575f5ffd5b805167ffffffffffffffff811115612d6c57612d6c612578565b612d9d60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016125f1565b818152856020838501011115612db1575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b5f5f60408385031215612ddf575f5ffd5b50508051602090910151909290915056fe60a060405234801561000f575f5ffd5b50604051610ecd380380610ecd83398101604081905261002e916102f3565b8484600361003c838261041c565b506004610049828261041c565b5050506001600160a01b03811661009c5760405162461bcd60e51b815260206004820152601260248201527113128e881e995c9bc81c9958da5c1a595b9d60721b60448201526064015b60405180910390fd5b5f82116100dd5760405162461bcd60e51b815260206004820152600f60248201526e4c4a3a207a65726f20737570706c7960881b6044820152606401610093565b60ff83166080526100ee81836100f8565b50505050506104fb565b6001600160a01b0382166101215760405163ec442f0560e01b81525f6004820152602401610093565b61012c5f8383610130565b5050565b6001600160a01b03831661015a578060025f82825461014f91906104d6565b909155506101ca9050565b6001600160a01b0383165f90815260208190526040902054818110156101ac5760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610093565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b0382166101e657600280548290039055610204565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161024991815260200190565b60405180910390a3505050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112610279575f5ffd5b81516001600160401b0381111561029257610292610256565b604051601f8201601f19908116603f011681016001600160401b03811182821017156102c0576102c0610256565b6040528181528382016020018510156102d7575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f5f5f5f5f60a08688031215610307575f5ffd5b85516001600160401b0381111561031c575f5ffd5b6103288882890161026a565b602088015190965090506001600160401b03811115610345575f5ffd5b6103518882890161026a565b945050604086015160ff81168114610367575f5ffd5b6060870151608088015191945092506001600160a01b038116811461038a575f5ffd5b809150509295509295909350565b600181811c908216806103ac57607f821691505b6020821081036103ca57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561041757805f5260205f20601f840160051c810160208510156103f55750805b601f840160051c820191505b81811015610414575f8155600101610401565b50505b505050565b81516001600160401b0381111561043557610435610256565b610449816104438454610398565b846103d0565b6020601f82116001811461047b575f83156104645750848201515b5f19600385901b1c1916600184901b178455610414565b5f84815260208120601f198516915b828110156104aa578785015182556020948501946001909201910161048a565b50848210156104c757868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b808201808211156104f557634e487b7160e01b5f52601160045260245ffd5b92915050565b6080516109ba6105135f395f61013501526109ba5ff3fe608060405234801561000f575f5ffd5b50600436106100c4575f3560e01c806351431d4f1161007d57806395d89b411161005857806395d89b411461020c578063a9059cbb14610214578063dd62ed3e14610227575f5ffd5b806351431d4f1461015f57806364e5229f1461019b57806370a08231146101d7575f5ffd5b806318160ddd116100ad57806318160ddd1461010957806323b872dd1461011b578063313ce5671461012e575f5ffd5b806306fdde03146100c8578063095ea7b3146100e6575b5f5ffd5b6100d061026c565b6040516100dd91906107cd565b60405180910390f35b6100f96100f4366004610848565b6102fc565b60405190151581526020016100dd565b6002545b6040519081526020016100dd565b6100f9610129366004610870565b610315565b60405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020016100dd565b6100d06040518060400160405280601581526020017f68747470733a2f2f6c6974746c656a6f686e2e6767000000000000000000000081525081565b6100d06040518060400160405280600881526020017f4f70656e42656c6c00000000000000000000000000000000000000000000000081525081565b61010d6101e53660046108aa565b73ffffffffffffffffffffffffffffffffffffffff165f9081526020819052604090205490565b6100d0610338565b6100f9610222366004610848565b610347565b61010d6102353660046108ca565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205490565b60606003805461027b906108fb565b80601f01602080910402602001604051908101604052809291908181526020018280546102a7906108fb565b80156102f25780601f106102c9576101008083540402835291602001916102f2565b820191905f5260205f20905b8154815290600101906020018083116102d557829003601f168201915b5050505050905090565b5f33610309818585610354565b60019150505b92915050565b5f33610322858285610366565b61032d858585610438565b506001949350505050565b60606004805461027b906108fb565b5f33610309818585610438565b61036183838360016104e1565b505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146104325781811015610424576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101829052604481018390526064015b60405180910390fd5b61043284848484035f6104e1565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610487576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081525f600482015260240161041b565b73ffffffffffffffffffffffffffffffffffffffff82166104d6576040517fec442f050000000000000000000000000000000000000000000000000000000081525f600482015260240161041b565b610361838383610626565b73ffffffffffffffffffffffffffffffffffffffff8416610530576040517fe602df050000000000000000000000000000000000000000000000000000000081525f600482015260240161041b565b73ffffffffffffffffffffffffffffffffffffffff831661057f576040517f94280d620000000000000000000000000000000000000000000000000000000081525f600482015260240161041b565b73ffffffffffffffffffffffffffffffffffffffff8085165f9081526001602090815260408083209387168352929052208290558015610432578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161061891815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff831661065d578060025f828254610652919061094c565b9091555061070d9050565b73ffffffffffffffffffffffffffffffffffffffff83165f90815260208190526040902054818110156106e2576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602481018290526044810183905260640161041b565b73ffffffffffffffffffffffffffffffffffffffff84165f9081526020819052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff821661073657600280548290039055610761565b73ffffffffffffffffffffffffffffffffffffffff82165f9081526020819052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516107c091815260200190565b60405180910390a3505050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610843575f5ffd5b919050565b5f5f60408385031215610859575f5ffd5b61086283610820565b946020939093013593505050565b5f5f5f60608486031215610882575f5ffd5b61088b84610820565b925061089960208501610820565b929592945050506040919091013590565b5f602082840312156108ba575f5ffd5b6108c382610820565b9392505050565b5f5f604083850312156108db575f5ffd5b6108e483610820565b91506108f260208401610820565b90509250929050565b600181811c9082168061090f57607f821691505b602082108103610946577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b8082018082111561030f577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffdfea264697066735822122014980c0624aeb7a437044617872b3df2a6dcfe3ece23f28f24a143907d5cecc564736f6c634300081c0033610180604052348015610010575f5ffd5b50604051611e06380380611e0683398101604081905261002f91610145565b60015f556001600160a01b038816158061005057506001600160a01b038716155b8061006257506001600160a01b038316155b8061007457506001600160a01b038216155b156100925760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0384166100b95760405163d92e233d60e01b815260040160405180910390fd5b61ffff811615806100d0575061271061ffff821610155b156100ee576040516311c56c8960e01b815260040160405180910390fd5b6001600160a01b0397881660805295871660a05260c09490945291851661014052841661016052831660e0529091166101005261ffff16610120526101ec565b6001600160a01b0381168114610142575f5ffd5b50565b5f5f5f5f5f5f5f5f610100898b03121561015d575f5ffd5b88516101688161012e565b60208a01519098506101798161012e565b60408a015160608b015191985096506101918161012e565b60808a01519095506101a28161012e565b60a08a01519094506101b38161012e565b60c08a01519093506101c48161012e565b60e08a015190925061ffff811681146101db575f5ffd5b809150509295985092959890939650565b60805160a05160c05160e05161010051610120516101405161016051611b106102f65f395f8181610160015281816108a9015281816109e901528181610b770152610bf301525f81816102e6015281816107c80152818161087d015281816109c801528181610b430152610bca01525f818161024c015261104301525f81816103190152818161046a01528181610f95015281816110e4015261117d01525f81816101030152818161042901528181610fd50152818161122901526112c201525f818161039f015261096f01525f81816103d20152818161067f01528181610721015281816107fd01528181610de40152610e6f01525f81816102b30152610a750152611b105ff3fe6080604052600436106100e7575f3560e01c806379f1232b11610087578063c879657211610057578063c87965721461037a578063ceefe5d11461038e578063dc4c90d3146103c1578063e1a45218146103f4575f5ffd5b806379f1232b146102d55780638ce744261461030857806391dd73461461033b578063a0cf0aea14610367575f5ffd5b806328079e4a116100c257806328079e4a146101f757806337ed3f1e1461023b57806351cff8d914610281578063791b98bc146102a2575f5ffd5b806302d05d3f146100f257806310d737b81461014f578063150b7a0214610182575f5ffd5b366100ee57005b5f5ffd5b3480156100fd575f5ffd5b506101257f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561015a575f5ffd5b506101257f000000000000000000000000000000000000000000000000000000000000000081565b34801561018d575f5ffd5b506101c661019c36600461162d565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610146565b348015610202575f5ffd5b5061022d610211366004611697565b600160209081525f928352604080842090915290825290205481565b604051908152602001610146565b348015610246575f5ffd5b5061026e7f000000000000000000000000000000000000000000000000000000000000000081565b60405161ffff9091168152602001610146565b34801561028c575f5ffd5b506102a061029b3660046116c8565b610409565b005b3480156102ad575f5ffd5b506101257f000000000000000000000000000000000000000000000000000000000000000081565b3480156102e0575f5ffd5b506101257f000000000000000000000000000000000000000000000000000000000000000081565b348015610313575f5ffd5b506101257f000000000000000000000000000000000000000000000000000000000000000081565b348015610346575f5ffd5b5061035a6103553660046116e1565b610665565b604051610146919061176c565b348015610372575f5ffd5b506101255f81565b348015610385575f5ffd5b506102a061086f565b348015610399575f5ffd5b5061022d7f000000000000000000000000000000000000000000000000000000000000000081565b3480156103cc575f5ffd5b506101257f000000000000000000000000000000000000000000000000000000000000000081565b3480156103ff575f5ffd5b5061026e61271081565b610411610c26565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161480159061048d57503373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614155b156104c4576040517f37762a6d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b335f90815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff851684529091528120549081900361052e576040517f797dba5400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b335f90815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff861680855292528220919091556105ea576040515f90339083908381818185875af1925050503d805f81146105a4576040519150601f19603f3d011682016040523d82523d5f602084013e6105a9565b606091505b50509050806105e4576040517f6d963f8800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5061060b565b61060b73ffffffffffffffffffffffffffffffffffffffff83163383610c67565b60405181815273ffffffffffffffffffffffffffffffffffffffff83169033907fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb9060200160405180910390a35061066260015f55565b50565b60603373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106d6576040517fae18210a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6106e38385018561177e565b6040517ff5298aca0000000000000000000000000000000000000000000000000000000081523060048201525f6024820152604481018290529091507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063f5298aca906064015f604051808303815f87803b158015610777575f5ffd5b505af1158015610789573d5f5f3e3d5ffd5b50506040517f0b0d9c0900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152306024830152604482018590527f0000000000000000000000000000000000000000000000000000000000000000169250630b0d9c0991506064015f604051808303815f87803b158015610840575f5ffd5b505af1158015610852573d5f5f3e3d5ffd5b5050505060405180602001604052805f8152509150505b92915050565b610877610c26565b5f6108a17f0000000000000000000000000000000000000000000000000000000000000000610cf9565b90505f6108cd7f0000000000000000000000000000000000000000000000000000000000000000610cf9565b604080517f010000000000000000000000000000000000000000000000000000000000000060208201527f1100000000000000000000000000000000000000000000000000000000000000602182015281516002818303810182526022830181815260828401909452939450925f92916042015b606081526020019060019003908161094157505060408051602080820183525f808352925193945061099a937f0000000000000000000000000000000000000000000000000000000000000000939283928392016117c2565b604051602081830303815290604052815f815181106109bb576109bb61181b565b60200260200101819052507f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030604051602001610a469392919073ffffffffffffffffffffffffffffffffffffffff93841681529183166020830152909116604082015260600190565b60405160208183030381529060405281600181518110610a6857610a6861181b565b60200260200101819052507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dd46508f8383604051602001610ac2929190611848565b604051602081830303815290604052426040518363ffffffff1660e01b8152600401610aef9291906118db565b5f604051808303815f87803b158015610b06575f5ffd5b505af1158015610b18573d5f5f3e3d5ffd5b505050507f49d512bf9cb224241c05691e73eb9fab078cf350c7dbcbcf66788f1fc0cc8b0b84610b677f0000000000000000000000000000000000000000000000000000000000000000610cf9565b610b719190611929565b84610b9b7f0000000000000000000000000000000000000000000000000000000000000000610cf9565b610ba59190611929565b6040805192835260208301919091520160405180910390a1610bc5610dae565b610bee7f0000000000000000000000000000000000000000000000000000000000000000610f7e565b610c177f0000000000000000000000000000000000000000000000000000000000000000610f7e565b50505050610c2460015f55565b565b60025f5403610c61576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610cf4908490611369565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff821615610da7576040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015610d7e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610da2919061193c565b610869565b4792915050565b6040517efdd58e0000000000000000000000000000000000000000000000000000000081523060048201525f60248201819052907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169062fdd58e90604401602060405180830381865afa158015610e3d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e61919061193c565b9050805f03610e6d5750565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166348c8949182604051602001610ebc91815260200190565b6040516020818303038152906040526040518263ffffffff1660e01b8152600401610ee7919061176c565b5f604051808303815f875af1158015610f02573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610f479190810190611953565b506040518181527f5206675f4abbe25801efb4cd9996c887b1529790b0ccb5b8e1d3598df9e330249060200160405180910390a150565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081165f908152600160208181526040808420868616808652908352818520547f00000000000000000000000000000000000000000000000000000000000000009096168552928252808420928452919052812054909161101391611a43565b90505f61101f83610cf9565b905081811161102d57505050565b5f6110388383611929565b90505f61271061106c7f000000000000000000000000000000000000000000000000000000000000000061ffff1684611a56565b6110769190611a6d565b90505f6110838284611929565b604080518281526020810185905291925073ffffffffffffffffffffffffffffffffffffffff8816917f60ce3cc2d133631eac66a476f14997a9fa682bd05a60dd993cf02285822d78d8910160405180910390a2811561121c575f611109877f000000000000000000000000000000000000000000000000000000000000000085611412565b90508015611166578673ffffffffffffffffffffffffffffffffffffffff167f4c96bcd0193ab402469b79efcedd5b112d7bfe5ef05f28e3299609128738ce1e8460405161115991815260200190565b60405180910390a261121a565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081165f908152600160209081526040808320938b16835292905290812080548592906111c9908490611a43565b909155505060405183815273ffffffffffffffffffffffffffffffffffffffff8816907fb1dd31259279c40f03801f2a0220c0cb7e5859eb0a0205a4b5d75a934b4475e29060200160405180910390a25b505b8015611361575f61124e877f000000000000000000000000000000000000000000000000000000000000000084611412565b905080156112ab578673ffffffffffffffffffffffffffffffffffffffff167f9f50225323bf3e91d345b270e096ff263d9706dd4521831da2433b7d3c5528518360405161129e91815260200190565b60405180910390a261135f565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081165f908152600160209081526040808320938b168352929052908120805484929061130e908490611a43565b909155505060405182815273ffffffffffffffffffffffffffffffffffffffff8816907f015d52525df6c50f9ece94e30e1754d3615b73e0487f9bb51a055a0ef1b0befb9060200160405180910390a25b505b505050505050565b5f5f60205f8451602086015f885af180611388576040513d5f823e3d81fd5b50505f513d9150811561139f5780600114156113b9565b73ffffffffffffffffffffffffffffffffffffffff84163b155b1561140c576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260240160405180910390fd5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff841661149a575f8373ffffffffffffffffffffffffffffffffffffffff168361c350906040515f60405180830381858888f193505050503d805f8114611489576040519150601f19603f3d011682016040523d82523d5f602084013e61148e565b606091505b509092506115b9915050565b60405173ffffffffffffffffffffffffffffffffffffffff8481166024830152604482018490525f918291871690606401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790525161154c9190611aa5565b5f604051808303815f865af19150503d805f8114611585576040519150601f19603f3d011682016040523d82523d5f602084013e61158a565b606091505b50915091508180156115b45750805115806115b45750808060200190518101906115b49190611abb565b925050505b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146115e3575f5ffd5b919050565b5f5f83601f8401126115f8575f5ffd5b50813567ffffffffffffffff81111561160f575f5ffd5b602083019150836020828501011115611626575f5ffd5b9250929050565b5f5f5f5f5f60808688031215611641575f5ffd5b61164a866115c0565b9450611658602087016115c0565b935060408601359250606086013567ffffffffffffffff81111561167a575f5ffd5b611686888289016115e8565b969995985093965092949392505050565b5f5f604083850312156116a8575f5ffd5b6116b1836115c0565b91506116bf602084016115c0565b90509250929050565b5f602082840312156116d8575f5ffd5b6115b9826115c0565b5f5f602083850312156116f2575f5ffd5b823567ffffffffffffffff811115611708575f5ffd5b611714858286016115e8565b90969095509350505050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f6115b96020830184611720565b5f6020828403121561178e575f5ffd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b8581528460208201526fffffffffffffffffffffffffffffffff841660408201526fffffffffffffffffffffffffffffffff8316606082015260a060808201525f61181060a0830184611720565b979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b604081525f61185a6040830185611720565b828103602084015280845180835260208301915060208160051b840101602087015f5b838110156118cd577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08684030185526118b7838351611720565b602095860195909350919091019060010161187d565b509098975050505050505050565b604081525f6118ed6040830185611720565b90508260208301529392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b81810381811115610869576108696118fc565b5f6020828403121561194c575f5ffd5b5051919050565b5f60208284031215611963575f5ffd5b815167ffffffffffffffff811115611979575f5ffd5b8201601f81018413611989575f5ffd5b805167ffffffffffffffff8111156119a3576119a3611795565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff82111715611a0f57611a0f611795565b604052818152828201602001861015611a26575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b80820180821115610869576108696118fc565b8082028115828204841417610869576108696118fc565b5f82611aa0577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b5f82518060208501845e5f920191825250919050565b5f60208284031215611acb575f5ffd5b815180151581146115b9575f5ffdfea26469706673582212208a3b3b1c408acf093c3c38774f8691fc93410bf4609349f663c3fdadb2fe263b64736f6c634300081c0033a26469706673582212204cc873ede9768f30fd7be87eb78eef7db89c062ebb605cef8c0009b5f8e8797d64736f6c634300081c0033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| DIH | 1 | $0.0000102 | $0 |
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x866e5c…6c1d1d | 30 days agoSun, 19 Jul 2026 01:41:22 UTC | 0x4cef2d…f839 | [0] 0x000000000000…770e1fa7 [1] 0x000000000000…3b252a74 data: 0x000000000000000000…e57d4000 |
| 0x866e5c…6c1d1d | 30 days agoSun, 19 Jul 2026 01:41:22 UTC | 0xbad0ed…d296 | [0] 0xb45cd346e2a4…cbb4ce34 data: 0x000000000000000000…ce851759 |
| 0x866e5c…6c1d1d | 30 days agoSun, 19 Jul 2026 01:41:22 UTC | 0xe901fb…ab51 | [0] 0xb45cd346e2a4…cbb4ce34 [1] 0x000000000000…770e1fa7 data: 0x000000000000000000…0002dc0b |
| 0x36e328…c9b13c | 32 days agoThu, 16 Jul 2026 16:07:50 UTC | 0x4cef2d…f839 | [0] 0x000000000000…7b9482b7 [1] 0x000000000000…3b252a74 data: 0x000000000000000000…e57d4000 |
| 0x36e328…c9b13c | 32 days agoThu, 16 Jul 2026 16:07:50 UTC | 0xbad0ed…d296 | [0] 0xeca14510690c…2fbae857 data: 0x000000000000000000…8d931d25 |
| 0x36e328…c9b13c | 32 days agoThu, 16 Jul 2026 16:07:50 UTC | 0xe901fb…ab51 | [0] 0xeca14510690c…2fbae857 [1] 0x000000000000…7b9482b7 data: 0x000000000000000000…00022bf8 |
| 0x08b38f…68dfdd | 37 days agoSat, 11 Jul 2026 21:46:44 UTC | 0x4cef2d…f839 | [0] 0x000000000000…86cb5e6d [1] 0x000000000000…3b252a74 data: 0x000000000000000000…e57d4000 |
| 0x08b38f…68dfdd | 37 days agoSat, 11 Jul 2026 21:46:44 UTC | 0xbad0ed…d296 | [0] 0xd5cd5f376a34…3236574b data: 0x000000000000000000…d70f7c97 |
| 0x08b38f…68dfdd | 37 days agoSat, 11 Jul 2026 21:46:44 UTC | 0xe901fb…ab51 | [0] 0xd5cd5f376a34…3236574b [1] 0x000000000000…86cb5e6d data: 0x000000000000000000…0000c107 |
| 0xadba78…ae04ed | 37 days agoSat, 11 Jul 2026 18:58:11 UTC | 0x8be007…57e0 | [0] 0x000000000000…00000000 [1] 0x000000000000…86cb5e6d |
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x93f8c041…dc348c | Transfer | 19,140,352 | 23 days agoSat, 25 Jul 2026 16:06:47 UTC | 0xcaf7…5d11 | IN | 0x3797…d916 | $0.001 DIH | ||
| 0x866e5c8d…6c1d1d | Transfer | 13,454,359 | 30 days agoSun, 19 Jul 2026 01:41:22 UTC | 0x3797…d916 | OUT | 0x0647…1fa7 | 0.000000 KEK | Kekistan (KEK) | |
| 0x866e5c8d…6c1d1d | Transfer | 13,454,359 | 30 days agoSun, 19 Jul 2026 01:41:22 UTC | 0x3797…d916 | OUT | 0x8366…0951 | 1,000,000,000.000000 KEK | Kekistan (KEK) | |
| 0x866e5c8d…6c1d1d | Transfer | 13,454,359 | 30 days agoSun, 19 Jul 2026 01:41:22 UTC | 0x0000…0000 | IN | 0x3797…d916 | 1,000,000,000.000000 KEK | Kekistan (KEK) | |
| 0x36e3289b…c9b13c | Transfer | 11,388,744 | 32 days agoThu, 16 Jul 2026 16:07:50 UTC | 0x3797…d916 | OUT | 0x0374…82b7 | 0.000000 BLOBO | Blobo (BLOBO) | |
| 0x36e3289b…c9b13c | Transfer | 11,388,744 | 32 days agoThu, 16 Jul 2026 16:07:50 UTC | 0x3797…d916 | OUT | 0x8366…0951 | 1,000,000,000.000000 BLOBO | Blobo (BLOBO) | |
| 0x36e3289b…c9b13c | Transfer | 11,388,744 | 32 days agoThu, 16 Jul 2026 16:07:50 UTC | 0x0000…0000 | IN | 0x3797…d916 | 1,000,000,000.000000 BLOBO | Blobo (BLOBO) | |
| 0x08b38fdb…68dfdd | Transfer | 7,277,378 | 37 days agoSat, 11 Jul 2026 21:46:44 UTC | 0x3797…d916 | OUT | 0x5d49…5e6d | 0.000000 LJCAN1 | LittleJohn Custom Canary (LJCAN1) | |
| 0x08b38fdb…68dfdd | Transfer | 7,277,378 | 37 days agoSat, 11 Jul 2026 21:46:44 UTC | 0x3797…d916 | OUT | 0x8366…0951 | 1,000,000,000.000000 LJCAN1 | LittleJohn Custom Canary (LJCAN1) | |
| 0x08b38fdb…68dfdd | Transfer | 7,277,378 | 37 days agoSat, 11 Jul 2026 21:46:44 UTC | 0x0000…0000 | IN | 0x3797…d916 | 1,000,000,000.000000 LJCAN1 | LittleJohn Custom Canary (LJCAN1) |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x866e5c…6c1d1d | createLaunch | 13,454,359 | 30 days agoSun, 19 Jul 2026 01:41:22 UTC | 0x0647…1fa7 | IN | LaunchFactory | $255.730.1345 ETH | 0.00017057 | |
| 0x36e328…c9b13c | createLaunch | 11,388,744 | 32 days agoThu, 16 Jul 2026 16:07:50 UTC | 0x0374…82b7 | IN | LaunchFactory | $103.620.0545 ETH | 0.00017636 | |
| 0x08b38f…68dfdd | createLaunch | 7,277,378 | 37 days agoSat, 11 Jul 2026 21:46:44 UTC | 0x5d49…5e6d | IN | LaunchFactory | $10.460.0055 ETH | 0.00016182 |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 13,454,359 | 30 days agoSun, 19 Jul 2026 01:41:22 UTC | 0x866e5c…6c1d1d | CALL | createLaunch | 0x3797…d916 | OUT | 0x9375…2a74 | 0.0045 ETH |
| 13,454,359 | 30 days agoSun, 19 Jul 2026 01:41:22 UTC | 0x866e5c…6c1d1d | CALL | createLaunch | 0x3797…d916 | OUT | 0x8366…0951 | 0.13 ETH |
| 13,454,359 | 30 days agoSun, 19 Jul 2026 01:41:22 UTC | 0x866e5c…6c1d1d | CREATE | createLaunch | 0x3797…d916 | OUT | 0x3d27…4931 | 0 ETH |
| 13,454,359 | 30 days agoSun, 19 Jul 2026 01:41:22 UTC | 0x866e5c…6c1d1d | CREATE | createLaunch | 0x3797…d916 | OUT | 0x8396…0584 | 0 ETH |
| 11,388,744 | 32 days agoThu, 16 Jul 2026 16:07:50 UTC | 0x36e328…c9b13c | CALL | createLaunch | 0x3797…d916 | OUT | 0x9375…2a74 | 0.0045 ETH |
| 11,388,744 | 32 days agoThu, 16 Jul 2026 16:07:50 UTC | 0x36e328…c9b13c | CALL | createLaunch | 0x3797…d916 | OUT | 0x8366…0951 | 0.05 ETH |
| 11,388,744 | 32 days agoThu, 16 Jul 2026 16:07:50 UTC | 0x36e328…c9b13c | CREATE | createLaunch | 0x3797…d916 | OUT | 0xd1f1…1fc8 | 0 ETH |
| 11,388,744 | 32 days agoThu, 16 Jul 2026 16:07:50 UTC | 0x36e328…c9b13c | CREATE | createLaunch | 0x3797…d916 | OUT | 0x2231…17a3 | 0 ETH |
| 7,277,378 | 37 days agoSat, 11 Jul 2026 21:46:44 UTC | 0x08b38f…68dfdd | CALL | createLaunch | 0x3797…d916 | OUT | 0x9375…2a74 | 0.0045 ETH |
| 7,277,378 | 37 days agoSat, 11 Jul 2026 21:46:44 UTC | 0x08b38f…68dfdd | CALL | createLaunch | 0x3797…d916 | OUT | 0x8366…0951 | 0.001 ETH |
| 7,277,378 | 37 days agoSat, 11 Jul 2026 21:46:44 UTC | 0x08b38f…68dfdd | CREATE | createLaunch | 0x3797…d916 | OUT | 0xb87a…f2a6 | 0 ETH |
| 7,277,378 | 37 days agoSat, 11 Jul 2026 21:46:44 UTC | 0x08b38f…68dfdd | CREATE | createLaunch | 0x3797…d916 | OUT | 0xb806…52c9 | 0 ETH |
| 7,176,415 | 37 days agoSat, 11 Jul 2026 18:58:11 UTC | 0xadba78…ae04ed | CREATE2 | 0x61016060 | 0x3797…d916 | OUT | 0x2373…60cc | 0 ETH |