2.7k txs
12.7k calls
constructor
constructor((address fareTokenAddress, uint256 evThreshold, uint256 vrfTimeout, address networkFeeRecipientAddress, uint256 minimumFeeBurnPercent, uint256 feeNetworkPercent, uint256 ethFarePrice, uint32 averageCallbackGas, address vrfWrapperAddress, bytes32 keyHash, uint256 subscriptionId, uint16 minimumRequestConfirmations, uint32 callbackGasLimit, address vrfCoordinatorAddress, bool useNativePayment) fareVaultParams)
functions
averageCallbackGas
viewfunction averageCallbackGas() view returns (uint32)
callbackGasLimit
viewfunction callbackGasLimit() view returns (uint32)
configView
viewfunction configView() view returns (tuple)
DEFAULT_ADMIN_ROLE
viewfunction DEFAULT_ADMIN_ROLE() view returns (bytes32)
ethFarePrice
viewfunction ethFarePrice() view returns (uint256)
evThreshold
viewfunction evThreshold() view returns (uint256)
fareToken
viewfunction fareToken() view returns (address)
feeNetworkPercent
viewfunction feeNetworkPercent() view returns (uint256)
getQKWithConfig
viewfunction getQKWithConfig(bytes32 qkWithConfigHash) view returns (tuple qkWithConfig)
getQKWithConfigHash
purefunction getQKWithConfigHash(uint256[] q, uint256[] k, uint256 feeLossMultiplier, uint256 feeMintMultiplier) pure returns (bytes32)
getRoleAdmin
viewfunction getRoleAdmin(bytes32 role) view returns (bytes32)
getRoleMember
viewfunction getRoleMember(bytes32 role, uint256 index) view returns (address)
getRoleMemberCount
viewfunction getRoleMemberCount(bytes32 role) view returns (uint256)
getRoleMembers
viewfunction getRoleMembers(bytes32 role) view returns (address[])
getTrialAndQKWithConfig
viewfunction getTrialAndQKWithConfig(uint256 trialId) view returns (tuple, tuple)
hasRole
viewfunction hasRole(bytes32 role, address account) view returns (bool)
keyHash
viewfunction keyHash() view returns (bytes32)
minimumFeeBurnPercent
viewfunction minimumFeeBurnPercent() view returns (uint256)
minimumRequestConfirmations
viewfunction minimumRequestConfirmations() view returns (uint16)
networkFeeRecipientAddress
viewfunction networkFeeRecipientAddress() view returns (address)
owner
viewfunction owner() view returns (address)
poolCount
viewfunction poolCount() view returns (uint256)
poolIdToPool
viewfunction poolIdToPool(uint256 poolId) view returns (address managerAddress, uint256 feePlayMultiplier, uint256 feeLossMultiplier, uint256 feeMintMultiplier, uint256 feeHostPercent, uint256 feePoolPercent, uint256 minLimitForTicket, uint256 probability, uint256 accumulatedAmount)
PRECISE_UNIT
viewfunction PRECISE_UNIT() view returns (uint256)
qkWithConfigHashToQKWithConfig
viewfunction qkWithConfigHashToQKWithConfig(bytes32 qkWithConfigHash) view returns (uint256 feeLossMultiplier, uint256 feeMintMultiplier, uint256 effectiveEv)
RESOLVER_ROLE
viewfunction RESOLVER_ROLE() view returns (bytes32)
s_vrfCoordinator
viewfunction s_vrfCoordinator() view returns (address)
subscriptionId
viewfunction subscriptionId() view returns (uint256)
supportsInterface
viewfunction supportsInterface(bytes4 interfaceId) view returns (bool)
trialIdToTrial
viewfunction trialIdToTrial(uint256 trialId) view returns (address who, uint96 timestamp, uint256 multiplier, bytes32 qkWithConfigHash, uint256 poolId, uint256 feeNetworkPercent)
uMAX_WHOLE_UD18x60
viewfunction uMAX_WHOLE_UD18x60() view returns (uint256)
useNativePayment
viewfunction useNativePayment() view returns (bool)
vrfConfigView
viewfunction vrfConfigView() view returns (address, bytes32, uint256, uint16, uint32, bool)
vrfTimeout
viewfunction vrfTimeout() view returns (uint256)
vrfWrapper
viewfunction vrfWrapper() view returns (address)
acceptOwnership
nonpayablefunction acceptOwnership()
configUpdate_averageCallbackGas
nonpayablefunction configUpdate_averageCallbackGas(uint32 _averageCallbackGas)
configUpdate_ethFarePrice
nonpayablefunction configUpdate_ethFarePrice(uint256 _ethFarePrice)
configUpdate_evThreshold
nonpayablefunction configUpdate_evThreshold(uint256 _evThreshold)
configUpdate_feeNetworkPercent
nonpayablefunction configUpdate_feeNetworkPercent(uint256 _feeNetworkPercent)
configUpdate_minimumFeeBurnPercent
nonpayablefunction configUpdate_minimumFeeBurnPercent(uint256 _minimumFeeBurnPercent)
configUpdate_networkFeeRecipientAddress
nonpayablefunction configUpdate_networkFeeRecipientAddress(address _networkFeeRecipientAddress)
configUpdate_vrfWrapper
nonpayablefunction configUpdate_vrfWrapper(address _vrfWrapperAddress)
extraordinaryResolve
nonpayablefunction extraordinaryResolve(uint256 trialId)
grantRole
nonpayablefunction grantRole(bytes32 role, address account)
poolRegister
nonpayablefunction poolRegister(address managerAddress, uint256 feePlayMultiplier, uint256 feeLossMultiplier, uint256 feeMintMultiplier, uint256 feeHostPercent, uint256 feePoolPercent, uint256 minLimitForTicket, uint256 probability) returns (uint256)
poolUpdate_managerAddress
nonpayablefunction poolUpdate_managerAddress(uint256 poolId, address _managerAddress)
qkWithConfigRegister
nonpayablefunction qkWithConfigRegister(uint256[] q, uint256[] k, uint256 feeLossMultiplier, uint256 feeMintMultiplier) returns (bytes32)
rawFulfillRandomWords
nonpayablefunction rawFulfillRandomWords(uint256 requestId, uint256[] randomWords)
renounceRole
nonpayablefunction renounceRole(bytes32 role, address callerConfirmation)
revokeRole
nonpayablefunction revokeRole(bytes32 role, address account)
setCoordinator
nonpayablefunction setCoordinator(address _vrfCoordinator)
transferOwnership
nonpayablefunction transferOwnership(address to)
trialRegisterByQKWithConfig
nonpayablefunction trialRegisterByQKWithConfig(uint256 multiplier, uint256 maxEthFarePrice, uint256 maxAverageCallbackGas, uint256 poolId, uint256[] q, uint256[] k, bytes32 extraDataHash) returns (uint256)
trialRegisterByQKWithConfigHash
nonpayablefunction trialRegisterByQKWithConfigHash(uint256 multiplier, uint256 maxEthFarePrice, uint256 maxAverageCallbackGas, uint256 poolId, bytes32 qkWithConfigHash, bytes32 extraDataHash) returns (uint256)
vrfConfigUpdate
nonpayablefunction vrfConfigUpdate(bytes32 _keyHash, uint256 _subscriptionId, uint16 _minimumRequestConfirmations, uint32 _callbackGasLimit, bool _useNativePayment)
events
AverageCallbackGasUpdated
event AverageCallbackGasUpdated(uint32 newAverageCallbackGas)
CoordinatorSet
event CoordinatorSet(address vrfCoordinator)
EthFarePriceUpdated
event EthFarePriceUpdated(uint256 newEthFarePrice)
EvThresholdUpdated
event EvThresholdUpdated(uint256 newEvThreshold)
FeeCharged
event FeeCharged(uint8 indexed feeType, uint256 indexed poolId, uint256 indexed trialId, uint256 feeAmount)
FeeNetworkPercentUpdated
event FeeNetworkPercentUpdated(uint256 newFeeNetworkPercent)
MinimumFeeBurnPercentUpdated
event MinimumFeeBurnPercentUpdated(uint256 newMinimumFeeBurnPercent)
NetworkFeeRecipientAddressUpdated
event NetworkFeeRecipientAddressUpdated(address newNetworkFeeRecipientAddress)
OwnershipTransferred
event OwnershipTransferred(address indexed from, address indexed to)
OwnershipTransferRequested
event OwnershipTransferRequested(address indexed from, address indexed to)
PoolAccumulatedAmountReleased
event PoolAccumulatedAmountReleased(uint256 indexed poolId, uint256 indexed trialId, address indexed receiver, uint256 releasedAmount)
PoolAccumulatedAmountUpdated
event PoolAccumulatedAmountUpdated(uint256 indexed poolId, uint256 indexed trialId, uint256 newAccumulatedAmount)
PoolManagerUpdated
event PoolManagerUpdated(uint256 indexed poolId, address indexed newPoolManager)
PoolRegistered
event PoolRegistered(uint256 indexed poolId, address indexed managerAddress, uint256 feePlayMultiplier, uint256 feeLossMultiplier, uint256 feeMintMultiplier, uint256 feeHostPercent, uint256 feePoolPercent, uint256 minLimitForTicket, uint256 probability)
QKWithConfigRegistered
event QKWithConfigRegistered(bytes32 indexed qkWithConfigHash, uint256[] q, uint256[] k, uint256 feeLossMultiplier, uint256 feeMintMultiplier, uint256 effectiveEv)
RoleAdminChanged
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)
RoleGranted
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)
RoleRevoked
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)
TrialRegistered
event TrialRegistered(uint256 indexed trialId, address indexed who, uint256 indexed poolId, uint256 multiplier, bytes32 qkWithConfigHash, uint256 vrfCostInFare, bytes32 extraDataHash)
TrialResolved
event TrialResolved(uint256 indexed trialId, uint256 resultIndex, uint256 randomness)
VRFConfigUpdated
event VRFConfigUpdated(bytes32 newKeyHash, uint256 newSubscriptionId, uint16 newMinimumRequestConfirmations, uint32 newCallbackGasLimit, bool newUseNativePayment)
VRFWrapperUpdated
event VRFWrapperUpdated(address newVRFWrapperAddress)
errors
AccessControlBadConfirmation
error AccessControlBadConfirmation()
AccessControlUnauthorizedAccount
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole)
AverageCallbackGasExceedsMax
error AverageCallbackGasExceedsMax()
CannotExtraordinaryResolveYet
error CannotExtraordinaryResolveYet()
CannotResolveATrialWithZeroMultiplier
error CannotResolveATrialWithZeroMultiplier()
CannotUseNonExistingPool
error CannotUseNonExistingPool()
EffectiveEvCannotExceedPreciseUnit
error EffectiveEvCannotExceedPreciseUnit()
EffectiveEvExceedsEvThreshold
error EffectiveEvExceedsEvThreshold()
EthFarePriceExceedsMax
error EthFarePriceExceedsMax()
EvThresholdCannotExceedPreciseUnit
error EvThresholdCannotExceedPreciseUnit()
FeeHostPercentCannotExceedOrBeUnit
error FeeHostPercentCannotExceedOrBeUnit()
FeeLossMultiplierMismatchForQKWithConfigAndPool
error FeeLossMultiplierMismatchForQKWithConfigAndPool()
FeeMintMultiplierMismatchForQKWithConfigAndPool
error FeeMintMultiplierMismatchForQKWithConfigAndPool()
FeeNetworkPercentCannotExceedOrBeUnit
error FeeNetworkPercentCannotExceedOrBeUnit()
FeePercentSumCannotExceedUnit
error FeePercentSumCannotExceedUnit()
FeePoolPercentCannotExceedOrBeUnit
error FeePoolPercentCannotExceedOrBeUnit()
InvalidNetworkFeeRecipientAddress
error InvalidNetworkFeeRecipientAddress()
InvalidVRFWrapperAddress
error InvalidVRFWrapperAddress()
MinimumFeeBurnPercentCannotExceedOrBeUnit
error MinimumFeeBurnPercentCannotExceedOrBeUnit()
MultiplierCannotBeZero
error MultiplierCannotBeZero()
NonManagerCannotUpdatePool
error NonManagerCannotUpdatePool()
OnlyCoordinatorCanFulfill
error OnlyCoordinatorCanFulfill(address have, address want)
OnlyOwnerOrCoordinator
error OnlyOwnerOrCoordinator(address have, address owner, address coordinator)
PoolProbabilityCannotExceedPreciseUnit
error PoolProbabilityCannotExceedPreciseUnit()
PRBMath_MulDiv18_Overflow
error PRBMath_MulDiv18_Overflow(uint256 x, uint256 y)
QKCannotBeEmpty
error QKCannotBeEmpty()
QKLengthMismatch
error QKLengthMismatch()
QKWithConfigAlreadyRegistered
error QKWithConfigAlreadyRegistered()
QKWithConfigCannotBeEmpty
error QKWithConfigCannotBeEmpty()
QSumHasToBeEqualToPreciseUnit
error QSumHasToBeEqualToPreciseUnit()
RandomnessOutOfBounds
error RandomnessOutOfBounds()
VrfTimedOut
error VrfTimedOut()
ZeroAddress
error ZeroAddress()
creation bytecode
0x60c060405234801562000010575f80fd5b5060405162004ff638038062004ff68339810160408190526200003391620008aa565b6101a081015133805f816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b5f80546001600160a01b0319166001600160a01b0384811691909117909155811615620000c157620000c18162000202565b5050506001600160a01b038116620000ec5760405163d92e233d60e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055620001185f33620002ac565b50620001457f92a19c77d2ea87c7f81d50c74403cb2f401780f3ad919571121efe2bdb427eb133620002ac565b5080516001600160a01b031660805260208101516200016490620002e7565b604081015160a05260608101516200017c906200036b565b60808101516200018c90620003ee565b60a08101516200019c9062000461565b60c0810151620001ac90620004d5565b60e0810151620001bc9062000517565b610100810151620001cd906200056c565b620001fb816101200151826101400151836101600151846101800151856101c00151620005fc60201b60201c565b50620009ac565b336001600160a01b038216036200025c5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b038381169182179092555f8054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b5f80620002ba8484620006ad565b90508015620002de575f848152600460205260409020620002dc90846200075c565b505b90505b92915050565b5f620002f38162000772565b789f4f2726179a224501d762422c946590d910000000000000008211156200032e5760405163186355ff60e11b815260040160405180910390fd5b60058290556040518281527fbf1c3139eb09a6b98219883fa37212e33440707c76fc3b04b5ec4217c8090b20906020015b60405180910390a15050565b5f620003778162000772565b6001600160a01b0382166200039f57604051630241354960e61b815260040160405180910390fd5b600880546001600160a01b0319166001600160a01b0384169081179091556040519081527f6c7c1cce5c19f9c14b1ee1bc0016818f419074bd7d63dafc589cb81c00b5f457906020016200035f565b5f620003fa8162000772565b6200040d82670de0b6b3a7640000111590565b156200042b57604051621c00bb60eb1b815260040160405180910390fd5b60068290556040518281527ffbbcd5c16f04731a39edd75c1d7702f9db4bc4a0b719e732f6d7588c83a6675c906020016200035f565b5f6200046d8162000772565b6200048082670de0b6b3a7640000111590565b156200049f5760405163f51ca7cb60e01b815260040160405180910390fd5b60078290556040518281527fca3eb624ca6a55f6998cd1f2c9fe163a950c76e087a27c2fb2866d6b2d55d599906020016200035f565b5f620004e18162000772565b60098290556040518281527f64ebbfac107cbbe37dd88f57f79ae9abe7c5cc48176a5150f75917b38810da93906020016200035f565b5f620005238162000772565b600a805463ffffffff191663ffffffff84169081179091556040519081527fb531403ecc87f376016c085f82df51b77ff81a3352ae72bbb6c9021cba22544b906020016200035f565b5f620005788162000772565b6001600160a01b038216620005a05760405163a467a1b560e01b815260040160405180910390fd5b600a8054600160201b600160c01b0319166401000000006001600160a01b038516908102919091179091556040519081527fafb59acb6c7d78f9543e178c08fcd45950a96ba04d94887a63f36f259bb66e15906020016200035f565b5f620006088162000772565b600b869055600c859055600d805461ffff861665ffffffffffff1990911681176201000063ffffffff87169081029190911760ff60301b1916660100000000000086151590810291909117909355604080518a8152602081018a905290810192909252606082015260808101919091527f48af56ee018a3fa3594ee913b23014d40a54bdefa25125f309db5016be339c9c9060a00160405180910390a1505050505050565b5f8281526003602090815260408083206001600160a01b038516845290915281205460ff1662000754575f8381526003602090815260408083206001600160a01b03861684529091529020805460ff191660011790556200070b3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001620002e1565b505f620002e1565b5f620002de836001600160a01b03841662000781565b6200077e8133620007c8565b50565b5f8181526001830160205260408120546200075457508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155620002e1565b5f8281526003602090815260408083206001600160a01b038516845290915290205460ff166200081e5760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440162000086565b5050565b6040516101e081016001600160401b03811182821017156200085257634e487b7160e01b5f52604160045260245ffd5b60405290565b80516001600160a01b03811681146200086f575f80fd5b919050565b805163ffffffff811681146200086f575f80fd5b805161ffff811681146200086f575f80fd5b805180151581146200086f575f80fd5b5f6101e08284031215620008bc575f80fd5b620008c662000822565b620008d18362000858565b81526020830151602082015260408301516040820152620008f56060840162000858565b60608201526080830151608082015260a083015160a082015260c083015160c08201526200092660e0840162000874565b60e08201526101006200093b81850162000858565b90820152610120838101519082015261014080840151908201526101606200096581850162000888565b908201526101806200097984820162000874565b908201526101a06200098d84820162000858565b908201526101c0620009a18482016200089a565b908201529392505050565b60805160a0516145d462000a225f395f81816107de01528181611ffd015281816120cc015261251e01525f818161094a01528181611fcd0152818161212c015281816121ff01528181612ca801528181612d5401528181612e17015281816132a6015281816133d401526134a501526145d45ff3fe608060405234801561000f575f80fd5b5060043610610367575f3560e01c80638ea98117116101c9578063cb7b11ee116100fe578063da2c2f191161009e578063f2fde38b11610079578063f2fde38b14610a6e578063f525cb6814610a81578063f7a6224b14610a8a578063f8caf2a214610a93575f80fd5b8063da2c2f19146109a5578063df8a6752146109b5578063e20f302a14610a22575f80fd5b8063d26efe30116100d9578063d26efe3014610945578063d547741f1461096c578063d5dc2a641461097f578063d892b52414610992575f80fd5b8063cb7b11ee14610914578063cf9c8c9d14610929578063cff52ca21461093c575f80fd5b80639eccacf611610169578063bb038bcb11610144578063bb038bcb146108bb578063c486bf10146108ce578063c9c1a306146108e1578063ca15c87314610901575f80fd5b80639eccacf614610874578063a217fddf14610894578063a3246ad31461089b575f80fd5b806391d14854116101a457806391d14854146108005780639200b771146108455780639955a146146108585780639b9ffc8614610861575f80fd5b80638ea98117146107b35780639010d07c146107c657806391a92df7146107d9575f80fd5b80633bccd8a21161029f57806378fab2601161023f57806383bbf9421161021a57806383bbf9421461073b57806383df21cf14610763578063864029e7146107765780638da5cb5b14610796575f80fd5b806378fab260146106f957806379ba5097146107205780637c0324ad14610728575f80fd5b806359aeee461161027a57806359aeee461461054c5780635c0757631461055f57806361728f39146106295780636aa298e214610632575f80fd5b80633bccd8a2146104ff57806349e10d48146105125780635898614114610539575f80fd5b80631fe543e31161030a57806324c3efc5116102e557806324c3efc51461049b57806324f74697146104ae5780632f2ff15d146104d957806336568abe146104ec575f80fd5b80631fe543e3146104455780632085791214610458578063248a9ca314610479575f80fd5b806309c1ba2e1161034557806309c1ba2e146103ef57806311bccc84146103f85780631bec47f11461040f5780631caa26cc14610430575f80fd5b806301ffc9a71461036b5780630289a01514610393578063090f083a146103d8575b5f80fd5b61037e610379366004613c7b565b610aa6565b60405190151581526020015b60405180910390f35b6008546103b39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161038a565b6103e160055481565b60405190815260200161038a565b6103e1600c5481565b600d5461037e906601000000000000900460ff1681565b600d5461041d9061ffff1681565b60405161ffff909116815260200161038a565b61044361043e366004613cba565b610b01565b005b610443610453366004613d19565b610b9b565b61046b610466366004613cba565b610c23565b60405161038a929190613e1d565b6103e1610487366004613cba565b5f9081526003602052604090206001015490565b6103e16104a9366004613e94565b610df3565b600d546104c49062010000900463ffffffff1681565b60405163ffffffff909116815260200161038a565b6104436104e7366004613f34565b610e31565b6104436104fa366004613f34565b610e5b565b61044361050d366004613cba565b610eb4565b6103e17fffffffffffffffbc8570930cbef0af3c4237271f54a0bc11300000000000000081565b6103e1610547366004613e94565b610f3c565b6103e161055a366004613f5e565b611293565b6105ce61056d366004613cba565b60106020525f908152604090208054600182015460028301546003840154600485015460058601546006870154600788015460089098015473ffffffffffffffffffffffffffffffffffffffff909716979596949593949293919290919089565b6040805173ffffffffffffffffffffffffffffffffffffffff909a168a5260208a0198909852968801959095526060870193909352608086019190915260a085015260c084015260e08301526101008201526101200161038a565b6103e1600b5481565b6106a8610640366004613cba565b600e6020525f90815260409020805460018201546002830154600384015460049094015473ffffffffffffffffffffffffffffffffffffffff841694740100000000000000000000000000000000000000009094046bffffffffffffffffffffffff16939086565b6040805173ffffffffffffffffffffffffffffffffffffffff90971687526bffffffffffffffffffffffff9095166020870152938501929092526060840152608083015260a082015260c00161038a565b6103e17f92a19c77d2ea87c7f81d50c74403cb2f401780f3ad919571121efe2bdb427eb181565b610443611540565b610443610736366004613fb0565b61163c565b600a546103b390640100000000900473ffffffffffffffffffffffffffffffffffffffff1681565b610443610771366004613fc9565b6116a9565b6103e1789f4f2726179a224501d762422c946590d9100000000000000081565b5f5473ffffffffffffffffffffffffffffffffffffffff166103b3565b6104436107c1366004613fc9565b61177d565b6103b36107d4366004613fe2565b611905565b6103e17f000000000000000000000000000000000000000000000000000000000000000081565b61037e61080e366004613f34565b5f91825260036020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b61044361085336600461400f565b611923565b6103e160075481565b6103e161086f36600461406e565b611a06565b6002546103b39073ffffffffffffffffffffffffffffffffffffffff1681565b6103e15f81565b6108ae6108a9366004613cba565b611c55565b60405161038a91906140c5565b6104436108c9366004613f34565b611c6e565b6104436108dc366004613fc9565b611d47565b6108f46108ef366004613cba565b611e11565b60405161038a919061411e565b6103e161090f366004613cba565b611f21565b61091c611f37565b60405161038a9190614130565b610443610937366004613cba565b612068565b6103e160065481565b6103b37f000000000000000000000000000000000000000000000000000000000000000081565b61044361097a366004613f34565b6122d9565b6103e161098d366004614210565b6122fd565b6104436109a0366004613cba565b612369565b600a546104c49063ffffffff1681565b600254600b54600c54600d546040805173ffffffffffffffffffffffffffffffffffffffff909516855260208501939093529183015261ffff8116606083015262010000810463ffffffff1660808301526601000000000000900460ff16151560a082015260c00161038a565b610a53610a30366004613cba565b600f6020525f908152604090206002810154600382015460049092015490919083565b6040805193845260208401929092529082015260600161038a565b610443610a7c366004613fc9565b6123f1565b6103e160115481565b6103e160095481565b610443610aa1366004613cba565b612405565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f5a05180f000000000000000000000000000000000000000000000000000000001480610afb5750610afb82612444565b92915050565b5f610b0b816124da565b789f4f2726179a224501d762422c946590d91000000000000000821115610b5e576040517f30c6abfe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058290556040518281527fbf1c3139eb09a6b98219883fa37212e33440707c76fc3b04b5ec4217c8090b20906020015b60405180910390a15050565b60025473ffffffffffffffffffffffffffffffffffffffff163314610c13576002546040517f1cf993f400000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff90911660248201526044015b60405180910390fd5b610c1e8383836124e4565b505050565b6040805160c0810182525f80825260208201819052918101829052606081018290526080810182905260a0810191909152610c836040518060a0016040528060608152602001606081526020015f81526020015f81526020015f81525090565b5f838152600e60209081526040808320815160c08082018452825473ffffffffffffffffffffffffffffffffffffffff811683527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff16828601526001830154828501526002830154606083018190526003840154608084015260049093015460a080840191909152928652600f8552948390208351815495860281018701909452918301848152909485949293928492849290918491840182828015610d6a57602002820191905f5260205f20905b815481526020019060010190808311610d56575b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015610dc057602002820191905f5260205f20905b815481526020019060010190808311610dac575b50505050508152602001600282015481526020016003820154815260200160048201548152505090509250925050915091565b5f868686868686604051602001610e0f96959493929190614319565b6040516020818303038152906040528051906020012090509695505050505050565b5f82815260036020526040902060010154610e4b816124da565b610e55838361259d565b50505050565b73ffffffffffffffffffffffffffffffffffffffff81163314610eaa576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c1e82826125d0565b5f610ebe816124da565b610ed082670de0b6b3a7640000111590565b15610f07576040517ff51ca7cb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60078290556040518281527fca3eb624ca6a55f6998cd1f2c9fe163a950c76e087a27c2fb2866d6b2d55d59990602001610b8f565b5f80610f4c888888888888610df3565b5f818152600f602052604090205490915015610f94576040517f4520b59500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b86858114610fce576040517f0a1f4ea100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f03611007576040517fd8290d2f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f5b838110156110b2575f8a8a8381811061102657611026614355565b9050602002013590505f8d8d8481811061104257611042614355565b9050602002013590505f611055835f1490565b611079576110748361106f670de0b6b3a76400008d6125fb565b612609565b61107b565b8a5b90505f6110888383612613565b905061109481886143af565b96506110a083876143af565b9550506001909301925061100b915050565b50789f4f2726179a224501d762422c946590d910000000000000008114611105576040517f7e484e1900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b789f4f2726179a224501d762422c946590d91000000000000000821115611158576040517f2c2987be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040518060a001604052808c8c808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152505050908252506040805160208c810282810182019093528c82529283019290918d918d9182918501908490808284375f92018290525093855250505060208083018b905260408084018b90526060909301869052878252600f815291902082518051919261120592849290910190613c1e565b50602082810151805161121e9260018501920190613c1e565b50604082015181600201556060820151816003015560808201518160040155905050837f39eec6dbaadee80fb948cd5cb7b2edaf842acca5aa08de864e7d8fffed0a70dd8c8c8c8c8c8c8960405161127c97969594939291906143c2565b60405180910390a250919998505050505050505050565b5f805f6112a38989898989612717565b915091505f6112b0612a9b565b90505f806112c28c8660200151612609565b905082895f7f54095626d1ec6261671951e96e2b7ae35f6018af1354dec0ed846e675010fffa8460405190815260200160405180910390a482897f3d28d07cd9c408eb36b7fed4fac331609f46bdb62e1215881669be5ecd1c11d761133161132e858a60a00151612609565b90565b5f8d815260106020526040812060080180549091906113519084906143af565b9182905550604051908152602001905060405180910390a35f61139961132e8e6113948561106f61138e670de0b6b3a76400008d60800151612b89565b8b612b89565b6125fb565b90506040518060c001604052803373ffffffffffffffffffffffffffffffffffffffff168152602001426bffffffffffffffffffffffff1681526020018e81526020018a81526020018b815260200186815250600e5f8681526020019081526020015f205f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151815f0160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555060408201518160010155606082015181600201556080820151816003015560a082015181600401559050506114aa612b97565b92506114e233826114be61132e868a612609565b6114c890876143af565b895f01516114dd61132e888d60800151612609565b612c5c565b5050604080518c815260208101899052908101829052606081018790528890339084907f2cb24b0c4dc41c1dddd55a59262c8c9a14146db4b8ef760f5983f79401bc663b9060800160405180910390a4509998505050505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146115c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610c0a565b5f8054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b5f611646816124da565b600a80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff84169081179091556040519081527fb531403ecc87f376016c085f82df51b77ff81a3352ae72bbb6c9021cba22544b90602001610b8f565b5f6116b3816124da565b73ffffffffffffffffffffffffffffffffffffffff8216611700576040517fa467a1b500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a80547fffffffffffffffff0000000000000000000000000000000000000000ffffffff1664010000000073ffffffffffffffffffffffffffffffffffffffff8516908102919091179091556040519081527fafb59acb6c7d78f9543e178c08fcd45950a96ba04d94887a63f36f259bb66e1590602001610b8f565b5f5473ffffffffffffffffffffffffffffffffffffffff1633148015906117bc575060025473ffffffffffffffffffffffffffffffffffffffff163314155b1561183f57336117e05f5473ffffffffffffffffffffffffffffffffffffffff1690565b6002546040517f061db9c100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff93841660048201529183166024830152919091166044820152606401610c0a565b73ffffffffffffffffffffffffffffffffffffffff811661188c576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fd1a6a14209a385a964d036e404cb5cfb71f4000cdb03c9366292430787261be69060200160405180910390a150565b5f82815260046020526040812061191c9083612e89565b9392505050565b5f61192d816124da565b600b869055600c859055600d805461ffff86167fffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000090911681176201000063ffffffff8716908102919091177fffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff16660100000000000086151590810291909117909355604080518a8152602081018a905290810192909252606082015260808101919091527f48af56ee018a3fa3594ee913b23014d40a54bdefa25125f309db5016be339c9c9060a00160405180910390a1505050505050565b5f611a1985670de0b6b3a7640000111590565b15611a50576040517f0d7d9f3900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611a6284670de0b6b3a7640000111590565b15611a99576040517f01b953b400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b789f4f2726179a224501d762422c946590d91000000000000000821115611aec576040517ff080086400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601180545f9182611afc83614408565b90915550604080516101208101825273ffffffffffffffffffffffffffffffffffffffff808e1680835260208084018f81528486018f8152606086018f8152608087018f815260a088018f815260c089018f815260e08a018f81525f6101008c018181528e825260109099528c90209a518b549a167fffffffffffffffffffffffff0000000000000000000000000000000000000000909a16999099178a55945160018a0155925160028901559051600388015551600487015551600586015551600685015591516007840155905160089092019190915590519192509082907fcb9b316e972fafcd41c67ddacdaf112d121824d8e9ba61845d777eafa92ef55890611c40908d908d908d908d908d908d908d90968752602087019590955260408601939093526060850191909152608084015260a083015260c082015260e00190565b60405180910390a39998505050505050505050565b5f818152600460205260409020606090610afb90612e94565b5f8281526010602052604090205473ffffffffffffffffffffffffffffffffffffffff163314611cca576040517fb3d8e9bf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8281526010602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff85169081179091559051909184917f0d077d90ec85731279ac03172b52fbdb3a1709a774aced2732a6ef1b86f058579190a35050565b5f611d51816124da565b73ffffffffffffffffffffffffffffffffffffffff8216611d9e576040517f904d524000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091556040519081527f6c7c1cce5c19f9c14b1ee1bc0016818f419074bd7d63dafc589cb81c00b5f45790602001610b8f565b611e406040518060a0016040528060608152602001606081526020015f81526020015f81526020015f81525090565b5f828152600f60209081526040918290208251815460c09381028201840190945260a081018481529093919284928491840182828015611e9d57602002820191905f5260205f20905b815481526020019060010190808311611e89575b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611ef357602002820191905f5260205f20905b815481526020019060010190808311611edf575b5050505050815260200160028201548152602001600382015481526020016004820154815250509050919050565b5f818152600460205260408120610afb90612ea0565b60408051610140810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810191909152604051806101400160405280611fb15f5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff90811682527f00000000000000000000000000000000000000000000000000000000000000008116602083015260055460408301527f000000000000000000000000000000000000000000000000000000000000000060608301526008548116608083015260065460a083015260075460c083015260095460e0830152600a5463ffffffff811661010084015264010000000090041661012090910152919050565b7f92a19c77d2ea87c7f81d50c74403cb2f401780f3ad919571121efe2bdb427eb1612092816124da565b5f828152600e60205260409020547401000000000000000000000000000000000000000090046bffffffffffffffffffffffff16426120f17f0000000000000000000000000000000000000000000000000000000000000000836143af565b10612128576040517fe7021ff000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612193573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121b7919061443f565b6008546040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201527f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015612246573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061226a919061443f565b43612276600182614456565b40423a5a6040805160208101999099528801969096526060870194909452608086019290925260a085015260c084015260e083015261010082015261012001604051602081830303815290604052805190602001205f1c9050610e558482612ea9565b5f828152600360205260409020600101546122f3816124da565b610e5583836125d0565b5f868152601060205260408120600281015460039091015482612324898989898787610df3565b5f818152600f60205260408120549192500361234a57612348898989898787610f3c565b505b6123588d8d8d8d858a611293565b9d9c50505050505050505050505050565b5f612373816124da565b61238582670de0b6b3a7640000111590565b156123bc576040517fe005d80000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60068290556040518281527ffbbcd5c16f04731a39edd75c1d7702f9db4bc4a0b719e732f6d7588c83a6675c90602001610b8f565b6123f96135be565b61240281613640565b50565b5f61240f816124da565b60098290556040518281527f64ebbfac107cbbe37dd88f57f79ae9abe7c5cc48176a5150f75917b38810da9390602001610b8f565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b000000000000000000000000000000000000000000000000000000001480610afb57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610afb565b6124028133613734565b5f838152600e60205260409020547401000000000000000000000000000000000000000090046bffffffffffffffffffffffff16426125437f0000000000000000000000000000000000000000000000000000000000000000836143af565b101561257b576040517f6cfde1bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e558484845f81811061259157612591614355565b90506020020135612ea9565b5f806125a984846137bf565b9050801561191c575f8481526004602052604090206125c890846138bc565b509392505050565b5f806125dc84846138dd565b9050801561191c575f8481526004602052604090206125c8908461399a565b5f61191c61132e83856143af565b5f61191c61132e84845b5f80807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848609848602925082811083820303915050805f036126635750670de0b6b3a764000090049050610afb565b670de0b6b3a764000081106126ae576040517f5173648d0000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604401610c0a565b5f670de0b6b3a7640000858709620400008185030493109091037d40000000000000000000000000000000000000000000000000000000000002919091177faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac106690291505092915050565b6127736040518061012001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b5f865f036127ad576040517f95ca534000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f838152600f602052604081205490036127f3576040517f76054aaa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005545f848152600f6020526040902060040154111561283f576040517fd875e22400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85600954111561287b576040517f6753a6eb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a5463ffffffff168510156128bd576040517fb1c7e47500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60115484106128f8576040517f98986b1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f84815260106020908152604091829020825161012081018452815473ffffffffffffffffffffffffffffffffffffffff16815260018201549281019290925260028101549282019290925260038201546060820152600482015460808201819052600583015460a08301819052600684015460c084015260078085015460e0850152600890940154610100840152925491926129bb916129ae916129a8916129a0916125fb565b6006546125fb565b836125fb565b670de0b6b3a76400001090565b156129f2576040517f08f3728e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040808301515f878152600f602052919091206002015414612a40576040517fb188911600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60608201515f868152600f602052604090206003015414612a8d576040517fc40bc19d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b909890975095505050505050565b6002546040805160c081018252600b548152600c54602080830191909152600d5461ffff81168385015262010000810463ffffffff166060840152600160808401528351918201909352660100000000000090920460ff16151582525f9273ffffffffffffffffffffffffffffffffffffffff1691639b1c385e919060a0820190612b25906139bb565b8152506040518263ffffffff1660e01b8152600401612b449190614496565b6020604051808303815f875af1158015612b60573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b84919061443f565b905090565b5f61191c61132e8385614456565b600954600a546040517f13c34b7f00000000000000000000000000000000000000000000000000000000815263ffffffff82166004820152600160248201525f926305f5e10092909164010000000090910473ffffffffffffffffffffffffffffffffffffffff16906313c34b7f90604401602060405180830381865afa158015612c24573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c48919061443f565b612c52919061454f565b612b849190614566565b6040517f79cc679000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152602482018690527f000000000000000000000000000000000000000000000000000000000000000016906379cc6790906044015f604051808303815f87803b158015612ce9575f80fd5b505af1158015612cfb573d5f803e3d5ffd5b50506008546040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89811660048301529182166024820152604481018790527f000000000000000000000000000000000000000000000000000000000000000090911692506323b872dd91506064016020604051808303815f875af1158015612d9e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612dc29190614579565b506040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528381166024830152604482018390527f000000000000000000000000000000000000000000000000000000000000000016906323b872dd906064016020604051808303815f875af1158015612e5d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e819190614579565b505050505050565b5f61191c8383613a77565b60605f61191c83613a9d565b5f610afb825490565b7fffffffffffffffbc8570930cbef0af3c4237271f54a0bc1130000000000000008110612f02576040517f4290697b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f612f26789f4f2726179a224501d762422c946590d9100000000000000083614594565b5f848152600e60209081526040808320815160c081018352815473ffffffffffffffffffffffffffffffffffffffff811682527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff168185015260018201548184019081526002830154606083015260038301546080830181905260049093015460a0830152918552601090935290832090519394509092909103612ffa576040517f8ccf080000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f81600601548360400151106130f7575f8560405160200161301e91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012090505f61307a789f4f2726179a224501d762422c946590d9100000000000000083614594565b9050836007015481116130f457845f015173ffffffffffffffffffffffffffffffffffffffff168886608001517fc65573dda21e04acf3071dfc7d69a02e9e966d5aaf03a1e5d7872dbc872cf3b46130dc6130d6896008015490565b97508790565b60405190815260200160405180910390a45f60088501555b50505b60608301515f908152600f602090815260408220808352908220815483929190835b8185101561316a578285015461312f81836143af565b9150818b1161315e5784600101868154811061314d5761314d614355565b905f5260205f20015496505061316a565b50600190940193613119565b505050505f613178835f1490565b156131d95761319561318b876040015190565b8660020154612609565b6080870151909150899060017f54095626d1ec6261671951e96e2b7ae35f6018af1354dec0ed846e675010fffa8460405190815260200160405180910390a4613254565b6131f1846113946131eb896040015190565b86612609565b935061321461320a613204886040015190565b85612609565b8660030154612609565b6080870151909150899060027f54095626d1ec6261671951e96e2b7ae35f6018af1354dec0ed846e675010fffa8460405190815260200160405180910390a45b5f613263828760040154612609565b90505f613274838860050154612609565b90505f613285848a60a00151612609565b9050821561335557875473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916340c10f1991166132d68690565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044015f604051808303815f87803b15801561333e575f80fd5b505af1158015613350573d5f803e3d5ffd5b505050505b81156133b4578b89608001517f3d28d07cd9c408eb36b7fed4fac331609f46bdb62e1215881669be5ecd1c11d76133898590565b8b6008015f82825461339b91906143af565b9182905550604051908152602001905060405180910390a35b80156134835760085473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116916340c10f1991166134048490565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044015f604051808303815f87803b15801561346c575f80fd5b505af115801561347e573d5f803e3d5ffd5b505050505b505050831561354c57855173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906340c10f1990866040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044015f604051808303815f87803b158015613535575f80fd5b505af1158015613547573d5f803e3d5ffd5b505050505b5f898152600e602090815260408083208381556001810184905560028101849055600381018490556004019290925581518481529081018a90528a917f570f7a8e815705a7d16ef95dfbfb8db6d2d8c9e92da4f974a57c87dac20442fc910160405180910390a2505050505050505050565b5f5473ffffffffffffffffffffffffffffffffffffffff16331461363e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610c0a565b565b3373ffffffffffffffffffffffffffffffffffffffff8216036136bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610c0a565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8381169182179092555f8054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b5f82815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166137bb576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8216600482015260248101839052604401610c0a565b5050565b5f82815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff166138b5575f83815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556138533390565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610afb565b505f610afb565b5f61191c8373ffffffffffffffffffffffffffffffffffffffff8416613af6565b5f82815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16156138b5575f83815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610afb565b5f61191c8373ffffffffffffffffffffffffffffffffffffffff8416613b3b565b60607f92fd13387c7fe7befbc38d303d6468778fb9731bc4583f17d92989c6fcfdeaaa826040516024016139f491511515815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915292915050565b5f825f018281548110613a8c57613a8c614355565b905f5260205f200154905092915050565b6060815f01805480602002602001604051908101604052809291908181526020018280548015613aea57602002820191905f5260205f20905b815481526020019060010190808311613ad6575b50505050509050919050565b5f8181526001830160205260408120546138b557508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610afb565b5f8181526001830160205260408120548015613c15575f613b5d600183614456565b85549091505f90613b7090600190614456565b9050808214613bcf575f865f018281548110613b8e57613b8e614355565b905f5260205f200154905080875f018481548110613bae57613bae614355565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080613be057613be06145a7565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610afb565b5f915050610afb565b828054828255905f5260205f20908101928215613c57579160200282015b82811115613c57578251825591602001919060010190613c3c565b50613c63929150613c67565b5090565b5b80821115613c63575f8155600101613c68565b5f60208284031215613c8b575f80fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461191c575f80fd5b5f60208284031215613cca575f80fd5b5035919050565b5f8083601f840112613ce1575f80fd5b50813567ffffffffffffffff811115613cf8575f80fd5b6020830191508360208260051b8501011115613d12575f80fd5b9250929050565b5f805f60408486031215613d2b575f80fd5b83359250602084013567ffffffffffffffff811115613d48575f80fd5b613d5486828701613cd1565b9497909650939450505050565b5f815180845260208085019450602084015f5b83811015613d9057815187529582019590820190600101613d74565b509495945050505050565b805160a080845281519084018190525f916020919082019060c0860190845b81811015613dd657835183529284019291840191600101613dba565b5050602085015192508581036020870152613df18184613d61565b925050506040830151604085015260608301516060850152608083015160808501528091505092915050565b73ffffffffffffffffffffffffffffffffffffffff83511681526bffffffffffffffffffffffff602084015116602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260e060c08201525f613e8c60e0830184613d9b565b949350505050565b5f805f805f8060808789031215613ea9575f80fd5b863567ffffffffffffffff80821115613ec0575f80fd5b613ecc8a838b01613cd1565b90985096506020890135915080821115613ee4575f80fd5b50613ef189828a01613cd1565b979a9699509760408101359660609091013595509350505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114613f2f575f80fd5b919050565b5f8060408385031215613f45575f80fd5b82359150613f5560208401613f0c565b90509250929050565b5f805f805f8060c08789031215613f73575f80fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b803563ffffffff81168114613f2f575f80fd5b5f60208284031215613fc0575f80fd5b61191c82613f9d565b5f60208284031215613fd9575f80fd5b61191c82613f0c565b5f8060408385031215613ff3575f80fd5b50508035926020909101359150565b8015158114612402575f80fd5b5f805f805f60a08688031215614023575f80fd5b8535945060208601359350604086013561ffff81168114614042575f80fd5b925061405060608701613f9d565b9150608086013561406081614002565b809150509295509295909350565b5f805f805f805f80610100898b031215614086575f80fd5b61408f89613f0c565b9a60208a01359a5060408a013599606081013599506080810135985060a0810135975060c0810135965060e00135945092505050565b602080825282518282018190525f9190848201906040850190845b8181101561411257835173ffffffffffffffffffffffffffffffffffffffff16835292840192918401916001016140e0565b50909695505050505050565b602081525f61191c6020830184613d9b565b815173ffffffffffffffffffffffffffffffffffffffff16815261014081016020830151614176602084018273ffffffffffffffffffffffffffffffffffffffff169052565b50604083015160408301526060830151606083015260808301516141b2608084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060a083015160a083015260c083015160c083015260e083015160e0830152610100808401516141e98285018263ffffffff169052565b50506101209283015173ffffffffffffffffffffffffffffffffffffffff16919092015290565b5f805f805f805f805f60e08a8c031215614228575f80fd5b8935985060208a0135975060408a0135965060608a0135955060808a013567ffffffffffffffff8082111561425b575f80fd5b6142678d838e01613cd1565b909750955060a08c013591508082111561427f575f80fd5b5061428c8c828d01613cd1565b9a9d999c50979a9699959894979660c00135949350505050565b8183525f7f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156142d6575f80fd5b8260051b80836020870137939093016020019392505050565b8183525f60208085019450825f5b85811015613d90578135875295820195908201906001016142fd565b608081525f61432c60808301888a6142a6565b828103602084015261433f8187896142ef565b6040840195909552505060600152949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115610afb57610afb614382565b60a081525f6143d560a08301898b6142a6565b82810360208401526143e881888a6142ef565b604084019690965250506060810192909252608090910152949350505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361443857614438614382565b5060010190565b5f6020828403121561444f575f80fd5b5051919050565b81810381811115610afb57610afb614382565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6020808352835160208401526020840151604084015261ffff6040850151166060840152606084015163ffffffff80821660808601528060808701511660a0860152505060a084015160c08085015280518060e08601525f5b8181101561450d57828101840151868201610100015283016144f0565b5061010092505f838287010152827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116860101935050505092915050565b8082028115828204841417610afb57610afb614382565b5f8261457457614574614469565b500490565b5f60208284031215614589575f80fd5b815161191c81614002565b5f826145a2576145a2614469565b500690565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd000000000000000000000000fa4e888d9fbbcf4afa7bf057ecfe59ed04619e62000000000000009db75246fdc41cce8e9f7850df557907b82c00000000000000000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000ace659dc614d5fc455d123a1c3e438dd78a05e77000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000002c68af0bb1400000000000000000000000000000000000000000000000000000000e7ebd06af000000000000000000000000000000000000000000000000000000000000002ab9800000000000000000000000014632cd5c12ec5875d41350b55e825c54406baab9e9e46732b32662b9adc6f3abdf6c5e926a666d174a4d6b8e39c4cca76a388974898d0cd97c5e7bd93bf9d8d47accf0c33c15b8582ac7f9e24bc9d9c08745fb8000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000002625a00000000000000000000000003c0ca683b403e37668ae3dc4fb62f4b29b6f7a3e0000000000000000000000000000000000000000000000000000000000000001