Configurator
The Configurator
contract is used by the admin as a single point of entry to configure protocol parameters.
Methods
batchInitLendingPoolReserve()
function batchInitLendingPoolReserve(ConfigTypes.InitReserveInput[] calldata input)
Batch initialises lending pool reserves.
Parameter Name | Type | Description |
---|---|---|
| ConfigTypes.InitReserveInput[] calldata | See ConfigTypes library for detail. |
setBorrowingFlagOnReserve()
function setBorrowingFlagOnReserve(uint256[] calldata reserveIds, bool flag)
Sets the borrowing for a given list of reserveIds.
Parameter Name | Type | Description |
---|---|---|
| uint256[] calldata | ids of target reserves |
| bool | true if borrowing is enabled |
setBorrowingRateBorrowingOnReserve()
function setVariableRateBorrowingOnReserve(uint256[] calldata reserveIds, bool flag)
Sets the variable rate borrowing for a given list of reserveIds.
Parameter Name | Type | Description |
---|---|---|
| uint256[] calldata | ids of target reserves |
| bool | true if variable rate borrowing is enabled |
setActiveFlagOnReserve()
function setActiveFlagOnReserve(uint256[] calldata reserveIds, bool flag)
Sets the active state for a given list of reserveIds.
Parameter Name | Type | Description |
---|---|---|
| uint256[] calldata | ids of target reserves |
| bool | true if reserve is active |
setFreezeFlagOnReserve()
function setFreezeFlagOnReserve(uint256[] calldata reserveIds, bool flag)
Sets the freeze state for a given list of reserveIds.
Parameter Name | Type | Description |
---|---|---|
| uint256[] calldata | ids of target reserves |
| bool | true if reserve is frozen |
setReserveFactor()
function setReserveFactor(uint256[] calldata reserveIds, uint256 factor)
Sets the reserve factor for a given list of reserveIds.
Parameter Name | Type | Description |
---|---|---|
| uint256[] calldata | ids of target reserves |
| uint256 | the percentage of yield that goes to the protocol |
setReserveInterestRateAddress()
function setReserveInterestRateAddress(uint256[] calldata reserveIds, uint256 rateAddress)
Sets the reserve interest rate model address for a given list of reserveIds.
Parameter Name | Type | Description |
---|---|---|
| uint256[] calldata | ids of target reserves |
| address | address of the interest rate model |
batchConfigReserve()
function batchConfigReserve(ConfigTypes.ConfigReserveInput[] calldata inputs)
Batch configures reserve parameters.
Parameter Name | Type | Description |
---|---|---|
| ConfigTypes.ConfigReserveInput[] calldata | See ConfigTypes library for detail. |
configureReserveAuction()
function configureReserveAuction(uint256[] calldata reserveIds, uint256 liquidationBonus, uint256 auctionDuration, uint256 auctionPriceMultiple)
Configures reserve auction parameters for a list of reserveIds.
Parameter Name | Type | Description |
---|---|---|
| uint256[] calldata | ids of target reserves |
| uint256 | bonus paid to auction stakeholders |
| uint256 | duration of the auction |
| uint256 | dutch auction start price multiplier |
setReserveMaxSupply()
function setReserveMaxSupply(uint256[] calldata reserveIds, uint256 maxSupply)
Sets the max supply of NFTs that can be used as collateral within a list of reserves.
Parameter Name | Type | Description |
---|---|---|
| uint256[] calldata | ids of target reserves |
| uint256 | max number of NFTs that can be used as collateral within the reserve |
setReserveCreatorAddress()
function setReserveCreatorAddress(uint256 reserveId, address creator)
Sets the creator address for a reserve.
Parameter Name | Type | Description |
---|---|---|
| uint256 | ids of target reserves |
| address | address to pay creator royalties |
setReserveCreatorPercentage()
function setReserveCreatorPercentage(uint256 reserveId, uint256 percentage)
Sets the creator percentage of collection fees accrued to the protocol.
Parameter Name | Type | Description |
---|---|---|
| uint256 | ids of target reserves |
| uint256 | percentage in 1e4, e.g. 5000 == 50% |
setMaxNumberOfReserves()
function setMaxNumberOfReserves(uint256 newVal)
Sets the maximum number of reserves permitted within the protocol.
Parameter Name | Type | Description |
---|---|---|
| uint256 | maximum number of reserves permitted |
setPoolPause()
function setPoolPause(bool val)
Pauses / unpauses all actions of the protocol including fToken transfers. Only actionable by the emergency admin.
Parameter Name | Type | Description |
---|---|---|
| bool | true to pause, false to unpause |
setPoolPauseTime()
function setPoolPauseTime(uint256 startTime, uint256 duration)
Pauses / unpauses all actions of the protocol including fToken transfers; at a given time, for a given duration. Only actionable by the emergency admin.
Parameter Name | Type | Description |
---|---|---|
| uint256 | pause start time |
| uint256 | pause duration from the start time |
updateFToken()
function updateFToken(ConfigTypes.UpdateFTokenInput[] calldata inputs)
Updates the fToken implementation for the reserve.
Parameter Name | Type | Description |
---|---|---|
| ConfigTypes.UpdateFTokenInput[] calldata | See ConfigTypes library for detail. |
updateStableDebtToken()
function updateStableDebtToken(ConfigTypes.UpdateStableDebtTokenInput[] calldata inputs)
Updates the stableDebtToken implementation for the reserve.
Parameter Name | Type | Description |
---|---|---|
| ConfigTypes.UpdateStableDebtTokenInput[] calldata | See ConfigTypes library for detail. |
updateVariableDebtToken()
function updateVariableDebtToken(ConfigTypes.UpdateVariableDebtTokenInput[] calldata inputs)
Updates the variableDebtToken implementation for the reserve.
Parameter Name | Type | Description |
---|---|---|
| ConfigTypes.UpdateVariableDebtTokenInput[] calldata | See ConfigTypes library for detail. |
approveExecutionDelegateContracts()
function approveExecutionDelegateContracts(address[] calldata contracts)
Approves contracts to send/receive tokens on behalf of the execution delegate.
Parameter Name | Type | Description |
---|---|---|
| address[] calldata | addresses of contracts approved by the execution delegate |
approveWETHExecutionDelegate()
function approveWETHExecutionDelegate()
Approves the Execution Delegate contract to send/receive tokens on behalf of the WETH Gateway.
View Methods
ABI
Configurator ABI
{
"abi": [
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "reserveId",
"type": "uint256"
}
],
"name": "BorrowingDisabledOnReserve",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "reserveId",
"type": "uint256"
}
],
"name": "BorrowingEnabledOnReserve",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "reserveId",
"type": "uint256"
},
{
"indexed": false,
"internalType": "address",
"name": "collateral",
"type": "address"
},
{
"indexed": false,
"internalType": "address",
"name": "asset",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "proxy",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "implementation",
"type": "address"
}
],
"name": "DebtTokenUpgraded",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "reserveId",
"type": "uint256"
},
{
"indexed": false,
"internalType": "address",
"name": "collateral",
"type": "address"
},
{
"indexed": false,
"internalType": "address",
"name": "asset",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "proxy",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "implementation",
"type": "address"
}
],
"name": "FTokenUpgraded",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint8",
"name": "version",
"type": "uint8"
}
],
"name": "Initialized",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint256",
"name": "maxNumberOfReserves",
"type": "uint256"
}
],
"name": "MaxNumberOfReservesChanged",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "string",
"name": "method",
"type": "string"
}
],
"name": "PriceConsumerAssetPriceMethodChanged",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "string",
"name": "method",
"type": "string"
}
],
"name": "PriceConsumerNftPriceMethodChanged",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "reserveId",
"type": "uint256"
}
],
"name": "ReserveActivated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "reserveId",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "liquidationBonus",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "auctionDuration",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "auctionPriceMultiple",
"type": "uint256"
}
],
"name": "ReserveAuctionChanged",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "reserveId",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "ltv",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "liquidationThreshold",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "liquidationBonus",
"type": "uint256"
}
],
"name": "ReserveCollateralConfigurationChanged",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "reserveId",
"type": "uint256"
}
],
"name": "ReserveDeactivated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "reserveId",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "factor",
"type": "uint256"
}
],
"name": "ReserveFactorChanged",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "reserveId",
"type": "uint256"
}
],
"name": "ReserveFrozen",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "reserveId",
"type": "uint256"
},
{
"indexed": true,
"internalType": "address",
"name": "collateral",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "asset",
"type": "address"
},
{
"indexed": false,
"internalType": "address",
"name": "fToken",
"type": "address"
},
{
"indexed": false,
"internalType": "address",
"name": "stableDebtToken",
"type": "address"
},
{
"indexed": false,
"internalType": "address",
"name": "variableDebtToken",
"type": "address"
},
{
"indexed": false,
"internalType": "address",
"name": "interestRateStrategyAddress",
"type": "address"
}
],
"name": "ReserveInitialized",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "reserveId",
"type": "uint256"
},
{
"indexed": false,
"internalType": "address",
"name": "strategy",
"type": "address"
}
],
"name": "ReserveInterestRateChanged",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "reserveId",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "maxSupply",
"type": "uint256"
}
],
"name": "ReserveMaxSupplyChanged",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "reserveId",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "redeemThreshold",
"type": "uint256"
}
],
"name": "ReserveRedeemThresholdChanged",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "reserveId",
"type": "uint256"
}
],
"name": "ReserveUnfrozen",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "reserveId",
"type": "uint256"
}
],
"name": "VariableRateBorrowingDisabledOnReserve",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "reserveId",
"type": "uint256"
}
],
"name": "VariableRateBorrowingEnabledOnReserve",
"type": "event"
},
{
"inputs": [
{
"internalType": "address[]",
"name": "contracts",
"type": "address[]"
}
],
"name": "approveExecutionDelegateContracts",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "approveWETHExecutionDelegate",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "uint256",
"name": "reserveId",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "reserveFactor",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "ltv",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "decimals",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "gracePeriod",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "liquidationBonus",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "liquidationThreshold",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "auctionDuration",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "auctionPriceMultiple",
"type": "uint256"
},
{
"internalType": "bool",
"name": "borrowingEnabled",
"type": "bool"
}
],
"internalType": "struct ConfigTypes.ConfigReserveInput[]",
"name": "inputs",
"type": "tuple[]"
}
],
"name": "batchConfigReserve",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "underlyingCollateral",
"type": "address"
},
{
"internalType": "string",
"name": "underlyingCollateralName",
"type": "string"
},
{
"internalType": "string",
"name": "underlyingCollateralSymbol",
"type": "string"
},
{
"internalType": "uint256",
"name": "underlyingMaxTokenId",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "underlyingMinTokenId",
"type": "uint256"
},
{
"internalType": "address",
"name": "underlyingAsset",
"type": "address"
},
{
"internalType": "string",
"name": "underlyingAssetName",
"type": "string"
},
{
"internalType": "string",
"name": "underlyingAssetSymbol",
"type": "string"
},
{
"internalType": "uint8",
"name": "underlyingAssetDecimals",
"type": "uint8"
},
{
"internalType": "address",
"name": "fTokenImpl",
"type": "address"
},
{
"internalType": "string",
"name": "fTokenName",
"type": "string"
},
{
"internalType": "string",
"name": "fTokenSymbol",
"type": "string"
},
{
"internalType": "address",
"name": "stableDebtTokenImpl",
"type": "address"
},
{
"internalType": "string",
"name": "stableDebtTokenName",
"type": "string"
},
{
"internalType": "string",
"name": "stableDebtTokenSymbol",
"type": "string"
},
{
"internalType": "address",
"name": "variableDebtTokenImpl",
"type": "address"
},
{
"internalType": "string",
"name": "variableDebtTokenName",
"type": "string"
},
{
"internalType": "string",
"name": "variableDebtTokenSymbol",
"type": "string"
},
{
"internalType": "address",
"name": "interestRateStrategy",
"type": "address"
},
{
"internalType": "uint256",
"name": "baseLTV",
"type": "uint256"
},
{
"internalType": "address",
"name": "treasury",
"type": "address"
},
{
"internalType": "address",
"name": "creator",
"type": "address"
},
{
"internalType": "uint256",
"name": "creatorPercentage",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "auctionCallerPercentage",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "auctionCreatorPercentage",
"type": "uint256"
},
{
"internalType": "string",
"name": "assetPriceFeed",
"type": "string"
}
],
"internalType": "struct ConfigTypes.InitReserveInput[]",
"name": "input",
"type": "tuple[]"
}
],
"name": "batchInitLendingPoolReserve",
"outputs": [
{
"internalType": "address[]",
"name": "",
"type": "address[]"
},
{
"internalType": "address[]",
"name": "",
"type": "address[]"
},
{
"internalType": "address[]",
"name": "",
"type": "address[]"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256[]",
"name": "reserveIds",
"type": "uint256[]"
},
{
"internalType": "uint256",
"name": "liquidationBonus",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "auctionDuration",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "auctionPriceMultiple",
"type": "uint256"
}
],
"name": "configureReserveAuction",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "addressProvider",
"type": "address"
}
],
"name": "initialize",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256[]",
"name": "reserveIds",
"type": "uint256[]"
},
{
"internalType": "bool",
"name": "flag",
"type": "bool"
}
],
"name": "setActiveFlagOnReserve",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256[]",
"name": "reserveIds",
"type": "uint256[]"
},
{
"internalType": "bool",
"name": "flag",
"type": "bool"
}
],
"name": "setBorrowingFlagOnReserve",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256[]",
"name": "reserveIds",
"type": "uint256[]"
},
{
"internalType": "bool",
"name": "flag",
"type": "bool"
}
],
"name": "setFreezeFlagOnReserve",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "newVal",
"type": "uint256"
}
],
"name": "setMaxNumberOfReserves",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bool",
"name": "val",
"type": "bool"
}
],
"name": "setPoolPause",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "startTime",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "durationTime",
"type": "uint256"
}
],
"name": "setPoolPausedTime",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "reserveId",
"type": "uint256"
},
{
"internalType": "address",
"name": "creator",
"type": "address"
}
],
"name": "setReserveCreatorAddress",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "reserveId",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "percentage",
"type": "uint256"
}
],
"name": "setReserveCreatorPercentage",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256[]",
"name": "reserveIds",
"type": "uint256[]"
},
{
"internalType": "uint256",
"name": "reserveFactor",
"type": "uint256"
}
],
"name": "setReserveFactor",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256[]",
"name": "reserveIds",
"type": "uint256[]"
},
{
"internalType": "address",
"name": "rateAddress",
"type": "address"
}
],
"name": "setReserveInterestRateAddress",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256[]",
"name": "reserveIds",
"type": "uint256[]"
},
{
"internalType": "uint256",
"name": "maxSupply",
"type": "uint256"
}
],
"name": "setReserveMaxSupply",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256[]",
"name": "reserveIds",
"type": "uint256[]"
},
{
"internalType": "bool",
"name": "flag",
"type": "bool"
}
],
"name": "setVariableRateBorrowingFlagOnReserve",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "collateral",
"type": "address"
},
{
"internalType": "address",
"name": "asset",
"type": "address"
},
{
"internalType": "address",
"name": "implementation",
"type": "address"
},
{
"internalType": "uint256",
"name": "reserveId",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "encodedCallData",
"type": "bytes"
}
],
"internalType": "struct ConfigTypes.UpdateFTokenInput[]",
"name": "inputs",
"type": "tuple[]"
}
],
"name": "updateFToken",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "collateral",
"type": "address"
},
{
"internalType": "address",
"name": "asset",
"type": "address"
},
{
"internalType": "address",
"name": "implementation",
"type": "address"
},
{
"internalType": "uint256",
"name": "reserveId",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "encodedCallData",
"type": "bytes"
}
],
"internalType": "struct ConfigTypes.UpdateDebtTokenInput[]",
"name": "inputs",
"type": "tuple[]"
}
],
"name": "updateStableDebtToken",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "collateral",
"type": "address"
},
{
"internalType": "address",
"name": "asset",
"type": "address"
},
{
"internalType": "address",
"name": "implementation",
"type": "address"
},
{
"internalType": "uint256",
"name": "reserveId",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "encodedCallData",
"type": "bytes"
}
],
"internalType": "struct ConfigTypes.UpdateDebtTokenInput[]",
"name": "inputs",
"type": "tuple[]"
}
],
"name": "updateVariableDebtToken",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
],
"bytecode": {
"object": "0x608060405234801561001057600080fd5b50613d9e806100206000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c806380a4d93d116100b8578063c4d66de81161007c578063c4d66de814610268578063c739fd411461027b578063ceaedb9b1461028e578063d9db75ee146102a1578063e49c8a52146102b4578063f9e8cafa146102c757600080fd5b806380a4d93d1461020957806384636d4f1461021c578063a9c644011461022f578063bbce5cf314610242578063bfead1a41461025557600080fd5b80633c8db8b1116100ff5780633c8db8b1146101aa5780635b5b815e146101bd578063746c35a2146101d05780637641f3d9146101e35780637bb28860146101f657600080fd5b80630e3427891461013c57806312b4f1901461014657806314699c651461015957806329534299146101845780632d72e18e14610197575b600080fd5b6101446102da565b005b610144610154366004613176565b61045b565b61016c6101673660046131cc565b610618565b60405161017b93929190613251565b60405180910390f35b6101446101923660046131cc565b6108ed565b6101446101a5366004613294565b610a5b565b6101446101b83660046131cc565b610c09565b6101446101cb3660046132ef565b610d71565b6101446101de366004613342565b611016565b6101446101f136600461335b565b611210565b6101446102043660046132ef565b61132e565b6101446102173660046131cc565b6115e2565b61014461022a36600461337d565b6117b1565b61014461023d366004613294565b6118d7565b61014461025036600461339f565b611b21565b6101446102633660046132ef565b611c16565b6101446102763660046133cf565b611ebb565b6101446102893660046133ec565b611fe0565b61014461029c3660046131cc565b6124a5565b6101446102af366004613461565b61260d565b6101446102c236600461337d565b612876565b6101446102d53660046132ef565b612969565b603354604080516315d9b46f60e31b8152905133926001600160a01b03169163aecda3789160048083019260209291908290030181865afa158015610323573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061034791906134c5565b6001600160a01b0316146040518060400160405280600381526020016203130360ec1b815250906103945760405162461bcd60e51b815260040161038b9190613506565b60405180910390fd5b50603354604080516377532ed960e01b815290516000926001600160a01b0316916377532ed99160048083019260209291908290030181865afa1580156103df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061040391906134c5565b9050806001600160a01b031663caaabc606040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561044057600080fd5b505af1158015610454573d6000803e3d6000fd5b5050505050565b603354604080516315d9b46f60e31b8152905133926001600160a01b03169163aecda3789160048083019260209291908290030181865afa1580156104a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104c891906134c5565b6001600160a01b0316146040518060400160405280600381526020016203130360ec1b8152509061050c5760405162461bcd60e51b815260040161038b9190613506565b506000610517612bf7565b905060005b8381101561045457816001600160a01b0316631932277586868481811061054557610545613539565b90506020020135856040518363ffffffff1660e01b815260040161057c9291909182526001600160a01b0316602082015260400190565b600060405180830381600087803b15801561059657600080fd5b505af11580156105aa573d6000803e3d6000fd5b505050508484828181106105c0576105c0613539565b6040516001600160a01b038716815260209182029390930135927ffe4461f34cf72b37179ac7dc6e66d7e91f10582c203cc08170ea5bf090983c0a92500160405180910390a2806106108161354f565b91505061051c565b603354604080516315d9b46f60e31b815290516060928392839233926001600160a01b03169163aecda3789160048083019260209291908290030181865afa158015610668573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068c91906134c5565b6001600160a01b0316146040518060400160405280600381526020016203130360ec1b815250906106d05760405162461bcd60e51b815260040161038b9190613506565b506000846001600160401b038111156106eb576106eb613576565b604051908082528060200260200182016040528015610714578160200160208202803683370190505b5090506000856001600160401b0381111561073157610731613576565b60405190808252806020026020018201604052801561075a578160200160208202803683370190505b5090506000866001600160401b0381111561077757610777613576565b6040519080825280602002602001820160405280156107a0578160200160208202803683370190505b50905060006107ad612bf7565b905060005b888110156108de5760335473__$0fe017e20684fbd032f923e9d615f3d00e$__9063a1086fed906001600160a01b0316848d8d868181106107f5576107f5613539565b9050602002810190610807919061358c565b6040518463ffffffff1660e01b81526004016108259392919061362c565b606060405180830381865af4158015610842573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086691906139aa565b87848151811061087857610878613539565b6020026020010187858151811061089157610891613539565b602002602001018786815181106108aa576108aa613539565b6001600160a01b039485166020918202929092010152928216909252919091169052806108d68161354f565b9150506107b2565b50929891975095509350505050565b603354604080516315d9b46f60e31b8152905133926001600160a01b03169163aecda3789160048083019260209291908290030181865afa158015610936573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095a91906134c5565b6001600160a01b0316146040518060400160405280600381526020016203130360ec1b8152509061099e5760405162461bcd60e51b815260040161038b9190613506565b5060006109a9612bf7565b905060005b82811015610a555773__$0fe017e20684fbd032f923e9d615f3d00e$__63d6979abe838686858181106109e3576109e3613539565b90506020028101906109f591906139ec565b6040518363ffffffff1660e01b8152600401610a12929190613a7d565b60006040518083038186803b158015610a2a57600080fd5b505af4158015610a3e573d6000803e3d6000fd5b505050508080610a4d9061354f565b9150506109ae565b50505050565b603354604080516315d9b46f60e31b8152905133926001600160a01b03169163aecda3789160048083019260209291908290030181865afa158015610aa4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac891906134c5565b6001600160a01b0316146040518060400160405280600381526020016203130360ec1b81525090610b0c5760405162461bcd60e51b815260040161038b9190613506565b506000610b17612bf7565b905060005b8381101561045457816001600160a01b031663d6ee0f73868684818110610b4557610b45613539565b90506020020135856040518363ffffffff1660e01b8152600401610b73929190918252602082015260400190565b600060405180830381600087803b158015610b8d57600080fd5b505af1158015610ba1573d6000803e3d6000fd5b50505050848482818110610bb757610bb7613539565b905060200201357fb5be071c2a981f4f4236982ec3bf0fcdb1a9b1471de2be1a7e78529eddd1f49e84604051610bef91815260200190565b60405180910390a280610c018161354f565b915050610b1c565b603354604080516315d9b46f60e31b8152905133926001600160a01b03169163aecda3789160048083019260209291908290030181865afa158015610c52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7691906134c5565b6001600160a01b0316146040518060400160405280600381526020016203130360ec1b81525090610cba5760405162461bcd60e51b815260040161038b9190613506565b506000610cc5612bf7565b905060005b82811015610a555773__$0fe017e20684fbd032f923e9d615f3d00e$__63a94cd28d83868685818110610cff57610cff613539565b9050602002810190610d1191906139ec565b6040518363ffffffff1660e01b8152600401610d2e929190613a7d565b60006040518083038186803b158015610d4657600080fd5b505af4158015610d5a573d6000803e3d6000fd5b505050508080610d699061354f565b915050610cca565b603354604080516315d9b46f60e31b8152905133926001600160a01b03169163aecda3789160048083019260209291908290030181865afa158015610dba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dde91906134c5565b6001600160a01b0316146040518060400160405280600381526020016203130360ec1b81525090610e225760405162461bcd60e51b815260040161038b9190613506565b506000610e2d612bf7565b905060005b83811015610454576000826001600160a01b031663eadff055878785818110610e5d57610e5d613539565b905060200201356040518263ffffffff1660e01b8152600401610e8291815260200190565b6020604051808303816000875af1158015610ea1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec59190613b13565b90508315610edd57610ed8816001612c6a565b610ee8565b610ee8816000612c6a565b826001600160a01b03166389a7245d878785818110610f0957610f09613539565b9050602002013583600001516040518363ffffffff1660e01b8152600401610f3b929190918252602082015260400190565b600060405180830381600087803b158015610f5557600080fd5b505af1158015610f69573d6000803e3d6000fd5b505050508315610fbd57858583818110610f8557610f85613539565b905060200201357ff110ac45454fea6974019bce0132b7e85f3247dc7d147b3afbf3979c64d45ef460405160405180910390a2611003565b858583818110610fcf57610fcf613539565b905060200201357feed17fae9c8c79df92a8a28c129668d097f5c55c4cc4ea42d2d618c0fda8af8a60405160405180910390a25b508061100e8161354f565b915050610e32565b603354604080516315d9b46f60e31b8152905133926001600160a01b03169163aecda3789160048083019260209291908290030181865afa15801561105f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061108391906134c5565b6001600160a01b0316146040518060400160405280600381526020016203130360ec1b815250906110c75760405162461bcd60e51b815260040161038b9190613506565b5060006110d2612bf7565b90506000816001600160a01b03166308ac08b96040518163ffffffff1660e01b8152600401602060405180830381865afa158015611114573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111389190613b2f565b90508083116040518060400160405280600381526020016237303160e81b815250906111775760405162461bcd60e51b815260040161038b9190613506565b50604051633a361ad160e11b8152600481018490526001600160a01b0383169063746c35a290602401600060405180830381600087803b1580156111ba57600080fd5b505af11580156111ce573d6000803e3d6000fd5b505050507f2326a0df34db769e143ca92ed7e2cd69db0263ec9604411030cbe62da6f62b218360405161120391815260200190565b60405180910390a1505050565b60335460408051636ee554f560e11b8152905133926001600160a01b03169163ddcaa9ea9160048083019260209291908290030181865afa158015611259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127d91906134c5565b6001600160a01b031614604051806040016040528060038152602001621b981960e91b815250906112c15760405162461bcd60e51b815260040161038b9190613506565b5060006112cc612bf7565b60405163bedb86fb60e01b815283151560048201529091506001600160a01b0382169063bedb86fb90602401600060405180830381600087803b15801561131257600080fd5b505af1158015611326573d6000803e3d6000fd5b505050505050565b603354604080516315d9b46f60e31b8152905133926001600160a01b03169163aecda3789160048083019260209291908290030181865afa158015611377573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139b91906134c5565b6001600160a01b0316146040518060400160405280600381526020016203130360ec1b815250906113df5760405162461bcd60e51b815260040161038b9190613506565b5060006113ea612bf7565b905060005b83811015610454576000826001600160a01b031663eadff05587878581811061141a5761141a613539565b905060200201356040518263ffffffff1660e01b815260040161143f91815260200190565b6020604051808303816000875af115801561145e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114829190613b13565b9050836114aa576114aa86868481811061149e5761149e613539565b90506020020135612c98565b6114b48185612de4565b826001600160a01b03166389a7245d8787858181106114d5576114d5613539565b9050602002013583600001516040518363ffffffff1660e01b8152600401611507929190918252602082015260400190565b600060405180830381600087803b15801561152157600080fd5b505af1158015611535573d6000803e3d6000fd5b5050505083156115895785858381811061155157611551613539565b905060200201357f1603fabc6ecfe8a2406f0d0a45592fff62c0c6875901cf35d8a091c74cc08b9a60405160405180910390a26115cf565b85858381811061159b5761159b613539565b905060200201357f8062272b11576c2818b72b2017028f551699cd48fb41767885eb72d18e44dbb260405160405180910390a25b50806115da8161354f565b9150506113ef565b603354604080516315d9b46f60e31b8152905133926001600160a01b03169163aecda3789160048083019260209291908290030181865afa15801561162b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164f91906134c5565b6001600160a01b0316146040518060400160405280600381526020016203130360ec1b815250906116935760405162461bcd60e51b815260040161038b9190613506565b50603354604080516347f872f160e01b815290516000926001600160a01b0316916347f872f19160048083019260209291908290030181865afa1580156116de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170291906134c5565b905060005b82811015610a5557816001600160a01b03166307f7aafb85858481811061173057611730613539565b905060200201602081019061174591906133cf565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b15801561178657600080fd5b505af115801561179a573d6000803e3d6000fd5b5050505080806117a99061354f565b915050611707565b60335460408051636ee554f560e11b8152905133926001600160a01b03169163ddcaa9ea9160048083019260209291908290030181865afa1580156117fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181e91906134c5565b6001600160a01b031614604051806040016040528060038152602001621b981960e91b815250906118625760405162461bcd60e51b815260040161038b9190613506565b50600061186d612bf7565b604051632f923ff760e01b815260048101859052602481018490529091506001600160a01b03821690632f923ff7906044015b600060405180830381600087803b1580156118ba57600080fd5b505af11580156118ce573d6000803e3d6000fd5b50505050505050565b603354604080516315d9b46f60e31b8152905133926001600160a01b03169163aecda3789160048083019260209291908290030181865afa158015611920573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194491906134c5565b6001600160a01b0316146040518060400160405280600381526020016203130360ec1b815250906119885760405162461bcd60e51b815260040161038b9190613506565b506000611993612bf7565b905060005b83811015610454576000826001600160a01b031663eadff0558787858181106119c3576119c3613539565b905060200201356040518263ffffffff1660e01b81526004016119e891815260200190565b6020604051808303816000875af1158015611a07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2b9190613b13565b9050611a378185612e12565b826001600160a01b03166389a7245d878785818110611a5857611a58613539565b9050602002013583600001516040518363ffffffff1660e01b8152600401611a8a929190918252602082015260400190565b600060405180830381600087803b158015611aa457600080fd5b505af1158015611ab8573d6000803e3d6000fd5b50505050858583818110611ace57611ace613539565b905060200201357fa0d3e805ee1d3e2ede42facb6a56b605599f8e40d6c55fa36498cd68fbc3c81885604051611b0691815260200190565b60405180910390a25080611b198161354f565b915050611998565b603354604080516315d9b46f60e31b8152905133926001600160a01b03169163aecda3789160048083019260209291908290030181865afa158015611b6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8e91906134c5565b6001600160a01b0316146040518060400160405280600381526020016203130360ec1b81525090611bd25760405162461bcd60e51b815260040161038b9190613506565b506000611bdd612bf7565b60405163bbce5cf360e01b8152600481018590526001600160a01b0384811660248301529192509082169063bbce5cf3906044016118a0565b603354604080516315d9b46f60e31b8152905133926001600160a01b03169163aecda3789160048083019260209291908290030181865afa158015611c5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c8391906134c5565b6001600160a01b0316146040518060400160405280600381526020016203130360ec1b81525090611cc75760405162461bcd60e51b815260040161038b9190613506565b506000611cd2612bf7565b905060005b83811015610454576000826001600160a01b031663eadff055878785818110611d0257611d02613539565b905060200201356040518263ffffffff1660e01b8152600401611d2791815260200190565b6020604051808303816000875af1158015611d46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d6a9190613b13565b90508315611d8257611d7d816001612e6a565b611d8d565b611d8d816000612e6a565b826001600160a01b03166389a7245d878785818110611dae57611dae613539565b9050602002013583600001516040518363ffffffff1660e01b8152600401611de0929190918252602082015260400190565b600060405180830381600087803b158015611dfa57600080fd5b505af1158015611e0e573d6000803e3d6000fd5b505050508315611e6257858583818110611e2a57611e2a613539565b905060200201357fe0850c0895ec100425343341b0fe939b37776e188c991c2a14f3489a8207c73760405160405180910390a2611ea8565b858583818110611e7457611e74613539565b905060200201357f94676996b7d3838859708eff3c1f5a3dab2a43dfbff6399e14041d4b989df6ba60405160405180910390a25b5080611eb38161354f565b915050611cd7565b600054610100900460ff1615808015611edb5750600054600160ff909116105b80611ef55750303b158015611ef5575060005460ff166001145b611f585760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161038b565b6000805460ff191660011790558015611f7b576000805461ff0019166101001790555b603380546001600160a01b0319166001600160a01b0384161790558015611fdc576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b603354604080516315d9b46f60e31b8152905133926001600160a01b03169163aecda3789160048083019260209291908290030181865afa158015612029573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061204d91906134c5565b6001600160a01b0316146040518060400160405280600381526020016203130360ec1b815250906120915760405162461bcd60e51b815260040161038b9190613506565b50600061209c612bf7565b905060005b82811015610a55576000826001600160a01b031663eadff0558686858181106120cc576120cc613539565b90506101400201600001356040518263ffffffff1660e01b81526004016120f591815260200190565b6020604051808303816000875af1158015612114573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121389190613b13565b905084848381811061214c5761214c613539565b9050610140020160c0013585858481811061216957612169613539565b905061014002016040013511156040518060400160405280600381526020016237303160e81b815250906121b05760405162461bcd60e51b815260040161038b9190613506565b508484838181106121c3576121c3613539565b9050610140020160c00135600014612237576127108585848181106121ea576121ea613539565b9050610140020160a0013511156040518060400160405280600381526020016237303160e81b815250906122315760405162461bcd60e51b815260040161038b9190613506565b50612293565b84848381811061224957612249613539565b9050610140020160a001356000146040518060400160405280600381526020016237303160e81b815250906122915760405162461bcd60e51b815260040161038b9190613506565b505b6122c28585848181106122a8576122a8613539565b905061014002016020013582612e1290919063ffffffff16565b6122f18585848181106122d7576122d7613539565b905061014002016040013582612e9890919063ffffffff16565b61232085858481811061230657612306613539565b905061014002016060013582612ee290919063ffffffff16565b61234f85858481811061233557612335613539565b905061014002016080013582612f3690919063ffffffff16565b61237e85858481811061236457612364613539565b9050610140020160a0013582612f8990919063ffffffff16565b6123ad85858481811061239357612393613539565b9050610140020160c0013582612fdd90919063ffffffff16565b6123dc8585848181106123c2576123c2613539565b9050610140020160e001358261302f90919063ffffffff16565b61240c8585848181106123f1576123f1613539565b9050610140020161010001358261308290919063ffffffff16565b826001600160a01b03166389a7245d86868581811061242d5761242d613539565b85516040516001600160e01b031960e087901b16815261014090920293909301356004820152602481019290925250604401600060405180830381600087803b15801561247957600080fd5b505af115801561248d573d6000803e3d6000fd5b5050505050808061249d9061354f565b9150506120a1565b603354604080516315d9b46f60e31b8152905133926001600160a01b03169163aecda3789160048083019260209291908290030181865afa1580156124ee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061251291906134c5565b6001600160a01b0316146040518060400160405280600381526020016203130360ec1b815250906125565760405162461bcd60e51b815260040161038b9190613506565b506000612561612bf7565b905060005b82811015610a555773__$0fe017e20684fbd032f923e9d615f3d00e$__63f943de388386868581811061259b5761259b613539565b90506020028101906125ad91906139ec565b6040518363ffffffff1660e01b81526004016125ca929190613a7d565b60006040518083038186803b1580156125e257600080fd5b505af41580156125f6573d6000803e3d6000fd5b5050505080806126059061354f565b915050612566565b603354604080516315d9b46f60e31b8152905133926001600160a01b03169163aecda3789160048083019260209291908290030181865afa158015612656573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061267a91906134c5565b6001600160a01b0316146040518060400160405280600381526020016203130360ec1b815250906126be5760405162461bcd60e51b815260040161038b9190613506565b5060006126c9612bf7565b905060005b858110156118ce576000826001600160a01b031663eadff0558989858181106126f9576126f9613539565b905060200201356040518263ffffffff1660e01b815260040161271e91815260200190565b6020604051808303816000875af115801561273d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127619190613b13565b905061276d8187612f89565b612777818661302f565b6127818185613082565b826001600160a01b03166389a7245d8989858181106127a2576127a2613539565b9050602002013583600001516040518363ffffffff1660e01b81526004016127d4929190918252602082015260400190565b600060405180830381600087803b1580156127ee57600080fd5b505af1158015612802573d6000803e3d6000fd5b5050505087878381811061281857612818613539565b604080518a815260208181018b905291810189905291029290920135917f8e1b436e42bffc00dac953e4d4d5f688702e3e24b901bdaebf13d6e8f9046dde915060600160405180910390a2508061286e8161354f565b9150506126ce565b603354604080516315d9b46f60e31b8152905133926001600160a01b03169163aecda3789160048083019260209291908290030181865afa1580156128bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128e391906134c5565b6001600160a01b0316146040518060400160405280600381526020016203130360ec1b815250906129275760405162461bcd60e51b815260040161038b9190613506565b506000612932612bf7565b60405163724e452960e11b815260048101859052602481018490529091506001600160a01b0382169063e49c8a52906044016118a0565b603354604080516315d9b46f60e31b8152905133926001600160a01b03169163aecda3789160048083019260209291908290030181865afa1580156129b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129d691906134c5565b6001600160a01b0316146040518060400160405280600381526020016203130360ec1b81525090612a1a5760405162461bcd60e51b815260040161038b9190613506565b506000612a25612bf7565b905060005b83811015610454576000826001600160a01b031663eadff055878785818110612a5557612a55613539565b905060200201356040518263ffffffff1660e01b8152600401612a7a91815260200190565b6020604051808303816000875af1158015612a99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612abd9190613b13565b9050612ac981856130d5565b826001600160a01b03166389a7245d878785818110612aea57612aea613539565b9050602002013583600001516040518363ffffffff1660e01b8152600401612b1c929190918252602082015260400190565b600060405180830381600087803b158015612b3657600080fd5b505af1158015612b4a573d6000803e3d6000fd5b505050508315612b9e57858583818110612b6657612b66613539565b905060200201357f635c7b10ea9d592b3b5eef7ce7bda26b5e37eafc305f2c496ecbe4131c481fef60405160405180910390a2612be4565b858583818110612bb057612bb0613539565b905060200201357fc9b9ee8e2ea2d94533a409277610db94f7c5139a2159305e03a25f04bd54e15560405160405180910390a25b5080612bef8161354f565b915050612a2a565b60335460408051630261bf8b60e01b815290516000926001600160a01b031691630261bf8b9160048083019260209291908290030181865afa158015612c41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c6591906134c5565b905090565b603a81612c78576000612c7b565b60015b8351670400000000000000191660ff9190911690911b1790915250565b6000612ca2612bf7565b6001600160a01b03166377778db3836040518263ffffffff1660e01b8152600401612ccf91815260200190565b600060405180830381865afa158015612cec573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612d149190810190613bf1565b604080820151606083015191516370a0823160e01b81526001600160a01b0392831660048201529293506000929116906370a0823190602401602060405180830381865afa158015612d6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d8e9190613b2f565b905080158015612daa57506101c08201516001600160801b0316155b6040518060400160405280600381526020016203730360ec1b81525090610a555760405162461bcd60e51b815260040161038b9190613506565b603881612df2576000612df5565b60015b8351670100000000000000191660ff9190911690911b1790915250565b6040805180820190915260038152620dcccd60ea1b602082015261ffff821115612e4f5760405162461bcd60e51b815260040161038b9190613506565b50815169ffff0000000000000000191660409190911b179052565b603b81612e78576000612e7b565b60015b8351670800000000000000191660ff9190911690911b1790915250565b60408051808201909152600381526203733360ec1b602082015261ffff821115612ed55760405162461bcd60e51b815260040161038b9190613506565b50815161ffff1916179052565b60408051808201909152600381526237333360e81b602082015260ff821115612f1e5760405162461bcd60e51b815260040161038b9190613506565b50815166ff000000000000191660309190911b179052565b60408051808201909152600381526237333960e81b602082015261ffff821115612f735760405162461bcd60e51b815260040161038b9190613506565b50815161ffff60501b191660509190911b179052565b6040805180820190915260038152621b999960e91b602082015261ffff821115612fc65760405162461bcd60e51b815260040161038b9190613506565b50815165ffff00000000191660209190911b179052565b60408051808201909152600381526237333160e81b602082015261ffff82111561301a5760405162461bcd60e51b815260040161038b9190613506565b50815163ffff0000191660109190911b179052565b60408051808201909152600381526203734360ec1b602082015261ffff82111561306c5760405162461bcd60e51b815260040161038b9190613506565b50815161ffff60601b191660609190911b179052565b60408051808201909152600381526237343160e81b602082015261ffff8211156130bf5760405162461bcd60e51b815260040161038b9190613506565b50815161ffff60701b191660709190911b179052565b6039816130e35760006130e6565b60015b8351670200000000000000191660ff9190911690911b1790915250565b60008083601f84011261311557600080fd5b5081356001600160401b0381111561312c57600080fd5b6020830191508360208260051b850101111561314757600080fd5b9250929050565b6001600160a01b038116811461316357600080fd5b50565b80356131718161314e565b919050565b60008060006040848603121561318b57600080fd5b83356001600160401b038111156131a157600080fd5b6131ad86828701613103565b90945092505060208401356131c18161314e565b809150509250925092565b600080602083850312156131df57600080fd5b82356001600160401b038111156131f557600080fd5b61320185828601613103565b90969095509350505050565b600081518084526020808501945080840160005b838110156132465781516001600160a01b031687529582019590820190600101613221565b509495945050505050565b606081526000613264606083018661320d565b8281036020840152613276818661320d565b9050828103604084015261328a818561320d565b9695505050505050565b6000806000604084860312156132a957600080fd5b83356001600160401b038111156132bf57600080fd5b6132cb86828701613103565b909790965060209590950135949350505050565b8035801515811461317157600080fd5b60008060006040848603121561330457600080fd5b83356001600160401b0381111561331a57600080fd5b61332686828701613103565b90945092506133399050602085016132df565b90509250925092565b60006020828403121561335457600080fd5b5035919050565b60006020828403121561336d57600080fd5b613376826132df565b9392505050565b6000806040838503121561339057600080fd5b50508035926020909101359150565b60008060408385031215613