// SPDX-License-Identifier: MIT
pragma solidity 0.8.28;
import {FrothBurner} from "../../src/FrothBurner.sol";
import {UniswapV3SwapAdapter} from "../../src/UniswapV3SwapAdapter.sol";
import {BaseFrothMemeProtocolDeployer} from "./BaseFrothMemeProtocolDeployer.sol";
/// @dev Split out of FrothMemeProtocolDeployer04: embedding three contracts' creation
/// code pushed that deployer past the EIP-170 size limit (28,168 > 24,576 bytes),
/// which fails on a real broadcast even though unit tests don't enforce it.
contract FrothMemeProtocolDeployer05 is BaseFrothMemeProtocolDeployer {
function deploy(InputParams memory _inputParams, OutputParams memory _outputParams)
external
override
onlyOrchestrator
returns (OutputParams memory)
{
_outputParams = _deployUniswapV3SwapAdapter(_inputParams, _outputParams);
_outputParams = _deployFrothBurner(_inputParams, _outputParams);
return _outputParams;
}
function configure(InputParams calldata _inputParams, OutputParams calldata _outputParams)
external
override
onlyOrchestrator
{
_configureUniswapV3SwapAdapter(_inputParams, _outputParams);
_configureFrothBurner(_inputParams, _outputParams);
}
/// @dev FROTH liquidity lives on Uniswap V3 on Robinhood, so the burner routes its
/// WETH -> FROTH buyback through a V2-to-V3 adapter pointed at SwapRouter02.
/// Skipped when no V3 router is configured (legacy/test V2-style setups).
function _deployUniswapV3SwapAdapter(InputParams memory inputParams, OutputParams memory outputParams)
internal
returns (OutputParams memory)
{
if (inputParams.uniswapV3SwapRouter == address(0)) {
return outputParams;
}
UniswapV3SwapAdapter adapter = new UniswapV3SwapAdapter(
inputParams.uniswapV3SwapRouter,
inputParams.initialAdminAndOperator,
inputParams.initialAdminAndOperator
);
outputParams.uniswapV3SwapAdapter = address(adapter);
return outputParams;
}
function _deployFrothBurner(InputParams memory inputParams, OutputParams memory outputParams)
internal
returns (OutputParams memory)
{
address burnerRouter = outputParams.uniswapV3SwapAdapter != address(0)
? outputParams.uniswapV3SwapAdapter
: inputParams.routerV2;
outputParams.frothBurner = address(
new FrothBurner(
burnerRouter,
inputParams.wrappedNative,
inputParams.froth,
inputParams.initialAdminAndOperator,
inputParams.initialAdminAndOperator,
inputParams.frothBurnerParams.minNativeAmount
)
);
return outputParams;
}
function _configureUniswapV3SwapAdapter(InputParams memory inputParams, OutputParams memory outputParams)
internal
{
if (outputParams.uniswapV3SwapAdapter == address(0)) {
return;
}
UniswapV3SwapAdapter adapter = UniswapV3SwapAdapter(outputParams.uniswapV3SwapAdapter);
// Pin the WETH/FROTH pool tier (0 keeps the adapter's 0.3% default)
if (inputParams.frothV3FeeTier != 0) {
adapter.setFeeTier(inputParams.wrappedNative, inputParams.froth, inputParams.frothV3FeeTier);
}
// Same role handover as the burner it fronts
if (inputParams.initialAdminAndOperator != inputParams.frothBurnerParams.finalOperator) {
adapter.grantRole(adapter.OPERATOR_ROLE(), inputParams.frothBurnerParams.finalOperator);
adapter.revokeRole(adapter.OPERATOR_ROLE(), inputParams.initialAdminAndOperator);
}
if (inputParams.initialAdminAndOperator != inputParams.frothBurnerParams.finalAdmin) {
adapter.grantRole(adapter.DEFAULT_ADMIN_ROLE(), inputParams.frothBurnerParams.finalAdmin);
adapter.revokeRole(adapter.DEFAULT_ADMIN_ROLE(), inputParams.initialAdminAndOperator);
}
}
function _configureFrothBurner(InputParams memory inputParams, OutputParams memory outputParams) internal {
FrothBurner frothBurner = FrothBurner(outputParams.frothBurner);
frothBurner.grantRole(frothBurner.OPERATOR_ROLE(), outputParams.feeDistributor);
if (inputParams.initialAdminAndOperator != inputParams.frothBurnerParams.finalOperator) {
frothBurner.grantRole(frothBurner.OPERATOR_ROLE(), inputParams.frothBurnerParams.finalOperator);
frothBurner.revokeRole(frothBurner.OPERATOR_ROLE(), inputParams.initialAdminAndOperator);
}
if (inputParams.initialAdminAndOperator != inputParams.frothBurnerParams.finalAdmin) {
frothBurner.grantRole(frothBurner.DEFAULT_ADMIN_ROLE(), inputParams.frothBurnerParams.finalAdmin);
frothBurner.revokeRole(frothBurner.DEFAULT_ADMIN_ROLE(), inputParams.initialAdminAndOperator);
}
}
function printOutputParams(OutputParams memory outputParams) external view {
_printOutputParams(outputParams);
}
}[
{
"name": "StringsInsufficientHexLength",
"type": "error",
"inputs": [
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "length",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "UnauthorizedOrchestrator",
"type": "error",
"inputs": [
{
"name": "caller",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "BPS_DENOMINATOR",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "CREATE_MEME_TOKEN_FEE_KEY",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "view"
},
{
"name": "CREATOR_FEES_ON_BUYING_KEY",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "view"
},
{
"name": "CREATOR_FEES_ON_SELLING_KEY",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "view"
},
{
"name": "DEFAULT_MIN_CONTRIBUTION_AMOUNT",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "GRADUATION_FEE_KEY",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "view"
},
{
"name": "MAX_TOTAL_CONTRIBUTION",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "MEME_TOKEN_CAP",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "MEME_TOKEN_LIQUIDITY_AMOUNT",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "RUG_FEE_KEY",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "view"
},
{
"name": "TRADE_BUY_FEE_KEY",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "view"
},
{
"name": "TRADE_SELL_FEE_KEY",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "view"
},
{
"name": "configure",
"type": "function",
"inputs": [
{
"name": "_inputParams",
"type": "tuple",
"components": [
{
"name": "initialAdminAndOperator",
"type": "address",
"internalType": "address"
},
{
"name": "bondingCurveFactoryParams",
"type": "tuple",
"components": [
{
"name": "finalAdmin",
"type": "address",
"internalType": "address"
},
{
"name": "finalOperator",
"type": "address",
"internalType": "address"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.BondingCurveFactoryParams"
},
{
"name": "bondingCurveParams",
"type": "tuple",
"components": [
{
"name": "initialVirtualNative",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "initialVirtualTokens",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "maxTokensSold",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "targetGraduation",
"type": "uint256",
"internalType": "uint256"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.BondingCurveParams"
},
{
"name": "A",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "B",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "wrappedNative",
"type": "address",
"internalType": "address"
},
{
"name": "routerV2",
"type": "address",
"internalType": "address"
},
{
"name": "frothSwapV1Router",
"type": "address",
"internalType": "address"
},
{
"name": "uniswapV3SwapRouter",
"type": "address",
"internalType": "address"
},
{
"name": "frothV3FeeTier",
"type": "uint24",
"internalType": "uint24"
},
{
"name": "froth",
"type": "address",
"internalType": "address"
},
{
"name": "feeDistributorParams",
"type": "tuple",
"components": [
{
"name": "finalAdmin",
"type": "address",
"internalType": "address"
},
{
"name": "finalOperator",
"type": "address",
"internalType": "address"
},
{
"name": "feeParams",
"type": "tuple",
"components": [
{
"name": "mintFee",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "creatorFeesOnBuyingFee",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "creatorFeesOnSellingFee",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "tradeBuyFee",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "tradeSellFee",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "graduationFee",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "rugFee",
"type": "uint256",
"internalType": "uint256"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.FeeParams"
},
{
"name": "twapPool",
"type": "address",
"internalType": "address"
},
{
"name": "teamWallet",
"type": "address",
"internalType": "address"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.FeeDistributorParams"
},
{
"name": "saleMemeTokenManagerParams",
"type": "tuple",
"components": [
{
"name": "finalAdmin",
"type": "address",
"internalType": "address"
},
{
"name": "finalOperator",
"type": "address",
"internalType": "address"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.SaleMemeTokenManagerParams"
},
{
"name": "frothMemeFactoryParams",
"type": "tuple",
"components": [
{
"name": "finalAdmin",
"type": "address",
"internalType": "address"
},
{
"name": "finalOperator",
"type": "address",
"internalType": "address"
},
{
"name": "paymentToken",
"type": "address",
"internalType": "address"
},
{
"name": "paymentAmount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "memeExpirationTime",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "minContributionAmount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "maxTotalContribution",
"type": "uint256",
"internalType": "uint256"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.FrothMemeFactoryParams"
},
{
"name": "creatorFeesClaimerParams",
"type": "tuple",
"components": [
{
"name": "finalAdmin",
"type": "address",
"internalType": "address"
},
{
"name": "finalOperator",
"type": "address",
"internalType": "address"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.CreatorFeesClaimerParams"
},
{
"name": "frothBurnerParams",
"type": "tuple",
"components": [
{
"name": "finalAdmin",
"type": "address",
"internalType": "address"
},
{
"name": "finalOperator",
"type": "address",
"internalType": "address"
},
{
"name": "minNativeAmount",
"type": "uint256",
"internalType": "uint256"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.FrothBurnerParams"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.InputParams"
},
{
"name": "_outputParams",
"type": "tuple",
"components": [
{
"name": "bondingCurveFactory",
"type": "address",
"internalType": "address"
},
{
"name": "bondingCurve",
"type": "address",
"internalType": "address"
},
{
"name": "feeDistributor",
"type": "address",
"internalType": "address"
},
{
"name": "twapPool",
"type": "address",
"internalType": "address"
},
{
"name": "saleMemeTokenManager",
"type": "address",
"internalType": "address"
},
{
"name": "frothMemeFactory",
"type": "address",
"internalType": "address"
},
{
"name": "creatorFeesClaimer",
"type": "address",
"internalType": "address"
},
{
"name": "frothBurner",
"type": "address",
"internalType": "address"
},
{
"name": "uniswapV3SwapAdapter",
"type": "address",
"internalType": "address"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.OutputParams"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "deploy",
"type": "function",
"inputs": [
{
"name": "_inputParams",
"type": "tuple",
"components": [
{
"name": "initialAdminAndOperator",
"type": "address",
"internalType": "address"
},
{
"name": "bondingCurveFactoryParams",
"type": "tuple",
"components": [
{
"name": "finalAdmin",
"type": "address",
"internalType": "address"
},
{
"name": "finalOperator",
"type": "address",
"internalType": "address"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.BondingCurveFactoryParams"
},
{
"name": "bondingCurveParams",
"type": "tuple",
"components": [
{
"name": "initialVirtualNative",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "initialVirtualTokens",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "maxTokensSold",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "targetGraduation",
"type": "uint256",
"internalType": "uint256"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.BondingCurveParams"
},
{
"name": "A",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "B",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "wrappedNative",
"type": "address",
"internalType": "address"
},
{
"name": "routerV2",
"type": "address",
"internalType": "address"
},
{
"name": "frothSwapV1Router",
"type": "address",
"internalType": "address"
},
{
"name": "uniswapV3SwapRouter",
"type": "address",
"internalType": "address"
},
{
"name": "frothV3FeeTier",
"type": "uint24",
"internalType": "uint24"
},
{
"name": "froth",
"type": "address",
"internalType": "address"
},
{
"name": "feeDistributorParams",
"type": "tuple",
"components": [
{
"name": "finalAdmin",
"type": "address",
"internalType": "address"
},
{
"name": "finalOperator",
"type": "address",
"internalType": "address"
},
{
"name": "feeParams",
"type": "tuple",
"components": [
{
"name": "mintFee",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "creatorFeesOnBuyingFee",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "creatorFeesOnSellingFee",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "tradeBuyFee",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "tradeSellFee",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "graduationFee",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "rugFee",
"type": "uint256",
"internalType": "uint256"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.FeeParams"
},
{
"name": "twapPool",
"type": "address",
"internalType": "address"
},
{
"name": "teamWallet",
"type": "address",
"internalType": "address"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.FeeDistributorParams"
},
{
"name": "saleMemeTokenManagerParams",
"type": "tuple",
"components": [
{
"name": "finalAdmin",
"type": "address",
"internalType": "address"
},
{
"name": "finalOperator",
"type": "address",
"internalType": "address"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.SaleMemeTokenManagerParams"
},
{
"name": "frothMemeFactoryParams",
"type": "tuple",
"components": [
{
"name": "finalAdmin",
"type": "address",
"internalType": "address"
},
{
"name": "finalOperator",
"type": "address",
"internalType": "address"
},
{
"name": "paymentToken",
"type": "address",
"internalType": "address"
},
{
"name": "paymentAmount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "memeExpirationTime",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "minContributionAmount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "maxTotalContribution",
"type": "uint256",
"internalType": "uint256"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.FrothMemeFactoryParams"
},
{
"name": "creatorFeesClaimerParams",
"type": "tuple",
"components": [
{
"name": "finalAdmin",
"type": "address",
"internalType": "address"
},
{
"name": "finalOperator",
"type": "address",
"internalType": "address"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.CreatorFeesClaimerParams"
},
{
"name": "frothBurnerParams",
"type": "tuple",
"components": [
{
"name": "finalAdmin",
"type": "address",
"internalType": "address"
},
{
"name": "finalOperator",
"type": "address",
"internalType": "address"
},
{
"name": "minNativeAmount",
"type": "uint256",
"internalType": "uint256"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.FrothBurnerParams"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.InputParams"
},
{
"name": "_outputParams",
"type": "tuple",
"components": [
{
"name": "bondingCurveFactory",
"type": "address",
"internalType": "address"
},
{
"name": "bondingCurve",
"type": "address",
"internalType": "address"
},
{
"name": "feeDistributor",
"type": "address",
"internalType": "address"
},
{
"name": "twapPool",
"type": "address",
"internalType": "address"
},
{
"name": "saleMemeTokenManager",
"type": "address",
"internalType": "address"
},
{
"name": "frothMemeFactory",
"type": "address",
"internalType": "address"
},
{
"name": "creatorFeesClaimer",
"type": "address",
"internalType": "address"
},
{
"name": "frothBurner",
"type": "address",
"internalType": "address"
},
{
"name": "uniswapV3SwapAdapter",
"type": "address",
"internalType": "address"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.OutputParams"
}
],
"outputs": [
{
"name": "",
"type": "tuple",
"components": [
{
"name": "bondingCurveFactory",
"type": "address",
"internalType": "address"
},
{
"name": "bondingCurve",
"type": "address",
"internalType": "address"
},
{
"name": "feeDistributor",
"type": "address",
"internalType": "address"
},
{
"name": "twapPool",
"type": "address",
"internalType": "address"
},
{
"name": "saleMemeTokenManager",
"type": "address",
"internalType": "address"
},
{
"name": "frothMemeFactory",
"type": "address",
"internalType": "address"
},
{
"name": "creatorFeesClaimer",
"type": "address",
"internalType": "address"
},
{
"name": "frothBurner",
"type": "address",
"internalType": "address"
},
{
"name": "uniswapV3SwapAdapter",
"type": "address",
"internalType": "address"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.OutputParams"
}
],
"stateMutability": "nonpayable"
},
{
"name": "printOutputParams",
"type": "function",
"inputs": [
{
"name": "outputParams",
"type": "tuple",
"components": [
{
"name": "bondingCurveFactory",
"type": "address",
"internalType": "address"
},
{
"name": "bondingCurve",
"type": "address",
"internalType": "address"
},
{
"name": "feeDistributor",
"type": "address",
"internalType": "address"
},
{
"name": "twapPool",
"type": "address",
"internalType": "address"
},
{
"name": "saleMemeTokenManager",
"type": "address",
"internalType": "address"
},
{
"name": "frothMemeFactory",
"type": "address",
"internalType": "address"
},
{
"name": "creatorFeesClaimer",
"type": "address",
"internalType": "address"
},
{
"name": "frothBurner",
"type": "address",
"internalType": "address"
},
{
"name": "uniswapV3SwapAdapter",
"type": "address",
"internalType": "address"
}
],
"internalType": "struct BaseFrothMemeProtocolDeployer.OutputParams"
}
],
"outputs": [],
"stateMutability": "view"
},
{
"name": "toString",
"type": "function",
"inputs": [
{
"name": "_uint256",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "pure"
},
{
"name": "toString",
"type": "function",
"inputs": [
{
"name": "_bytes32",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "pure"
}
]0x60a0604052336080523480156012575f5ffd5b506080516154ef6100325f395f818161033f015261053601526154ef5ff3fe608060405234801561000f575f5ffd5b5060043610610106575f3560e01c806380c2da021161009e578063b11a19e81161006e578063b11a19e814610255578063b6ead9af14610268578063d813b64b1461027b578063e1595b091461030f578063e1a452181461032b575f5ffd5b806380c2da02146101fe57806385f07aa7146102115780638fd44eb5146102205780639f77df1c14610247575f5ffd5b806350ec06a8116100d957806350ec06a81461018d578063673d54ae146101b45780636900a3ae146101c957806372d93aa8146101e9575f5ffd5b806305196db31461010a57806313e9ba89146101445780632493ecaf146101605780634771d20814610172575b5f5ffd5b6101317f43524541544f525f464545535f4f4e5f53454c4c494e475f4b4559000000000081565b6040519081526020015b60405180910390f35b6101317147524144554154494f4e5f4645455f4b455960701b81565b6101316aa56fa5b99019a5c800000081565b6101317054524144455f4255595f4645455f4b455960781b81565b6101317f4352454154455f4d454d455f544f4b454e5f4645455f4b45590000000000000081565b6101c76101c236600461183a565b610334565b005b6101dc6101d7366004611880565b6103d4565b60405161013b91906118c5565b6101316a5255475f4645455f4b455960a81b81565b6101c761020c366004611aa7565b6103e5565b610131676f05b59d3b20000081565b6101317f43524541544f525f464545535f4f4e5f425559494e475f4b455900000000000081565b61013166038d7ea4c6800081565b6101dc610263366004611880565b6103f1565b6101316b033b2e3c9fd0803ce800000081565b61028e610289366004611e62565b610523565b60405161013b919081516001600160a01b03908116825260208084015182169083015260408084015182169083015260608084015182169083015260808084015182169083015260a08084015182169083015260c08084015182169083015260e0808401518216908301526101009283015116918101919091526101200190565b6101317154524144455f53454c4c5f4645455f4b455960701b81565b61013161271081565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610384576040516308fffdfd60e21b81523360048201526024015b60405180910390fd5b6103aa61039636849003840184611e97565b6103a536849003840184611aa7565b61058c565b6103d06103bc36849003840184611e97565b6103cb36849003840184611aa7565b6109b5565b5050565b60606103df82610a60565b92915050565b6103ee81610aef565b50565b60605f5b60208160ff161080156104295750828160ff166020811061041857610418611eb2565b1a60f81b6001600160f81b03191615155b15610440578061043881611eda565b9150506103f5565b5f8160ff166001600160401b0381111561045c5761045c6118d7565b6040519080825280601f01601f191660200182016040528015610486576020820181803683370190505b5090505f91505b60208260ff161080156104c15750838260ff16602081106104b0576104b0611eb2565b1a60f81b6001600160f81b03191615155b1561051c57838260ff16602081106104db576104db611eb2565b1a60f81b818360ff16815181106104f4576104f4611eb2565b60200101906001600160f81b03191690815f1a9053508161051481611eda565b92505061048d565b9392505050565b61052b6117d5565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610576576040516308fffdfd60e21b815233600482015260240161037b565b6105808383610eb6565b915061051c8383610f43565b6101008101516001600160a01b03166105a3575050565b61010081015161012083015162ffffff16156106355760a08301516101408401516101208501516040516304fe3fcb60e01b81526001600160a01b039384166004820152918316602483015262ffffff166044820152908216906304fe3fcb906064015b5f604051808303815f87803b15801561061e575f5ffd5b505af1158015610630573d5f5f3e3d5ffd5b505050505b826101e00151602001516001600160a01b0316835f01516001600160a01b0316146107f957806001600160a01b0316632f2ff15d826001600160a01b031663f5b541a66040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106a5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106c99190611ef8565b6101e0860151602001516040516001600160e01b031960e085901b16815260048101929092526001600160a01b031660248201526044015f604051808303815f87803b158015610717575f5ffd5b505af1158015610729573d5f5f3e3d5ffd5b50505050806001600160a01b031663d547741f826001600160a01b031663f5b541a66040518163ffffffff1660e01b8152600401602060405180830381865afa158015610778573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061079c9190611ef8565b855160405160e084901b6001600160e01b031916815260048101929092526001600160a01b031660248201526044015f604051808303815f87803b1580156107e2575f5ffd5b505af11580156107f4573d5f5f3e3d5ffd5b505050505b6101e08301515183516001600160a01b039081169116146109b057806001600160a01b0316632f2ff15d826001600160a01b031663a217fddf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561085f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108839190611ef8565b6101e08601515160405160e084901b6001600160e01b031916815260048101929092526001600160a01b031660248201526044015f604051808303815f87803b1580156108ce575f5ffd5b505af11580156108e0573d5f5f3e3d5ffd5b50505050806001600160a01b031663d547741f826001600160a01b031663a217fddf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561092f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109539190611ef8565b855160405160e084901b6001600160e01b031916815260048101929092526001600160a01b031660248201526044015f604051808303815f87803b158015610999575f5ffd5b505af11580156109ab573d5f5f3e3d5ffd5b505050505b505050565b5f8160e001519050806001600160a01b0316632f2ff15d826001600160a01b031663f5b541a66040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a08573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a2c9190611ef8565b84604001516040518363ffffffff1660e01b81526004016106079291909182526001600160a01b0316602082015260400190565b60605f610a6c83611005565b60010190505f816001600160401b03811115610a8a57610a8a6118d7565b6040519080825280601f01601f191660200182016040528015610ab4576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084610abe57509392505050565b610b2d6040518060400160405280601781526020017f4f757470757420506172616d65746572733a20202020200000000000000000008152506110dc565b610b4e604051806060016040528060408152602001615400604091396110dc565b610b916040518060400160405280601781526020017f426f6e64696e6743757276653a20202020202020202020000000000000000000815250826020015161111f565b610bd46040518060400160405280601781526020017f4665654469737472696275746f723a2020202020202020000000000000000000815250826040015161111f565b610c176040518060400160405280601781526020017f53616c654d656d65546f6b656e4d616e616765723a2020000000000000000000815250826080015161111f565b610c5a6040518060400160405280601781526020017f46726f74684d656d65466163746f72793a2020202020200000000000000000008152508260a0015161111f565b610c9d6040518060400160405280601781526020017f43726561746f7246656573436c61696d65723a202020200000000000000000008152508260c0015161111f565b610ce06040518060400160405280601781526020017f46726f74684275726e65723a20202020202020202020200000000000000000008152508260e0015161111f565b610d246040518060400160405280601781526020017f556e6973776170563353776170416461707465723a202000000000000000000081525082610100015161111f565b610d45604051806080016040528060428152602001615478604291396110dc565b610d66604051806060016040528060388152602001615440603891396110dc565b610d9a610d768260800151611164565b604051602001610d869190611f26565b6040516020818303038152906040526110dc565b610dba610daa8260800151611164565b604051602001610d869190611f89565b610dda610dca8260400151611164565b604051602001610d869190611faa565b610dfa610dea8260200151611164565b604051602001610d869190611fce565b610e1a610e0a8260a00151611164565b604051602001610d869190611ff0565b610e3a610e2a8260c00151611164565b604051602001610d869190612017565b610e5a610e4a8260e00151611164565b604051602001610d869190612040565b610e7b610e6b826101000151611164565b604051602001610d869190612061565b610e9c604051806080016040528060428152602001615478604291396110dc565b610ea9816040015161117a565b6103ee81604001516112de565b610ebe6117d5565b6101008301516001600160a01b0316610ed85750806103df565b61010083015183516040515f9291908190610ef290611820565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103905ff080158015610f2b573d5f5f3e3d5ffd5b506001600160a01b0316610100840152509092915050565b610f4b6117d5565b6101008201515f906001600160a01b0316610f6a578360c00151610f71565b8261010001515b9050808460a00151856101400151865f0151875f0151886101e0015160400151604051610f9d9061182d565b6001600160a01b039687168152948616602086015292851660408501529084166060840152909216608082015260a081019190915260c001604051809103905ff080158015610fee573d5f5f3e3d5ffd5b506001600160a01b031660e0840152509092915050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106110435772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef8100000000831061106f576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061108d57662386f26fc10000830492506010015b6305f5e10083106110a5576305f5e100830492506008015b61271083106110b957612710830492506004015b606483106110cb576064830492506002015b600a83106103df5760010192915050565b6103ee816040516024016110f091906118c5565b60408051601f198184030181529190526020810180516001600160e01b031663104c13eb60e21b1790526113af565b6103d08282604051602401611135929190612092565b60408051601f198184030181529190526020810180516001600160e01b031663319af33360e01b1790526113af565b60606103df6001600160a01b03831660146113b8565b5f816001600160a01b0316638adfb7556040518163ffffffff1660e01b81526004015f60405180830381865afa1580156111b6573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526111dd91908101906120dd565b90505f5b81518110156109b0575f61120d83838151811061120057611200611eb2565b60200260200101516103f1565b611296856001600160a01b0316635ba6b2ec86868151811061123157611231611eb2565b60200260200101516040518263ffffffff1660e01b815260040161125791815260200190565b602060405180830381865afa158015611272573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d79190611ef8565b6040516020016112a7929190612172565b60408051601f198184030181528282019091526002825261011960f51b602083015291506112d59082611531565b506001016111e1565b5f816001600160a01b0316631ea297df6040518163ffffffff1660e01b81526004015f60405180830381865afa15801561131a573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261134191908101906120dd565b90506113796040518060400160405280601381526020017202234b9ba3934b13aba34b7b71035b2bcb99d1606d1b8152508251611576565b5f5b81518110156109b0576113a78383838151811061139a5761139a611eb2565b60200260200101516115bb565b60010161137b565b6103ee8161176f565b6060825f6113c78460026121a8565b6113d29060026121bf565b6001600160401b038111156113e9576113e96118d7565b6040519080825280601f01601f191660200182016040528015611413576020820181803683370190505b509050600360fc1b815f8151811061142d5761142d611eb2565b60200101906001600160f81b03191690815f1a905350600f60fb1b8160018151811061145b5761145b611eb2565b60200101906001600160f81b03191690815f1a9053505f61147d8560026121a8565b6114889060016121bf565b90505b60018111156114ff576f181899199a1a9b1b9c1cb0b131b232b360811b83600f16601081106114bc576114bc611eb2565b1a60f81b8282815181106114d2576114d2611eb2565b60200101906001600160f81b03191690815f1a90535060049290921c916114f8816121d2565b905061148b565b5081156115295760405163e22e27eb60e01b8152600481018690526024810185905260440161037b565b949350505050565b6103d082826040516024016115479291906121e7565b60408051601f198184030181529190526020810180516001600160e01b0316634b5c427760e01b1790526113af565b6103d0828260405160240161158c929190612214565b60408051601f198184030181529190526020810180516001600160e01b0316632d839cb360e21b1790526113af565b6115e6604051806040016040528060018152602001602360f81b8152506115e1836103f1565b611531565b604051631ed40e3360e11b8152600481018290525f906001600160a01b03841690633da81c66906024015f60405180830381865afa15801561162a573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526116519190810190612235565b90505f5b8151811015611769576116a56040518060400160405280600381526020016201010160ed1b815250611686836103d4565b604051806040016040528060018152602001601d60f91b81525061178e565b6116f36040518060400160405280601081526020016f01010101010102932b1b2b4bb32b91d160851b8152508383815181106116e3576116e3611eb2565b60200260200101515f015161111f565b6117616040518060400160405280600b81526020016a01010101010102138399d160ad1b81525061174084848151811061172f5761172f611eb2565b6020026020010151602001516103d4565b6040518060400160405280600381526020016262707360e81b81525061178e565b600101611655565b50505050565b5f6a636f6e736f6c652e6c6f6790505f5f835160208501845afa505050565b6109b08383836040516024016117a6939291906122e9565b60408051601f198184030181529190526020810180516001600160e01b0316632ced7cef60e01b1790526113af565b60408051610120810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081019190915290565b6118438061232283390190565b61189b80613b6583390190565b5f5f82840361062081121561184d575f5ffd5b61050081121561185b575f5ffd5b8392506101206104ff1982011215611871575f5ffd5b50610500830190509250929050565b5f60208284031215611890575f5ffd5b5035919050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61051c6020830184611897565b634e487b7160e01b5f52604160045260245ffd5b60405161012081016001600160401b038111828210171561190e5761190e6118d7565b60405290565b604080519081016001600160401b038111828210171561190e5761190e6118d7565b60405160a081016001600160401b038111828210171561190e5761190e6118d7565b60405160e081016001600160401b038111828210171561190e5761190e6118d7565b60405161020081016001600160401b038111828210171561190e5761190e6118d7565b604051601f8201601f191681016001600160401b03811182821017156119c5576119c56118d7565b604052919050565b6001600160a01b03811681146103ee575f5ffd5b80356119ec816119cd565b919050565b5f6101208284031215611a02575f5ffd5b611a0a6118eb565b9050611a15826119e1565b8152611a23602083016119e1565b6020820152611a34604083016119e1565b6040820152611a45606083016119e1565b6060820152611a56608083016119e1565b6080820152611a6760a083016119e1565b60a0820152611a7860c083016119e1565b60c0820152611a8960e083016119e1565b60e0820152611a9b61010083016119e1565b61010082015292915050565b5f6101208284031215611ab8575f5ffd5b61051c83836119f1565b5f60408284031215611ad2575f5ffd5b611ada611914565b90508135611ae7816119cd565b81526020820135611af7816119cd565b602082015292915050565b5f60808284031215611b12575f5ffd5b604051608081016001600160401b0381118282101715611b3457611b346118d7565b6040908152833582526020808501359083015283810135908201526060928301359281019290925250919050565b803562ffffff811681146119ec575f5ffd5b5f818303610160811215611b86575f5ffd5b611b8e611936565b91508235611b9b816119cd565b82526020830135611bab816119cd565b602083015260e0603f1982011215611bc1575f5ffd5b50611bca611958565b604083810135825260608085013560208401526080808601358484015260a0808701359285019290925260c0808701359185019190915260e08601359184019190915261010085013590830152820152611c2761012083016119e1565b6060820152611c3961014083016119e1565b608082015292915050565b5f60e08284031215611c54575f5ffd5b611c5c611958565b90508135611c69816119cd565b81526020820135611c79816119cd565b60208201526040820135611c8c816119cd565b6040820152606082810135908201526080808301359082015260a0808301359082015260c09182013591810191909152919050565b5f60608284031215611cd1575f5ffd5b604051606081016001600160401b0381118282101715611cf357611cf36118d7565b6040529050808235611d04816119cd565b81526020830135611d14816119cd565b6020820152604092830135920191909152919050565b5f6105008284031215611d3b575f5ffd5b611d4361197a565b9050611d4e826119e1565b8152611d5d8360208401611ac2565b6020820152611d6f8360608401611b02565b604082015260e082013560608201526101008201356080820152611d9661012083016119e1565b60a0820152611da861014083016119e1565b60c0820152611dba61016083016119e1565b60e0820152611dcc61018083016119e1565b610100820152611ddf6101a08301611b62565b610120820152611df26101c083016119e1565b610140820152611e06836101e08401611b74565b610160820152611e1a836103408401611ac2565b610180820152611e2e836103808401611c44565b6101a0820152611e42836104608401611ac2565b6101c0820152611e56836104a08401611cc1565b6101e082015292915050565b5f5f6106208385031215611e74575f5ffd5b611e7e8484611d2a565b9150611e8e8461050085016119f1565b90509250929050565b5f6105008284031215611ea8575f5ffd5b61051c8383611d2a565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f60ff821660ff8103611eef57611eef611ec6565b60010192915050565b5f60208284031215611f08575f5ffd5b5051919050565b5f81518060208401855e5f93019283525090919050565b64555345523d60d81b81525f611f3f6005830184611f0f565b7f2020202020202020232053616c654d656d65546f6b656e4d616e61676572202881527373746570203420546965722d31206772616e742960601b60208201526034019392505050565b6c53414c455f4d414e414745523d60981b81525f61051c600d830184611f0f565b6f4645455f4449535452494255544f523d60801b81525f61051c6010830184611f0f565b6d424f4e44494e475f43555256453d60901b81525f61051c600e830184611f0f565b7246524f54485f4d454d455f464143544f52593d60681b81525f61051c6013830184611f0f565b7443524541544f525f464545535f434c41494d45523d60581b81525f61051c6015830184611f0f565b6c46524f54485f4255524e45523d60981b81525f61051c600d830184611f0f565b7f554e49535741505f56335f535741505f414441505445523d000000000000000081525f61051c6018830184611f0f565b604081525f6120a46040830185611897565b905060018060a01b03831660208301529392505050565b5f6001600160401b038211156120d3576120d36118d7565b5060051b60200190565b5f602082840312156120ed575f5ffd5b81516001600160401b03811115612102575f5ffd5b8201601f81018413612112575f5ffd5b8051612125612120826120bb565b61199d565b8082825260208201915060208360051b850101925086831115612146575f5ffd5b6020840193505b8284101561216857835182526020938401939091019061214d565b9695505050505050565b5f61217d8285611f0f565b620101e960ed1b81526121936003820185611f0f565b6262707360e81b815260030195945050505050565b80820281158282048414176103df576103df611ec6565b808201808211156103df576103df611ec6565b5f816121e0576121e0611ec6565b505f190190565b604081525f6121f96040830185611897565b828103602084015261220b8185611897565b95945050505050565b604081525f6122266040830185611897565b90508260208301529392505050565b5f60208284031215612245575f5ffd5b81516001600160401b0381111561225a575f5ffd5b8201601f8101841361226a575f5ffd5b8051612278612120826120bb565b8082825260208201915060208360061b850101925086831115612299575f5ffd5b6020840193505b8284101561216857604084880312156122b7575f5ffd5b6122bf611914565b84516122ca816119cd565b81526020858101518183015290835260409094019391909101906122a0565b606081525f6122fb6060830186611897565b828103602084015261230d8186611897565b90508281036040840152612168818561189756fe60a060405234801561000f575f5ffd5b5060405161184338038061184383398101604081905261002e91610379565b826001600160a01b03811661008a5760408051630961777760e41b81526004810191909152600a60448201526939bbb0b82937baba32b960b11b60648201526001600160a01b0390911660248201526084015b60405180910390fd5b50816001600160a01b0381166100dd5760408051630961777760e41b81526004810191909152600560448201526430b236b4b760d91b60648201526001600160a01b039091166024820152608401610081565b50806001600160a01b0381166101335760408051630961777760e41b81526004810191909152600860448201526737b832b930ba37b960c11b60648201526001600160a01b039091166024820152608401610081565b506001600160a01b03831660805261014b5f8361022d565b82905f906101a65760405163c10b188f60e01b815260606004820152601260648201527164656661756c742061646d696e20726f6c6560701b60848201526001600160a01b039092166024830152604482015260a401610081565b506101c090505f5160206118235f395f51905f528261022d565b815f5160206118235f395f51905f5290916102235760405163c10b188f60e01b815260606004820152600d60648201526c6f70657261746f7220726f6c6560981b60848201526001600160a01b039092166024830152604482015260a401610081565b50505050506103b9565b5f806102398484610263565b9050801561025a575f848152600160205260409020610258908461030a565b505b90505b92915050565b5f828152602081815260408083206001600160a01b038516845290915281205460ff16610303575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556102bb3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600161025d565b505f61025d565b5f61025a836001600160a01b0384165f81815260018301602052604081205461030357508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561025d565b80516001600160a01b0381168114610374575f5ffd5b919050565b5f5f5f6060848603121561038b575f5ffd5b6103948461035e565b92506103a26020850161035e565b91506103b06040850161035e565b90509250925092565b6080516114446103df5f395f818161024c0152818161066501526106cc01526114445ff3fe608060405234801561000f575f5ffd5b50600436106100fb575f3560e01c80639010d07c11610093578063c31c9c0711610063578063c31c9c0714610247578063ca15c8731461026e578063d547741f14610281578063f5b541a614610294575f5ffd5b80639010d07c146101e257806391d148541461020d578063a217fddf14610220578063a3246ad314610227575f5ffd5b80632f2ff15d116100ce5780632f2ff15d1461018957806336568abe1461019c57806338ed1739146101af578063818f8349146101cf575f5ffd5b806301ffc9a7146100ff57806304fe3fcb14610127578063248a9ca31461013c5780632495016a1461016c575b5f5ffd5b61011261010d36600461103b565b6102bb565b60405190151581526020015b60405180910390f35b61013a61013536600461107d565b6102e5565b005b61015e61014a3660046110c8565b5f9081526020819052604090206001015490565b60405190815260200161011e565b610175610bb881565b60405162ffffff909116815260200161011e565b61013a6101973660046110df565b610490565b61013a6101aa3660046110df565b6104ba565b6101c26101bd366004611109565b6104f2565b60405161011e91906111a7565b6101756101dd3660046111e9565b610868565b6101f56101f0366004611211565b6108a6565b6040516001600160a01b03909116815260200161011e565b61011261021b3660046110df565b6108c4565b61015e5f81565b61023a6102353660046110c8565b6108ec565b60405161011e9190611231565b6101f57f000000000000000000000000000000000000000000000000000000000000000081565b61015e61027c3660046110c8565b610905565b61013a61028f3660046110df565b61091b565b61015e7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92981565b5f6001600160e01b03198216635a05180f60e01b14806102df57506102df8261093f565b92915050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92961030f81610973565b836001600160a01b0381166103675760408051630961777760e41b815260048101919091526006604482015265746f6b656e4160d01b60648201526001600160a01b0390911660248201526084015b60405180910390fd5b50826001600160a01b03811661039157604051630961777760e41b815260040161035e9190611271565b50826001600160a01b0316846001600160a01b0316141583906103c857604051630961777760e41b815260040161035e9190611271565b5081620f424062ffffff8216106104165760408051631533de4360e01b81526004810191909152600360448201526266656560e81b606482015262ffffff909116602482015260840161035e565b508160025f6104258787610980565b815260208082019290925260409081015f20805462ffffff191662ffffff9485161790555191841682526001600160a01b0385811692908716917ff18161b22989d51062141f1a93919c1dd709b30f0f13dfa56c3e2b5efe1da6f1910160405180910390a350505050565b5f828152602081905260409020600101546104aa81610973565b6104b483836109ef565b50505050565b6001600160a01b03811633146104e35760405163334bd91960e11b815260040160405180910390fd5b6104ed8282610a22565b505050565b606083600281101561053f5760408051631533de4360e01b81526004810191909152600b60448201526a0e0c2e8d040d8cadccee8d60ab1b6064820152602481019190915260840161035e565b5086806105845760408051631533de4360e01b81526004810191909152600860448201526730b6b7bab73a24b760c11b6064820152602481019190915260840161035e565b50826001600160a01b0381166105d45760408051630961777760e41b815260048101919091526002604482015261746f60f01b60648201526001600160a01b03909116602482015260840161035e565b508142818111156106205760405163ea58dd2960e01b8152606060048201526008606482015267646561646c696e6560c01b60848201526024810192909252604482015260a40161035e565b505061066033308988885f81811061063a5761063a6112a2565b905060200201602081019061064f91906112b6565b6001600160a01b0316929190610a4d565b6106bc7f00000000000000000000000000000000000000000000000000000000000000008887875f818110610697576106976112a2565b90506020020160208101906106ac91906112b6565b6001600160a01b03169190610ab4565b5f6106c78686610b43565b90505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b858183f6040518060800160405280858152602001886001600160a01b031681526020018c81526020018b8152506040518263ffffffff1660e01b815260040161073f91906112fd565b6020604051808303815f875af115801561075b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061077f919061134a565b90508567ffffffffffffffff81111561079a5761079a611361565b6040519080825280602002602001820160405280156107c3578160200160208202803683370190505b50925088835f815181106107d9576107d96112a2565b602090810291909101015280836107f1600189611375565b81518110610801576108016112a2565b602002602001018181525050846001600160a01b0316336001600160a01b03167f79dbb638e0e184b522cb4db65c89f6d329add37e37fb592a9f0e3a03cc35d60d8b848660405161085493929190611394565b60405180910390a350509695505050505050565b5f5f60025f6108778686610980565b815260208101919091526040015f205462ffffff169050801561089a578061089e565b610bb85b949350505050565b5f8281526001602052604081206108bd9083610c62565b9392505050565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b5f8181526001602052604090206060906102df90610c6d565b5f8181526001602052604081206102df90610c79565b5f8281526020819052604090206001015461093581610973565b6104b48383610a22565b5f6001600160e01b03198216637965db0b60e01b14806102df57506301ffc9a760e01b6001600160e01b03198316146102df565b61097d8133610c82565b50565b5f5f5f836001600160a01b0316856001600160a01b0316106109a35783856109a6565b84845b6040516001600160601b0319606084811b8216602084015283901b1660348201529193509150604801604051602081830303815290604052805190602001209250505092915050565b5f5f6109fb8484610cbf565b905080156108bd575f848152600160205260409020610a1a9084610d4e565b509392505050565b5f5f610a2e8484610d62565b905080156108bd575f848152600160205260409020610a1a9084610dcb565b6040516001600160a01b0384811660248301528381166044830152606482018390526104b49186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050610ddf565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610b058482610e4b565b6104b4576040516001600160a01b0384811660248301525f6044830152610b3991869182169063095ea7b390606401610a82565b6104b48482610ddf565b606082825f818110610b5757610b576112a2565b9050602002016020810190610b6c91906112b6565b604051602001610b8f919060609190911b6001600160601b031916815260140190565b60408051601f19818403018152919052905060015b82811015610c5b5781610c088585610bbd600186611375565b818110610bcc57610bcc6112a2565b9050602002016020810190610be191906112b6565b868685818110610bf357610bf36112a2565b90506020020160208101906101dd91906112b6565b858584818110610c1a57610c1a6112a2565b9050602002016020810190610c2f91906112b6565b604051602001610c41939291906113bb565b60408051601f198184030181529190529150600101610ba4565b5092915050565b5f6108bd8383610e94565b60605f6108bd83610eba565b5f6102df825490565b610c8c82826108c4565b610cbb5760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161035e565b5050565b5f610cca83836108c4565b610d47575f838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610cff3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016102df565b505f6102df565b5f6108bd836001600160a01b038416610f13565b5f610d6d83836108c4565b15610d47575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016102df565b5f6108bd836001600160a01b038416610f58565b5f5f60205f8451602086015f885af180610dfe576040513d5f823e3d81fd5b50505f513d91508115610e15578060011415610e22565b6001600160a01b0384163b155b156104b457604051635274afe760e01b81526001600160a01b038516600482015260240161035e565b5f5f5f5f60205f8651602088015f8a5af192503d91505f519050828015610e8a57508115610e7c5780600114610e8a565b5f866001600160a01b03163b115b9695505050505050565b5f825f018281548110610ea957610ea96112a2565b905f5260205f200154905092915050565b6060815f01805480602002602001604051908101604052809291908181526020018280548015610f0757602002820191905f5260205f20905b815481526020019060010190808311610ef3575b50505050509050919050565b5f818152600183016020526040812054610d4757508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556102df565b5f8181526001830160205260408120548015611032575f610f7a600183611375565b85549091505f90610f8d90600190611375565b9050808214610fec575f865f018281548110610fab57610fab6112a2565b905f5260205f200154905080875f018481548110610fcb57610fcb6112a2565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080610ffd57610ffd6113fa565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506102df565b5f9150506102df565b5f6020828403121561104b575f5ffd5b81356001600160e01b0319811681146108bd575f5ffd5b80356001600160a01b0381168114611078575f5ffd5b919050565b5f5f5f6060848603121561108f575f5ffd5b61109884611062565b92506110a660208501611062565b9150604084013562ffffff811681146110bd575f5ffd5b809150509250925092565b5f602082840312156110d8575f5ffd5b5035919050565b5f5f604083850312156110f0575f5ffd5b8235915061110060208401611062565b90509250929050565b5f5f5f5f5f5f60a0878903121561111e575f5ffd5b8635955060208701359450604087013567ffffffffffffffff811115611142575f5ffd5b8701601f81018913611152575f5ffd5b803567ffffffffffffffff811115611168575f5ffd5b8960208260051b840101111561117c575f5ffd5b6020919091019450925061119260608801611062565b95989497509295919493608090920135925050565b602080825282518282018190525f918401906040840190835b818110156111de5783518352602093840193909201916001016111c0565b509095945050505050565b5f5f604083850312156111fa575f5ffd5b61120383611062565b915061110060208401611062565b5f5f60408385031215611222575f5ffd5b50508035926020909101359150565b602080825282518282018190525f918401906040840190835b818110156111de5783516001600160a01b031683526020938401939092019160010161124a565b6040808252600690820152653a37b5b2b72160d11b60608201526001600160a01b0391909116602082015260800190565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156112c6575f5ffd5b6108bd82611062565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f82516080602084015261131860a08401826112cf565b905060018060a01b03602085015116604084015260408401516060840152606084015160808401528091505092915050565b5f6020828403121561135a575f5ffd5b5051919050565b634e487b7160e01b5f52604160045260245ffd5b818103818111156102df57634e487b7160e01b5f52601160045260245ffd5b838152826020820152606060408201525f6113b260608301846112cf565b95945050505050565b5f84518060208701845e60e89490941b6001600160e81b0319169190930190815260609190911b6001600160601b031916600382015260170192915050565b634e487b7160e01b5f52603160045260245ffdfea264697066735822122027e045caab9bbf1bb79c8881723435fb67c5f259b0aedf5077ae1c97187fd61764736f6c634300081c003397667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929610100604052348015610010575f5ffd5b5060405161189b38038061189b83398101604081905261002f9161048c565b856001600160a01b0381166100895760408051630961777760e41b8152600481019190915260086044820152673937baba32b92b1960c11b60648201526001600160a01b0390911660248201526084015b60405180910390fd5b50846001600160a01b0381166100e45760408051630961777760e41b81526004810191909152600d60448201526c777261707065644e617469766560981b60648201526001600160a01b039091166024820152608401610080565b50836001600160a01b0381166101375760408051630961777760e41b8152600481019190915260056044820152640cce4dee8d60db1b60648201526001600160a01b039091166024820152608401610080565b50826001600160a01b03811661018a5760408051630961777760e41b81526004810191909152600560448201526430b236b4b760d91b60648201526001600160a01b039091166024820152608401610080565b50816001600160a01b0381166101e05760408051630961777760e41b81526004810191909152600860448201526737b832b930ba37b960c11b60648201526001600160a01b039091166024820152608401610080565b50808061022c5760408051631533de4360e01b81526004810191909152600f60448201526e1b5a5b93985d1a5d99505b5bdd5b9d608a1b60648201526024810191909152608401610080565b506001600160a01b0380871660a05284811660c052851660e052600281905561dead60805261025b5f84610340565b83905f906102b65760405163c10b188f60e01b815260606004820152601260648201527164656661756c742061646d696e20726f6c6560701b60848201526001600160a01b039092166024830152604482015260a401610080565b506102d090505f51602061187b5f395f51905f5283610340565b825f51602061187b5f395f51905f5290916103335760405163c10b188f60e01b815260606004820152600d60648201526c6f70657261746f7220726f6c6560981b60848201526001600160a01b039092166024830152604482015260a401610080565b50505050505050506104f5565b5f8061034c8484610376565b9050801561036d575f84815260016020526040902061036b908461041d565b505b90505b92915050565b5f828152602081815260408083206001600160a01b038516845290915281205460ff16610416575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556103ce3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610370565b505f610370565b5f61036d836001600160a01b0384165f81815260018301602052604081205461041657508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610370565b80516001600160a01b0381168114610487575f5ffd5b919050565b5f5f5f5f5f5f60c087890312156104a1575f5ffd5b6104aa87610471565b95506104b860208801610471565b94506104c660408801610471565b93506104d460608801610471565b92506104e260808801610471565b915060a087015190509295509295509295565b60805160a05160c05160e0516113146105675f395f818161030b0152818161041001528181610734015281816107e70152610c7e01525f818161016301528181610871015261099801525f818161024a01528181610815015261083d01525f818161027101526109ba01526113145ff3fe608060405234801561000f575f5ffd5b5060043610610132575f3560e01c806370d5ae05116100b4578063ca15c87311610079578063ca15c873146102e0578063d547741f146102f3578063d999984d14610306578063e31a63811461032d578063f591c32714610335578063f5b541a614610348575f5ffd5b806370d5ae051461026c5780639010d07c1461029357806391d14854146102a6578063a217fddf146102b9578063a3246ad3146102c0575f5ffd5b806336568abe116100fa57806336568abe146101ea578063384893be146101fd5780633ebe0b5d146102295780634a3e66f514610232578063502f744614610245575f5ffd5b806301ffc9a714610136578063132ba6241461015e578063248a9ca31461019d5780632f2ff15d146101cd5780633626193c146101e2575b5f5ffd5b610149610144366004610f8e565b61035c565b60405190151581526020015b60405180910390f35b6101857f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610155565b6101bf6101ab366004610fb5565b5f9081526020819052604090206001015490565b604051908152602001610155565b6101e06101db366004610fe7565b610386565b005b6101bf6103b0565b6101e06101f8366004610fe7565b6103be565b61021061020b366004611011565b6103f6565b6040516001600160e01b03199091168152602001610155565b6101bf60025481565b6101e0610240366004610fb5565b61054d565b6101857f000000000000000000000000000000000000000000000000000000000000000081565b6101857f000000000000000000000000000000000000000000000000000000000000000081565b6101856102a13660046110b9565b610571565b6101496102b4366004610fe7565b61058f565b6101bf5f81565b6102d36102ce366004610fb5565b6105b7565b604051610155919061111c565b6101bf6102ee366004610fb5565b6105d0565b6101e0610301366004610fe7565b6105e6565b6101857f000000000000000000000000000000000000000000000000000000000000000081565b6101bf603c81565b6101e0610343366004610fb5565b61060a565b6101bf5f5160206112bf5f395f51905f5281565b5f6001600160e01b03198216635a05180f60e01b14806103805750610380826106a9565b92915050565b5f828152602081905260409020600101546103a0816106dd565b6103aa83836106ea565b50505050565b5f6103b961071d565b905090565b6001600160a01b03811633146103e75760405163334bd91960e11b815260040160405180910390fd5b6103f182826107a5565b505050565b5f5f5160206112bf5f395f51905f5261040e816106dd565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b03161486906104915760408051630961777760e41b8152600481019190915260056044820152643a37b5b2b760d91b60648201526001600160a01b0390911660248201526084015b60405180910390fd5b506104a95f5160206112bf5f395f51905f528961058f565b88906104f55760408051630961777760e41b81526004810191909152600860448201526737b832b930ba37b960c11b60648201526001600160a01b039091166024820152608401610488565b5084806105385760408051631533de4360e01b815260048101919091526006604482015265185b5bdd5b9d60d21b60648201526024810191909152608401610488565b50631c2449df60e11b98975050505050505050565b5f5160206112bf5f395f51905f52610564816106dd565b61056d826107d0565b5050565b5f8281526001602052604081206105889083610a22565b9392505050565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b5f81815260016020526040902060609061038090610a2d565b5f81815260016020526040812061038090610a39565b5f82815260208190526040902060010154610600816106dd565b6103aa83836107a5565b5f5160206112bf5f395f51905f52610621816106dd565b818061066c5760408051631533de4360e01b81526004810191909152600f60448201526e1b5a5b93985d1a5d99505b5bdd5b9d608a1b60648201526024810191909152608401610488565b5060028290556040518281527f32995a1d10fae1883717ee96a3a48a60b73f032ffae82a68a5fd3feea50651a89060200160405180910390a15050565b5f6001600160e01b03198216637965db0b60e01b148061038057506301ffc9a760e01b6001600160e01b0319831614610380565b6106e78133610a42565b50565b5f5f6106f68484610a7b565b90508015610588575f8481526001602052604090206107159084610b0a565b509392505050565b6040516370a0823160e01b81523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610781573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103b9919061112e565b5f5f6107b18484610b1e565b90508015610588575f8481526001602052604090206107159084610b87565b5f6107d961071d565b905060025481111561056d577f000000000000000000000000000000000000000000000000000000000000000061083a6001600160a01b0382167f000000000000000000000000000000000000000000000000000000000000000084610b9b565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166338ed173984866108957f0000000000000000000000000000000000000000000000000000000000000000610c58565b306108a1603c42611159565b6040518663ffffffff1660e01b81526004016108c195949392919061116c565b5f604051808303815f875af11580156108dc573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261090391908101906111bb565b90505f815f8151811061091857610918611283565b602002602001015190505f8260018151811061093657610936611283565b602002602001015190505f8111819061098a5760408051631533de4360e01b81526004810191909152600b60448201526a199c9bdd1a105b5bdd5b9d60aa1b60648201526024810191909152608401610488565b506109df6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000083610d01565b604080518381526020810183905233917f72804eb0f37edc6b86d6105e2c070989375ca372ce96e4f4a26e1cd5d05d2e9c910160405180910390a2505050505050565b5f6105888383610d32565b60605f61058883610d58565b5f610380825490565b610a4c828261058f565b61056d5760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401610488565b5f610a86838361058f565b610b03575f838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610abb3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610380565b505f610380565b5f610588836001600160a01b038416610db1565b5f610b29838361058f565b15610b03575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610380565b5f610588836001600160a01b038416610df6565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610bec8482610ed9565b6103aa576040516001600160a01b0384811660248301525f6044830152610c4e91869182169063095ea7b3906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050610f22565b6103aa8482610f22565b60408051600280825260608083018452925f9291906020830190803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000815f81518110610caf57610caf611283565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110610ce357610ce3611283565b6001600160a01b039092166020928302919091019091015292915050565b6040516001600160a01b038381166024830152604482018390526103f191859182169063a9059cbb90606401610c1c565b5f825f018281548110610d4757610d47611283565b905f5260205f200154905092915050565b6060815f01805480602002602001604051908101604052809291908181526020018280548015610da557602002820191905f5260205f20905b815481526020019060010190808311610d91575b50505050509050919050565b5f818152600183016020526040812054610b0357508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610380565b5f8181526001830160205260408120548015610ed0575f610e18600183611297565b85549091505f90610e2b90600190611297565b9050808214610e8a575f865f018281548110610e4957610e49611283565b905f5260205f200154905080875f018481548110610e6957610e69611283565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080610e9b57610e9b6112aa565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610380565b5f915050610380565b5f5f5f5f60205f8651602088015f8a5af192503d91505f519050828015610f1857508115610f0a5780600114610f18565b5f866001600160a01b03163b115b9695505050505050565b5f5f60205f8451602086015f885af180610f41576040513d5f823e3d81fd5b50505f513d91508115610f58578060011415610f65565b6001600160a01b0384163b155b156103aa57604051635274afe760e01b81526001600160a01b0385166004820152602401610488565b5f60208284031215610f9e575f5ffd5b81356001600160e01b031981168114610588575f5ffd5b5f60208284031215610fc5575f5ffd5b5035919050565b80356001600160a01b0381168114610fe2575f5ffd5b919050565b5f5f60408385031215610ff8575f5ffd5b8235915061100860208401610fcc565b90509250929050565b5f5f5f5f5f5f60a08789031215611026575f5ffd5b61102f87610fcc565b955061103d60208801610fcc565b945061104b60408801610fcc565b935060608701359250608087013567ffffffffffffffff81111561106d575f5ffd5b8701601f8101891361107d575f5ffd5b803567ffffffffffffffff811115611093575f5ffd5b8960208284010111156110a4575f5ffd5b60208201935080925050509295509295509295565b5f5f604083850312156110ca575f5ffd5b50508035926020909101359150565b5f8151808452602084019350602083015f5b828110156111125781516001600160a01b03168652602095860195909101906001016110eb565b5093949350505050565b602081525f61058860208301846110d9565b5f6020828403121561113e575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561038057610380611145565b85815284602082015260a060408201525f61118a60a08301866110d9565b6001600160a01b0394909416606083015250608001529392505050565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156111cb575f5ffd5b815167ffffffffffffffff8111156111e1575f5ffd5b8201601f810184136111f1575f5ffd5b805167ffffffffffffffff81111561120b5761120b6111a7565b8060051b604051601f19603f830116810181811067ffffffffffffffff82111715611238576112386111a7565b604052918252602081840181019290810187841115611255575f5ffd5b6020850194505b838510156112785784518082526020958601959093500161125c565b509695505050505050565b634e487b7160e01b5f52603260045260245ffd5b8181038181111561038057610380611145565b634e487b7160e01b5f52603160045260245ffdfe97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929a2646970667358221220402a746701690d1acc0dfa4a3a504096d7a950a482d7567d80ab551d4867df1064736f6c634300081c003397667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9292d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d23202d2d2d20636172727920746865736520746f2074686520546965722d31206772616e74202b20766572696679207374657073202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d0a0aa2646970667358221220aaa28bfa784887d57cac9822dfb423dbe420f128b8397e52a783c51069d9ff0164736f6c634300081c0033
0x608060405234801561000f575f5ffd5b5060043610610106575f3560e01c806380c2da021161009e578063b11a19e81161006e578063b11a19e814610255578063b6ead9af14610268578063d813b64b1461027b578063e1595b091461030f578063e1a452181461032b575f5ffd5b806380c2da02146101fe57806385f07aa7146102115780638fd44eb5146102205780639f77df1c14610247575f5ffd5b806350ec06a8116100d957806350ec06a81461018d578063673d54ae146101b45780636900a3ae146101c957806372d93aa8146101e9575f5ffd5b806305196db31461010a57806313e9ba89146101445780632493ecaf146101605780634771d20814610172575b5f5ffd5b6101317f43524541544f525f464545535f4f4e5f53454c4c494e475f4b4559000000000081565b6040519081526020015b60405180910390f35b6101317147524144554154494f4e5f4645455f4b455960701b81565b6101316aa56fa5b99019a5c800000081565b6101317054524144455f4255595f4645455f4b455960781b81565b6101317f4352454154455f4d454d455f544f4b454e5f4645455f4b45590000000000000081565b6101c76101c236600461183a565b610334565b005b6101dc6101d7366004611880565b6103d4565b60405161013b91906118c5565b6101316a5255475f4645455f4b455960a81b81565b6101c761020c366004611aa7565b6103e5565b610131676f05b59d3b20000081565b6101317f43524541544f525f464545535f4f4e5f425559494e475f4b455900000000000081565b61013166038d7ea4c6800081565b6101dc610263366004611880565b6103f1565b6101316b033b2e3c9fd0803ce800000081565b61028e610289366004611e62565b610523565b60405161013b919081516001600160a01b03908116825260208084015182169083015260408084015182169083015260608084015182169083015260808084015182169083015260a08084015182169083015260c08084015182169083015260e0808401518216908301526101009283015116918101919091526101200190565b6101317154524144455f53454c4c5f4645455f4b455960701b81565b61013161271081565b336001600160a01b037f0000000000000000000000003f963669208db585f80732733d4514bff337c9b81614610384576040516308fffdfd60e21b81523360048201526024015b60405180910390fd5b6103aa61039636849003840184611e97565b6103a536849003840184611aa7565b61058c565b6103d06103bc36849003840184611e97565b6103cb36849003840184611aa7565b6109b5565b5050565b60606103df82610a60565b92915050565b6103ee81610aef565b50565b60605f5b60208160ff161080156104295750828160ff166020811061041857610418611eb2565b1a60f81b6001600160f81b03191615155b15610440578061043881611eda565b9150506103f5565b5f8160ff166001600160401b0381111561045c5761045c6118d7565b6040519080825280601f01601f191660200182016040528015610486576020820181803683370190505b5090505f91505b60208260ff161080156104c15750838260ff16602081106104b0576104b0611eb2565b1a60f81b6001600160f81b03191615155b1561051c57838260ff16602081106104db576104db611eb2565b1a60f81b818360ff16815181106104f4576104f4611eb2565b60200101906001600160f81b03191690815f1a9053508161051481611eda565b92505061048d565b9392505050565b61052b6117d5565b336001600160a01b037f0000000000000000000000003f963669208db585f80732733d4514bff337c9b81614610576576040516308fffdfd60e21b815233600482015260240161037b565b6105808383610eb6565b915061051c8383610f43565b6101008101516001600160a01b03166105a3575050565b61010081015161012083015162ffffff16156106355760a08301516101408401516101208501516040516304fe3fcb60e01b81526001600160a01b039384166004820152918316602483015262ffffff166044820152908216906304fe3fcb906064015b5f604051808303815f87803b15801561061e575f5ffd5b505af1158015610630573d5f5f3e3d5ffd5b505050505b826101e00151602001516001600160a01b0316835f01516001600160a01b0316146107f957806001600160a01b0316632f2ff15d826001600160a01b031663f5b541a66040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106a5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106c99190611ef8565b6101e0860151602001516040516001600160e01b031960e085901b16815260048101929092526001600160a01b031660248201526044015f604051808303815f87803b158015610717575f5ffd5b505af1158015610729573d5f5f3e3d5ffd5b50505050806001600160a01b031663d547741f826001600160a01b031663f5b541a66040518163ffffffff1660e01b8152600401602060405180830381865afa158015610778573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061079c9190611ef8565b855160405160e084901b6001600160e01b031916815260048101929092526001600160a01b031660248201526044015f604051808303815f87803b1580156107e2575f5ffd5b505af11580156107f4573d5f5f3e3d5ffd5b505050505b6101e08301515183516001600160a01b039081169116146109b057806001600160a01b0316632f2ff15d826001600160a01b031663a217fddf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561085f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108839190611ef8565b6101e08601515160405160e084901b6001600160e01b031916815260048101929092526001600160a01b031660248201526044015f604051808303815f87803b1580156108ce575f5ffd5b505af11580156108e0573d5f5f3e3d5ffd5b50505050806001600160a01b031663d547741f826001600160a01b031663a217fddf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561092f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109539190611ef8565b855160405160e084901b6001600160e01b031916815260048101929092526001600160a01b031660248201526044015f604051808303815f87803b158015610999575f5ffd5b505af11580156109ab573d5f5f3e3d5ffd5b505050505b505050565b5f8160e001519050806001600160a01b0316632f2ff15d826001600160a01b031663f5b541a66040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a08573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a2c9190611ef8565b84604001516040518363ffffffff1660e01b81526004016106079291909182526001600160a01b0316602082015260400190565b60605f610a6c83611005565b60010190505f816001600160401b03811115610a8a57610a8a6118d7565b6040519080825280601f01601f191660200182016040528015610ab4576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084610abe57509392505050565b610b2d6040518060400160405280601781526020017f4f757470757420506172616d65746572733a20202020200000000000000000008152506110dc565b610b4e604051806060016040528060408152602001615400604091396110dc565b610b916040518060400160405280601781526020017f426f6e64696e6743757276653a20202020202020202020000000000000000000815250826020015161111f565b610bd46040518060400160405280601781526020017f4665654469737472696275746f723a2020202020202020000000000000000000815250826040015161111f565b610c176040518060400160405280601781526020017f53616c654d656d65546f6b656e4d616e616765723a2020000000000000000000815250826080015161111f565b610c5a6040518060400160405280601781526020017f46726f74684d656d65466163746f72793a2020202020200000000000000000008152508260a0015161111f565b610c9d6040518060400160405280601781526020017f43726561746f7246656573436c61696d65723a202020200000000000000000008152508260c0015161111f565b610ce06040518060400160405280601781526020017f46726f74684275726e65723a20202020202020202020200000000000000000008152508260e0015161111f565b610d246040518060400160405280601781526020017f556e6973776170563353776170416461707465723a202000000000000000000081525082610100015161111f565b610d45604051806080016040528060428152602001615478604291396110dc565b610d66604051806060016040528060388152602001615440603891396110dc565b610d9a610d768260800151611164565b604051602001610d869190611f26565b6040516020818303038152906040526110dc565b610dba610daa8260800151611164565b604051602001610d869190611f89565b610dda610dca8260400151611164565b604051602001610d869190611faa565b610dfa610dea8260200151611164565b604051602001610d869190611fce565b610e1a610e0a8260a00151611164565b604051602001610d869190611ff0565b610e3a610e2a8260c00151611164565b604051602001610d869190612017565b610e5a610e4a8260e00151611164565b604051602001610d869190612040565b610e7b610e6b826101000151611164565b604051602001610d869190612061565b610e9c604051806080016040528060428152602001615478604291396110dc565b610ea9816040015161117a565b6103ee81604001516112de565b610ebe6117d5565b6101008301516001600160a01b0316610ed85750806103df565b61010083015183516040515f9291908190610ef290611820565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103905ff080158015610f2b573d5f5f3e3d5ffd5b506001600160a01b0316610100840152509092915050565b610f4b6117d5565b6101008201515f906001600160a01b0316610f6a578360c00151610f71565b8261010001515b9050808460a00151856101400151865f0151875f0151886101e0015160400151604051610f9d9061182d565b6001600160a01b039687168152948616602086015292851660408501529084166060840152909216608082015260a081019190915260c001604051809103905ff080158015610fee573d5f5f3e3d5ffd5b506001600160a01b031660e0840152509092915050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106110435772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef8100000000831061106f576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061108d57662386f26fc10000830492506010015b6305f5e10083106110a5576305f5e100830492506008015b61271083106110b957612710830492506004015b606483106110cb576064830492506002015b600a83106103df5760010192915050565b6103ee816040516024016110f091906118c5565b60408051601f198184030181529190526020810180516001600160e01b031663104c13eb60e21b1790526113af565b6103d08282604051602401611135929190612092565b60408051601f198184030181529190526020810180516001600160e01b031663319af33360e01b1790526113af565b60606103df6001600160a01b03831660146113b8565b5f816001600160a01b0316638adfb7556040518163ffffffff1660e01b81526004015f60405180830381865afa1580156111b6573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526111dd91908101906120dd565b90505f5b81518110156109b0575f61120d83838151811061120057611200611eb2565b60200260200101516103f1565b611296856001600160a01b0316635ba6b2ec86868151811061123157611231611eb2565b60200260200101516040518263ffffffff1660e01b815260040161125791815260200190565b602060405180830381865afa158015611272573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d79190611ef8565b6040516020016112a7929190612172565b60408051601f198184030181528282019091526002825261011960f51b602083015291506112d59082611531565b506001016111e1565b5f816001600160a01b0316631ea297df6040518163ffffffff1660e01b81526004015f60405180830381865afa15801561131a573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261134191908101906120dd565b90506113796040518060400160405280601381526020017202234b9ba3934b13aba34b7b71035b2bcb99d1606d1b8152508251611576565b5f5b81518110156109b0576113a78383838151811061139a5761139a611eb2565b60200260200101516115bb565b60010161137b565b6103ee8161176f565b6060825f6113c78460026121a8565b6113d29060026121bf565b6001600160401b038111156113e9576113e96118d7565b6040519080825280601f01601f191660200182016040528015611413576020820181803683370190505b509050600360fc1b815f8151811061142d5761142d611eb2565b60200101906001600160f81b03191690815f1a905350600f60fb1b8160018151811061145b5761145b611eb2565b60200101906001600160f81b03191690815f1a9053505f61147d8560026121a8565b6114889060016121bf565b90505b60018111156114ff576f181899199a1a9b1b9c1cb0b131b232b360811b83600f16601081106114bc576114bc611eb2565b1a60f81b8282815181106114d2576114d2611eb2565b60200101906001600160f81b03191690815f1a90535060049290921c916114f8816121d2565b905061148b565b5081156115295760405163e22e27eb60e01b8152600481018690526024810185905260440161037b565b949350505050565b6103d082826040516024016115479291906121e7565b60408051601f198184030181529190526020810180516001600160e01b0316634b5c427760e01b1790526113af565b6103d0828260405160240161158c929190612214565b60408051601f198184030181529190526020810180516001600160e01b0316632d839cb360e21b1790526113af565b6115e6604051806040016040528060018152602001602360f81b8152506115e1836103f1565b611531565b604051631ed40e3360e11b8152600481018290525f906001600160a01b03841690633da81c66906024015f60405180830381865afa15801561162a573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526116519190810190612235565b90505f5b8151811015611769576116a56040518060400160405280600381526020016201010160ed1b815250611686836103d4565b604051806040016040528060018152602001601d60f91b81525061178e565b6116f36040518060400160405280601081526020016f01010101010102932b1b2b4bb32b91d160851b8152508383815181106116e3576116e3611eb2565b60200260200101515f015161111f565b6117616040518060400160405280600b81526020016a01010101010102138399d160ad1b81525061174084848151811061172f5761172f611eb2565b6020026020010151602001516103d4565b6040518060400160405280600381526020016262707360e81b81525061178e565b600101611655565b50505050565b5f6a636f6e736f6c652e6c6f6790505f5f835160208501845afa505050565b6109b08383836040516024016117a6939291906122e9565b60408051601f198184030181529190526020810180516001600160e01b0316632ced7cef60e01b1790526113af565b60408051610120810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081019190915290565b6118438061232283390190565b61189b80613b6583390190565b5f5f82840361062081121561184d575f5ffd5b61050081121561185b575f5ffd5b8392506101206104ff1982011215611871575f5ffd5b50610500830190509250929050565b5f60208284031215611890575f5ffd5b5035919050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61051c6020830184611897565b634e487b7160e01b5f52604160045260245ffd5b60405161012081016001600160401b038111828210171561190e5761190e6118d7565b60405290565b604080519081016001600160401b038111828210171561190e5761190e6118d7565b60405160a081016001600160401b038111828210171561190e5761190e6118d7565b60405160e081016001600160401b038111828210171561190e5761190e6118d7565b60405161020081016001600160401b038111828210171561190e5761190e6118d7565b604051601f8201601f191681016001600160401b03811182821017156119c5576119c56118d7565b604052919050565b6001600160a01b03811681146103ee575f5ffd5b80356119ec816119cd565b919050565b5f6101208284031215611a02575f5ffd5b611a0a6118eb565b9050611a15826119e1565b8152611a23602083016119e1565b6020820152611a34604083016119e1565b6040820152611a45606083016119e1565b6060820152611a56608083016119e1565b6080820152611a6760a083016119e1565b60a0820152611a7860c083016119e1565b60c0820152611a8960e083016119e1565b60e0820152611a9b61010083016119e1565b61010082015292915050565b5f6101208284031215611ab8575f5ffd5b61051c83836119f1565b5f60408284031215611ad2575f5ffd5b611ada611914565b90508135611ae7816119cd565b81526020820135611af7816119cd565b602082015292915050565b5f60808284031215611b12575f5ffd5b604051608081016001600160401b0381118282101715611b3457611b346118d7565b6040908152833582526020808501359083015283810135908201526060928301359281019290925250919050565b803562ffffff811681146119ec575f5ffd5b5f818303610160811215611b86575f5ffd5b611b8e611936565b91508235611b9b816119cd565b82526020830135611bab816119cd565b602083015260e0603f1982011215611bc1575f5ffd5b50611bca611958565b604083810135825260608085013560208401526080808601358484015260a0808701359285019290925260c0808701359185019190915260e08601359184019190915261010085013590830152820152611c2761012083016119e1565b6060820152611c3961014083016119e1565b608082015292915050565b5f60e08284031215611c54575f5ffd5b611c5c611958565b90508135611c69816119cd565b81526020820135611c79816119cd565b60208201526040820135611c8c816119cd565b6040820152606082810135908201526080808301359082015260a0808301359082015260c09182013591810191909152919050565b5f60608284031215611cd1575f5ffd5b604051606081016001600160401b0381118282101715611cf357611cf36118d7565b6040529050808235611d04816119cd565b81526020830135611d14816119cd565b6020820152604092830135920191909152919050565b5f6105008284031215611d3b575f5ffd5b611d4361197a565b9050611d4e826119e1565b8152611d5d8360208401611ac2565b6020820152611d6f8360608401611b02565b604082015260e082013560608201526101008201356080820152611d9661012083016119e1565b60a0820152611da861014083016119e1565b60c0820152611dba61016083016119e1565b60e0820152611dcc61018083016119e1565b610100820152611ddf6101a08301611b62565b610120820152611df26101c083016119e1565b610140820152611e06836101e08401611b74565b610160820152611e1a836103408401611ac2565b610180820152611e2e836103808401611c44565b6101a0820152611e42836104608401611ac2565b6101c0820152611e56836104a08401611cc1565b6101e082015292915050565b5f5f6106208385031215611e74575f5ffd5b611e7e8484611d2a565b9150611e8e8461050085016119f1565b90509250929050565b5f6105008284031215611ea8575f5ffd5b61051c8383611d2a565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f60ff821660ff8103611eef57611eef611ec6565b60010192915050565b5f60208284031215611f08575f5ffd5b5051919050565b5f81518060208401855e5f93019283525090919050565b64555345523d60d81b81525f611f3f6005830184611f0f565b7f2020202020202020232053616c654d656d65546f6b656e4d616e61676572202881527373746570203420546965722d31206772616e742960601b60208201526034019392505050565b6c53414c455f4d414e414745523d60981b81525f61051c600d830184611f0f565b6f4645455f4449535452494255544f523d60801b81525f61051c6010830184611f0f565b6d424f4e44494e475f43555256453d60901b81525f61051c600e830184611f0f565b7246524f54485f4d454d455f464143544f52593d60681b81525f61051c6013830184611f0f565b7443524541544f525f464545535f434c41494d45523d60581b81525f61051c6015830184611f0f565b6c46524f54485f4255524e45523d60981b81525f61051c600d830184611f0f565b7f554e49535741505f56335f535741505f414441505445523d000000000000000081525f61051c6018830184611f0f565b604081525f6120a46040830185611897565b905060018060a01b03831660208301529392505050565b5f6001600160401b038211156120d3576120d36118d7565b5060051b60200190565b5f602082840312156120ed575f5ffd5b81516001600160401b03811115612102575f5ffd5b8201601f81018413612112575f5ffd5b8051612125612120826120bb565b61199d565b8082825260208201915060208360051b850101925086831115612146575f5ffd5b6020840193505b8284101561216857835182526020938401939091019061214d565b9695505050505050565b5f61217d8285611f0f565b620101e960ed1b81526121936003820185611f0f565b6262707360e81b815260030195945050505050565b80820281158282048414176103df576103df611ec6565b808201808211156103df576103df611ec6565b5f816121e0576121e0611ec6565b505f190190565b604081525f6121f96040830185611897565b828103602084015261220b8185611897565b95945050505050565b604081525f6122266040830185611897565b90508260208301529392505050565b5f60208284031215612245575f5ffd5b81516001600160401b0381111561225a575f5ffd5b8201601f8101841361226a575f5ffd5b8051612278612120826120bb565b8082825260208201915060208360061b850101925086831115612299575f5ffd5b6020840193505b8284101561216857604084880312156122b7575f5ffd5b6122bf611914565b84516122ca816119cd565b81526020858101518183015290835260409094019391909101906122a0565b606081525f6122fb6060830186611897565b828103602084015261230d8186611897565b90508281036040840152612168818561189756fe60a060405234801561000f575f5ffd5b5060405161184338038061184383398101604081905261002e91610379565b826001600160a01b03811661008a5760408051630961777760e41b81526004810191909152600a60448201526939bbb0b82937baba32b960b11b60648201526001600160a01b0390911660248201526084015b60405180910390fd5b50816001600160a01b0381166100dd5760408051630961777760e41b81526004810191909152600560448201526430b236b4b760d91b60648201526001600160a01b039091166024820152608401610081565b50806001600160a01b0381166101335760408051630961777760e41b81526004810191909152600860448201526737b832b930ba37b960c11b60648201526001600160a01b039091166024820152608401610081565b506001600160a01b03831660805261014b5f8361022d565b82905f906101a65760405163c10b188f60e01b815260606004820152601260648201527164656661756c742061646d696e20726f6c6560701b60848201526001600160a01b039092166024830152604482015260a401610081565b506101c090505f5160206118235f395f51905f528261022d565b815f5160206118235f395f51905f5290916102235760405163c10b188f60e01b815260606004820152600d60648201526c6f70657261746f7220726f6c6560981b60848201526001600160a01b039092166024830152604482015260a401610081565b50505050506103b9565b5f806102398484610263565b9050801561025a575f848152600160205260409020610258908461030a565b505b90505b92915050565b5f828152602081815260408083206001600160a01b038516845290915281205460ff16610303575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556102bb3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600161025d565b505f61025d565b5f61025a836001600160a01b0384165f81815260018301602052604081205461030357508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561025d565b80516001600160a01b0381168114610374575f5ffd5b919050565b5f5f5f6060848603121561038b575f5ffd5b6103948461035e565b92506103a26020850161035e565b91506103b06040850161035e565b90509250925092565b6080516114446103df5f395f818161024c0152818161066501526106cc01526114445ff3fe608060405234801561000f575f5ffd5b50600436106100fb575f3560e01c80639010d07c11610093578063c31c9c0711610063578063c31c9c0714610247578063ca15c8731461026e578063d547741f14610281578063f5b541a614610294575f5ffd5b80639010d07c146101e257806391d148541461020d578063a217fddf14610220578063a3246ad314610227575f5ffd5b80632f2ff15d116100ce5780632f2ff15d1461018957806336568abe1461019c57806338ed1739146101af578063818f8349146101cf575f5ffd5b806301ffc9a7146100ff57806304fe3fcb14610127578063248a9ca31461013c5780632495016a1461016c575b5f5ffd5b61011261010d36600461103b565b6102bb565b60405190151581526020015b60405180910390f35b61013a61013536600461107d565b6102e5565b005b61015e61014a3660046110c8565b5f9081526020819052604090206001015490565b60405190815260200161011e565b610175610bb881565b60405162ffffff909116815260200161011e565b61013a6101973660046110df565b610490565b61013a6101aa3660046110df565b6104ba565b6101c26101bd366004611109565b6104f2565b60405161011e91906111a7565b6101756101dd3660046111e9565b610868565b6101f56101f0366004611211565b6108a6565b6040516001600160a01b03909116815260200161011e565b61011261021b3660046110df565b6108c4565b61015e5f81565b61023a6102353660046110c8565b6108ec565b60405161011e9190611231565b6101f57f000000000000000000000000000000000000000000000000000000000000000081565b61015e61027c3660046110c8565b610905565b61013a61028f3660046110df565b61091b565b61015e7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92981565b5f6001600160e01b03198216635a05180f60e01b14806102df57506102df8261093f565b92915050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92961030f81610973565b836001600160a01b0381166103675760408051630961777760e41b815260048101919091526006604482015265746f6b656e4160d01b60648201526001600160a01b0390911660248201526084015b60405180910390fd5b50826001600160a01b03811661039157604051630961777760e41b815260040161035e9190611271565b50826001600160a01b0316846001600160a01b0316141583906103c857604051630961777760e41b815260040161035e9190611271565b5081620f424062ffffff8216106104165760408051631533de4360e01b81526004810191909152600360448201526266656560e81b606482015262ffffff909116602482015260840161035e565b508160025f6104258787610980565b815260208082019290925260409081015f20805462ffffff191662ffffff9485161790555191841682526001600160a01b0385811692908716917ff18161b22989d51062141f1a93919c1dd709b30f0f13dfa56c3e2b5efe1da6f1910160405180910390a350505050565b5f828152602081905260409020600101546104aa81610973565b6104b483836109ef565b50505050565b6001600160a01b03811633146104e35760405163334bd91960e11b815260040160405180910390fd5b6104ed8282610a22565b505050565b606083600281101561053f5760408051631533de4360e01b81526004810191909152600b60448201526a0e0c2e8d040d8cadccee8d60ab1b6064820152602481019190915260840161035e565b5086806105845760408051631533de4360e01b81526004810191909152600860448201526730b6b7bab73a24b760c11b6064820152602481019190915260840161035e565b50826001600160a01b0381166105d45760408051630961777760e41b815260048101919091526002604482015261746f60f01b60648201526001600160a01b03909116602482015260840161035e565b508142818111156106205760405163ea58dd2960e01b8152606060048201526008606482015267646561646c696e6560c01b60848201526024810192909252604482015260a40161035e565b505061066033308988885f81811061063a5761063a6112a2565b905060200201602081019061064f91906112b6565b6001600160a01b0316929190610a4d565b6106bc7f00000000000000000000000000000000000000000000000000000000000000008887875f818110610697576106976112a2565b90506020020160208101906106ac91906112b6565b6001600160a01b03169190610ab4565b5f6106c78686610b43565b90505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b858183f6040518060800160405280858152602001886001600160a01b031681526020018c81526020018b8152506040518263ffffffff1660e01b815260040161073f91906112fd565b6020604051808303815f875af115801561075b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061077f919061134a565b90508567ffffffffffffffff81111561079a5761079a611361565b6040519080825280602002602001820160405280156107c3578160200160208202803683370190505b50925088835f815181106107d9576107d96112a2565b602090810291909101015280836107f1600189611375565b81518110610801576108016112a2565b602002602001018181525050846001600160a01b0316336001600160a01b03167f79dbb638e0e184b522cb4db65c89f6d329add37e37fb592a9f0e3a03cc35d60d8b848660405161085493929190611394565b60405180910390a350509695505050505050565b5f5f60025f6108778686610980565b815260208101919091526040015f205462ffffff169050801561089a578061089e565b610bb85b949350505050565b5f8281526001602052604081206108bd9083610c62565b9392505050565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b5f8181526001602052604090206060906102df90610c6d565b5f8181526001602052604081206102df90610c79565b5f8281526020819052604090206001015461093581610973565b6104b48383610a22565b5f6001600160e01b03198216637965db0b60e01b14806102df57506301ffc9a760e01b6001600160e01b03198316146102df565b61097d8133610c82565b50565b5f5f5f836001600160a01b0316856001600160a01b0316106109a35783856109a6565b84845b6040516001600160601b0319606084811b8216602084015283901b1660348201529193509150604801604051602081830303815290604052805190602001209250505092915050565b5f5f6109fb8484610cbf565b905080156108bd575f848152600160205260409020610a1a9084610d4e565b509392505050565b5f5f610a2e8484610d62565b905080156108bd575f848152600160205260409020610a1a9084610dcb565b6040516001600160a01b0384811660248301528381166044830152606482018390526104b49186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050610ddf565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610b058482610e4b565b6104b4576040516001600160a01b0384811660248301525f6044830152610b3991869182169063095ea7b390606401610a82565b6104b48482610ddf565b606082825f818110610b5757610b576112a2565b9050602002016020810190610b6c91906112b6565b604051602001610b8f919060609190911b6001600160601b031916815260140190565b60408051601f19818403018152919052905060015b82811015610c5b5781610c088585610bbd600186611375565b818110610bcc57610bcc6112a2565b9050602002016020810190610be191906112b6565b868685818110610bf357610bf36112a2565b90506020020160208101906101dd91906112b6565b858584818110610c1a57610c1a6112a2565b9050602002016020810190610c2f91906112b6565b604051602001610c41939291906113bb565b60408051601f198184030181529190529150600101610ba4565b5092915050565b5f6108bd8383610e94565b60605f6108bd83610eba565b5f6102df825490565b610c8c82826108c4565b610cbb5760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161035e565b5050565b5f610cca83836108c4565b610d47575f838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610cff3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016102df565b505f6102df565b5f6108bd836001600160a01b038416610f13565b5f610d6d83836108c4565b15610d47575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016102df565b5f6108bd836001600160a01b038416610f58565b5f5f60205f8451602086015f885af180610dfe576040513d5f823e3d81fd5b50505f513d91508115610e15578060011415610e22565b6001600160a01b0384163b155b156104b457604051635274afe760e01b81526001600160a01b038516600482015260240161035e565b5f5f5f5f60205f8651602088015f8a5af192503d91505f519050828015610e8a57508115610e7c5780600114610e8a565b5f866001600160a01b03163b115b9695505050505050565b5f825f018281548110610ea957610ea96112a2565b905f5260205f200154905092915050565b6060815f01805480602002602001604051908101604052809291908181526020018280548015610f0757602002820191905f5260205f20905b815481526020019060010190808311610ef3575b50505050509050919050565b5f818152600183016020526040812054610d4757508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556102df565b5f8181526001830160205260408120548015611032575f610f7a600183611375565b85549091505f90610f8d90600190611375565b9050808214610fec575f865f018281548110610fab57610fab6112a2565b905f5260205f200154905080875f018481548110610fcb57610fcb6112a2565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080610ffd57610ffd6113fa565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506102df565b5f9150506102df565b5f6020828403121561104b575f5ffd5b81356001600160e01b0319811681146108bd575f5ffd5b80356001600160a01b0381168114611078575f5ffd5b919050565b5f5f5f6060848603121561108f575f5ffd5b61109884611062565b92506110a660208501611062565b9150604084013562ffffff811681146110bd575f5ffd5b809150509250925092565b5f602082840312156110d8575f5ffd5b5035919050565b5f5f604083850312156110f0575f5ffd5b8235915061110060208401611062565b90509250929050565b5f5f5f5f5f5f60a0878903121561111e575f5ffd5b8635955060208701359450604087013567ffffffffffffffff811115611142575f5ffd5b8701601f81018913611152575f5ffd5b803567ffffffffffffffff811115611168575f5ffd5b8960208260051b840101111561117c575f5ffd5b6020919091019450925061119260608801611062565b95989497509295919493608090920135925050565b602080825282518282018190525f918401906040840190835b818110156111de5783518352602093840193909201916001016111c0565b509095945050505050565b5f5f604083850312156111fa575f5ffd5b61120383611062565b915061110060208401611062565b5f5f60408385031215611222575f5ffd5b50508035926020909101359150565b602080825282518282018190525f918401906040840190835b818110156111de5783516001600160a01b031683526020938401939092019160010161124a565b6040808252600690820152653a37b5b2b72160d11b60608201526001600160a01b0391909116602082015260800190565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156112c6575f5ffd5b6108bd82611062565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f82516080602084015261131860a08401826112cf565b905060018060a01b03602085015116604084015260408401516060840152606084015160808401528091505092915050565b5f6020828403121561135a575f5ffd5b5051919050565b634e487b7160e01b5f52604160045260245ffd5b818103818111156102df57634e487b7160e01b5f52601160045260245ffd5b838152826020820152606060408201525f6113b260608301846112cf565b95945050505050565b5f84518060208701845e60e89490941b6001600160e81b0319169190930190815260609190911b6001600160601b031916600382015260170192915050565b634e487b7160e01b5f52603160045260245ffdfea264697066735822122027e045caab9bbf1bb79c8881723435fb67c5f259b0aedf5077ae1c97187fd61764736f6c634300081c003397667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929610100604052348015610010575f5ffd5b5060405161189b38038061189b83398101604081905261002f9161048c565b856001600160a01b0381166100895760408051630961777760e41b8152600481019190915260086044820152673937baba32b92b1960c11b60648201526001600160a01b0390911660248201526084015b60405180910390fd5b50846001600160a01b0381166100e45760408051630961777760e41b81526004810191909152600d60448201526c777261707065644e617469766560981b60648201526001600160a01b039091166024820152608401610080565b50836001600160a01b0381166101375760408051630961777760e41b8152600481019190915260056044820152640cce4dee8d60db1b60648201526001600160a01b039091166024820152608401610080565b50826001600160a01b03811661018a5760408051630961777760e41b81526004810191909152600560448201526430b236b4b760d91b60648201526001600160a01b039091166024820152608401610080565b50816001600160a01b0381166101e05760408051630961777760e41b81526004810191909152600860448201526737b832b930ba37b960c11b60648201526001600160a01b039091166024820152608401610080565b50808061022c5760408051631533de4360e01b81526004810191909152600f60448201526e1b5a5b93985d1a5d99505b5bdd5b9d608a1b60648201526024810191909152608401610080565b506001600160a01b0380871660a05284811660c052851660e052600281905561dead60805261025b5f84610340565b83905f906102b65760405163c10b188f60e01b815260606004820152601260648201527164656661756c742061646d696e20726f6c6560701b60848201526001600160a01b039092166024830152604482015260a401610080565b506102d090505f51602061187b5f395f51905f5283610340565b825f51602061187b5f395f51905f5290916103335760405163c10b188f60e01b815260606004820152600d60648201526c6f70657261746f7220726f6c6560981b60848201526001600160a01b039092166024830152604482015260a401610080565b50505050505050506104f5565b5f8061034c8484610376565b9050801561036d575f84815260016020526040902061036b908461041d565b505b90505b92915050565b5f828152602081815260408083206001600160a01b038516845290915281205460ff16610416575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556103ce3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610370565b505f610370565b5f61036d836001600160a01b0384165f81815260018301602052604081205461041657508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610370565b80516001600160a01b0381168114610487575f5ffd5b919050565b5f5f5f5f5f5f60c087890312156104a1575f5ffd5b6104aa87610471565b95506104b860208801610471565b94506104c660408801610471565b93506104d460608801610471565b92506104e260808801610471565b915060a087015190509295509295509295565b60805160a05160c05160e0516113146105675f395f818161030b0152818161041001528181610734015281816107e70152610c7e01525f818161016301528181610871015261099801525f818161024a01528181610815015261083d01525f818161027101526109ba01526113145ff3fe608060405234801561000f575f5ffd5b5060043610610132575f3560e01c806370d5ae05116100b4578063ca15c87311610079578063ca15c873146102e0578063d547741f146102f3578063d999984d14610306578063e31a63811461032d578063f591c32714610335578063f5b541a614610348575f5ffd5b806370d5ae051461026c5780639010d07c1461029357806391d14854146102a6578063a217fddf146102b9578063a3246ad3146102c0575f5ffd5b806336568abe116100fa57806336568abe146101ea578063384893be146101fd5780633ebe0b5d146102295780634a3e66f514610232578063502f744614610245575f5ffd5b806301ffc9a714610136578063132ba6241461015e578063248a9ca31461019d5780632f2ff15d146101cd5780633626193c146101e2575b5f5ffd5b610149610144366004610f8e565b61035c565b60405190151581526020015b60405180910390f35b6101857f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610155565b6101bf6101ab366004610fb5565b5f9081526020819052604090206001015490565b604051908152602001610155565b6101e06101db366004610fe7565b610386565b005b6101bf6103b0565b6101e06101f8366004610fe7565b6103be565b61021061020b366004611011565b6103f6565b6040516001600160e01b03199091168152602001610155565b6101bf60025481565b6101e0610240366004610fb5565b61054d565b6101857f000000000000000000000000000000000000000000000000000000000000000081565b6101857f000000000000000000000000000000000000000000000000000000000000000081565b6101856102a13660046110b9565b610571565b6101496102b4366004610fe7565b61058f565b6101bf5f81565b6102d36102ce366004610fb5565b6105b7565b604051610155919061111c565b6101bf6102ee366004610fb5565b6105d0565b6101e0610301366004610fe7565b6105e6565b6101857f000000000000000000000000000000000000000000000000000000000000000081565b6101bf603c81565b6101e0610343366004610fb5565b61060a565b6101bf5f5160206112bf5f395f51905f5281565b5f6001600160e01b03198216635a05180f60e01b14806103805750610380826106a9565b92915050565b5f828152602081905260409020600101546103a0816106dd565b6103aa83836106ea565b50505050565b5f6103b961071d565b905090565b6001600160a01b03811633146103e75760405163334bd91960e11b815260040160405180910390fd5b6103f182826107a5565b505050565b5f5f5160206112bf5f395f51905f5261040e816106dd565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b03161486906104915760408051630961777760e41b8152600481019190915260056044820152643a37b5b2b760d91b60648201526001600160a01b0390911660248201526084015b60405180910390fd5b506104a95f5160206112bf5f395f51905f528961058f565b88906104f55760408051630961777760e41b81526004810191909152600860448201526737b832b930ba37b960c11b60648201526001600160a01b039091166024820152608401610488565b5084806105385760408051631533de4360e01b815260048101919091526006604482015265185b5bdd5b9d60d21b60648201526024810191909152608401610488565b50631c2449df60e11b98975050505050505050565b5f5160206112bf5f395f51905f52610564816106dd565b61056d826107d0565b5050565b5f8281526001602052604081206105889083610a22565b9392505050565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b5f81815260016020526040902060609061038090610a2d565b5f81815260016020526040812061038090610a39565b5f82815260208190526040902060010154610600816106dd565b6103aa83836107a5565b5f5160206112bf5f395f51905f52610621816106dd565b818061066c5760408051631533de4360e01b81526004810191909152600f60448201526e1b5a5b93985d1a5d99505b5bdd5b9d608a1b60648201526024810191909152608401610488565b5060028290556040518281527f32995a1d10fae1883717ee96a3a48a60b73f032ffae82a68a5fd3feea50651a89060200160405180910390a15050565b5f6001600160e01b03198216637965db0b60e01b148061038057506301ffc9a760e01b6001600160e01b0319831614610380565b6106e78133610a42565b50565b5f5f6106f68484610a7b565b90508015610588575f8481526001602052604090206107159084610b0a565b509392505050565b6040516370a0823160e01b81523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610781573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103b9919061112e565b5f5f6107b18484610b1e565b90508015610588575f8481526001602052604090206107159084610b87565b5f6107d961071d565b905060025481111561056d577f000000000000000000000000000000000000000000000000000000000000000061083a6001600160a01b0382167f000000000000000000000000000000000000000000000000000000000000000084610b9b565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166338ed173984866108957f0000000000000000000000000000000000000000000000000000000000000000610c58565b306108a1603c42611159565b6040518663ffffffff1660e01b81526004016108c195949392919061116c565b5f604051808303815f875af11580156108dc573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261090391908101906111bb565b90505f815f8151811061091857610918611283565b602002602001015190505f8260018151811061093657610936611283565b602002602001015190505f8111819061098a5760408051631533de4360e01b81526004810191909152600b60448201526a199c9bdd1a105b5bdd5b9d60aa1b60648201526024810191909152608401610488565b506109df6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000083610d01565b604080518381526020810183905233917f72804eb0f37edc6b86d6105e2c070989375ca372ce96e4f4a26e1cd5d05d2e9c910160405180910390a2505050505050565b5f6105888383610d32565b60605f61058883610d58565b5f610380825490565b610a4c828261058f565b61056d5760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401610488565b5f610a86838361058f565b610b03575f838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610abb3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610380565b505f610380565b5f610588836001600160a01b038416610db1565b5f610b29838361058f565b15610b03575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610380565b5f610588836001600160a01b038416610df6565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610bec8482610ed9565b6103aa576040516001600160a01b0384811660248301525f6044830152610c4e91869182169063095ea7b3906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050610f22565b6103aa8482610f22565b60408051600280825260608083018452925f9291906020830190803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000815f81518110610caf57610caf611283565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110610ce357610ce3611283565b6001600160a01b039092166020928302919091019091015292915050565b6040516001600160a01b038381166024830152604482018390526103f191859182169063a9059cbb90606401610c1c565b5f825f018281548110610d4757610d47611283565b905f5260205f200154905092915050565b6060815f01805480602002602001604051908101604052809291908181526020018280548015610da557602002820191905f5260205f20905b815481526020019060010190808311610d91575b50505050509050919050565b5f818152600183016020526040812054610b0357508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610380565b5f8181526001830160205260408120548015610ed0575f610e18600183611297565b85549091505f90610e2b90600190611297565b9050808214610e8a575f865f018281548110610e4957610e49611283565b905f5260205f200154905080875f018481548110610e6957610e69611283565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080610e9b57610e9b6112aa565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610380565b5f915050610380565b5f5f5f5f60205f8651602088015f8a5af192503d91505f519050828015610f1857508115610f0a5780600114610f18565b5f866001600160a01b03163b115b9695505050505050565b5f5f60205f8451602086015f885af180610f41576040513d5f823e3d81fd5b50505f513d91508115610f58578060011415610f65565b6001600160a01b0384163b155b156103aa57604051635274afe760e01b81526001600160a01b0385166004820152602401610488565b5f60208284031215610f9e575f5ffd5b81356001600160e01b031981168114610588575f5ffd5b5f60208284031215610fc5575f5ffd5b5035919050565b80356001600160a01b0381168114610fe2575f5ffd5b919050565b5f5f60408385031215610ff8575f5ffd5b8235915061100860208401610fcc565b90509250929050565b5f5f5f5f5f5f60a08789031215611026575f5ffd5b61102f87610fcc565b955061103d60208801610fcc565b945061104b60408801610fcc565b935060608701359250608087013567ffffffffffffffff81111561106d575f5ffd5b8701601f8101891361107d575f5ffd5b803567ffffffffffffffff811115611093575f5ffd5b8960208284010111156110a4575f5ffd5b60208201935080925050509295509295509295565b5f5f604083850312156110ca575f5ffd5b50508035926020909101359150565b5f8151808452602084019350602083015f5b828110156111125781516001600160a01b03168652602095860195909101906001016110eb565b5093949350505050565b602081525f61058860208301846110d9565b5f6020828403121561113e575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561038057610380611145565b85815284602082015260a060408201525f61118a60a08301866110d9565b6001600160a01b0394909416606083015250608001529392505050565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156111cb575f5ffd5b815167ffffffffffffffff8111156111e1575f5ffd5b8201601f810184136111f1575f5ffd5b805167ffffffffffffffff81111561120b5761120b6111a7565b8060051b604051601f19603f830116810181811067ffffffffffffffff82111715611238576112386111a7565b604052918252602081840181019290810187841115611255575f5ffd5b6020850194505b838510156112785784518082526020958601959093500161125c565b509695505050505050565b634e487b7160e01b5f52603260045260245ffd5b8181038181111561038057610380611145565b634e487b7160e01b5f52603160045260245ffdfe97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929a2646970667358221220402a746701690d1acc0dfa4a3a504096d7a950a482d7567d80ab551d4867df1064736f6c634300081c003397667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9292d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d23202d2d2d20636172727920746865736520746f2074686520546965722d31206772616e74202b20766572696679207374657073202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d0a0aa2646970667358221220aaa28bfa784887d57cac9822dfb423dbe420f128b8397e52a783c51069d9ff0164736f6c634300081c0033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| no event logs emitted by this address | |||
| 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 | ||
|---|---|---|---|---|---|---|---|---|---|
| no token transfers for this address yet | |||||||||
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xdf0fd9…90274e | configure | 10,436,270 | 33 days agoWed, 15 Jul 2026 13:40:41 UTC | 0x3f96…c9b8 | IN | FrothMemeProtocolDeployer05 | $0.000 ETH | 0.00002580 | |
| 0x7c22ae…80342f | deploy | 10,436,270 | 33 days agoWed, 15 Jul 2026 13:40:41 UTC | 0x3f96…c9b8 | IN | FrothMemeProtocolDeployer05 | $0.000 ETH | 0.00014767 |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 10,436,270 | 33 days agoWed, 15 Jul 2026 13:40:41 UTC | 0x7c22ae…80342f | CREATE | deploy | 0x9aed…4b29 | OUT | 0x632a…a630 | 0 ETH |
| 10,436,270 | 33 days agoWed, 15 Jul 2026 13:40:41 UTC | 0x7c22ae…80342f | CREATE | deploy | 0x9aed…4b29 | OUT | 0x1446…0626 | 0 ETH |