diff --git a/.changeset/gorgeous-crabs-repeat.md b/.changeset/gorgeous-crabs-repeat.md new file mode 100644 index 00000000000..a74f36ec3a9 --- /dev/null +++ b/.changeset/gorgeous-crabs-repeat.md @@ -0,0 +1,5 @@ +--- +"chainlink": patch +--- + +Soft delete consumer nonce in VRF coordinator v2.5 diff --git a/contracts/src/v0.8/vrf/dev/SubscriptionAPI.sol b/contracts/src/v0.8/vrf/dev/SubscriptionAPI.sol index 8a634f904a8..0ac1e903d42 100644 --- a/contracts/src/v0.8/vrf/dev/SubscriptionAPI.sol +++ b/contracts/src/v0.8/vrf/dev/SubscriptionAPI.sol @@ -60,8 +60,13 @@ abstract contract SubscriptionAPI is ConfirmedOwner, IERC677Receiver, IVRFSubscr // consumer is valid without reading all the consumers from storage. address[] consumers; } + struct ConsumerConfig { + bool active; + uint64 nonce; + } // Note a nonce of 0 indicates an the consumer is not assigned to that subscription. - mapping(address => mapping(uint256 => uint64)) /* consumer */ /* subId */ /* nonce */ internal s_consumers; + mapping(address => mapping(uint256 => ConsumerConfig)) /* consumerAddress */ /* subId */ /* consumerConfig */ + internal s_consumers; mapping(uint256 => SubscriptionConfig) /* subId */ /* subscriptionConfig */ internal s_subscriptionConfigs; mapping(uint256 => Subscription) /* subId */ /* subscription */ internal s_subscriptions; // subscription nonce used to construct subId. Rises monotonically @@ -400,19 +405,21 @@ abstract contract SubscriptionAPI is ConfirmedOwner, IERC677Receiver, IVRFSubscr * @inheritdoc IVRFSubscriptionV2Plus */ function addConsumer(uint256 subId, address consumer) external override onlySubOwner(subId) nonReentrant { + ConsumerConfig storage consumerConfig = s_consumers[consumer][subId]; + if (consumerConfig.active) { + // Idempotence - do nothing if already added. + // Ensures uniqueness in s_subscriptions[subId].consumers. + return; + } // Already maxed, cannot add any more consumers. address[] storage consumers = s_subscriptionConfigs[subId].consumers; if (consumers.length == MAX_CONSUMERS) { revert TooManyConsumers(); } - mapping(uint256 => uint64) storage nonces = s_consumers[consumer]; - if (nonces[subId] != 0) { - // Idempotence - do nothing if already added. - // Ensures uniqueness in s_subscriptions[subId].consumers. - return; - } - // Initialize the nonce to 1, indicating the consumer is allocated. - nonces[subId] = 1; + // consumerConfig.nonce is 0 if the consumer had never sent a request to this subscription + // otherwise, consumerConfig.nonce is non-zero + // in both cases, use consumerConfig.nonce as is and set active status to true + consumerConfig.active = true; consumers.push(consumer); emit SubscriptionConsumerAdded(subId, consumer); diff --git a/contracts/src/v0.8/vrf/dev/VRFCoordinatorV2_5.sol b/contracts/src/v0.8/vrf/dev/VRFCoordinatorV2_5.sol index d1347440d3c..2712dd27ce6 100644 --- a/contracts/src/v0.8/vrf/dev/VRFCoordinatorV2_5.sol +++ b/contracts/src/v0.8/vrf/dev/VRFCoordinatorV2_5.sol @@ -263,10 +263,9 @@ contract VRFCoordinatorV2_5 is VRF, SubscriptionAPI, IVRFCoordinatorV2Plus { } // Its important to ensure that the consumer is in fact who they say they // are, otherwise they could use someone else's subscription balance. - // A nonce of 0 indicates consumer is not allocated to the sub. - mapping(uint256 => uint64) storage nonces = s_consumers[msg.sender]; - uint64 nonce = nonces[subId]; - if (nonce == 0) { + mapping(uint256 => ConsumerConfig) storage consumerConfigs = s_consumers[msg.sender]; + ConsumerConfig memory consumerConfig = consumerConfigs[subId]; + if (!consumerConfig.active) { revert InvalidConsumer(subId, msg.sender); } // Input validation using the config storage word. @@ -293,9 +292,9 @@ contract VRFCoordinatorV2_5 is VRF, SubscriptionAPI, IVRFCoordinatorV2Plus { // Note we do not check whether the keyHash is valid to save gas. // The consequence for users is that they can send requests // for invalid keyHashes which will simply not be fulfilled. - ++nonce; + ++consumerConfig.nonce; uint256 preSeed; - (requestId, preSeed) = _computeRequestId(req.keyHash, msg.sender, subId, nonce); + (requestId, preSeed) = _computeRequestId(req.keyHash, msg.sender, subId, consumerConfig.nonce); bytes memory extraArgsBytes = VRFV2PlusClient._argsToBytes(_fromBytes(req.extraArgs)); s_requestCommitments[requestId] = keccak256( @@ -320,7 +319,7 @@ contract VRFCoordinatorV2_5 is VRF, SubscriptionAPI, IVRFCoordinatorV2Plus { extraArgsBytes, msg.sender ); - nonces[subId] = nonce; + consumerConfigs[subId] = consumerConfig; return requestId; } @@ -630,7 +629,12 @@ contract VRFCoordinatorV2_5 is VRF, SubscriptionAPI, IVRFCoordinatorV2Plus { for (uint256 i = 0; i < consumersLength; ++i) { address consumer = consumers[i]; for (uint256 j = 0; j < provingKeyHashesLength; ++j) { - (uint256 reqId, ) = _computeRequestId(s_provingKeyHashes[j], consumer, subId, s_consumers[consumer][subId]); + (uint256 reqId, ) = _computeRequestId( + s_provingKeyHashes[j], + consumer, + subId, + s_consumers[consumer][subId].nonce + ); if (s_requestCommitments[reqId] != 0) { return true; } @@ -646,7 +650,7 @@ contract VRFCoordinatorV2_5 is VRF, SubscriptionAPI, IVRFCoordinatorV2Plus { if (pendingRequestExists(subId)) { revert PendingRequestExists(); } - if (s_consumers[consumer][subId] == 0) { + if (!s_consumers[consumer][subId].active) { revert InvalidConsumer(subId, consumer); } // Note bounded by MAX_CONSUMERS @@ -662,7 +666,7 @@ contract VRFCoordinatorV2_5 is VRF, SubscriptionAPI, IVRFCoordinatorV2Plus { break; } } - delete s_consumers[consumer][subId]; + s_consumers[consumer][subId].active = false; emit SubscriptionConsumerRemoved(subId, consumer); } diff --git a/contracts/src/v0.8/vrf/dev/testhelpers/VRFCoordinatorV2PlusUpgradedVersion.sol b/contracts/src/v0.8/vrf/dev/testhelpers/VRFCoordinatorV2PlusUpgradedVersion.sol index 608536518fb..2e3aef59cd7 100644 --- a/contracts/src/v0.8/vrf/dev/testhelpers/VRFCoordinatorV2PlusUpgradedVersion.sol +++ b/contracts/src/v0.8/vrf/dev/testhelpers/VRFCoordinatorV2PlusUpgradedVersion.sol @@ -240,8 +240,9 @@ contract VRFCoordinatorV2PlusUpgradedVersion is // Its important to ensure that the consumer is in fact who they say they // are, otherwise they could use someone else's subscription balance. // A nonce of 0 indicates consumer is not allocated to the sub. - uint64 currentNonce = s_consumers[msg.sender][req.subId]; - if (currentNonce == 0) { + mapping(uint256 => ConsumerConfig) storage consumerConfigs = s_consumers[msg.sender]; + ConsumerConfig memory consumerConfig = consumerConfigs[req.subId]; + if (!consumerConfig.active) { revert InvalidConsumer(req.subId, msg.sender); } // Input validation using the config storage word. @@ -267,8 +268,8 @@ contract VRFCoordinatorV2PlusUpgradedVersion is // Note we do not check whether the keyHash is valid to save gas. // The consequence for users is that they can send requests // for invalid keyHashes which will simply not be fulfilled. - uint64 nonce = currentNonce + 1; - (uint256 requestId, uint256 preSeed) = _computeRequestId(req.keyHash, msg.sender, req.subId, nonce); + ++consumerConfig.nonce; + (uint256 requestId, uint256 preSeed) = _computeRequestId(req.keyHash, msg.sender, req.subId, consumerConfig.nonce); VRFV2PlusClient.ExtraArgsV1 memory extraArgs = _fromBytes(req.extraArgs); bytes memory extraArgsBytes = VRFV2PlusClient._argsToBytes(extraArgs); @@ -294,7 +295,7 @@ contract VRFCoordinatorV2PlusUpgradedVersion is extraArgsBytes, msg.sender ); - s_consumers[msg.sender][req.subId] = nonce; + s_consumers[msg.sender][req.subId] = consumerConfig; return requestId; } @@ -548,7 +549,7 @@ contract VRFCoordinatorV2PlusUpgradedVersion is s_provingKeyHashes[j], subConfig.consumers[i], subId, - s_consumers[subConfig.consumers[i]][subId] + s_consumers[subConfig.consumers[i]][subId].nonce ); if (s_requestCommitments[reqId] != 0) { return true; @@ -565,7 +566,7 @@ contract VRFCoordinatorV2PlusUpgradedVersion is if (pendingRequestExists(subId)) { revert PendingRequestExists(); } - if (s_consumers[consumer][subId] == 0) { + if (!s_consumers[consumer][subId].active) { revert InvalidConsumer(subId, consumer); } // Note bounded by MAX_CONSUMERS @@ -712,7 +713,7 @@ contract VRFCoordinatorV2PlusUpgradedVersion is } for (uint256 i = 0; i < migrationData.consumers.length; i++) { - s_consumers[migrationData.consumers[i]][migrationData.subId] = 1; + s_consumers[migrationData.consumers[i]][migrationData.subId] = ConsumerConfig({active: true, nonce: 0}); } s_subscriptions[migrationData.subId] = Subscription({ diff --git a/contracts/test/v0.8/foundry/vrf/VRFV2Plus.t.sol b/contracts/test/v0.8/foundry/vrf/VRFV2Plus.t.sol index 57ecb942c13..02fd1873792 100644 --- a/contracts/test/v0.8/foundry/vrf/VRFV2Plus.t.sol +++ b/contracts/test/v0.8/foundry/vrf/VRFV2Plus.t.sol @@ -12,6 +12,7 @@ import {VRFV2PlusConsumerExample} from "../../../../src/v0.8/vrf/dev/testhelpers import {VRFV2PlusClient} from "../../../../src/v0.8/vrf/dev/libraries/VRFV2PlusClient.sol"; import {console} from "forge-std/console.sol"; import {VmSafe} from "forge-std/Vm.sol"; +import {VRFV2PlusLoadTestWithMetrics} from "../../../../src/v0.8/vrf/dev/testhelpers/VRFV2PlusLoadTestWithMetrics.sol"; import "@openzeppelin/contracts/utils/math/Math.sol"; // for Math.ceilDiv /* @@ -25,6 +26,9 @@ import "@openzeppelin/contracts/utils/math/Math.sol"; // for Math.ceilDiv contract VRFV2Plus is BaseTest { address internal constant LINK_WHALE = 0xD883a6A1C22fC4AbFE938a5aDF9B2Cc31b1BF18B; uint64 internal constant GAS_LANE_MAX_GAS = 5000 gwei; + uint16 internal constant MIN_CONFIRMATIONS = 0; + uint32 internal constant CALLBACK_GAS_LIMIT = 1_000_000; + uint32 internal constant NUM_WORDS = 1; // Bytecode for a VRFV2PlusConsumerExample contract. // to calculate: console.logBytes(type(VRFV2PlusConsumerExample).creationCode); @@ -226,6 +230,7 @@ contract VRFV2Plus is BaseTest { assertTrue(exists); assertEq(GAS_LANE_MAX_GAS, maxGas); assertEq(s_testCoordinator.s_provingKeyHashes(0), keyHash); + assertEq(keyHash, vrfKeyHash); } function testDeregisterProvingKey() public { @@ -429,25 +434,25 @@ contract VRFV2Plus is BaseTest { (bool fulfilled, , ) = s_testConsumer.s_requests(requestId); assertEq(fulfilled, true); - // The cost of fulfillRandomWords is approximately 97_000 gas. + // The cost of fulfillRandomWords is approximately 86_000 gas. // gasAfterPaymentCalculation is 50_000. // // The cost of the VRF fulfillment charged to the user is: // paymentNoFee = (weiPerUnitGas * (gasAfterPaymentCalculation + startGas - gasleft() + l1CostWei) / link_native_ratio) - // paymentNoFee = (1e11 * (50_000 + 97_000 + 0)) / .5 - // paymentNoFee = 2.94e16 + // paymentNoFee = (1e11 * (50_000 + 86_000 + 0)) / .5 + // paymentNoFee = 2.72e16 // flatFeeWei = 1e12 * (fulfillmentFlatFeeNativePPM - fulfillmentFlatFeeLinkDiscountPPM) // flatFeeWei = 1e12 * (500_000 - 100_000) // flatFeeJuels = 1e18 * flatFeeWei / link_native_ratio // flatFeeJuels = 4e17 / 0.5 = 8e17 // billed_fee = paymentNoFee * ((100 + 10) / 100) + 8e17 - // billed_fee = 2.94e16 * 1.1 + 8e17 - // billed_fee = 3.234e16 + 8e17 = 8.3234e17 + // billed_fee = 2.72e16 * 1.1 + 8e17 + // billed_fee = 2.992e16 + 8e17 = 8.2992e17 // note: delta is doubled from the native test to account for more variance due to the link/native ratio (uint96 linkBalanceAfter, , , , ) = s_testCoordinator.getSubscription(subId); // 1e15 is less than 1 percent discrepancy - assertApproxEqAbs(payment, 8.3234 * 1e17, 1e15); - assertApproxEqAbs(linkBalanceAfter, linkBalanceBefore - 8.3234 * 1e17, 1e15); + assertApproxEqAbs(payment, 8.2992 * 1e17, 1e15); + assertApproxEqAbs(linkBalanceAfter, linkBalanceBefore - 8.2992 * 1e17, 1e15); } function testRequestAndFulfillRandomWordsLINK_FallbackWeiPerUnitLinkUsed() public { @@ -488,19 +493,19 @@ contract VRFV2Plus is BaseTest { // Request random words. vm.expectEmit(true, true, false, true); uint256 preSeed; - (requestId, preSeed) = s_testCoordinator.computeRequestIdExternal(vrfKeyHash, address(s_testConsumer), subId, 2); + (requestId, preSeed) = s_testCoordinator.computeRequestIdExternal(vrfKeyHash, address(s_testConsumer), subId, 1); emit RandomWordsRequested( vrfKeyHash, requestId, preSeed, subId, - 0, // minConfirmations - 1_000_000, // callbackGasLimit - 1, // numWords + MIN_CONFIRMATIONS, + CALLBACK_GAS_LIMIT, + NUM_WORDS, VRFV2PlusClient._argsToBytes(VRFV2PlusClient.ExtraArgsV1({nativePayment: false})), // nativePayment, // nativePayment address(s_testConsumer) // requester ); - s_testConsumer.requestRandomWords(1_000_000, 0, 1, vrfKeyHash, false); + s_testConsumer.requestRandomWords(CALLBACK_GAS_LIMIT, MIN_CONFIRMATIONS, NUM_WORDS, vrfKeyHash, false); (bool fulfilled, , ) = s_testConsumer.s_requests(requestId); assertEq(fulfilled, false); @@ -520,7 +525,7 @@ contract VRFV2Plus is BaseTest { /* go run . generate-proof-v2-plus \ -key-hash 0x9f2353bde94264dbc3d554a94cceba2d7d2b4fdce4304d3e09a1fea9fbeb1528 \ - -pre-seed 108233140904510496268355288815996296196427471042093167619305836589216327096601 \ + -pre-seed 58424872742560034068603954318478134981993109073728628043159461959392650534066 \ -block-hash 0x0000000000000000000000000000000000000000000000000000000000000014 \ -block-num 20 \ -sender 0x90A8820424CC8a819d14cBdE54D12fD3fbFa9bb2 @@ -531,22 +536,22 @@ contract VRFV2Plus is BaseTest { 62070622898698443831883535403436258712770888294397026493185421712108624767191 ], gamma: [ - 49785247270467418393187938018746488660500261614113251546613288843777654841004, - 8320717868018488740308781441198484312662094766876176838868269181386589318272 + 38041205470219573731614166317842050442610096576830191475863676359766283013831, + 31897503406364148988967447112698248795931483458172800286988696482435433838056 ], - c: 41596204381278553342984662603150353549780558761307588910860350083645227536604, - s: 81592778991188138734863787790226463602813498664606420860910885269124681994753, - seed: 108233140904510496268355288815996296196427471042093167619305836589216327096601, - uWitness: 0x56920892EE71E624d369dCc8dc63B6878C85Ca70, + c: 114706080610174375269579192101772790158458728655229562781479812703475130740224, + s: 91869928024010088265014058436030407245056128545665425448353233998362687232253, + seed: 58424872742560034068603954318478134981993109073728628043159461959392650534066, + uWitness: 0x1514536B09a51E671d070312bcD3653386d5a82b, cGammaWitness: [ - 28250667431035633903490940933503696927659499415200427260709034207157951953043, - 105660182690338773283351292037478192732977803900032569393220726139772041021018 + 90605489216274499662544489893800286859751132311034850249229378789467669572783, + 76568417372883461229305641415175605031997103681542349721251313705711146936024 ], sHashWitness: [ - 18420263847278540234821121001488166570853056146131705862117248292063859054211, - 15740432967529684573970722302302642068194042971767150190061244675457227502736 + 43417948503950579681520475434461454031791886587406480417092620950034789197994, + 100772571879140362396088596211082924128900752544164141322636815729889228000249 ], - zInv: 100579074451139970455673776933943662313989441807178260211316504761358492254052 + zInv: 82374292458278672300647114418593830323283909625362447038989596015264004164958 }); rc = VRFCoordinatorV2_5.RequestCommitment({ blockNum: requestBlock, @@ -576,19 +581,19 @@ contract VRFV2Plus is BaseTest { // Request random words. vm.expectEmit(true, true, true, true); uint256 preSeed; - (requestId, preSeed) = s_testCoordinator.computeRequestIdExternal(vrfKeyHash, address(s_testConsumer), subId, 2); + (requestId, preSeed) = s_testCoordinator.computeRequestIdExternal(vrfKeyHash, address(s_testConsumer), subId, 1); emit RandomWordsRequested( vrfKeyHash, requestId, preSeed, subId, - 0, // minConfirmations - 1_000_000, // callbackGasLimit - 1, // numWords + MIN_CONFIRMATIONS, + CALLBACK_GAS_LIMIT, + NUM_WORDS, VRFV2PlusClient._argsToBytes(VRFV2PlusClient.ExtraArgsV1({nativePayment: true})), // nativePayment address(s_testConsumer) // requester ); - s_testConsumer.requestRandomWords(1_000_000, 0, 1, vrfKeyHash, true); + s_testConsumer.requestRandomWords(CALLBACK_GAS_LIMIT, MIN_CONFIRMATIONS, NUM_WORDS, vrfKeyHash, true); (bool fulfilled, , ) = s_testConsumer.s_requests(requestId); assertEq(fulfilled, false); @@ -608,7 +613,7 @@ contract VRFV2Plus is BaseTest { /* go run . generate-proof-v2-plus \ -key-hash 0x9f2353bde94264dbc3d554a94cceba2d7d2b4fdce4304d3e09a1fea9fbeb1528 \ - -pre-seed 93724884573574303181157854277074121673523280784530506403108144933983063023487 \ + -pre-seed 83266692323404068105564931899467966321583332182309426611016082057597749986430 \ -block-hash 0x000000000000000000000000000000000000000000000000000000000000000a \ -block-num 10 \ -sender 0x90A8820424CC8a819d14cBdE54D12fD3fbFa9bb2 \ @@ -620,27 +625,27 @@ contract VRFV2Plus is BaseTest { 62070622898698443831883535403436258712770888294397026493185421712108624767191 ], gamma: [ - 51111463251706978184511913295560024261167135799300172382907308330135472647507, - 41885656274025752055847945432737871864088659248922821023734315208027501951872 + 47144451677122876068574640250190132179872561942855874114516471019540736524783, + 63001220656590641645486673489302242739512599229187442248048295264418080499391 ], - c: 96917856581077810363012153828220232197567408835708926581335248000925197916153, - s: 103298896676233752268329042222773891728807677368628421408380318882272184455566, - seed: 93724884573574303181157854277074121673523280784530506403108144933983063023487, - uWitness: 0xFCaA10875C6692f6CcC86c64300eb0b52f2D4323, + c: 42928477813589729783511577059394077774341588261592343937605454161333818133643, + s: 14447529458406454898597883219032514356523135029224613793880920230249515634875, + seed: 83266692323404068105564931899467966321583332182309426611016082057597749986430, + uWitness: 0x5Ed3bb2AA8EAFe168a23079644d5dfBf892B1038, cGammaWitness: [ - 61463607927970680172418313129927007099021056249775757132623753443657677198526, - 48686021866486086188742596461341782400160109177829661164208082534005682984658 + 40742088032247467257043132769297935807697466810312051815364187117543257089153, + 110399474382135664619186049639190334359061769014381608543009407662815758204131 ], sHashWitness: [ - 91508089836242281395929619352465003226819385335975246221498243754781593857533, - 63571625936444669399167157725633389238098818902162172059681813608664564703308 + 26556776392895292893984393164594214244553035014769995354896600239759043777485, + 67126706735912782218279556535631175449291035782208850310724682668198932501077 ], - zInv: 97568175302326019383632009699686265453584842953005404815285123863099260038246 + zInv: 88742453392918610091640193378775723954629905126315835248392650970979000380325 }); rc = VRFCoordinatorV2_5.RequestCommitment({ blockNum: requestBlock, subId: subId, - callbackGasLimit: 1_000_000, + callbackGasLimit: CALLBACK_GAS_LIMIT, numWords: 1, sender: address(s_testConsumer), extraArgs: VRFV2PlusClient._argsToBytes(VRFV2PlusClient.ExtraArgsV1({nativePayment: true})) @@ -739,25 +744,185 @@ contract VRFV2Plus is BaseTest { (bool fulfilled, , ) = s_testConsumer.s_requests(requestId); assertEq(fulfilled, true); - // The cost of fulfillRandomWords is approximately 97_000 gas. + // The cost of fulfillRandomWords is approximately 86_000 gas. // gasAfterPaymentCalculation is 50_000. // // The cost of the VRF fulfillment charged to the user is: // paymentNoFee = (weiPerUnitGas * (gasAfterPaymentCalculation + startGas - gasleft() + l1CostWei) / link_native_ratio) // network gas price is capped at gas lane max gas (5000 gwei) - // paymentNoFee = (5e12 * (50_000 + 97_000 + 0)) / .5 - // paymentNoFee = 1.47e+18 + // paymentNoFee = (5e12 * (50_000 + 86_000 + 0)) / .5 + // paymentNoFee = 1.36e+18 // flatFeeWei = 1e12 * (fulfillmentFlatFeeNativePPM - fulfillmentFlatFeeLinkDiscountPPM) // flatFeeWei = 1e12 * (500_000 - 100_000) // flatFeeJuels = 1e18 * flatFeeWei / link_native_ratio // flatFeeJuels = 4e17 / 0.5 = 8e17 // billed_fee = paymentNoFee * (10 / 100) + 8e17 - // billed_fee = 1.47e+18 * 0.1 + 8e17 - // billed_fee = 9.47e+17 + // billed_fee = 1.36e+18 * 0.1 + 8e17 + // billed_fee = 9.36e+17 // note: delta is doubled from the native test to account for more variance due to the link/native ratio (uint96 linkBalanceAfter, , , , ) = s_testCoordinator.getSubscription(subId); // 1e15 is less than 1 percent discrepancy - assertApproxEqAbs(payment, 9.47 * 1e17, 1e15); - assertApproxEqAbs(linkBalanceAfter, linkBalanceBefore - 9.47 * 1e17, 1e15); + assertApproxEqAbs(payment, 9.36 * 1e17, 1e15); + assertApproxEqAbs(linkBalanceAfter, linkBalanceBefore - 9.36 * 1e17, 1e15); + } + + function testRequestRandomWords_InvalidConsumer() public { + address subOwner = makeAddr("subOwner"); + changePrank(subOwner); + uint256 subId = s_testCoordinator.createSubscription(); + VRFV2PlusLoadTestWithMetrics consumer = new VRFV2PlusLoadTestWithMetrics(address(s_testCoordinator)); + + // consumer is not added to the subscription + vm.expectRevert(abi.encodeWithSelector(SubscriptionAPI.InvalidConsumer.selector, subId, address(consumer))); + consumer.requestRandomWords( + subId, + MIN_CONFIRMATIONS, + vrfKeyHash, + CALLBACK_GAS_LIMIT, + true, + NUM_WORDS, + 1 /* requestCount */ + ); + } + + function testRequestRandomWords_ReAddConsumer_AssertRequestID() public { + // 1. setup consumer and subscription + setConfig(); + registerProvingKey(); + address subOwner = makeAddr("subOwner"); + changePrank(subOwner); + uint256 subId = s_testCoordinator.createSubscription(); + VRFV2PlusLoadTestWithMetrics consumer = new VRFV2PlusLoadTestWithMetrics(address(s_testCoordinator)); + s_testCoordinator.addConsumer(subId, address(consumer)); + uint32 requestBlock = 10; + vm.roll(requestBlock); + changePrank(LINK_WHALE); + s_testCoordinator.fundSubscriptionWithNative{value: 10 ether}(subId); + + // 2. Request random words. + changePrank(subOwner); + vm.expectEmit(true, true, false, true); + uint256 requestId; + uint256 preSeed; + (requestId, preSeed) = s_testCoordinator.computeRequestIdExternal(vrfKeyHash, address(consumer), subId, 1); + emit RandomWordsRequested( + vrfKeyHash, + requestId, + preSeed, + subId, + MIN_CONFIRMATIONS, + CALLBACK_GAS_LIMIT, + NUM_WORDS, + VRFV2PlusClient._argsToBytes(VRFV2PlusClient.ExtraArgsV1({nativePayment: true})), + address(consumer) // requester + ); + consumer.requestRandomWords( + subId, + MIN_CONFIRMATIONS, + vrfKeyHash, + CALLBACK_GAS_LIMIT, + true /* nativePayment */, + NUM_WORDS, + 1 /* requestCount */ + ); + assertTrue(s_testCoordinator.pendingRequestExists(subId)); + + // 3. Fulfill the request above + //console.log("requestId: ", requestId); + //console.log("preSeed: ", preSeed); + //console.log("sender: ", address(consumer)); + + // Move on to the next block. + // Store the previous block's blockhash, and assert that it is as expected. + vm.roll(requestBlock + 1); + s_bhs.store(requestBlock); + assertEq(hex"000000000000000000000000000000000000000000000000000000000000000a", s_bhs.getBlockhash(requestBlock)); + + // Fulfill the request. + // Proof generated via the generate-proof-v2-plus script command. Example usage: + /* + go run . generate-proof-v2-plus \ + -key-hash 0x9f2353bde94264dbc3d554a94cceba2d7d2b4fdce4304d3e09a1fea9fbeb1528 \ + -pre-seed 94043941380654896554739370173616551044559721638888689173752661912204412136884 \ + -block-hash 0x000000000000000000000000000000000000000000000000000000000000000a \ + -block-num 10 \ + -sender 0x44CAfC03154A0708F9DCf988681821f648dA74aF \ + -native-payment true + */ + VRF.Proof memory proof = VRF.Proof({ + pk: [ + 72488970228380509287422715226575535698893157273063074627791787432852706183111, + 62070622898698443831883535403436258712770888294397026493185421712108624767191 + ], + gamma: [ + 18593555375562408458806406536059989757338587469093035962641476877033456068708, + 55675218112764789548330682504442195066741636758414578491295297591596761905475 + ], + c: 56595337384472359782910435918403237878894172750128610188222417200315739516270, + s: 60666722370046279064490737533582002977678558769715798604164042022636022215663, + seed: 94043941380654896554739370173616551044559721638888689173752661912204412136884, + uWitness: 0xEdbE15fd105cfEFb9CCcbBD84403d1F62719E50d, + cGammaWitness: [ + 11752391553651713021860307604522059957920042356542944931263270793211985356642, + 14713353048309058367510422609936133400473710094544154206129568172815229277104 + ], + sHashWitness: [ + 109716108880570827107616596438987062129934448629902940427517663799192095060206, + 79378277044196229730810703755304140279837983575681427317104232794580059801930 + ], + zInv: 18898957977631212231148068121702167284572066246731769473720131179584458697812 + }); + VRFCoordinatorV2_5.RequestCommitment memory rc = VRFCoordinatorV2_5.RequestCommitment({ + blockNum: requestBlock, + subId: subId, + callbackGasLimit: CALLBACK_GAS_LIMIT, + numWords: NUM_WORDS, + sender: address(consumer), + extraArgs: VRFV2PlusClient._argsToBytes(VRFV2PlusClient.ExtraArgsV1({nativePayment: true})) + }); + s_testCoordinator.fulfillRandomWords(proof, rc, true /* onlyPremium */); + assertFalse(s_testCoordinator.pendingRequestExists(subId)); + + // 4. remove consumer and verify request random words doesn't work + s_testCoordinator.removeConsumer(subId, address(consumer)); + vm.expectRevert(abi.encodeWithSelector(SubscriptionAPI.InvalidConsumer.selector, subId, address(consumer))); + consumer.requestRandomWords( + subId, + MIN_CONFIRMATIONS, + vrfKeyHash, + CALLBACK_GAS_LIMIT, + false /* nativePayment */, + NUM_WORDS, + 1 /* requestCount */ + ); + + // 5. re-add consumer and assert requestID nonce starts from 2 (nonce 1 was used before consumer removal) + s_testCoordinator.addConsumer(subId, address(consumer)); + vm.expectEmit(true, true, false, true); + uint256 requestId2; + uint256 preSeed2; + (requestId2, preSeed2) = s_testCoordinator.computeRequestIdExternal(vrfKeyHash, address(consumer), subId, 2); + emit RandomWordsRequested( + vrfKeyHash, + requestId2, + preSeed2, + subId, + MIN_CONFIRMATIONS, + CALLBACK_GAS_LIMIT, + NUM_WORDS, + VRFV2PlusClient._argsToBytes(VRFV2PlusClient.ExtraArgsV1({nativePayment: false})), // nativePayment, // nativePayment + address(consumer) // requester + ); + consumer.requestRandomWords( + subId, + MIN_CONFIRMATIONS, + vrfKeyHash, + CALLBACK_GAS_LIMIT, + false /* nativePayment */, + NUM_WORDS, + 1 /* requestCount */ + ); + assertNotEq(requestId, requestId2); + assertNotEq(preSeed, preSeed2); } } diff --git a/contracts/test/v0.8/foundry/vrf/VRFV2PlusSubscriptionAPI.t.sol b/contracts/test/v0.8/foundry/vrf/VRFV2PlusSubscriptionAPI.t.sol index 0df53a12175..9883acdbc23 100644 --- a/contracts/test/v0.8/foundry/vrf/VRFV2PlusSubscriptionAPI.t.sol +++ b/contracts/test/v0.8/foundry/vrf/VRFV2PlusSubscriptionAPI.t.sol @@ -2,10 +2,12 @@ pragma solidity 0.8.6; import "../BaseTest.t.sol"; import {ExposedVRFCoordinatorV2_5} from "../../../../src/v0.8/vrf/dev/testhelpers/ExposedVRFCoordinatorV2_5.sol"; +import {VRFV2PlusLoadTestWithMetrics} from "../../../../src/v0.8/vrf/dev/testhelpers/VRFV2PlusLoadTestWithMetrics.sol"; import {SubscriptionAPI} from "../../../../src/v0.8/vrf/dev/SubscriptionAPI.sol"; import {MockLinkToken} from "../../../../src/v0.8/mocks/MockLinkToken.sol"; import {MockV3Aggregator} from "../../../../src/v0.8/tests/MockV3Aggregator.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; // for Strings.toString +import {VmSafe} from "forge-std/Vm.sol"; contract VRFV2PlusSubscriptionAPITest is BaseTest { event SubscriptionFunded(uint256 indexed subId, uint256 oldBalance, uint256 newBalance); @@ -16,6 +18,7 @@ contract VRFV2PlusSubscriptionAPITest is BaseTest { event SubscriptionOwnerTransferRequested(uint256 indexed subId, address from, address to); event SubscriptionOwnerTransferred(uint256 indexed subId, address from, address to); event SubscriptionConsumerAdded(uint256 indexed subId, address consumer); + event SubscriptionConsumerRemoved(uint256 indexed subId, address consumer); ExposedVRFCoordinatorV2_5 s_subscriptionAPI; @@ -596,6 +599,25 @@ contract VRFV2PlusSubscriptionAPITest is BaseTest { // add consumer again, should be no-op changePrank(subOwner); + VmSafe.Log[] memory events = vm.getRecordedLogs(); + s_subscriptionAPI.addConsumer(subId, consumer); + assertEq(events.length, 0); + assertEq(s_subscriptionAPI.getSubscriptionConfig(subId).consumers.length, 1); + assertEq(s_subscriptionAPI.getSubscriptionConfig(subId).consumers[0], consumer); + + // remove consumer + vm.expectEmit(true, false, false, true); + emit SubscriptionConsumerRemoved(subId, consumer); + s_subscriptionAPI.removeConsumer(subId, consumer); + assertEq(s_subscriptionAPI.getSubscriptionConfig(subId).consumers.length, 0); + + // removing consumer twice should revert + vm.expectRevert(abi.encodeWithSelector(SubscriptionAPI.InvalidConsumer.selector, subId, address(consumer))); + s_subscriptionAPI.removeConsumer(subId, consumer); + + //re-add consumer + vm.expectEmit(true, false, false, true); + emit SubscriptionConsumerAdded(subId, consumer); s_subscriptionAPI.addConsumer(subId, consumer); assertEq(s_subscriptionAPI.getSubscriptionConfig(subId).consumers.length, 1); assertEq(s_subscriptionAPI.getSubscriptionConfig(subId).consumers[0], consumer); diff --git a/contracts/test/v0.8/foundry/vrf/VRFV2PlusWrapper.t.sol b/contracts/test/v0.8/foundry/vrf/VRFV2PlusWrapper.t.sol index a3f1baf5fff..5b03b9278e7 100644 --- a/contracts/test/v0.8/foundry/vrf/VRFV2PlusWrapper.t.sol +++ b/contracts/test/v0.8/foundry/vrf/VRFV2PlusWrapper.t.sol @@ -187,7 +187,7 @@ contract VRFV2PlusWrapperTest is BaseTest { vrfKeyHash, address(s_wrapper), s_wrapper.SUBSCRIPTION_ID(), - 2 + 1 ); uint32 EIP150Overhead = callbackGasLimit / 63 + 1; emit RandomWordsRequested( @@ -247,7 +247,7 @@ contract VRFV2PlusWrapperTest is BaseTest { vrfKeyHash, address(s_wrapper), s_wrapper.SUBSCRIPTION_ID(), - 2 + 1 ); uint32 EIP150Overhead = callbackGasLimit / 63 + 1; emit RandomWordsRequested( @@ -314,7 +314,7 @@ contract VRFV2PlusWrapperTest is BaseTest { vrfKeyHash, address(s_wrapper), s_wrapper.SUBSCRIPTION_ID(), - 2 + 1 ); uint32 EIP150Overhead = callbackGasLimit / 63 + 1; vm.expectEmit(true, true, true, true); diff --git a/core/gethwrappers/generated/vrf_coordinator_v2_5/vrf_coordinator_v2_5.go b/core/gethwrappers/generated/vrf_coordinator_v2_5/vrf_coordinator_v2_5.go index 7a21e90faae..119fba7d2e4 100644 --- a/core/gethwrappers/generated/vrf_coordinator_v2_5/vrf_coordinator_v2_5.go +++ b/core/gethwrappers/generated/vrf_coordinator_v2_5/vrf_coordinator_v2_5.go @@ -62,7 +62,7 @@ type VRFV2PlusClientRandomWordsRequest struct { var VRFCoordinatorV25MetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"blockhashStore\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"internalBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"externalBalance\",\"type\":\"uint256\"}],\"name\":\"BalanceInvariantViolated\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNum\",\"type\":\"uint256\"}],\"name\":\"BlockhashNotInStore\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"coordinatorAddress\",\"type\":\"address\"}],\"name\":\"CoordinatorAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"coordinatorAddress\",\"type\":\"address\"}],\"name\":\"CoordinatorNotRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedToSendNative\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedToTransferLink\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"have\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"want\",\"type\":\"uint32\"}],\"name\":\"GasLimitTooBig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"gasPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxGas\",\"type\":\"uint256\"}],\"name\":\"GasPriceExceeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectCommitment\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IndexOutOfRange\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"have\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"want\",\"type\":\"uint256\"}],\"name\":\"InsufficientGasForConsumer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidCalldata\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"InvalidConsumer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidExtraArgsTag\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"linkWei\",\"type\":\"int256\"}],\"name\":\"InvalidLinkWeiPrice\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"premiumPercentage\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"max\",\"type\":\"uint8\"}],\"name\":\"InvalidPremiumPercentage\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"have\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"min\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"max\",\"type\":\"uint16\"}],\"name\":\"InvalidRequestConfirmations\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSubscription\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkAlreadySet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"flatFeeLinkDiscountPPM\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"flatFeeNativePPM\",\"type\":\"uint32\"}],\"name\":\"LinkDiscountTooHigh\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkNotSet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"have\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"max\",\"type\":\"uint32\"}],\"name\":\"MsgDataTooBig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"proposedOwner\",\"type\":\"address\"}],\"name\":\"MustBeRequestedOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"MustBeSubOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoCorrespondingRequest\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"}],\"name\":\"NoSuchProvingKey\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"have\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"want\",\"type\":\"uint32\"}],\"name\":\"NumWordsTooBig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableFromLink\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PaymentTooLarge\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PendingRequestExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"}],\"name\":\"ProvingKeyAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Reentrant\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyConsumers\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"stalenessSeconds\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"gasAfterPaymentCalculation\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"int256\",\"name\":\"fallbackWeiPerUnitLink\",\"type\":\"int256\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeNativePPM\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeLinkDiscountPPM\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"nativePremiumPercentage\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"linkPremiumPercentage\",\"type\":\"uint8\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"coordinatorAddress\",\"type\":\"address\"}],\"name\":\"CoordinatorDeregistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"coordinatorAddress\",\"type\":\"address\"}],\"name\":\"CoordinatorRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"int256\",\"name\":\"fallbackWeiPerUnitLink\",\"type\":\"int256\"}],\"name\":\"FallbackWeiPerUnitLinkUsed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"FundsRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newCoordinator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"MigrationCompleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"NativeFundsRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"maxGas\",\"type\":\"uint64\"}],\"name\":\"ProvingKeyDeregistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"maxGas\",\"type\":\"uint64\"}],\"name\":\"ProvingKeyRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"outputSeed\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"payment\",\"type\":\"uint96\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"nativePayment\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"onlyPremium\",\"type\":\"bool\"}],\"name\":\"RandomWordsFulfilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"preSeed\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"numWords\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RandomWordsRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountLink\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountNative\",\"type\":\"uint256\"}],\"name\":\"SubscriptionCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"SubscriptionConsumerAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"SubscriptionConsumerRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"SubscriptionCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newBalance\",\"type\":\"uint256\"}],\"name\":\"SubscriptionFunded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldNativeBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newNativeBalance\",\"type\":\"uint256\"}],\"name\":\"SubscriptionFundedWithNative\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"SubscriptionOwnerTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"SubscriptionOwnerTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BLOCKHASH_STORE\",\"outputs\":[{\"internalType\":\"contractBlockhashStoreInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"LINK\",\"outputs\":[{\"internalType\":\"contractLinkTokenInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"LINK_NATIVE_FEED\",\"outputs\":[{\"internalType\":\"contractAggregatorV3Interface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_CONSUMERS\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_NUM_WORDS\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_REQUEST_CONFIRMATIONS\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"acceptSubscriptionOwnerTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"addConsumer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"cancelSubscription\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"createSubscription\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"deregisterMigratableCoordinator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[2]\",\"name\":\"publicProvingKey\",\"type\":\"uint256[2]\"}],\"name\":\"deregisterProvingKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256[2]\",\"name\":\"pk\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"gamma\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"c\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"s\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"seed\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"uWitness\",\"type\":\"address\"},{\"internalType\":\"uint256[2]\",\"name\":\"cGammaWitness\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"sHashWitness\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"zInv\",\"type\":\"uint256\"}],\"internalType\":\"structVRF.Proof\",\"name\":\"proof\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"blockNum\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"numWords\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structVRFCoordinatorV2_5.RequestCommitment\",\"name\":\"rc\",\"type\":\"tuple\"},{\"internalType\":\"bool\",\"name\":\"onlyPremium\",\"type\":\"bool\"}],\"name\":\"fulfillRandomWords\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"payment\",\"type\":\"uint96\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"fundSubscriptionWithNative\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"startIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxCount\",\"type\":\"uint256\"}],\"name\":\"getActiveSubscriptionIds\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"getSubscription\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"balance\",\"type\":\"uint96\"},{\"internalType\":\"uint96\",\"name\":\"nativeBalance\",\"type\":\"uint96\"},{\"internalType\":\"uint64\",\"name\":\"reqCount\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"consumers\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[2]\",\"name\":\"publicKey\",\"type\":\"uint256[2]\"}],\"name\":\"hashOfKey\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"newCoordinator\",\"type\":\"address\"}],\"name\":\"migrate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onTokenTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"ownerCancelSubscription\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"pendingRequestExists\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"recoverFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"recoverNativeFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"registerMigratableCoordinator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[2]\",\"name\":\"publicProvingKey\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint64\",\"name\":\"maxGas\",\"type\":\"uint64\"}],\"name\":\"registerProvingKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"removeConsumer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"uint16\",\"name\":\"requestConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"numWords\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structVRFV2PlusClient.RandomWordsRequest\",\"name\":\"req\",\"type\":\"tuple\"}],\"name\":\"requestRandomWords\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"requestSubscriptionOwnerTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_config\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"reentrancyLock\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"stalenessSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasAfterPaymentCalculation\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeNativePPM\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeLinkDiscountPPM\",\"type\":\"uint32\"},{\"internalType\":\"uint8\",\"name\":\"nativePremiumPercentage\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"linkPremiumPercentage\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_currentSubNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_fallbackWeiPerUnitLink\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"s_provingKeyHashes\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"s_provingKeys\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"exists\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"maxGas\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"s_requestCommitments\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_totalBalance\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_totalNativeBalance\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"stalenessSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasAfterPaymentCalculation\",\"type\":\"uint32\"},{\"internalType\":\"int256\",\"name\":\"fallbackWeiPerUnitLink\",\"type\":\"int256\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeNativePPM\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeLinkDiscountPPM\",\"type\":\"uint32\"},{\"internalType\":\"uint8\",\"name\":\"nativePremiumPercentage\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"linkPremiumPercentage\",\"type\":\"uint8\"}],\"name\":\"setConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"link\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"linkNativeFeed\",\"type\":\"address\"}],\"name\":\"setLINKAndLINKNativeFeed\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"withdrawNative\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162005eaa38038062005eaa833981016040819052620000349162000183565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620000d7565b50505060601b6001600160601b031916608052620001b5565b6001600160a01b038116331415620001325760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000602082840312156200019657600080fd5b81516001600160a01b0381168114620001ae57600080fd5b9392505050565b60805160601c615ccf620001db6000396000818161055001526132c30152615ccf6000f3fe60806040526004361061021c5760003560e01c80638402595e11610124578063b2a7cac5116100a6578063b2a7cac514610732578063bec4c08c14610752578063caf70c4a14610772578063cb63179714610792578063d98e620e146107b2578063da2f2610146107d2578063dac83d2914610831578063dc311dd314610851578063e72f6e3014610882578063ee9d2d38146108a2578063f2fde38b146108cf57600080fd5b80638402595e146105c757806386fe91c7146105e75780638da5cb5b1461060757806395b55cfc146106255780639b1c385e146106385780639d40a6fd14610658578063a21a23e414610690578063a4c0ed36146106a5578063a63e0bfb146106c5578063aa433aff146106e5578063aefb212f1461070557600080fd5b8063405b84fa116101ad578063405b84fa1461044e57806340d6bb821461046e57806341af6c871461049957806351cff8d9146104c95780635d06b4ab146104e957806364d51a2a14610509578063659827441461051e578063689c45171461053e57806372e9d5651461057257806379ba5097146105925780637a5a2aef146105a757600080fd5b806304104edb14610221578063043bd6ae14610243578063088070f51461026c57806308821d581461033a5780630ae095401461035a57806315c48b841461037a57806318e3dd27146103a25780631b6b6d23146103e15780632f622e6b1461040e578063301f42e91461042e575b600080fd5b34801561022d57600080fd5b5061024161023c366004615086565b6108ef565b005b34801561024f57600080fd5b5061025960105481565b6040519081526020015b60405180910390f35b34801561027857600080fd5b50600c546102dd9061ffff81169063ffffffff62010000820481169160ff600160301b8204811692600160381b8304811692600160581b8104821692600160781b8204831692600160981b83041691600160b81b8104821691600160c01b9091041689565b6040805161ffff909a168a5263ffffffff98891660208b01529615159689019690965293861660608801529185166080870152841660a08601529290921660c084015260ff91821660e08401521661010082015261012001610263565b34801561034657600080fd5b50610241610355366004615164565b610a5c565b34801561036657600080fd5b5061024161037536600461544e565b610c06565b34801561038657600080fd5b5061038f60c881565b60405161ffff9091168152602001610263565b3480156103ae57600080fd5b50600a546103c990600160601b90046001600160601b031681565b6040516001600160601b039091168152602001610263565b3480156103ed57600080fd5b50600254610401906001600160a01b031681565b604051610263919061567f565b34801561041a57600080fd5b50610241610429366004615086565b610c4e565b34801561043a57600080fd5b506103c961044936600461526a565b610d9a565b34801561045a57600080fd5b5061024161046936600461544e565b61104d565b34801561047a57600080fd5b506104846101f481565b60405163ffffffff9091168152602001610263565b3480156104a557600080fd5b506104b96104b43660046151ed565b6113ff565b6040519015158152602001610263565b3480156104d557600080fd5b506102416104e4366004615086565b61150f565b3480156104f557600080fd5b50610241610504366004615086565b61169d565b34801561051557600080fd5b5061038f606481565b34801561052a57600080fd5b506102416105393660046150a3565b611754565b34801561054a57600080fd5b506104017f000000000000000000000000000000000000000000000000000000000000000081565b34801561057e57600080fd5b50600354610401906001600160a01b031681565b34801561059e57600080fd5b506102416117b4565b3480156105b357600080fd5b506102416105c2366004615180565b61185e565b3480156105d357600080fd5b506102416105e2366004615086565b61198e565b3480156105f357600080fd5b50600a546103c9906001600160601b031681565b34801561061357600080fd5b506000546001600160a01b0316610401565b6102416106333660046151ed565b611aa0565b34801561064457600080fd5b50610259610653366004615358565b611bc4565b34801561066457600080fd5b50600754610678906001600160401b031681565b6040516001600160401b039091168152602001610263565b34801561069c57600080fd5b50610259611f05565b3480156106b157600080fd5b506102416106c03660046150dc565b6120d8565b3480156106d157600080fd5b506102416106e03660046153ad565b612254565b3480156106f157600080fd5b506102416107003660046151ed565b612520565b34801561071157600080fd5b50610725610720366004615473565b612568565b60405161026391906156f6565b34801561073e57600080fd5b5061024161074d3660046151ed565b61266a565b34801561075e57600080fd5b5061024161076d36600461544e565b61275f565b34801561077e57600080fd5b5061025961078d3660046151b4565b61286b565b34801561079e57600080fd5b506102416107ad36600461544e565b61289b565b3480156107be57600080fd5b506102596107cd3660046151ed565b612b0a565b3480156107de57600080fd5b506108126107ed3660046151ed565b600d6020526000908152604090205460ff81169061010090046001600160401b031682565b6040805192151583526001600160401b03909116602083015201610263565b34801561083d57600080fd5b5061024161084c36600461544e565b612b2b565b34801561085d57600080fd5b5061087161086c3660046151ed565b612bc2565b6040516102639594939291906158e0565b34801561088e57600080fd5b5061024161089d366004615086565b612cb0565b3480156108ae57600080fd5b506102596108bd3660046151ed565b600f6020526000908152604090205481565b3480156108db57600080fd5b506102416108ea366004615086565b612e83565b6108f7612e94565b60115460005b81811015610a3457826001600160a01b03166011828154811061092257610922615c2b565b6000918252602090912001546001600160a01b03161415610a2457601161094a600184615adb565b8154811061095a5761095a615c2b565b600091825260209091200154601180546001600160a01b03909216918390811061098657610986615c2b565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060118054806109c5576109c5615c15565b600082815260209020810160001990810180546001600160a01b03191690550190556040517ff80a1a97fd42251f3c33cda98635e7399253033a6774fe37cd3f650b5282af3790610a1790859061567f565b60405180910390a1505050565b610a2d81615b93565b90506108fd565b5081604051635428d44960e01b8152600401610a50919061567f565b60405180910390fd5b50565b610a64612e94565b604080518082018252600091610a9391908490600290839083908082843760009201919091525061286b915050565b6000818152600d602090815260409182902082518084019093525460ff811615158084526101009091046001600160401b03169183019190915291925090610af157604051631dfd6e1360e21b815260048101839052602401610a50565b6000828152600d6020526040812080546001600160481b0319169055600e54905b81811015610bc25783600e8281548110610b2e57610b2e615c2b565b90600052602060002001541415610bb257600e610b4c600184615adb565b81548110610b5c57610b5c615c2b565b9060005260206000200154600e8281548110610b7a57610b7a615c2b565b600091825260209091200155600e805480610b9757610b97615c15565b60019003818190600052602060002001600090559055610bc2565b610bbb81615b93565b9050610b12565b507f9b6868e0eb737bcd72205360baa6bfd0ba4e4819a33ade2db384e8a8025639a5838360200151604051610bf8929190615709565b60405180910390a150505050565b81610c1081612ee9565b610c18612f4a565b610c21836113ff565b15610c3f57604051631685ecdd60e31b815260040160405180910390fd5b610c498383612f75565b505050565b610c56612f4a565b610c5e612e94565b600b54600160601b90046001600160601b0316610c8e57604051631e9acf1760e31b815260040160405180910390fd5b600b8054600160601b90046001600160601b0316908190600c610cb18380615b17565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555080600a600c8282829054906101000a90046001600160601b0316610cf99190615b17565b92506101000a8154816001600160601b0302191690836001600160601b031602179055506000826001600160a01b0316826001600160601b031660405160006040518083038185875af1925050503d8060008114610d73576040519150601f19603f3d011682016040523d82523d6000602084013e610d78565b606091505b5050905080610c495760405163950b247960e01b815260040160405180910390fd5b6000610da4612f4a565b60005a9050610324361115610dd657604051630f28961b60e01b81523660048201526103246024820152604401610a50565b6000610de28686613129565b90506000610df8858360000151602001516133e5565b60408301516060888101519293509163ffffffff16806001600160401b03811115610e2557610e25615c41565b604051908082528060200260200182016040528015610e4e578160200160208202803683370190505b50925060005b81811015610eb65760408051602081018590529081018290526060016040516020818303038152906040528051906020012060001c848281518110610e9b57610e9b615c2b565b6020908102919091010152610eaf81615b93565b9050610e54565b5050602080850180516000908152600f9092526040822082905551610edc908a85613433565b60208a8101516000908152600690915260409020805491925090601890610f1290600160c01b90046001600160401b0316615bae565b91906101000a8154816001600160401b0302191690836001600160401b0316021790555060008960a0015160018b60a0015151610f4f9190615adb565b81518110610f5f57610f5f615c2b565b60209101015160f81c60011490506000610f7b8887848d6134ce565b90995090508015610fc65760208088015160105460408051928352928201527f6ca648a381f22ead7e37773d934e64885dcf861fbfbb26c40354cbf0c4662d1a910160405180910390a15b50610fd688828c60200151613506565b6020808b015187820151604080518781526001600160601b038d16948101949094528415159084015284151560608401528b1515608084015290917faeb4b4786571e184246d39587f659abf0e26f41f6a3358692250382c0cdb47b79060a00160405180910390a3505050505050505b9392505050565b611055612f4a565b61105e81613659565b61107d5780604051635428d44960e01b8152600401610a50919061567f565b60008060008061108c86612bc2565b945094505093509350336001600160a01b0316826001600160a01b0316146110ef5760405162461bcd60e51b81526020600482015260166024820152752737ba1039bab139b1b934b83a34b7b71037bbb732b960511b6044820152606401610a50565b6110f8866113ff565b1561113e5760405162461bcd60e51b815260206004820152601660248201527550656e64696e6720726571756573742065786973747360501b6044820152606401610a50565b6040805160c0810182526001815260208082018990526001600160a01b03851682840152606082018490526001600160601b038088166080840152861660a08301529151909160009161119391849101615733565b60405160208183030381529060405290506111ad886136c5565b505060405163ce3f471960e01b81526001600160a01b0388169063ce3f4719906001600160601b038816906111e6908590600401615720565b6000604051808303818588803b1580156111ff57600080fd5b505af1158015611213573d6000803e3d6000fd5b50506002546001600160a01b03161580159350915061123c905057506001600160601b03861615155b156113065760025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611273908a908a906004016156c6565b602060405180830381600087803b15801561128d57600080fd5b505af11580156112a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c591906151d0565b6113065760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b6044820152606401610a50565b600c805460ff60301b1916600160301b17905560005b83518110156113ad5783818151811061133757611337615c2b565b60200260200101516001600160a01b0316638ea98117896040518263ffffffff1660e01b815260040161136a919061567f565b600060405180830381600087803b15801561138457600080fd5b505af1158015611398573d6000803e3d6000fd5b50505050806113a690615b93565b905061131c565b50600c805460ff60301b191690556040517fd63ca8cb945956747ee69bfdc3ea754c24a4caf7418db70e46052f7850be4187906113ed9089908b90615693565b60405180910390a15050505050505050565b6000818152600560205260408120600201805480611421575060009392505050565b600e5460005b8281101561150357600084828154811061144357611443615c2b565b60009182526020822001546001600160a01b031691505b838110156114f05760006114b8600e838154811061147a5761147a615c2b565b60009182526020808320909101546001600160a01b03871683526004825260408084208e855290925291205485908c906001600160401b031661386d565b506000818152600f6020526040902054909150156114df5750600198975050505050505050565b506114e981615b93565b905061145a565b5050806114fc90615b93565b9050611427565b50600095945050505050565b611517612f4a565b61151f612e94565b6002546001600160a01b03166115485760405163c1f0c0a160e01b815260040160405180910390fd5b600b546001600160601b031661157157604051631e9acf1760e31b815260040160405180910390fd5b600b80546001600160601b0316908190600061158d8380615b17565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555080600a60008282829054906101000a90046001600160601b03166115d59190615b17565b82546001600160601b039182166101009390930a92830291909202199091161790555060025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb9061162a90859085906004016156c6565b602060405180830381600087803b15801561164457600080fd5b505af1158015611658573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167c91906151d0565b61169957604051631e9acf1760e31b815260040160405180910390fd5b5050565b6116a5612e94565b6116ae81613659565b156116ce578060405163ac8a27ef60e01b8152600401610a50919061567f565b601180546001810182556000919091527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c680180546001600160a01b0319166001600160a01b0383161790556040517fb7cabbfc11e66731fc77de0444614282023bcbd41d16781c753a431d0af016259061174990839061567f565b60405180910390a150565b61175c612e94565b6002546001600160a01b03161561178657604051631688c53760e11b815260040160405180910390fd5b600280546001600160a01b039384166001600160a01b03199182161790915560038054929093169116179055565b6001546001600160a01b031633146118075760405162461bcd60e51b815260206004820152601660248201527526bab9ba10313290383937b837b9b2b21037bbb732b960511b6044820152606401610a50565b60008054336001600160a01b0319808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b611866612e94565b60408051808201825260009161189591908590600290839083908082843760009201919091525061286b915050565b6000818152600d602052604090205490915060ff16156118cb57604051634a0b8fa760e01b815260048101829052602401610a50565b60408051808201825260018082526001600160401b0385811660208085019182526000878152600d9091528581209451855492516001600160481b031990931690151568ffffffffffffffff00191617610100929093169190910291909117909255600e805491820181559091527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd01829055517f9b911b2c240bfbef3b6a8f7ed6ee321d1258bb2a3fe6becab52ac1cd3210afd390610a179083908590615709565b611996612e94565b600a544790600160601b90046001600160601b0316818111156119d6576040516354ced18160e11b81526004810182905260248101839052604401610a50565b81811015610c495760006119ea8284615adb565b90506000846001600160a01b03168260405160006040518083038185875af1925050503d8060008114611a39576040519150601f19603f3d011682016040523d82523d6000602084013e611a3e565b606091505b5050905080611a605760405163950b247960e01b815260040160405180910390fd5b7f4aed7c8eed0496c8c19ea2681fcca25741c1602342e38b045d9f1e8e905d2e9c8583604051611a91929190615693565b60405180910390a15050505050565b611aa8612f4a565b6000818152600560205260409020546001600160a01b0316611add57604051630fb532db60e11b815260040160405180910390fd5b60008181526006602052604090208054600160601b90046001600160601b0316903490600c611b0c8385615a86565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555034600a600c8282829054906101000a90046001600160601b0316611b549190615a86565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550817f7603b205d03651ee812f803fccde89f1012e545a9c99f0abfea9cedd0fd8e902823484611ba79190615a27565b604080519283526020830191909152015b60405180910390a25050565b6000611bce612f4a565b602080830135600081815260059092526040909120546001600160a01b0316611c0a57604051630fb532db60e11b815260040160405180910390fd5b33600090815260046020908152604080832084845291829052909120546001600160401b031680611c525782336040516379bfd40160e01b8152600401610a509291906157a8565b600c5461ffff16611c696060870160408801615392565b61ffff161080611c8c575060c8611c866060870160408801615392565b61ffff16115b15611cd257611ca16060860160408701615392565b600c5460405163539c34bb60e11b815261ffff92831660048201529116602482015260c86044820152606401610a50565b600c5462010000900463ffffffff16611cf16080870160608801615495565b63ffffffff161115611d4157611d0d6080860160608701615495565b600c54604051637aebf00f60e11b815263ffffffff9283166004820152620100009091049091166024820152604401610a50565b6101f4611d5460a0870160808801615495565b63ffffffff161115611d9a57611d7060a0860160808701615495565b6040516311ce1afb60e21b815263ffffffff90911660048201526101f46024820152604401610a50565b611da381615bae565b90506000611db4863533868561386d565b90955090506000611dd8611dd3611dce60a08a018a615935565b6138e6565b613963565b905085611de36139d4565b86611df460808b0160608c01615495565b611e0460a08c0160808d01615495565b3386604051602001611e1c9796959493929190615833565b60405160208183030381529060405280519060200120600f600088815260200190815260200160002081905550336001600160a01b03168588600001357feb0e3652e0f44f417695e6e90f2f42c99b65cd7169074c5a654b16b9748c3a4e89868c6040016020810190611e8f9190615392565b8d6060016020810190611ea29190615495565b8e6080016020810190611eb59190615495565b89604051611ec8969594939291906157f4565b60405180910390a450506000928352602091909152604090912080546001600160401b0319166001600160401b039092169190911790555b919050565b6000611f0f612f4a565b6007546001600160401b031633611f27600143615adb565b6040516001600160601b0319606093841b81166020830152914060348201523090921b1660548201526001600160c01b031960c083901b16606882015260700160408051601f1981840301815291905280516020909101209150611f8c816001615a3f565b600780546001600160401b0319166001600160401b03928316179055604080516000808252608082018352602080830182815283850183815260608086018581528a86526006855287862093518454935191516001600160601b039182166001600160c01b031990951694909417600160601b9190921602176001600160c01b0316600160c01b9290981691909102969096179055835194850184523385528481018281528585018481528884526005835294909220855181546001600160a01b03199081166001600160a01b03928316178355935160018301805490951691161790925592518051929493919261208a9260028501920190614da0565b5061209a91506008905084613a64565b50827f1d3015d7ba850fa198dc7b1a3f5d42779313a681035f77c8c03764c61005518d336040516120cb919061567f565b60405180910390a2505090565b6120e0612f4a565b6002546001600160a01b0316331461210b576040516344b0e3c360e01b815260040160405180910390fd5b6020811461212c57604051638129bbcd60e01b815260040160405180910390fd5b600061213a828401846151ed565b6000818152600560205260409020549091506001600160a01b031661217257604051630fb532db60e11b815260040160405180910390fd5b600081815260066020526040812080546001600160601b0316918691906121998385615a86565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555084600a60008282829054906101000a90046001600160601b03166121e19190615a86565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550817f1ced9348ff549fceab2ac57cd3a9de38edaaab274b725ee82c23e8fc8c4eec7a8287846122349190615a27565b6040805192835260208301919091520160405180910390a2505050505050565b61225c612e94565b60c861ffff8a1611156122965760405163539c34bb60e11b815261ffff8a1660048201819052602482015260c86044820152606401610a50565b600085136122ba576040516321ea67b360e11b815260048101869052602401610a50565b8363ffffffff168363ffffffff1611156122f7576040516313c06e5960e11b815263ffffffff808516600483015285166024820152604401610a50565b609b60ff8316111561232857604051631d66288d60e11b815260ff83166004820152609b6024820152604401610a50565b609b60ff8216111561235957604051631d66288d60e11b815260ff82166004820152609b6024820152604401610a50565b604080516101208101825261ffff8b1680825263ffffffff808c16602084018190526000848601528b8216606085018190528b8316608086018190528a841660a08701819052938a1660c0870181905260ff808b1660e08901819052908a16610100909801889052600c8054600160c01b90990260ff60c01b19600160b81b9093029290921661ffff60b81b19600160981b90940263ffffffff60981b19600160781b9099029890981667ffffffffffffffff60781b19600160581b90960263ffffffff60581b19600160381b9098029790971668ffffffffffffffffff60301b196201000090990265ffffffffffff19909c16909a179a909a1796909616979097179390931791909116959095179290921793909316929092179190911790556010869055517f2c6b6b12413678366b05b145c5f00745bdd00e739131ab5de82484a50c9d78b69061250d908b908b908b908b908b908b908b908b908b9061ffff99909916895263ffffffff97881660208a0152958716604089015293861660608801526080870192909252841660a086015290921660c084015260ff91821660e0840152166101008201526101200190565b60405180910390a1505050505050505050565b612528612e94565b6000818152600560205260409020546001600160a01b03168061255e57604051630fb532db60e11b815260040160405180910390fd5b6116998282612f75565b606060006125766008613a70565b905080841061259857604051631390f2a160e01b815260040160405180910390fd5b60006125a48486615a27565b9050818111806125b2575083155b6125bc57806125be565b815b905060006125cc8683615adb565b9050806001600160401b038111156125e6576125e6615c41565b60405190808252806020026020018201604052801561260f578160200160208202803683370190505b50935060005b8181101561265f5761263261262a8883615a27565b600890613a7a565b85828151811061264457612644615c2b565b602090810291909101015261265881615b93565b9050612615565b505050505b92915050565b612672612f4a565b6000818152600560205260409020546001600160a01b0316806126a857604051630fb532db60e11b815260040160405180910390fd5b6000828152600560205260409020600101546001600160a01b031633146126ff576000828152600560205260409081902060010154905163d084e97560e01b8152610a50916001600160a01b03169060040161567f565b600082815260056020526040908190208054336001600160a01b031991821681178355600190920180549091169055905183917fd4114ab6e9af9f597c52041f32d62dc57c5c4e4c0d4427006069635e216c938691611bb89185916156ac565b8161276981612ee9565b612771612f4a565b60008381526005602052604090206002018054606414156127a5576040516305a48e0f60e01b815260040160405180910390fd5b6001600160a01b038316600090815260046020908152604080832087845291829052909120546001600160401b0316156127e0575050505050565b600085815260208281526040808320805460016001600160401b0319909116811790915585549081018655858452919092200180546001600160a01b0319166001600160a01b0387161790555185907f1e980d04aa7648e205713e5e8ea3808672ac163d10936d36f91b2c88ac1575e19061285c90879061567f565b60405180910390a25050505050565b60008160405160200161287e91906156e8565b604051602081830303815290604052805190602001209050919050565b816128a581612ee9565b6128ad612f4a565b6128b6836113ff565b156128d457604051631685ecdd60e31b815260040160405180910390fd5b6001600160a01b03821660009081526004602090815260408083208684529091529020546001600160401b03166129225782826040516379bfd40160e01b8152600401610a509291906157a8565b60008381526005602090815260408083206002018054825181850281018501909352808352919290919083018282801561298557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612967575b5050505050905060006001825161299c9190615adb565b905060005b8251811015612aa657846001600160a01b03168382815181106129c6576129c6615c2b565b60200260200101516001600160a01b03161415612a965760008383815181106129f1576129f1615c2b565b6020026020010151905080600560008981526020019081526020016000206002018381548110612a2357612a23615c2b565b600091825260208083209190910180546001600160a01b0319166001600160a01b039490941693909317909255888152600590915260409020600201805480612a6e57612a6e615c15565b600082815260209020810160001990810180546001600160a01b031916905501905550612aa6565b612a9f81615b93565b90506129a1565b506001600160a01b03841660009081526004602090815260408083208884529091529081902080546001600160401b03191690555185907f32158c6058347c1601b2d12bc696ac6901d8a9a9aa3ba10c27ab0a983e8425a79061285c90879061567f565b600e8181548110612b1a57600080fd5b600091825260209091200154905081565b81612b3581612ee9565b612b3d612f4a565b600083815260056020526040902060018101546001600160a01b03848116911614612bbc576001810180546001600160a01b0319166001600160a01b03851617905560405184907f21a4dad170a6bf476c31bbcf4a16628295b0e450672eec25d7c93308e05344a190612bb390339087906156ac565b60405180910390a25b50505050565b600081815260056020526040812054819081906001600160a01b0316606081612bfe57604051630fb532db60e11b815260040160405180910390fd5b600086815260066020908152604080832054600583529281902060020180548251818502810185019093528083526001600160601b0380861695600160601b810490911694600160c01b9091046001600160401b0316938893929091839190830182828015612c9657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612c78575b505050505090509450945094509450945091939590929450565b612cb8612e94565b6002546001600160a01b0316612ce15760405163c1f0c0a160e01b815260040160405180910390fd5b6002546040516370a0823160e01b81526000916001600160a01b0316906370a0823190612d1290309060040161567f565b60206040518083038186803b158015612d2a57600080fd5b505afa158015612d3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d629190615206565b600a549091506001600160601b031681811115612d9c576040516354ced18160e11b81526004810182905260248101839052604401610a50565b81811015610c49576000612db08284615adb565b60025460405163a9059cbb60e01b81529192506001600160a01b03169063a9059cbb90612de39087908590600401615693565b602060405180830381600087803b158015612dfd57600080fd5b505af1158015612e11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e3591906151d0565b612e5257604051631f01ff1360e21b815260040160405180910390fd5b7f59bfc682b673f8cbf945f1e454df9334834abf7dfe7f92237ca29ecb9b4366008482604051610bf8929190615693565b612e8b612e94565b610a5981613a86565b6000546001600160a01b03163314612ee75760405162461bcd60e51b815260206004820152601660248201527527b7363c9031b0b63630b1363290313c9037bbb732b960511b6044820152606401610a50565b565b6000818152600560205260409020546001600160a01b031680612f1f57604051630fb532db60e11b815260040160405180910390fd5b336001600160a01b038216146116995780604051636c51fda960e11b8152600401610a50919061567f565b600c54600160301b900460ff1615612ee75760405163769dd35360e11b815260040160405180910390fd5b600080612f81846136c5565b60025491935091506001600160a01b031615801590612fa857506001600160601b03821615155b156130575760025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90612fe89086906001600160601b03871690600401615693565b602060405180830381600087803b15801561300257600080fd5b505af1158015613016573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061303a91906151d0565b61305757604051631e9acf1760e31b815260040160405180910390fd5b6000836001600160a01b0316826001600160601b031660405160006040518083038185875af1925050503d80600081146130ad576040519150601f19603f3d011682016040523d82523d6000602084013e6130b2565b606091505b50509050806130d45760405163950b247960e01b815260040160405180910390fd5b604080516001600160a01b03861681526001600160601b03808616602083015284169181019190915285907f8c74ce8b8cf87f5eb001275c8be27eb34ea2b62bfab6814fcc62192bb63e81c49060600161285c565b6040805160a08101825260006060820181815260808301829052825260208201819052918101919091526000613162846000015161286b565b6000818152600d602090815260409182902082518084019093525460ff811615158084526101009091046001600160401b031691830191909152919250906131c057604051631dfd6e1360e21b815260048101839052602401610a50565b60008286608001516040516020016131e2929190918252602082015260400190565b60408051601f1981840301815291815281516020928301206000818152600f9093529120549091508061322857604051631b44092560e11b815260040160405180910390fd5b85516020808801516040808a015160608b015160808c015160a08d01519351613257978a97909695910161588c565b60405160208183030381529060405280519060200120811461328c5760405163354a450b60e21b815260040160405180910390fd5b600061329b8760000151613b2a565b905080613373578651604051631d2827a760e31b81526001600160401b0390911660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e9413d389060240160206040518083038186803b15801561330d57600080fd5b505afa158015613321573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133459190615206565b90508061337357865160405163175dadad60e01b81526001600160401b039091166004820152602401610a50565b6000886080015182604051602001613395929190918252602082015260400190565b6040516020818303038152906040528051906020012060001c905060006133bc8a83613c0c565b604080516060810182529788526020880196909652948601949094525092979650505050505050565b6000816001600160401b03163a111561342b57821561340e57506001600160401b038116612664565b3a8260405163435e532d60e11b8152600401610a50929190615709565b503a92915050565b6000806000631fe543e360e01b86856040516024016134539291906157d3565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252600c805460ff60301b1916600160301b1790559086015160808701519192506134b79163ffffffff9091169083613c77565b600c805460ff60301b191690559695505050505050565b60008083156134ed576134e2868685613cc3565b6000915091506134fd565b6134f8868685613dd4565b915091505b94509492505050565b600081815260066020526040902082156135c55780546001600160601b03600160601b909104811690851681101561355157604051631e9acf1760e31b815260040160405180910390fd5b61355b8582615b17565b8254600160601b600160c01b031916600160601b6001600160601b039283168102919091178455600b805488939192600c9261359b928692900416615a86565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555050612bbc565b80546001600160601b039081169085168110156135f557604051631e9acf1760e31b815260040160405180910390fd5b6135ff8582615b17565b82546001600160601b0319166001600160601b03918216178355600b8054879260009161362e91859116615a86565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505050505050565b601154600090815b818110156136bb57836001600160a01b03166011828154811061368657613686615c2b565b6000918252602090912001546001600160a01b031614156136ab575060019392505050565b6136b481615b93565b9050613661565b5060009392505050565b60008181526005602090815260408083206006909252822054600290910180546001600160601b0380841694600160601b90940416925b81811015613767576004600084838154811061371a5761371a615c2b565b60009182526020808320909101546001600160a01b031683528281019390935260409182018120898252909252902080546001600160401b031916905561376081615b93565b90506136fc565b50600085815260056020526040812080546001600160a01b0319908116825560018201805490911690559061379f6002830182614e05565b50506000858152600660205260408120556137bb600886613fc6565b506001600160601b0384161561380e57600a80548591906000906137e99084906001600160601b0316615b17565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505b6001600160601b038316156138665782600a600c8282829054906101000a90046001600160601b03166138419190615b17565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505b5050915091565b6040805160208082018790526001600160a01b03959095168183015260608101939093526001600160401b03919091166080808401919091528151808403909101815260a08301825280519084012060c083019490945260e0808301859052815180840390910181526101009092019052805191012091565b6040805160208101909152600081528161390f5750604080516020810190915260008152612664565b63125fa26760e31b6139218385615b37565b6001600160e01b0319161461394957604051632923fee760e11b815260040160405180910390fd5b61395682600481866159fd565b810190611046919061521f565b60607f92fd13387c7fe7befbc38d303d6468778fb9731bc4583f17d92989c6fcfdeaaa8260405160240161399c91511515815260200190565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915292915050565b6000466139e081613fd2565b15613a5d5760646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b815260040160206040518083038186803b158015613a1f57600080fd5b505afa158015613a33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a579190615206565b91505090565b4391505090565b60006110468383613ff5565b6000612664825490565b60006110468383614044565b6001600160a01b038116331415613ad95760405162461bcd60e51b815260206004820152601760248201527621b0b73737ba103a3930b739b332b9103a379039b2b63360491b6044820152606401610a50565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600046613b3681613fd2565b15613bfd57610100836001600160401b0316613b506139d4565b613b5a9190615adb565b1180613b765750613b696139d4565b836001600160401b031610155b15613b845750600092915050565b6040516315a03d4160e11b81526001600160401b0384166004820152606490632b407a82906024015b60206040518083038186803b158015613bc557600080fd5b505afa158015613bd9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110469190615206565b50506001600160401b03164090565b6000613c408360000151846020015185604001518660600151868860a001518960c001518a60e001518b610100015161406e565b60038360200151604051602001613c589291906157bf565b60408051601f1981840301815291905280516020909101209392505050565b60005a611388811015613c8957600080fd5b611388810390508460408204820311613ca157600080fd5b50823b613cad57600080fd5b60008083516020850160008789f1949350505050565b600080613d066000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061428a92505050565b905060005a600c54613d26908890600160581b900463ffffffff16615a27565b613d309190615adb565b613d3a9086615abc565b600c54909150600090613d5f90600160781b900463ffffffff1664e8d4a51000615abc565b90508415613dab57600c548190606490600160b81b900460ff16613d838587615a27565b613d8d9190615abc565b613d979190615aa8565b613da19190615a27565b9350505050611046565b600c548190606490613dc790600160b81b900460ff1682615a61565b60ff16613d838587615a27565b600080600080613de2614358565b9150915060008213613e0a576040516321ea67b360e11b815260048101839052602401610a50565b6000613e4c6000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061428a92505050565b9050600083825a600c54613e6e908d90600160581b900463ffffffff16615a27565b613e789190615adb565b613e82908b615abc565b613e8c9190615a27565b613e9e90670de0b6b3a7640000615abc565b613ea89190615aa8565b600c54909150600090613ed19063ffffffff600160981b8204811691600160781b900416615af2565b613ee69063ffffffff1664e8d4a51000615abc565b9050600085613efd83670de0b6b3a7640000615abc565b613f079190615aa8565b905060008915613f4857600c548290606490613f2d90600160c01b900460ff1687615abc565b613f379190615aa8565b613f419190615a27565b9050613f88565b600c548290606490613f6490600160c01b900460ff1682615a61565b613f719060ff1687615abc565b613f7b9190615aa8565b613f859190615a27565b90505b6b033b2e3c9fd0803ce8000000811115613fb55760405163e80fa38160e01b815260040160405180910390fd5b9b949a509398505050505050505050565b6000611046838361442e565b600061a4b1821480613fe6575062066eed82145b8061266457505062066eee1490565b600081815260018301602052604081205461403c57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155612664565b506000612664565b600082600001828154811061405b5761405b615c2b565b9060005260206000200154905092915050565b61407789614521565b6140c05760405162461bcd60e51b815260206004820152601a6024820152797075626c6963206b6579206973206e6f74206f6e20637572766560301b6044820152606401610a50565b6140c988614521565b61410d5760405162461bcd60e51b815260206004820152601560248201527467616d6d61206973206e6f74206f6e20637572766560581b6044820152606401610a50565b61411683614521565b6141625760405162461bcd60e51b815260206004820152601d60248201527f6347616d6d615769746e657373206973206e6f74206f6e2063757276650000006044820152606401610a50565b61416b82614521565b6141b75760405162461bcd60e51b815260206004820152601c60248201527f73486173685769746e657373206973206e6f74206f6e206375727665000000006044820152606401610a50565b6141c3878a88876145e4565b61420b5760405162461bcd60e51b81526020600482015260196024820152786164647228632a706b2b732a6729213d5f755769746e65737360381b6044820152606401610a50565b60006142178a87614707565b9050600061422a898b878b86898961476b565b9050600061423b838d8d8a8661488a565b9050808a1461427c5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b210383937b7b360991b6044820152606401610a50565b505050505050505050505050565b60004661429681613fd2565b156142d557606c6001600160a01b031663c6f7de0e6040518163ffffffff1660e01b815260040160206040518083038186803b158015613bc557600080fd5b6142de816148ca565b1561434f57600f602160991b016001600160a01b03166349948e0e84604051806080016040528060488152602001615c7b604891396040516020016143249291906155d5565b6040516020818303038152906040526040518263ffffffff1660e01b8152600401613bad9190615720565b50600092915050565b600c5460035460408051633fabe5a360e21b815290516000938493600160381b90910463ffffffff169284926001600160a01b039092169163feaf968c9160048082019260a092909190829003018186803b1580156143b657600080fd5b505afa1580156143ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143ee91906154b0565b50919650909250505063ffffffff82161580159061441a57506144118142615adb565b8263ffffffff16105b925082156144285760105493505b50509091565b60008181526001830160205260408120548015614517576000614452600183615adb565b855490915060009061446690600190615adb565b90508181146144cb57600086600001828154811061448657614486615c2b565b90600052602060002001549050808760000184815481106144a9576144a9615c2b565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806144dc576144dc615c15565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612664565b6000915050612664565b80516000906401000003d0191161456f5760405162461bcd60e51b8152602060048201526012602482015271696e76616c696420782d6f7264696e61746560701b6044820152606401610a50565b60208201516401000003d019116145bd5760405162461bcd60e51b8152602060048201526012602482015271696e76616c696420792d6f7264696e61746560701b6044820152606401610a50565b60208201516401000003d0199080096145dd8360005b6020020151614904565b1492915050565b60006001600160a01b03821661462a5760405162461bcd60e51b815260206004820152600b60248201526a626164207769746e65737360a81b6044820152606401610a50565b60208401516000906001161561464157601c614644565b601b5b9050600070014551231950b75fc4402da1732fc9bebe1985876000602002015109865170014551231950b75fc4402da1732fc9bebe19918203925060009190890987516040805160008082526020820180845287905260ff88169282019290925260608101929092526080820183905291925060019060a0016020604051602081039080840390855afa1580156146df573d6000803e3d6000fd5b5050604051601f1901516001600160a01b039081169088161495505050505050949350505050565b61470f614e23565b61473c600184846040516020016147289392919061565e565b604051602081830303815290604052614928565b90505b61474881614521565b6126645780516040805160208101929092526147649101614728565b905061473f565b614773614e23565b825186516401000003d01990819006910614156147d25760405162461bcd60e51b815260206004820152601e60248201527f706f696e747320696e2073756d206d7573742062652064697374696e637400006044820152606401610a50565b6147dd878988614976565b6148225760405162461bcd60e51b8152602060048201526016602482015275119a5c9cdd081b5d5b0818da1958dac819985a5b195960521b6044820152606401610a50565b61482d848685614976565b6148735760405162461bcd60e51b815260206004820152601760248201527614d958dbdb99081b5d5b0818da1958dac819985a5b1959604a1b6044820152606401610a50565b61487e868484614a9e565b98975050505050505050565b6000600286868685876040516020016148a896959493929190615604565b60408051601f1981840301815291905280516020909101209695505050505050565b6000600a8214806148dc57506101a482145b806148e9575062aa37dc82145b806148f5575061210582145b8061266457505062014a331490565b6000806401000003d01980848509840990506401000003d019600782089392505050565b614930614e23565b61493982614b61565b815261494e6149498260006145d3565b614b9c565b602082018190526002900660011415611f00576020810180516401000003d019039052919050565b6000826149b35760405162461bcd60e51b815260206004820152600b60248201526a3d32b9379039b1b0b630b960a91b6044820152606401610a50565b835160208501516000906149c990600290615bd5565b156149d557601c6149d8565b601b5b9050600070014551231950b75fc4402da1732fc9bebe198387096040805160008082526020820180845281905260ff86169282019290925260608101869052608081018390529192509060019060a0016020604051602081039080840390855afa158015614a4a573d6000803e3d6000fd5b505050602060405103519050600086604051602001614a6991906155c3565b60408051601f1981840301815291905280516020909101206001600160a01b0392831692169190911498975050505050505050565b614aa6614e23565b835160208086015185519186015160009384938493614ac793909190614bbc565b919450925090506401000003d019858209600114614b235760405162461bcd60e51b815260206004820152601960248201527834b73b2d1036bab9ba1031329034b73b32b939b29037b3103d60391b6044820152606401610a50565b60405180604001604052806401000003d01980614b4257614b42615bff565b87860981526020016401000003d0198785099052979650505050505050565b805160208201205b6401000003d0198110611f0057604080516020808201939093528151808203840181529082019091528051910120614b69565b6000612664826002614bb56401000003d0196001615a27565b901c614c9c565b60008080600180826401000003d019896401000003d019038808905060006401000003d0198b6401000003d019038a0890506000614bfc83838585614d33565b9098509050614c0d88828e88614d57565b9098509050614c1e88828c87614d57565b90985090506000614c318d878b85614d57565b9098509050614c4288828686614d33565b9098509050614c5388828e89614d57565b9098509050818114614c88576401000003d019818a0998506401000003d01982890997506401000003d0198183099650614c8c565b8196505b5050505050509450945094915050565b600080614ca7614e41565b6020808252818101819052604082015260608101859052608081018490526401000003d01960a0820152614cd9614e5f565b60208160c0846005600019fa925082614d295760405162461bcd60e51b81526020600482015260126024820152716269674d6f64457870206661696c7572652160701b6044820152606401610a50565b5195945050505050565b6000806401000003d0198487096401000003d0198487099097909650945050505050565b600080806401000003d019878509905060006401000003d01987876401000003d019030990506401000003d0198183086401000003d01986890990999098509650505050505050565b828054828255906000526020600020908101928215614df5579160200282015b82811115614df557825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614dc0565b50614e01929150614e7d565b5090565b5080546000825590600052602060002090810190610a599190614e7d565b60405180604001604052806002906020820280368337509192915050565b6040518060c001604052806006906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b5b80821115614e015760008155600101614e7e565b8035611f0081615c57565b806040810183101561266457600080fd5b600082601f830112614ebf57600080fd5b604051604081018181106001600160401b0382111715614ee157614ee1615c41565b8060405250808385604086011115614ef857600080fd5b60005b6002811015614f1a578135835260209283019290910190600101614efb565b509195945050505050565b8035611f0081615c6c565b600060c08284031215614f4257600080fd5b614f4a615982565b9050614f5582615044565b815260208083013581830152614f6d60408401615030565b6040830152614f7e60608401615030565b60608301526080830135614f9181615c57565b608083015260a08301356001600160401b0380821115614fb057600080fd5b818501915085601f830112614fc457600080fd5b813581811115614fd657614fd6615c41565b614fe8601f8201601f191685016159cd565b91508082528684828501011115614ffe57600080fd5b80848401858401376000848284010152508060a085015250505092915050565b803561ffff81168114611f0057600080fd5b803563ffffffff81168114611f0057600080fd5b80356001600160401b0381168114611f0057600080fd5b803560ff81168114611f0057600080fd5b805169ffffffffffffffffffff81168114611f0057600080fd5b60006020828403121561509857600080fd5b813561104681615c57565b600080604083850312156150b657600080fd5b82356150c181615c57565b915060208301356150d181615c57565b809150509250929050565b600080600080606085870312156150f257600080fd5b84356150fd81615c57565b93506020850135925060408501356001600160401b038082111561512057600080fd5b818701915087601f83011261513457600080fd5b81358181111561514357600080fd5b88602082850101111561515557600080fd5b95989497505060200194505050565b60006040828403121561517657600080fd5b6110468383614e9d565b6000806060838503121561519357600080fd5b61519d8484614e9d565b91506151ab60408401615044565b90509250929050565b6000604082840312156151c657600080fd5b6110468383614eae565b6000602082840312156151e257600080fd5b815161104681615c6c565b6000602082840312156151ff57600080fd5b5035919050565b60006020828403121561521857600080fd5b5051919050565b60006020828403121561523157600080fd5b604051602081018181106001600160401b038211171561525357615253615c41565b604052823561526181615c6c565b81529392505050565b60008060008385036101e081121561528157600080fd5b6101a08082121561529157600080fd5b6152996159aa565b91506152a58787614eae565b82526152b48760408801614eae565b60208301526080860135604083015260a0860135606083015260c086013560808301526152e360e08701614e92565b60a08301526101006152f788828901614eae565b60c084015261530a886101408901614eae565b60e0840152610180870135908301529093508401356001600160401b0381111561533357600080fd5b61533f86828701614f30565b92505061534f6101c08501614f25565b90509250925092565b60006020828403121561536a57600080fd5b81356001600160401b0381111561538057600080fd5b820160c0818503121561104657600080fd5b6000602082840312156153a457600080fd5b6110468261501e565b60008060008060008060008060006101208a8c0312156153cc57600080fd5b6153d58a61501e565b98506153e360208b01615030565b97506153f160408b01615030565b96506153ff60608b01615030565b955060808a0135945061541460a08b01615030565b935061542260c08b01615030565b925061543060e08b0161505b565b915061543f6101008b0161505b565b90509295985092959850929598565b6000806040838503121561546157600080fd5b8235915060208301356150d181615c57565b6000806040838503121561548657600080fd5b50508035926020909101359150565b6000602082840312156154a757600080fd5b61104682615030565b600080600080600060a086880312156154c857600080fd5b6154d18661506c565b94506020860151935060408601519250606086015191506154f46080870161506c565b90509295509295909350565b600081518084526020808501945080840160005b838110156155395781516001600160a01b031687529582019590820190600101615514565b509495945050505050565b8060005b6002811015612bbc578151845260209384019390910190600101615548565b600081518084526020808501945080840160005b838110156155395781518752958201959082019060010161557b565b600081518084526155af816020860160208601615b67565b601f01601f19169290920160200192915050565b6155cd8183615544565b604001919050565b600083516155e7818460208801615b67565b8351908301906155fb818360208801615b67565b01949350505050565b8681526156146020820187615544565b6156216060820186615544565b61562e60a0820185615544565b61563b60e0820184615544565b60609190911b6001600160601b0319166101208201526101340195945050505050565b83815261566e6020820184615544565b606081019190915260800192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039290921682526001600160601b0316602082015260400190565b604081016126648284615544565b6020815260006110466020830184615567565b9182526001600160401b0316602082015260400190565b6020815260006110466020830184615597565b6020815260ff82511660208201526020820151604082015260018060a01b0360408301511660608201526000606083015160c0608084015261577860e0840182615500565b60808501516001600160601b0390811660a0868101919091529095015190941660c0909301929092525090919050565b9182526001600160a01b0316602082015260400190565b828152606081016110466020830184615544565b8281526040602082015260006157ec6040830184615567565b949350505050565b86815285602082015261ffff85166040820152600063ffffffff808616606084015280851660808401525060c060a083015261487e60c0830184615597565b878152602081018790526040810186905263ffffffff8581166060830152841660808201526001600160a01b03831660a082015260e060c0820181905260009061587f90830184615597565b9998505050505050505050565b8781526001600160401b03871660208201526040810186905263ffffffff8581166060830152841660808201526001600160a01b03831660a082015260e060c0820181905260009061587f90830184615597565b6001600160601b038681168252851660208201526001600160401b03841660408201526001600160a01b038316606082015260a06080820181905260009061592a90830184615500565b979650505050505050565b6000808335601e1984360301811261594c57600080fd5b8301803591506001600160401b0382111561596657600080fd5b60200191503681900382131561597b57600080fd5b9250929050565b60405160c081016001600160401b03811182821017156159a4576159a4615c41565b60405290565b60405161012081016001600160401b03811182821017156159a4576159a4615c41565b604051601f8201601f191681016001600160401b03811182821017156159f5576159f5615c41565b604052919050565b60008085851115615a0d57600080fd5b83861115615a1a57600080fd5b5050820193919092039150565b60008219821115615a3a57615a3a615be9565b500190565b60006001600160401b038083168185168083038211156155fb576155fb615be9565b600060ff821660ff84168060ff03821115615a7e57615a7e615be9565b019392505050565b60006001600160601b038281168482168083038211156155fb576155fb615be9565b600082615ab757615ab7615bff565b500490565b6000816000190483118215151615615ad657615ad6615be9565b500290565b600082821015615aed57615aed615be9565b500390565b600063ffffffff83811690831681811015615b0f57615b0f615be9565b039392505050565b60006001600160601b0383811690831681811015615b0f57615b0f615be9565b6001600160e01b03198135818116916004851015615b5f5780818660040360031b1b83161692505b505092915050565b60005b83811015615b82578181015183820152602001615b6a565b83811115612bbc5750506000910152565b6000600019821415615ba757615ba7615be9565b5060010190565b60006001600160401b0380831681811415615bcb57615bcb615be9565b6001019392505050565b600082615be457615be4615bff565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610a5957600080fd5b8015158114610a5957600080fdfe307866666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666a164736f6c6343000806000a", + Bin: "0x60a06040523480156200001157600080fd5b5060405162005ee138038062005ee1833981016040819052620000349162000183565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620000d7565b50505060601b6001600160601b031916608052620001b5565b6001600160a01b038116331415620001325760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000602082840312156200019657600080fd5b81516001600160a01b0381168114620001ae57600080fd5b9392505050565b60805160601c615d06620001db6000396000818161055001526132fa0152615d066000f3fe60806040526004361061021c5760003560e01c80638402595e11610124578063b2a7cac5116100a6578063b2a7cac514610732578063bec4c08c14610752578063caf70c4a14610772578063cb63179714610792578063d98e620e146107b2578063da2f2610146107d2578063dac83d2914610831578063dc311dd314610851578063e72f6e3014610882578063ee9d2d38146108a2578063f2fde38b146108cf57600080fd5b80638402595e146105c757806386fe91c7146105e75780638da5cb5b1461060757806395b55cfc146106255780639b1c385e146106385780639d40a6fd14610658578063a21a23e414610690578063a4c0ed36146106a5578063a63e0bfb146106c5578063aa433aff146106e5578063aefb212f1461070557600080fd5b8063405b84fa116101ad578063405b84fa1461044e57806340d6bb821461046e57806341af6c871461049957806351cff8d9146104c95780635d06b4ab146104e957806364d51a2a14610509578063659827441461051e578063689c45171461053e57806372e9d5651461057257806379ba5097146105925780637a5a2aef146105a757600080fd5b806304104edb14610221578063043bd6ae14610243578063088070f51461026c57806308821d581461033a5780630ae095401461035a57806315c48b841461037a57806318e3dd27146103a25780631b6b6d23146103e15780632f622e6b1461040e578063301f42e91461042e575b600080fd5b34801561022d57600080fd5b5061024161023c3660046150bd565b6108ef565b005b34801561024f57600080fd5b5061025960105481565b6040519081526020015b60405180910390f35b34801561027857600080fd5b50600c546102dd9061ffff81169063ffffffff62010000820481169160ff600160301b8204811692600160381b8304811692600160581b8104821692600160781b8204831692600160981b83041691600160b81b8104821691600160c01b9091041689565b6040805161ffff909a168a5263ffffffff98891660208b01529615159689019690965293861660608801529185166080870152841660a08601529290921660c084015260ff91821660e08401521661010082015261012001610263565b34801561034657600080fd5b5061024161035536600461519b565b610a5c565b34801561036657600080fd5b50610241610375366004615485565b610c06565b34801561038657600080fd5b5061038f60c881565b60405161ffff9091168152602001610263565b3480156103ae57600080fd5b50600a546103c990600160601b90046001600160601b031681565b6040516001600160601b039091168152602001610263565b3480156103ed57600080fd5b50600254610401906001600160a01b031681565b60405161026391906156b6565b34801561041a57600080fd5b506102416104293660046150bd565b610c4e565b34801561043a57600080fd5b506103c96104493660046152a1565b610d9a565b34801561045a57600080fd5b50610241610469366004615485565b61104d565b34801561047a57600080fd5b506104846101f481565b60405163ffffffff9091168152602001610263565b3480156104a557600080fd5b506104b96104b4366004615224565b6113ff565b6040519015158152602001610263565b3480156104d557600080fd5b506102416104e43660046150bd565b611515565b3480156104f557600080fd5b506102416105043660046150bd565b6116a3565b34801561051557600080fd5b5061038f606481565b34801561052a57600080fd5b506102416105393660046150da565b61175a565b34801561054a57600080fd5b506104017f000000000000000000000000000000000000000000000000000000000000000081565b34801561057e57600080fd5b50600354610401906001600160a01b031681565b34801561059e57600080fd5b506102416117ba565b3480156105b357600080fd5b506102416105c23660046151b7565b611864565b3480156105d357600080fd5b506102416105e23660046150bd565b611994565b3480156105f357600080fd5b50600a546103c9906001600160601b031681565b34801561061357600080fd5b506000546001600160a01b0316610401565b610241610633366004615224565b611aa6565b34801561064457600080fd5b5061025961065336600461538f565b611bca565b34801561066457600080fd5b50600754610678906001600160401b031681565b6040516001600160401b039091168152602001610263565b34801561069c57600080fd5b50610259611f61565b3480156106b157600080fd5b506102416106c0366004615113565b612135565b3480156106d157600080fd5b506102416106e03660046153e4565b6122b1565b3480156106f157600080fd5b50610241610700366004615224565b61257d565b34801561071157600080fd5b506107256107203660046154aa565b6125c5565b604051610263919061572d565b34801561073e57600080fd5b5061024161074d366004615224565b6126c7565b34801561075e57600080fd5b5061024161076d366004615485565b6127bc565b34801561077e57600080fd5b5061025961078d3660046151eb565b6128ae565b34801561079e57600080fd5b506102416107ad366004615485565b6128de565b3480156107be57600080fd5b506102596107cd366004615224565b612b41565b3480156107de57600080fd5b506108126107ed366004615224565b600d6020526000908152604090205460ff81169061010090046001600160401b031682565b6040805192151583526001600160401b03909116602083015201610263565b34801561083d57600080fd5b5061024161084c366004615485565b612b62565b34801561085d57600080fd5b5061087161086c366004615224565b612bf9565b604051610263959493929190615917565b34801561088e57600080fd5b5061024161089d3660046150bd565b612ce7565b3480156108ae57600080fd5b506102596108bd366004615224565b600f6020526000908152604090205481565b3480156108db57600080fd5b506102416108ea3660046150bd565b612eba565b6108f7612ecb565b60115460005b81811015610a3457826001600160a01b03166011828154811061092257610922615c62565b6000918252602090912001546001600160a01b03161415610a2457601161094a600184615b12565b8154811061095a5761095a615c62565b600091825260209091200154601180546001600160a01b03909216918390811061098657610986615c62565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060118054806109c5576109c5615c4c565b600082815260209020810160001990810180546001600160a01b03191690550190556040517ff80a1a97fd42251f3c33cda98635e7399253033a6774fe37cd3f650b5282af3790610a179085906156b6565b60405180910390a1505050565b610a2d81615bca565b90506108fd565b5081604051635428d44960e01b8152600401610a5091906156b6565b60405180910390fd5b50565b610a64612ecb565b604080518082018252600091610a939190849060029083908390808284376000920191909152506128ae915050565b6000818152600d602090815260409182902082518084019093525460ff811615158084526101009091046001600160401b03169183019190915291925090610af157604051631dfd6e1360e21b815260048101839052602401610a50565b6000828152600d6020526040812080546001600160481b0319169055600e54905b81811015610bc25783600e8281548110610b2e57610b2e615c62565b90600052602060002001541415610bb257600e610b4c600184615b12565b81548110610b5c57610b5c615c62565b9060005260206000200154600e8281548110610b7a57610b7a615c62565b600091825260209091200155600e805480610b9757610b97615c4c565b60019003818190600052602060002001600090559055610bc2565b610bbb81615bca565b9050610b12565b507f9b6868e0eb737bcd72205360baa6bfd0ba4e4819a33ade2db384e8a8025639a5838360200151604051610bf8929190615740565b60405180910390a150505050565b81610c1081612f20565b610c18612f81565b610c21836113ff565b15610c3f57604051631685ecdd60e31b815260040160405180910390fd5b610c498383612fac565b505050565b610c56612f81565b610c5e612ecb565b600b54600160601b90046001600160601b0316610c8e57604051631e9acf1760e31b815260040160405180910390fd5b600b8054600160601b90046001600160601b0316908190600c610cb18380615b4e565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555080600a600c8282829054906101000a90046001600160601b0316610cf99190615b4e565b92506101000a8154816001600160601b0302191690836001600160601b031602179055506000826001600160a01b0316826001600160601b031660405160006040518083038185875af1925050503d8060008114610d73576040519150601f19603f3d011682016040523d82523d6000602084013e610d78565b606091505b5050905080610c495760405163950b247960e01b815260040160405180910390fd5b6000610da4612f81565b60005a9050610324361115610dd657604051630f28961b60e01b81523660048201526103246024820152604401610a50565b6000610de28686613160565b90506000610df88583600001516020015161341c565b60408301516060888101519293509163ffffffff16806001600160401b03811115610e2557610e25615c78565b604051908082528060200260200182016040528015610e4e578160200160208202803683370190505b50925060005b81811015610eb65760408051602081018590529081018290526060016040516020818303038152906040528051906020012060001c848281518110610e9b57610e9b615c62565b6020908102919091010152610eaf81615bca565b9050610e54565b5050602080850180516000908152600f9092526040822082905551610edc908a8561346a565b60208a8101516000908152600690915260409020805491925090601890610f1290600160c01b90046001600160401b0316615be5565b91906101000a8154816001600160401b0302191690836001600160401b0316021790555060008960a0015160018b60a0015151610f4f9190615b12565b81518110610f5f57610f5f615c62565b60209101015160f81c60011490506000610f7b8887848d613505565b90995090508015610fc65760208088015160105460408051928352928201527f6ca648a381f22ead7e37773d934e64885dcf861fbfbb26c40354cbf0c4662d1a910160405180910390a15b50610fd688828c6020015161353d565b6020808b015187820151604080518781526001600160601b038d16948101949094528415159084015284151560608401528b1515608084015290917faeb4b4786571e184246d39587f659abf0e26f41f6a3358692250382c0cdb47b79060a00160405180910390a3505050505050505b9392505050565b611055612f81565b61105e81613690565b61107d5780604051635428d44960e01b8152600401610a5091906156b6565b60008060008061108c86612bf9565b945094505093509350336001600160a01b0316826001600160a01b0316146110ef5760405162461bcd60e51b81526020600482015260166024820152752737ba1039bab139b1b934b83a34b7b71037bbb732b960511b6044820152606401610a50565b6110f8866113ff565b1561113e5760405162461bcd60e51b815260206004820152601660248201527550656e64696e6720726571756573742065786973747360501b6044820152606401610a50565b6040805160c0810182526001815260208082018990526001600160a01b03851682840152606082018490526001600160601b038088166080840152861660a0830152915190916000916111939184910161576a565b60405160208183030381529060405290506111ad886136fc565b505060405163ce3f471960e01b81526001600160a01b0388169063ce3f4719906001600160601b038816906111e6908590600401615757565b6000604051808303818588803b1580156111ff57600080fd5b505af1158015611213573d6000803e3d6000fd5b50506002546001600160a01b03161580159350915061123c905057506001600160601b03861615155b156113065760025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611273908a908a906004016156fd565b602060405180830381600087803b15801561128d57600080fd5b505af11580156112a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c59190615207565b6113065760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b6044820152606401610a50565b600c805460ff60301b1916600160301b17905560005b83518110156113ad5783818151811061133757611337615c62565b60200260200101516001600160a01b0316638ea98117896040518263ffffffff1660e01b815260040161136a91906156b6565b600060405180830381600087803b15801561138457600080fd5b505af1158015611398573d6000803e3d6000fd5b50505050806113a690615bca565b905061131c565b50600c805460ff60301b191690556040517fd63ca8cb945956747ee69bfdc3ea754c24a4caf7418db70e46052f7850be4187906113ed9089908b906156ca565b60405180910390a15050505050505050565b6000818152600560205260408120600201805480611421575060009392505050565b600e5460005b8281101561150957600084828154811061144357611443615c62565b60009182526020822001546001600160a01b031691505b838110156114f65760006114be600e838154811061147a5761147a615c62565b60009182526020808320909101546001600160a01b03871683526004825260408084208e855290925291205485908c906001600160401b03610100909104166138a4565b506000818152600f6020526040902054909150156114e55750600198975050505050505050565b506114ef81615bca565b905061145a565b50508061150290615bca565b9050611427565b50600095945050505050565b61151d612f81565b611525612ecb565b6002546001600160a01b031661154e5760405163c1f0c0a160e01b815260040160405180910390fd5b600b546001600160601b031661157757604051631e9acf1760e31b815260040160405180910390fd5b600b80546001600160601b031690819060006115938380615b4e565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555080600a60008282829054906101000a90046001600160601b03166115db9190615b4e565b82546001600160601b039182166101009390930a92830291909202199091161790555060025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb9061163090859085906004016156fd565b602060405180830381600087803b15801561164a57600080fd5b505af115801561165e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116829190615207565b61169f57604051631e9acf1760e31b815260040160405180910390fd5b5050565b6116ab612ecb565b6116b481613690565b156116d4578060405163ac8a27ef60e01b8152600401610a5091906156b6565b601180546001810182556000919091527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c680180546001600160a01b0319166001600160a01b0383161790556040517fb7cabbfc11e66731fc77de0444614282023bcbd41d16781c753a431d0af016259061174f9083906156b6565b60405180910390a150565b611762612ecb565b6002546001600160a01b03161561178c57604051631688c53760e11b815260040160405180910390fd5b600280546001600160a01b039384166001600160a01b03199182161790915560038054929093169116179055565b6001546001600160a01b0316331461180d5760405162461bcd60e51b815260206004820152601660248201527526bab9ba10313290383937b837b9b2b21037bbb732b960511b6044820152606401610a50565b60008054336001600160a01b0319808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b61186c612ecb565b60408051808201825260009161189b9190859060029083908390808284376000920191909152506128ae915050565b6000818152600d602052604090205490915060ff16156118d157604051634a0b8fa760e01b815260048101829052602401610a50565b60408051808201825260018082526001600160401b0385811660208085019182526000878152600d9091528581209451855492516001600160481b031990931690151568ffffffffffffffff00191617610100929093169190910291909117909255600e805491820181559091527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd01829055517f9b911b2c240bfbef3b6a8f7ed6ee321d1258bb2a3fe6becab52ac1cd3210afd390610a179083908590615740565b61199c612ecb565b600a544790600160601b90046001600160601b0316818111156119dc576040516354ced18160e11b81526004810182905260248101839052604401610a50565b81811015610c495760006119f08284615b12565b90506000846001600160a01b03168260405160006040518083038185875af1925050503d8060008114611a3f576040519150601f19603f3d011682016040523d82523d6000602084013e611a44565b606091505b5050905080611a665760405163950b247960e01b815260040160405180910390fd5b7f4aed7c8eed0496c8c19ea2681fcca25741c1602342e38b045d9f1e8e905d2e9c8583604051611a979291906156ca565b60405180910390a15050505050565b611aae612f81565b6000818152600560205260409020546001600160a01b0316611ae357604051630fb532db60e11b815260040160405180910390fd5b60008181526006602052604090208054600160601b90046001600160601b0316903490600c611b128385615abd565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555034600a600c8282829054906101000a90046001600160601b0316611b5a9190615abd565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550817f7603b205d03651ee812f803fccde89f1012e545a9c99f0abfea9cedd0fd8e902823484611bad9190615a5e565b604080519283526020830191909152015b60405180910390a25050565b6000611bd4612f81565b602080830135600081815260059092526040909120546001600160a01b0316611c1057604051630fb532db60e11b815260040160405180910390fd5b3360009081526004602090815260408083208484528083529281902081518083019092525460ff811615158083526101009091046001600160401b03169282019290925290611c765782336040516379bfd40160e01b8152600401610a509291906157df565b600c5461ffff16611c8d60608701604088016153c9565b61ffff161080611cb0575060c8611caa60608701604088016153c9565b61ffff16115b15611cf657611cc560608601604087016153c9565b600c5460405163539c34bb60e11b815261ffff92831660048201529116602482015260c86044820152606401610a50565b600c5462010000900463ffffffff16611d1560808701606088016154cc565b63ffffffff161115611d6557611d3160808601606087016154cc565b600c54604051637aebf00f60e11b815263ffffffff9283166004820152620100009091049091166024820152604401610a50565b6101f4611d7860a08701608088016154cc565b63ffffffff161115611dbe57611d9460a08601608087016154cc565b6040516311ce1afb60e21b815263ffffffff90911660048201526101f46024820152604401610a50565b806020018051611dcd90615be5565b6001600160401b031690526020810151600090611df090873590339087906138a4565b90955090506000611e14611e0f611e0a60a08a018a61596c565b61391d565b61399a565b905085611e1f613a0b565b86611e3060808b0160608c016154cc565b611e4060a08c0160808d016154cc565b3386604051602001611e58979695949392919061586a565b60405160208183030381529060405280519060200120600f600088815260200190815260200160002081905550336001600160a01b03168588600001357feb0e3652e0f44f417695e6e90f2f42c99b65cd7169074c5a654b16b9748c3a4e89868c6040016020810190611ecb91906153c9565b8d6060016020810190611ede91906154cc565b8e6080016020810190611ef191906154cc565b89604051611f049695949392919061582b565b60405180910390a450506000928352602091825260409092208251815492909301516001600160401b03166101000268ffffffffffffffff0019931515939093166001600160481b0319909216919091179190911790555b919050565b6000611f6b612f81565b6007546001600160401b031633611f83600143615b12565b6040516001600160601b0319606093841b81166020830152914060348201523090921b1660548201526001600160c01b031960c083901b16606882015260700160408051601f1981840301815291905280516020909101209150611fe8816001615a76565b6007805467ffffffffffffffff19166001600160401b03928316179055604080516000808252608082018352602080830182815283850183815260608086018581528a86526006855287862093518454935191516001600160601b039182166001600160c01b031990951694909417600160601b9190921602176001600160c01b0316600160c01b9290981691909102969096179055835194850184523385528481018281528585018481528884526005835294909220855181546001600160a01b03199081166001600160a01b0392831617835593516001830180549095169116179092559251805192949391926120e79260028501920190614dd7565b506120f791506008905084613a9b565b50827f1d3015d7ba850fa198dc7b1a3f5d42779313a681035f77c8c03764c61005518d3360405161212891906156b6565b60405180910390a2505090565b61213d612f81565b6002546001600160a01b03163314612168576040516344b0e3c360e01b815260040160405180910390fd5b6020811461218957604051638129bbcd60e01b815260040160405180910390fd5b600061219782840184615224565b6000818152600560205260409020549091506001600160a01b03166121cf57604051630fb532db60e11b815260040160405180910390fd5b600081815260066020526040812080546001600160601b0316918691906121f68385615abd565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555084600a60008282829054906101000a90046001600160601b031661223e9190615abd565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550817f1ced9348ff549fceab2ac57cd3a9de38edaaab274b725ee82c23e8fc8c4eec7a8287846122919190615a5e565b6040805192835260208301919091520160405180910390a2505050505050565b6122b9612ecb565b60c861ffff8a1611156122f35760405163539c34bb60e11b815261ffff8a1660048201819052602482015260c86044820152606401610a50565b60008513612317576040516321ea67b360e11b815260048101869052602401610a50565b8363ffffffff168363ffffffff161115612354576040516313c06e5960e11b815263ffffffff808516600483015285166024820152604401610a50565b609b60ff8316111561238557604051631d66288d60e11b815260ff83166004820152609b6024820152604401610a50565b609b60ff821611156123b657604051631d66288d60e11b815260ff82166004820152609b6024820152604401610a50565b604080516101208101825261ffff8b1680825263ffffffff808c16602084018190526000848601528b8216606085018190528b8316608086018190528a841660a08701819052938a1660c0870181905260ff808b1660e08901819052908a16610100909801889052600c8054600160c01b90990260ff60c01b19600160b81b9093029290921661ffff60b81b19600160981b90940263ffffffff60981b19600160781b9099029890981667ffffffffffffffff60781b19600160581b90960263ffffffff60581b19600160381b9098029790971668ffffffffffffffffff60301b196201000090990265ffffffffffff19909c16909a179a909a1796909616979097179390931791909116959095179290921793909316929092179190911790556010869055517f2c6b6b12413678366b05b145c5f00745bdd00e739131ab5de82484a50c9d78b69061256a908b908b908b908b908b908b908b908b908b9061ffff99909916895263ffffffff97881660208a0152958716604089015293861660608801526080870192909252841660a086015290921660c084015260ff91821660e0840152166101008201526101200190565b60405180910390a1505050505050505050565b612585612ecb565b6000818152600560205260409020546001600160a01b0316806125bb57604051630fb532db60e11b815260040160405180910390fd5b61169f8282612fac565b606060006125d36008613aa7565b90508084106125f557604051631390f2a160e01b815260040160405180910390fd5b60006126018486615a5e565b90508181118061260f575083155b612619578061261b565b815b905060006126298683615b12565b9050806001600160401b0381111561264357612643615c78565b60405190808252806020026020018201604052801561266c578160200160208202803683370190505b50935060005b818110156126bc5761268f6126878883615a5e565b600890613ab1565b8582815181106126a1576126a1615c62565b60209081029190910101526126b581615bca565b9050612672565b505050505b92915050565b6126cf612f81565b6000818152600560205260409020546001600160a01b03168061270557604051630fb532db60e11b815260040160405180910390fd5b6000828152600560205260409020600101546001600160a01b0316331461275c576000828152600560205260409081902060010154905163d084e97560e01b8152610a50916001600160a01b0316906004016156b6565b600082815260056020526040908190208054336001600160a01b031991821681178355600190920180549091169055905183917fd4114ab6e9af9f597c52041f32d62dc57c5c4e4c0d4427006069635e216c938691611bbe9185916156e3565b816127c681612f20565b6127ce612f81565b6001600160a01b03821660009081526004602090815260408083208684529091529020805460ff16156128015750505050565b6000848152600560205260409020600201805460641415612835576040516305a48e0f60e01b815260040160405180910390fd5b8154600160ff1990911681178355815490810182556000828152602090200180546001600160a01b0319166001600160a01b03861617905560405185907f1e980d04aa7648e205713e5e8ea3808672ac163d10936d36f91b2c88ac1575e19061289f9087906156b6565b60405180910390a25050505050565b6000816040516020016128c1919061571f565b604051602081830303815290604052805190602001209050919050565b816128e881612f20565b6128f0612f81565b6128f9836113ff565b1561291757604051631685ecdd60e31b815260040160405180910390fd5b6001600160a01b038216600090815260046020908152604080832086845290915290205460ff1661295f5782826040516379bfd40160e01b8152600401610a509291906157df565b6000838152600560209081526040808320600201805482518185028101850190935280835291929091908301828280156129c257602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116129a4575b505050505090506000600182516129d99190615b12565b905060005b8251811015612ae357846001600160a01b0316838281518110612a0357612a03615c62565b60200260200101516001600160a01b03161415612ad3576000838381518110612a2e57612a2e615c62565b6020026020010151905080600560008981526020019081526020016000206002018381548110612a6057612a60615c62565b600091825260208083209190910180546001600160a01b0319166001600160a01b039490941693909317909255888152600590915260409020600201805480612aab57612aab615c4c565b600082815260209020810160001990810180546001600160a01b031916905501905550612ae3565b612adc81615bca565b90506129de565b506001600160a01b038416600090815260046020908152604080832088845290915290819020805460ff191690555185907f32158c6058347c1601b2d12bc696ac6901d8a9a9aa3ba10c27ab0a983e8425a79061289f9087906156b6565b600e8181548110612b5157600080fd5b600091825260209091200154905081565b81612b6c81612f20565b612b74612f81565b600083815260056020526040902060018101546001600160a01b03848116911614612bf3576001810180546001600160a01b0319166001600160a01b03851617905560405184907f21a4dad170a6bf476c31bbcf4a16628295b0e450672eec25d7c93308e05344a190612bea90339087906156e3565b60405180910390a25b50505050565b600081815260056020526040812054819081906001600160a01b0316606081612c3557604051630fb532db60e11b815260040160405180910390fd5b600086815260066020908152604080832054600583529281902060020180548251818502810185019093528083526001600160601b0380861695600160601b810490911694600160c01b9091046001600160401b0316938893929091839190830182828015612ccd57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612caf575b505050505090509450945094509450945091939590929450565b612cef612ecb565b6002546001600160a01b0316612d185760405163c1f0c0a160e01b815260040160405180910390fd5b6002546040516370a0823160e01b81526000916001600160a01b0316906370a0823190612d499030906004016156b6565b60206040518083038186803b158015612d6157600080fd5b505afa158015612d75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d99919061523d565b600a549091506001600160601b031681811115612dd3576040516354ced18160e11b81526004810182905260248101839052604401610a50565b81811015610c49576000612de78284615b12565b60025460405163a9059cbb60e01b81529192506001600160a01b03169063a9059cbb90612e1a90879085906004016156ca565b602060405180830381600087803b158015612e3457600080fd5b505af1158015612e48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e6c9190615207565b612e8957604051631f01ff1360e21b815260040160405180910390fd5b7f59bfc682b673f8cbf945f1e454df9334834abf7dfe7f92237ca29ecb9b4366008482604051610bf89291906156ca565b612ec2612ecb565b610a5981613abd565b6000546001600160a01b03163314612f1e5760405162461bcd60e51b815260206004820152601660248201527527b7363c9031b0b63630b1363290313c9037bbb732b960511b6044820152606401610a50565b565b6000818152600560205260409020546001600160a01b031680612f5657604051630fb532db60e11b815260040160405180910390fd5b336001600160a01b0382161461169f5780604051636c51fda960e11b8152600401610a5091906156b6565b600c54600160301b900460ff1615612f1e5760405163769dd35360e11b815260040160405180910390fd5b600080612fb8846136fc565b60025491935091506001600160a01b031615801590612fdf57506001600160601b03821615155b1561308e5760025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb9061301f9086906001600160601b038716906004016156ca565b602060405180830381600087803b15801561303957600080fd5b505af115801561304d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130719190615207565b61308e57604051631e9acf1760e31b815260040160405180910390fd5b6000836001600160a01b0316826001600160601b031660405160006040518083038185875af1925050503d80600081146130e4576040519150601f19603f3d011682016040523d82523d6000602084013e6130e9565b606091505b505090508061310b5760405163950b247960e01b815260040160405180910390fd5b604080516001600160a01b03861681526001600160601b03808616602083015284169181019190915285907f8c74ce8b8cf87f5eb001275c8be27eb34ea2b62bfab6814fcc62192bb63e81c49060600161289f565b6040805160a0810182526000606082018181526080830182905282526020820181905291810191909152600061319984600001516128ae565b6000818152600d602090815260409182902082518084019093525460ff811615158084526101009091046001600160401b031691830191909152919250906131f757604051631dfd6e1360e21b815260048101839052602401610a50565b6000828660800151604051602001613219929190918252602082015260400190565b60408051601f1981840301815291815281516020928301206000818152600f9093529120549091508061325f57604051631b44092560e11b815260040160405180910390fd5b85516020808801516040808a015160608b015160808c015160a08d0151935161328e978a9790969591016158c3565b6040516020818303038152906040528051906020012081146132c35760405163354a450b60e21b815260040160405180910390fd5b60006132d28760000151613b61565b9050806133aa578651604051631d2827a760e31b81526001600160401b0390911660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e9413d389060240160206040518083038186803b15801561334457600080fd5b505afa158015613358573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061337c919061523d565b9050806133aa57865160405163175dadad60e01b81526001600160401b039091166004820152602401610a50565b60008860800151826040516020016133cc929190918252602082015260400190565b6040516020818303038152906040528051906020012060001c905060006133f38a83613c43565b604080516060810182529788526020880196909652948601949094525092979650505050505050565b6000816001600160401b03163a111561346257821561344557506001600160401b0381166126c1565b3a8260405163435e532d60e11b8152600401610a50929190615740565b503a92915050565b6000806000631fe543e360e01b868560405160240161348a92919061580a565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252600c805460ff60301b1916600160301b1790559086015160808701519192506134ee9163ffffffff9091169083613cae565b600c805460ff60301b191690559695505050505050565b600080831561352457613519868685613cfa565b600091509150613534565b61352f868685613e0b565b915091505b94509492505050565b600081815260066020526040902082156135fc5780546001600160601b03600160601b909104811690851681101561358857604051631e9acf1760e31b815260040160405180910390fd5b6135928582615b4e565b8254600160601b600160c01b031916600160601b6001600160601b039283168102919091178455600b805488939192600c926135d2928692900416615abd565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555050612bf3565b80546001600160601b0390811690851681101561362c57604051631e9acf1760e31b815260040160405180910390fd5b6136368582615b4e565b82546001600160601b0319166001600160601b03918216178355600b8054879260009161366591859116615abd565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505050505050565b601154600090815b818110156136f257836001600160a01b0316601182815481106136bd576136bd615c62565b6000918252602090912001546001600160a01b031614156136e2575060019392505050565b6136eb81615bca565b9050613698565b5060009392505050565b60008181526005602090815260408083206006909252822054600290910180546001600160601b0380841694600160601b90940416925b8181101561379e576004600084838154811061375157613751615c62565b60009182526020808320909101546001600160a01b031683528281019390935260409182018120898252909252902080546001600160481b031916905561379781615bca565b9050613733565b50600085815260056020526040812080546001600160a01b031990811682556001820180549091169055906137d66002830182614e3c565b50506000858152600660205260408120556137f2600886613ffd565b506001600160601b0384161561384557600a80548591906000906138209084906001600160601b0316615b4e565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505b6001600160601b0383161561389d5782600a600c8282829054906101000a90046001600160601b03166138789190615b4e565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505b5050915091565b6040805160208082018790526001600160a01b03959095168183015260608101939093526001600160401b03919091166080808401919091528151808403909101815260a08301825280519084012060c083019490945260e0808301859052815180840390910181526101009092019052805191012091565b6040805160208101909152600081528161394657506040805160208101909152600081526126c1565b63125fa26760e31b6139588385615b6e565b6001600160e01b0319161461398057604051632923fee760e11b815260040160405180910390fd5b61398d8260048186615a34565b8101906110469190615256565b60607f92fd13387c7fe7befbc38d303d6468778fb9731bc4583f17d92989c6fcfdeaaa826040516024016139d391511515815260200190565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915292915050565b600046613a1781614009565b15613a945760646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b815260040160206040518083038186803b158015613a5657600080fd5b505afa158015613a6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a8e919061523d565b91505090565b4391505090565b6000611046838361402c565b60006126c1825490565b6000611046838361407b565b6001600160a01b038116331415613b105760405162461bcd60e51b815260206004820152601760248201527621b0b73737ba103a3930b739b332b9103a379039b2b63360491b6044820152606401610a50565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600046613b6d81614009565b15613c3457610100836001600160401b0316613b87613a0b565b613b919190615b12565b1180613bad5750613ba0613a0b565b836001600160401b031610155b15613bbb5750600092915050565b6040516315a03d4160e11b81526001600160401b0384166004820152606490632b407a82906024015b60206040518083038186803b158015613bfc57600080fd5b505afa158015613c10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611046919061523d565b50506001600160401b03164090565b6000613c778360000151846020015185604001518660600151868860a001518960c001518a60e001518b61010001516140a5565b60038360200151604051602001613c8f9291906157f6565b60408051601f1981840301815291905280516020909101209392505050565b60005a611388811015613cc057600080fd5b611388810390508460408204820311613cd857600080fd5b50823b613ce457600080fd5b60008083516020850160008789f1949350505050565b600080613d3d6000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506142c192505050565b905060005a600c54613d5d908890600160581b900463ffffffff16615a5e565b613d679190615b12565b613d719086615af3565b600c54909150600090613d9690600160781b900463ffffffff1664e8d4a51000615af3565b90508415613de257600c548190606490600160b81b900460ff16613dba8587615a5e565b613dc49190615af3565b613dce9190615adf565b613dd89190615a5e565b9350505050611046565b600c548190606490613dfe90600160b81b900460ff1682615a98565b60ff16613dba8587615a5e565b600080600080613e1961438f565b9150915060008213613e41576040516321ea67b360e11b815260048101839052602401610a50565b6000613e836000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506142c192505050565b9050600083825a600c54613ea5908d90600160581b900463ffffffff16615a5e565b613eaf9190615b12565b613eb9908b615af3565b613ec39190615a5e565b613ed590670de0b6b3a7640000615af3565b613edf9190615adf565b600c54909150600090613f089063ffffffff600160981b8204811691600160781b900416615b29565b613f1d9063ffffffff1664e8d4a51000615af3565b9050600085613f3483670de0b6b3a7640000615af3565b613f3e9190615adf565b905060008915613f7f57600c548290606490613f6490600160c01b900460ff1687615af3565b613f6e9190615adf565b613f789190615a5e565b9050613fbf565b600c548290606490613f9b90600160c01b900460ff1682615a98565b613fa89060ff1687615af3565b613fb29190615adf565b613fbc9190615a5e565b90505b6b033b2e3c9fd0803ce8000000811115613fec5760405163e80fa38160e01b815260040160405180910390fd5b9b949a509398505050505050505050565b60006110468383614465565b600061a4b182148061401d575062066eed82145b806126c157505062066eee1490565b6000818152600183016020526040812054614073575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556126c1565b5060006126c1565b600082600001828154811061409257614092615c62565b9060005260206000200154905092915050565b6140ae89614558565b6140f75760405162461bcd60e51b815260206004820152601a6024820152797075626c6963206b6579206973206e6f74206f6e20637572766560301b6044820152606401610a50565b61410088614558565b6141445760405162461bcd60e51b815260206004820152601560248201527467616d6d61206973206e6f74206f6e20637572766560581b6044820152606401610a50565b61414d83614558565b6141995760405162461bcd60e51b815260206004820152601d60248201527f6347616d6d615769746e657373206973206e6f74206f6e2063757276650000006044820152606401610a50565b6141a282614558565b6141ee5760405162461bcd60e51b815260206004820152601c60248201527f73486173685769746e657373206973206e6f74206f6e206375727665000000006044820152606401610a50565b6141fa878a888761461b565b6142425760405162461bcd60e51b81526020600482015260196024820152786164647228632a706b2b732a6729213d5f755769746e65737360381b6044820152606401610a50565b600061424e8a8761473e565b90506000614261898b878b8689896147a2565b90506000614272838d8d8a866148c1565b9050808a146142b35760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b210383937b7b360991b6044820152606401610a50565b505050505050505050505050565b6000466142cd81614009565b1561430c57606c6001600160a01b031663c6f7de0e6040518163ffffffff1660e01b815260040160206040518083038186803b158015613bfc57600080fd5b61431581614901565b1561438657600f602160991b016001600160a01b03166349948e0e84604051806080016040528060488152602001615cb26048913960405160200161435b92919061560c565b6040516020818303038152906040526040518263ffffffff1660e01b8152600401613be49190615757565b50600092915050565b600c5460035460408051633fabe5a360e21b815290516000938493600160381b90910463ffffffff169284926001600160a01b039092169163feaf968c9160048082019260a092909190829003018186803b1580156143ed57600080fd5b505afa158015614401573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061442591906154e7565b50919650909250505063ffffffff82161580159061445157506144488142615b12565b8263ffffffff16105b9250821561445f5760105493505b50509091565b6000818152600183016020526040812054801561454e576000614489600183615b12565b855490915060009061449d90600190615b12565b90508181146145025760008660000182815481106144bd576144bd615c62565b90600052602060002001549050808760000184815481106144e0576144e0615c62565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061451357614513615c4c565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506126c1565b60009150506126c1565b80516000906401000003d019116145a65760405162461bcd60e51b8152602060048201526012602482015271696e76616c696420782d6f7264696e61746560701b6044820152606401610a50565b60208201516401000003d019116145f45760405162461bcd60e51b8152602060048201526012602482015271696e76616c696420792d6f7264696e61746560701b6044820152606401610a50565b60208201516401000003d0199080096146148360005b602002015161493b565b1492915050565b60006001600160a01b0382166146615760405162461bcd60e51b815260206004820152600b60248201526a626164207769746e65737360a81b6044820152606401610a50565b60208401516000906001161561467857601c61467b565b601b5b9050600070014551231950b75fc4402da1732fc9bebe1985876000602002015109865170014551231950b75fc4402da1732fc9bebe19918203925060009190890987516040805160008082526020820180845287905260ff88169282019290925260608101929092526080820183905291925060019060a0016020604051602081039080840390855afa158015614716573d6000803e3d6000fd5b5050604051601f1901516001600160a01b039081169088161495505050505050949350505050565b614746614e5a565b6147736001848460405160200161475f93929190615695565b60405160208183030381529060405261495f565b90505b61477f81614558565b6126c157805160408051602081019290925261479b910161475f565b9050614776565b6147aa614e5a565b825186516401000003d01990819006910614156148095760405162461bcd60e51b815260206004820152601e60248201527f706f696e747320696e2073756d206d7573742062652064697374696e637400006044820152606401610a50565b6148148789886149ad565b6148595760405162461bcd60e51b8152602060048201526016602482015275119a5c9cdd081b5d5b0818da1958dac819985a5b195960521b6044820152606401610a50565b6148648486856149ad565b6148aa5760405162461bcd60e51b815260206004820152601760248201527614d958dbdb99081b5d5b0818da1958dac819985a5b1959604a1b6044820152606401610a50565b6148b5868484614ad5565b98975050505050505050565b6000600286868685876040516020016148df9695949392919061563b565b60408051601f1981840301815291905280516020909101209695505050505050565b6000600a82148061491357506101a482145b80614920575062aa37dc82145b8061492c575061210582145b806126c157505062014a331490565b6000806401000003d01980848509840990506401000003d019600782089392505050565b614967614e5a565b61497082614b98565b815261498561498082600061460a565b614bd3565b602082018190526002900660011415611f5c576020810180516401000003d019039052919050565b6000826149ea5760405162461bcd60e51b815260206004820152600b60248201526a3d32b9379039b1b0b630b960a91b6044820152606401610a50565b83516020850151600090614a0090600290615c0c565b15614a0c57601c614a0f565b601b5b9050600070014551231950b75fc4402da1732fc9bebe198387096040805160008082526020820180845281905260ff86169282019290925260608101869052608081018390529192509060019060a0016020604051602081039080840390855afa158015614a81573d6000803e3d6000fd5b505050602060405103519050600086604051602001614aa091906155fa565b60408051601f1981840301815291905280516020909101206001600160a01b0392831692169190911498975050505050505050565b614add614e5a565b835160208086015185519186015160009384938493614afe93909190614bf3565b919450925090506401000003d019858209600114614b5a5760405162461bcd60e51b815260206004820152601960248201527834b73b2d1036bab9ba1031329034b73b32b939b29037b3103d60391b6044820152606401610a50565b60405180604001604052806401000003d01980614b7957614b79615c36565b87860981526020016401000003d0198785099052979650505050505050565b805160208201205b6401000003d0198110611f5c57604080516020808201939093528151808203840181529082019091528051910120614ba0565b60006126c1826002614bec6401000003d0196001615a5e565b901c614cd3565b60008080600180826401000003d019896401000003d019038808905060006401000003d0198b6401000003d019038a0890506000614c3383838585614d6a565b9098509050614c4488828e88614d8e565b9098509050614c5588828c87614d8e565b90985090506000614c688d878b85614d8e565b9098509050614c7988828686614d6a565b9098509050614c8a88828e89614d8e565b9098509050818114614cbf576401000003d019818a0998506401000003d01982890997506401000003d0198183099650614cc3565b8196505b5050505050509450945094915050565b600080614cde614e78565b6020808252818101819052604082015260608101859052608081018490526401000003d01960a0820152614d10614e96565b60208160c0846005600019fa925082614d605760405162461bcd60e51b81526020600482015260126024820152716269674d6f64457870206661696c7572652160701b6044820152606401610a50565b5195945050505050565b6000806401000003d0198487096401000003d0198487099097909650945050505050565b600080806401000003d019878509905060006401000003d01987876401000003d019030990506401000003d0198183086401000003d01986890990999098509650505050505050565b828054828255906000526020600020908101928215614e2c579160200282015b82811115614e2c57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614df7565b50614e38929150614eb4565b5090565b5080546000825590600052602060002090810190610a599190614eb4565b60405180604001604052806002906020820280368337509192915050565b6040518060c001604052806006906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b5b80821115614e385760008155600101614eb5565b8035611f5c81615c8e565b80604081018310156126c157600080fd5b600082601f830112614ef657600080fd5b604051604081018181106001600160401b0382111715614f1857614f18615c78565b8060405250808385604086011115614f2f57600080fd5b60005b6002811015614f51578135835260209283019290910190600101614f32565b509195945050505050565b8035611f5c81615ca3565b600060c08284031215614f7957600080fd5b614f816159b9565b9050614f8c8261507b565b815260208083013581830152614fa460408401615067565b6040830152614fb560608401615067565b60608301526080830135614fc881615c8e565b608083015260a08301356001600160401b0380821115614fe757600080fd5b818501915085601f830112614ffb57600080fd5b81358181111561500d5761500d615c78565b61501f601f8201601f19168501615a04565b9150808252868482850101111561503557600080fd5b80848401858401376000848284010152508060a085015250505092915050565b803561ffff81168114611f5c57600080fd5b803563ffffffff81168114611f5c57600080fd5b80356001600160401b0381168114611f5c57600080fd5b803560ff81168114611f5c57600080fd5b805169ffffffffffffffffffff81168114611f5c57600080fd5b6000602082840312156150cf57600080fd5b813561104681615c8e565b600080604083850312156150ed57600080fd5b82356150f881615c8e565b9150602083013561510881615c8e565b809150509250929050565b6000806000806060858703121561512957600080fd5b843561513481615c8e565b93506020850135925060408501356001600160401b038082111561515757600080fd5b818701915087601f83011261516b57600080fd5b81358181111561517a57600080fd5b88602082850101111561518c57600080fd5b95989497505060200194505050565b6000604082840312156151ad57600080fd5b6110468383614ed4565b600080606083850312156151ca57600080fd5b6151d48484614ed4565b91506151e26040840161507b565b90509250929050565b6000604082840312156151fd57600080fd5b6110468383614ee5565b60006020828403121561521957600080fd5b815161104681615ca3565b60006020828403121561523657600080fd5b5035919050565b60006020828403121561524f57600080fd5b5051919050565b60006020828403121561526857600080fd5b604051602081018181106001600160401b038211171561528a5761528a615c78565b604052823561529881615ca3565b81529392505050565b60008060008385036101e08112156152b857600080fd5b6101a0808212156152c857600080fd5b6152d06159e1565b91506152dc8787614ee5565b82526152eb8760408801614ee5565b60208301526080860135604083015260a0860135606083015260c0860135608083015261531a60e08701614ec9565b60a083015261010061532e88828901614ee5565b60c0840152615341886101408901614ee5565b60e0840152610180870135908301529093508401356001600160401b0381111561536a57600080fd5b61537686828701614f67565b9250506153866101c08501614f5c565b90509250925092565b6000602082840312156153a157600080fd5b81356001600160401b038111156153b757600080fd5b820160c0818503121561104657600080fd5b6000602082840312156153db57600080fd5b61104682615055565b60008060008060008060008060006101208a8c03121561540357600080fd5b61540c8a615055565b985061541a60208b01615067565b975061542860408b01615067565b965061543660608b01615067565b955060808a0135945061544b60a08b01615067565b935061545960c08b01615067565b925061546760e08b01615092565b91506154766101008b01615092565b90509295985092959850929598565b6000806040838503121561549857600080fd5b82359150602083013561510881615c8e565b600080604083850312156154bd57600080fd5b50508035926020909101359150565b6000602082840312156154de57600080fd5b61104682615067565b600080600080600060a086880312156154ff57600080fd5b615508866150a3565b945060208601519350604086015192506060860151915061552b608087016150a3565b90509295509295909350565b600081518084526020808501945080840160005b838110156155705781516001600160a01b03168752958201959082019060010161554b565b509495945050505050565b8060005b6002811015612bf357815184526020938401939091019060010161557f565b600081518084526020808501945080840160005b83811015615570578151875295820195908201906001016155b2565b600081518084526155e6816020860160208601615b9e565b601f01601f19169290920160200192915050565b615604818361557b565b604001919050565b6000835161561e818460208801615b9e565b835190830190615632818360208801615b9e565b01949350505050565b86815261564b602082018761557b565b615658606082018661557b565b61566560a082018561557b565b61567260e082018461557b565b60609190911b6001600160601b0319166101208201526101340195945050505050565b8381526156a5602082018461557b565b606081019190915260800192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039290921682526001600160601b0316602082015260400190565b604081016126c1828461557b565b602081526000611046602083018461559e565b9182526001600160401b0316602082015260400190565b60208152600061104660208301846155ce565b6020815260ff82511660208201526020820151604082015260018060a01b0360408301511660608201526000606083015160c060808401526157af60e0840182615537565b60808501516001600160601b0390811660a0868101919091529095015190941660c0909301929092525090919050565b9182526001600160a01b0316602082015260400190565b82815260608101611046602083018461557b565b828152604060208201526000615823604083018461559e565b949350505050565b86815285602082015261ffff85166040820152600063ffffffff808616606084015280851660808401525060c060a08301526148b560c08301846155ce565b878152602081018790526040810186905263ffffffff8581166060830152841660808201526001600160a01b03831660a082015260e060c082018190526000906158b6908301846155ce565b9998505050505050505050565b8781526001600160401b03871660208201526040810186905263ffffffff8581166060830152841660808201526001600160a01b03831660a082015260e060c082018190526000906158b6908301846155ce565b6001600160601b038681168252851660208201526001600160401b03841660408201526001600160a01b038316606082015260a06080820181905260009061596190830184615537565b979650505050505050565b6000808335601e1984360301811261598357600080fd5b8301803591506001600160401b0382111561599d57600080fd5b6020019150368190038213156159b257600080fd5b9250929050565b60405160c081016001600160401b03811182821017156159db576159db615c78565b60405290565b60405161012081016001600160401b03811182821017156159db576159db615c78565b604051601f8201601f191681016001600160401b0381118282101715615a2c57615a2c615c78565b604052919050565b60008085851115615a4457600080fd5b83861115615a5157600080fd5b5050820193919092039150565b60008219821115615a7157615a71615c20565b500190565b60006001600160401b0380831681851680830382111561563257615632615c20565b600060ff821660ff84168060ff03821115615ab557615ab5615c20565b019392505050565b60006001600160601b0382811684821680830382111561563257615632615c20565b600082615aee57615aee615c36565b500490565b6000816000190483118215151615615b0d57615b0d615c20565b500290565b600082821015615b2457615b24615c20565b500390565b600063ffffffff83811690831681811015615b4657615b46615c20565b039392505050565b60006001600160601b0383811690831681811015615b4657615b46615c20565b6001600160e01b03198135818116916004851015615b965780818660040360031b1b83161692505b505092915050565b60005b83811015615bb9578181015183820152602001615ba1565b83811115612bf35750506000910152565b6000600019821415615bde57615bde615c20565b5060010190565b60006001600160401b0380831681811415615c0257615c02615c20565b6001019392505050565b600082615c1b57615c1b615c36565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610a5957600080fd5b8015158114610a5957600080fdfe307866666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666a164736f6c6343000806000a", } var VRFCoordinatorV25ABI = VRFCoordinatorV25MetaData.ABI diff --git a/core/gethwrappers/generated/vrf_v2plus_upgraded_version/vrf_v2plus_upgraded_version.go b/core/gethwrappers/generated/vrf_v2plus_upgraded_version/vrf_v2plus_upgraded_version.go index f81693ce06b..472f6acef9a 100644 --- a/core/gethwrappers/generated/vrf_v2plus_upgraded_version/vrf_v2plus_upgraded_version.go +++ b/core/gethwrappers/generated/vrf_v2plus_upgraded_version/vrf_v2plus_upgraded_version.go @@ -62,7 +62,7 @@ type VRFV2PlusClientRandomWordsRequest struct { var VRFCoordinatorV2PlusUpgradedVersionMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"blockhashStore\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"internalBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"externalBalance\",\"type\":\"uint256\"}],\"name\":\"BalanceInvariantViolated\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNum\",\"type\":\"uint256\"}],\"name\":\"BlockhashNotInStore\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"coordinatorAddress\",\"type\":\"address\"}],\"name\":\"CoordinatorAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"coordinatorAddress\",\"type\":\"address\"}],\"name\":\"CoordinatorNotRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedToSendNative\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedToTransferLink\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"have\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"want\",\"type\":\"uint32\"}],\"name\":\"GasLimitTooBig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectCommitment\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IndexOutOfRange\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidCalldata\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"InvalidConsumer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidExtraArgsTag\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"linkWei\",\"type\":\"int256\"}],\"name\":\"InvalidLinkWeiPrice\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"transferredValue\",\"type\":\"uint256\"},{\"internalType\":\"uint96\",\"name\":\"expectedValue\",\"type\":\"uint96\"}],\"name\":\"InvalidNativeBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"have\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"min\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"max\",\"type\":\"uint16\"}],\"name\":\"InvalidRequestConfirmations\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSubscription\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"requestVersion\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"expectedVersion\",\"type\":\"uint8\"}],\"name\":\"InvalidVersion\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkAlreadySet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkNotSet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"proposedOwner\",\"type\":\"address\"}],\"name\":\"MustBeRequestedOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"MustBeSubOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoCorrespondingRequest\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"}],\"name\":\"NoSuchProvingKey\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"have\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"want\",\"type\":\"uint32\"}],\"name\":\"NumWordsTooBig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableFromLink\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PaymentTooLarge\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PendingRequestExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"}],\"name\":\"ProvingKeyAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Reentrant\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SubscriptionIDCollisionFound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyConsumers\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"stalenessSeconds\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"gasAfterPaymentCalculation\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"int256\",\"name\":\"fallbackWeiPerUnitLink\",\"type\":\"int256\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"nativePremiumPercentage\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"linkPremiumPercentage\",\"type\":\"uint8\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"coordinatorAddress\",\"type\":\"address\"}],\"name\":\"CoordinatorRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"FundsRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newCoordinator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"MigrationCompleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"NativeFundsRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"}],\"name\":\"ProvingKeyRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"outputSeed\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subID\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"payment\",\"type\":\"uint96\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"name\":\"RandomWordsFulfilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"preSeed\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"numWords\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RandomWordsRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountLink\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountNative\",\"type\":\"uint256\"}],\"name\":\"SubscriptionCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"SubscriptionConsumerAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"SubscriptionConsumerRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"SubscriptionCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newBalance\",\"type\":\"uint256\"}],\"name\":\"SubscriptionFunded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldNativeBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newNativeBalance\",\"type\":\"uint256\"}],\"name\":\"SubscriptionFundedWithNative\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"SubscriptionOwnerTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"SubscriptionOwnerTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BLOCKHASH_STORE\",\"outputs\":[{\"internalType\":\"contractBlockhashStoreInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"LINK\",\"outputs\":[{\"internalType\":\"contractLinkTokenInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"LINK_NATIVE_FEED\",\"outputs\":[{\"internalType\":\"contractAggregatorV3Interface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_CONSUMERS\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_NUM_WORDS\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_REQUEST_CONFIRMATIONS\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"acceptSubscriptionOwnerTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"addConsumer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"cancelSubscription\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"createSubscription\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256[2]\",\"name\":\"pk\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"gamma\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"c\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"s\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"seed\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"uWitness\",\"type\":\"address\"},{\"internalType\":\"uint256[2]\",\"name\":\"cGammaWitness\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"sHashWitness\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"zInv\",\"type\":\"uint256\"}],\"internalType\":\"structVRF.Proof\",\"name\":\"proof\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"blockNum\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"numWords\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structVRFCoordinatorV2PlusUpgradedVersion.RequestCommitment\",\"name\":\"rc\",\"type\":\"tuple\"},{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"name\":\"fulfillRandomWords\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"fundSubscriptionWithNative\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"startIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxCount\",\"type\":\"uint256\"}],\"name\":\"getActiveSubscriptionIds\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRequestConfig\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"},{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"getSubscription\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"balance\",\"type\":\"uint96\"},{\"internalType\":\"uint96\",\"name\":\"nativeBalance\",\"type\":\"uint96\"},{\"internalType\":\"uint64\",\"name\":\"reqCount\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"consumers\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[2]\",\"name\":\"publicKey\",\"type\":\"uint256[2]\"}],\"name\":\"hashOfKey\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"newCoordinator\",\"type\":\"address\"}],\"name\":\"migrate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"migrationVersion\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedData\",\"type\":\"bytes\"}],\"name\":\"onMigration\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onTokenTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"ownerCancelSubscription\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"pendingRequestExists\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"recoverFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"recoverNativeFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"registerMigratableCoordinator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[2]\",\"name\":\"publicProvingKey\",\"type\":\"uint256[2]\"}],\"name\":\"registerProvingKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"removeConsumer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"uint16\",\"name\":\"requestConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"numWords\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structVRFV2PlusClient.RandomWordsRequest\",\"name\":\"req\",\"type\":\"tuple\"}],\"name\":\"requestRandomWords\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"requestSubscriptionOwnerTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_config\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"reentrancyLock\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"stalenessSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasAfterPaymentCalculation\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeNativePPM\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeLinkDiscountPPM\",\"type\":\"uint32\"},{\"internalType\":\"uint8\",\"name\":\"nativePremiumPercentage\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"linkPremiumPercentage\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_currentSubNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"s_provingKeyHashes\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"s_requestCommitments\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_totalBalance\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_totalNativeBalance\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"stalenessSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasAfterPaymentCalculation\",\"type\":\"uint32\"},{\"internalType\":\"int256\",\"name\":\"fallbackWeiPerUnitLink\",\"type\":\"int256\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeNativePPM\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeLinkDiscountPPM\",\"type\":\"uint32\"},{\"internalType\":\"uint8\",\"name\":\"nativePremiumPercentage\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"linkPremiumPercentage\",\"type\":\"uint8\"}],\"name\":\"setConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"link\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"linkNativeFeed\",\"type\":\"address\"}],\"name\":\"setLINKAndLINKNativeFeed\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"withdrawNative\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162005dec38038062005dec833981016040819052620000349162000183565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620000d7565b50505060601b6001600160601b031916608052620001b5565b6001600160a01b038116331415620001325760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000602082840312156200019657600080fd5b81516001600160a01b0381168114620001ae57600080fd5b9392505050565b60805160601c615c11620001db600039600081816104f401526133f80152615c116000f3fe6080604052600436106101e05760003560e01c8062012291146101e5578063088070f5146102125780630ae09540146102e057806315c48b841461030257806318e3dd271461032a5780631b6b6d2314610369578063294daa49146103965780632f622e6b146103b2578063301f42e9146103d2578063405b84fa146103f257806340d6bb821461041257806341af6c871461043d57806351cff8d91461046d5780635d06b4ab1461048d57806364d51a2a146104ad57806365982744146104c2578063689c4517146104e257806372e9d5651461051657806379ba5097146105365780637bce14d11461054b5780638402595e1461056b57806386fe91c71461058b5780638da5cb5b146105ab57806395b55cfc146105c95780639b1c385e146105dc5780639d40a6fd1461060a578063a21a23e414610637578063a4c0ed361461064c578063a63e0bfb1461066c578063aa433aff1461068c578063aefb212f146106ac578063b2a7cac5146106d9578063bec4c08c146106f9578063caf70c4a14610719578063cb63179714610739578063ce3f471914610759578063d98e620e1461076c578063dac83d291461078c578063dc311dd3146107ac578063e72f6e30146107dd578063ee9d2d38146107fd578063f2fde38b1461082a575b600080fd5b3480156101f157600080fd5b506101fa61084a565b604051610209939291906156e5565b60405180910390f35b34801561021e57600080fd5b50600c546102839061ffff81169063ffffffff62010000820481169160ff600160301b8204811692600160381b8304811692600160581b8104821692600160781b8204831692600160981b83041691600160b81b8104821691600160c01b9091041689565b6040805161ffff909a168a5263ffffffff98891660208b01529615159689019690965293861660608801529185166080870152841660a08601529290921660c084015260ff91821660e08401521661010082015261012001610209565b3480156102ec57600080fd5b506103006102fb366004615358565b6108c6565b005b34801561030e57600080fd5b5061031760c881565b60405161ffff9091168152602001610209565b34801561033657600080fd5b50600a5461035190600160601b90046001600160601b031681565b6040516001600160601b039091168152602001610209565b34801561037557600080fd5b50600254610389906001600160a01b031681565b6040516102099190615589565b3480156103a257600080fd5b5060405160028152602001610209565b3480156103be57600080fd5b506103006103cd366004614e72565b61090e565b3480156103de57600080fd5b506103516103ed366004615029565b610a5a565b3480156103fe57600080fd5b5061030061040d366004615358565b610ef0565b34801561041e57600080fd5b506104286101f481565b60405163ffffffff9091168152602001610209565b34801561044957600080fd5b5061045d61045836600461533f565b6112c1565b6040519015158152602001610209565b34801561047957600080fd5b50610300610488366004614e72565b611462565b34801561049957600080fd5b506103006104a8366004614e72565b6115f0565b3480156104b957600080fd5b50610317606481565b3480156104ce57600080fd5b506103006104dd366004614e8f565b6116a7565b3480156104ee57600080fd5b506103897f000000000000000000000000000000000000000000000000000000000000000081565b34801561052257600080fd5b50600354610389906001600160a01b031681565b34801561054257600080fd5b50610300611707565b34801561055757600080fd5b50610300610566366004614f23565b6117b1565b34801561057757600080fd5b50610300610586366004614e72565b6118aa565b34801561059757600080fd5b50600a54610351906001600160601b031681565b3480156105b757600080fd5b506000546001600160a01b0316610389565b6103006105d736600461533f565b6119b6565b3480156105e857600080fd5b506105fc6105f7366004615117565b611ad7565b604051908152602001610209565b34801561061657600080fd5b5060075461062a906001600160401b031681565b604051610209919061587e565b34801561064357600080fd5b506105fc611e23565b34801561065857600080fd5b50610300610667366004614ec8565b611ff6565b34801561067857600080fd5b5061030061068736600461529e565b612170565b34801561069857600080fd5b506103006106a736600461533f565b612379565b3480156106b857600080fd5b506106cc6106c736600461537d565b6123c1565b6040516102099190615600565b3480156106e557600080fd5b506103006106f436600461533f565b6124c3565b34801561070557600080fd5b50610300610714366004615358565b6125b8565b34801561072557600080fd5b506105fc610734366004614f4b565b6126c4565b34801561074557600080fd5b50610300610754366004615358565b6126f4565b610300610767366004614f9d565b612965565b34801561077857600080fd5b506105fc61078736600461533f565b612c7c565b34801561079857600080fd5b506103006107a7366004615358565b612c9d565b3480156107b857600080fd5b506107cc6107c736600461533f565b612d33565b604051610209959493929190615892565b3480156107e957600080fd5b506103006107f8366004614e72565b612e21565b34801561080957600080fd5b506105fc61081836600461533f565b600f6020526000908152604090205481565b34801561083657600080fd5b50610300610845366004614e72565b612ffc565b600c54600e805460408051602080840282018101909252828152600094859460609461ffff8316946201000090930463ffffffff169391928391908301828280156108b457602002820191906000526020600020905b8154815260200190600101908083116108a0575b50505050509050925092509250909192565b816108d081613010565b6108d8613071565b6108e1836112c1565b156108ff57604051631685ecdd60e31b815260040160405180910390fd5b610909838361309e565b505050565b610916613071565b61091e613252565b600b54600160601b90046001600160601b031661094e57604051631e9acf1760e31b815260040160405180910390fd5b600b8054600160601b90046001600160601b0316908190600c6109718380615a78565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555080600a600c8282829054906101000a90046001600160601b03166109b99190615a78565b92506101000a8154816001600160601b0302191690836001600160601b031602179055506000826001600160a01b0316826001600160601b031660405160006040518083038185875af1925050503d8060008114610a33576040519150601f19603f3d011682016040523d82523d6000602084013e610a38565b606091505b50509050806109095760405163950b247960e01b815260040160405180910390fd5b6000610a64613071565b60005a90506000610a7586866132a5565b90506000856060015163ffffffff166001600160401b03811115610a9b57610a9b615b83565b604051908082528060200260200182016040528015610ac4578160200160208202803683370190505b50905060005b866060015163ffffffff16811015610b3b57826040015181604051602001610af3929190615613565b6040516020818303038152906040528051906020012060001c828281518110610b1e57610b1e615b6d565b602090810291909101015280610b3381615afc565b915050610aca565b50602080830180516000908152600f9092526040808320839055905190518291631fe543e360e01b91610b739190869060240161576f565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252600c805460ff60301b1916600160301b1790559089015160808a0151919250600091610bd89163ffffffff169084613510565b600c805460ff60301b1916905560208a810151600090815260069091526040902054909150600160c01b90046001600160401b0316610c188160016159ea565b6020808c0151600090815260069091526040812080546001600160401b0393909316600160c01b026001600160c01b039093169290921790915560a08b01518051610c6590600190615a61565b81518110610c7557610c75615b6d565b602091010151600c5460f89190911c6001149150600090610ca6908a90600160581b900463ffffffff163a8561355c565b90508115610d9e576020808d01516000908152600690915260409020546001600160601b03808316600160601b909204161015610cf657604051631e9acf1760e31b815260040160405180910390fd5b60208c81015160009081526006909152604090208054829190600c90610d2d908490600160601b90046001600160601b0316615a78565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555080600b600c8282829054906101000a90046001600160601b0316610d759190615a0c565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550610e79565b6020808d01516000908152600690915260409020546001600160601b0380831691161015610ddf57604051631e9acf1760e31b815260040160405180910390fd5b6020808d015160009081526006909152604081208054839290610e0c9084906001600160601b0316615a78565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555080600b60008282829054906101000a90046001600160601b0316610e549190615a0c565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505b8b6020015188602001517f49580fdfd9497e1ed5c1b1cec0495087ae8e3f1267470ec2fb015db32e3d6aa78a604001518488604051610ed6939291909283526001600160601b039190911660208301521515604082015260600190565b60405180910390a3985050505050505050505b9392505050565b610ef8613071565b610f01816135ab565b610f295780604051635428d44960e01b8152600401610f209190615589565b60405180910390fd5b600080600080610f3886612d33565b945094505093509350336001600160a01b0316826001600160a01b031614610f9b5760405162461bcd60e51b81526020600482015260166024820152752737ba1039bab139b1b934b83a34b7b71037bbb732b960511b6044820152606401610f20565b610fa4866112c1565b15610fea5760405162461bcd60e51b815260206004820152601660248201527550656e64696e6720726571756573742065786973747360501b6044820152606401610f20565b60006040518060c00160405280610fff600290565b60ff168152602001888152602001846001600160a01b03168152602001838152602001866001600160601b03168152602001856001600160601b031681525090506000816040516020016110539190615652565b604051602081830303815290604052905061106d88613615565b505060405163ce3f471960e01b81526001600160a01b0388169063ce3f4719906001600160601b038816906110a690859060040161563f565b6000604051808303818588803b1580156110bf57600080fd5b505af11580156110d3573d6000803e3d6000fd5b50506002546001600160a01b0316158015935091506110fc905057506001600160601b03861615155b156111c65760025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611133908a908a906004016155d0565b602060405180830381600087803b15801561114d57600080fd5b505af1158015611161573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111859190614f67565b6111c65760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b6044820152606401610f20565b600c805460ff60301b1916600160301b17905560005b835181101561126f578381815181106111f7576111f7615b6d565b60200260200101516001600160a01b0316638ea98117896040518263ffffffff1660e01b815260040161122a9190615589565b600060405180830381600087803b15801561124457600080fd5b505af1158015611258573d6000803e3d6000fd5b50505050808061126790615afc565b9150506111dc565b50600c805460ff60301b191690556040517fd63ca8cb945956747ee69bfdc3ea754c24a4caf7418db70e46052f7850be4187906112af9089908b9061559d565b60405180910390a15050505050505050565b6000818152600560209081526040808320815160608101835281546001600160a01b039081168252600183015416818501526002820180548451818702810187018652818152879693958601939092919083018282801561134b57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161132d575b505050505081525050905060005b8160400151518110156114585760005b600e5481101561144557600061140e600e838154811061138b5761138b615b6d565b9060005260206000200154856040015185815181106113ac576113ac615b6d565b60200260200101518860046000896040015189815181106113cf576113cf615b6d565b6020908102919091018101516001600160a01b0316825281810192909252604090810160009081208d82529092529020546001600160401b03166137bd565b506000818152600f6020526040902054909150156114325750600195945050505050565b508061143d81615afc565b915050611369565b508061145081615afc565b915050611359565b5060009392505050565b61146a613071565b611472613252565b6002546001600160a01b031661149b5760405163c1f0c0a160e01b815260040160405180910390fd5b600b546001600160601b03166114c457604051631e9acf1760e31b815260040160405180910390fd5b600b80546001600160601b031690819060006114e08380615a78565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555080600a60008282829054906101000a90046001600160601b03166115289190615a78565b82546001600160601b039182166101009390930a92830291909202199091161790555060025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb9061157d90859085906004016155d0565b602060405180830381600087803b15801561159757600080fd5b505af11580156115ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115cf9190614f67565b6115ec57604051631e9acf1760e31b815260040160405180910390fd5b5050565b6115f8613252565b611601816135ab565b15611621578060405163ac8a27ef60e01b8152600401610f209190615589565b601280546001810182556000919091527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440180546001600160a01b0319166001600160a01b0383161790556040517fb7cabbfc11e66731fc77de0444614282023bcbd41d16781c753a431d0af016259061169c908390615589565b60405180910390a150565b6116af613252565b6002546001600160a01b0316156116d957604051631688c53760e11b815260040160405180910390fd5b600280546001600160a01b039384166001600160a01b03199182161790915560038054929093169116179055565b6001546001600160a01b0316331461175a5760405162461bcd60e51b815260206004820152601660248201527526bab9ba10313290383937b837b9b2b21037bbb732b960511b6044820152606401610f20565b60008054336001600160a01b0319808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6117b9613252565b6040805180820182526000916117e89190849060029083908390808284376000920191909152506126c4915050565b6000818152600d602052604090205490915060ff161561181e57604051634a0b8fa760e01b815260048101829052602401610f20565b6000818152600d6020526040808220805460ff19166001908117909155600e805491820181559092527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd909101829055517fc9583fd3afa3d7f16eb0b88d0268e7d05c09bafa4b21e092cbd1320e1bc8089d9061189e9083815260200190565b60405180910390a15050565b6118b2613252565b600a544790600160601b90046001600160601b0316818111156118ec5780826040516354ced18160e11b8152600401610f20929190615613565b818110156109095760006119008284615a61565b90506000846001600160a01b03168260405160006040518083038185875af1925050503d806000811461194f576040519150601f19603f3d011682016040523d82523d6000602084013e611954565b606091505b50509050806119765760405163950b247960e01b815260040160405180910390fd5b7f4aed7c8eed0496c8c19ea2681fcca25741c1602342e38b045d9f1e8e905d2e9c85836040516119a792919061559d565b60405180910390a15050505050565b6119be613071565b6000818152600560205260409020546001600160a01b03166119f357604051630fb532db60e11b815260040160405180910390fd5b60008181526006602052604090208054600160601b90046001600160601b0316903490600c611a228385615a0c565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555034600a600c8282829054906101000a90046001600160601b0316611a6a9190615a0c565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550817f7603b205d03651ee812f803fccde89f1012e545a9c99f0abfea9cedd0fd8e902823484611abd91906159d2565b604051611acb929190615613565b60405180910390a25050565b6000611ae1613071565b6020808301356000908152600590915260409020546001600160a01b0316611b1c57604051630fb532db60e11b815260040160405180910390fd5b3360009081526004602090815260408083208583013584529091529020546001600160401b031680611b69578260200135336040516379bfd40160e01b8152600401610f20929190615744565b600c5461ffff16611b806060850160408601615283565b61ffff161080611ba3575060c8611b9d6060850160408601615283565b61ffff16115b15611bdd57611bb86060840160408501615283565b600c5460405163539c34bb60e11b8152610f20929161ffff169060c8906004016156c7565b600c5462010000900463ffffffff16611bfc608085016060860161539f565b63ffffffff161115611c4257611c18608084016060850161539f565b600c54604051637aebf00f60e11b8152610f20929162010000900463ffffffff1690600401615867565b6101f4611c5560a085016080860161539f565b63ffffffff161115611c8f57611c7160a084016080850161539f565b6101f46040516311ce1afb60e21b8152600401610f20929190615867565b6000611c9c8260016159ea565b9050600080611cb28635336020890135866137bd565b90925090506000611cce611cc960a08901896158e7565b613846565b90506000611cdb826138c3565b905083611ce6613934565b60208a0135611cfb60808c0160608d0161539f565b611d0b60a08d0160808e0161539f565b3386604051602001611d2397969594939291906157c7565b60405160208183030381529060405280519060200120600f600086815260200190815260200160002081905550336001600160a01b0316886020013589600001357feb0e3652e0f44f417695e6e90f2f42c99b65cd7169074c5a654b16b9748c3a4e87878d6040016020810190611d9a9190615283565b8e6060016020810190611dad919061539f565b8f6080016020810190611dc0919061539f565b89604051611dd396959493929190615788565b60405180910390a45050336000908152600460209081526040808320898301358452909152902080546001600160401b0319166001600160401b039490941693909317909255925050505b919050565b6000611e2d613071565b6007546001600160401b031633611e45600143615a61565b6040516001600160601b0319606093841b81166020830152914060348201523090921b1660548201526001600160c01b031960c083901b16606882015260700160408051601f1981840301815291905280516020909101209150611eaa8160016159ea565b600780546001600160401b0319166001600160401b03928316179055604080516000808252608082018352602080830182815283850183815260608086018581528a86526006855287862093518454935191516001600160601b039182166001600160c01b031990951694909417600160601b9190921602176001600160c01b0316600160c01b9290981691909102969096179055835194850184523385528481018281528585018481528884526005835294909220855181546001600160a01b03199081166001600160a01b039283161783559351600183018054909516911617909255925180519294939192611fa89260028501920190614b36565b50611fb8915060089050846139c4565b50827f1d3015d7ba850fa198dc7b1a3f5d42779313a681035f77c8c03764c61005518d33604051611fe99190615589565b60405180910390a2505090565b611ffe613071565b6002546001600160a01b03163314612029576040516344b0e3c360e01b815260040160405180910390fd5b6020811461204a57604051638129bbcd60e01b815260040160405180910390fd5b60006120588284018461533f565b6000818152600560205260409020549091506001600160a01b031661209057604051630fb532db60e11b815260040160405180910390fd5b600081815260066020526040812080546001600160601b0316918691906120b78385615a0c565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555084600a60008282829054906101000a90046001600160601b03166120ff9190615a0c565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550817f1ced9348ff549fceab2ac57cd3a9de38edaaab274b725ee82c23e8fc8c4eec7a82878461215291906159d2565b604051612160929190615613565b60405180910390a2505050505050565b612178613252565b60c861ffff8a1611156121a557888960c860405163539c34bb60e11b8152600401610f20939291906156c7565b600085136121c9576040516321ea67b360e11b815260048101869052602401610f20565b604080516101208101825261ffff8b1680825263ffffffff808c16602084018190526000848601528b8216606085018190528b8316608086018190528a841660a08701819052938a1660c0870181905260ff808b1660e08901819052908a16610100909801889052600c8054600160c01b90990260ff60c01b19600160b81b9093029290921661ffff60b81b19600160981b90940263ffffffff60981b19600160781b90990298909816600160781b600160b81b0319600160581b90960263ffffffff60581b19600160381b90980297909716600160301b600160781b03196201000090990265ffffffffffff19909c16909a179a909a1796909616979097179390931791909116959095179290921793909316929092179190911790556010869055517f95cb2ddab6d2297c29a4861691de69b3969c464aa4a9c44258b101ff02ff375a90612366908b908b908b908b908b908990899061ffff97909716875263ffffffff95861660208801529385166040870152919093166060850152608084019290925260ff91821660a08401521660c082015260e00190565b60405180910390a1505050505050505050565b612381613252565b6000818152600560205260409020546001600160a01b0316806123b757604051630fb532db60e11b815260040160405180910390fd5b6115ec828261309e565b606060006123cf60086139d0565b90508084106123f157604051631390f2a160e01b815260040160405180910390fd5b60006123fd84866159d2565b90508181118061240b575083155b6124155780612417565b815b905060006124258683615a61565b9050806001600160401b0381111561243f5761243f615b83565b604051908082528060200260200182016040528015612468578160200160208202803683370190505b50935060005b818110156124b85761248b61248388836159d2565b6008906139da565b85828151811061249d5761249d615b6d565b60209081029190910101526124b181615afc565b905061246e565b505050505b92915050565b6124cb613071565b6000818152600560205260409020546001600160a01b03168061250157604051630fb532db60e11b815260040160405180910390fd5b6000828152600560205260409020600101546001600160a01b03163314612558576000828152600560205260409081902060010154905163d084e97560e01b8152610f20916001600160a01b031690600401615589565b600082815260056020526040908190208054336001600160a01b031991821681178355600190920180549091169055905183917fd4114ab6e9af9f597c52041f32d62dc57c5c4e4c0d4427006069635e216c938691611acb9185916155b6565b816125c281613010565b6125ca613071565b60008381526005602052604090206002018054606414156125fe576040516305a48e0f60e01b815260040160405180910390fd5b6001600160a01b038316600090815260046020908152604080832087845291829052909120546001600160401b031615612639575050505050565b600085815260208281526040808320805460016001600160401b0319909116811790915585549081018655858452919092200180546001600160a01b0319166001600160a01b0387161790555185907f1e980d04aa7648e205713e5e8ea3808672ac163d10936d36f91b2c88ac1575e1906126b5908790615589565b60405180910390a25050505050565b6000816040516020016126d791906155f2565b604051602081830303815290604052805190602001209050919050565b816126fe81613010565b612706613071565b61270f836112c1565b1561272d57604051631685ecdd60e31b815260040160405180910390fd5b6001600160a01b03821660009081526004602090815260408083208684529091529020546001600160401b031661277b5782826040516379bfd40160e01b8152600401610f20929190615744565b6000838152600560209081526040808320600201805482518185028101850190935280835291929091908301828280156127de57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116127c0575b505050505090506000600182516127f59190615a61565b905060005b825181101561290157846001600160a01b031683828151811061281f5761281f615b6d565b60200260200101516001600160a01b031614156128ef57600083838151811061284a5761284a615b6d565b602002602001015190508060056000898152602001908152602001600020600201838154811061287c5761287c615b6d565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394909416939093179092558881526005909152604090206002018054806128c7576128c7615b57565b600082815260209020810160001990810180546001600160a01b031916905501905550612901565b806128f981615afc565b9150506127fa565b506001600160a01b03841660009081526004602090815260408083208884529091529081902080546001600160401b03191690555185907f32158c6058347c1601b2d12bc696ac6901d8a9a9aa3ba10c27ab0a983e8425a7906126b5908790615589565b600061297382840184615151565b9050806000015160ff166001146129ac57805160405163237d181f60e21b815260ff909116600482015260016024820152604401610f20565b8060a001516001600160601b031634146129f05760a08101516040516306acf13560e41b81523460048201526001600160601b039091166024820152604401610f20565b6020808201516000908152600590915260409020546001600160a01b031615612a2c576040516326afa43560e11b815260040160405180910390fd5b60005b816060015151811015612acc5760016004600084606001518481518110612a5857612a58615b6d565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008460200151815260200190815260200160002060006101000a8154816001600160401b0302191690836001600160401b031602179055508080612ac490615afc565b915050612a2f565b50604080516060808201835260808401516001600160601b03908116835260a0850151811660208085019182526000858701818152828901805183526006845288832097518854955192516001600160401b0316600160c01b026001600160c01b03938816600160601b026001600160c01b0319909716919097161794909417169390931790945584518084018652868601516001600160a01b03908116825281860184815294880151828801908152925184526005865295909220825181549087166001600160a01b0319918216178255935160018201805491909716941693909317909455925180519192612bcb92600285019290910190614b36565b5050506080810151600a8054600090612bee9084906001600160601b0316615a0c565b92506101000a8154816001600160601b0302191690836001600160601b031602179055508060a00151600a600c8282829054906101000a90046001600160601b0316612c3a9190615a0c565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550612c76816020015160086139c490919063ffffffff16565b50505050565b600e8181548110612c8c57600080fd5b600091825260209091200154905081565b81612ca781613010565b612caf613071565b600083815260056020526040902060018101546001600160a01b03848116911614612c76576001810180546001600160a01b0319166001600160a01b03851617905560405184907f21a4dad170a6bf476c31bbcf4a16628295b0e450672eec25d7c93308e05344a190612d2590339087906155b6565b60405180910390a250505050565b600081815260056020526040812054819081906001600160a01b0316606081612d6f57604051630fb532db60e11b815260040160405180910390fd5b600086815260066020908152604080832054600583529281902060020180548251818502810185019093528083526001600160601b0380861695600160601b810490911694600160c01b9091046001600160401b0316938893929091839190830182828015612e0757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612de9575b505050505090509450945094509450945091939590929450565b612e29613252565b6002546001600160a01b0316612e525760405163c1f0c0a160e01b815260040160405180910390fd5b6002546040516370a0823160e01b81526000916001600160a01b0316906370a0823190612e83903090600401615589565b60206040518083038186803b158015612e9b57600080fd5b505afa158015612eaf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ed39190614f84565b600a549091506001600160601b031681811115612f075780826040516354ced18160e11b8152600401610f20929190615613565b81811015610909576000612f1b8284615a61565b60025460405163a9059cbb60e01b81529192506001600160a01b03169063a9059cbb90612f4e908790859060040161559d565b602060405180830381600087803b158015612f6857600080fd5b505af1158015612f7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fa09190614f67565b612fbd57604051631f01ff1360e21b815260040160405180910390fd5b7f59bfc682b673f8cbf945f1e454df9334834abf7dfe7f92237ca29ecb9b4366008482604051612fee92919061559d565b60405180910390a150505050565b613004613252565b61300d816139e6565b50565b6000818152600560205260409020546001600160a01b03168061304657604051630fb532db60e11b815260040160405180910390fd5b336001600160a01b038216146115ec5780604051636c51fda960e11b8152600401610f209190615589565b600c54600160301b900460ff161561309c5760405163769dd35360e11b815260040160405180910390fd5b565b6000806130aa84613615565b60025491935091506001600160a01b0316158015906130d157506001600160601b03821615155b156131805760025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906131119086906001600160601b0387169060040161559d565b602060405180830381600087803b15801561312b57600080fd5b505af115801561313f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131639190614f67565b61318057604051631e9acf1760e31b815260040160405180910390fd5b6000836001600160a01b0316826001600160601b031660405160006040518083038185875af1925050503d80600081146131d6576040519150601f19603f3d011682016040523d82523d6000602084013e6131db565b606091505b50509050806131fd5760405163950b247960e01b815260040160405180910390fd5b604080516001600160a01b03861681526001600160601b03808616602083015284169181019190915285907f8c74ce8b8cf87f5eb001275c8be27eb34ea2b62bfab6814fcc62192bb63e81c4906060016126b5565b6000546001600160a01b0316331461309c5760405162461bcd60e51b815260206004820152601660248201527527b7363c9031b0b63630b1363290313c9037bbb732b960511b6044820152606401610f20565b604080516060810182526000808252602082018190529181019190915260006132d184600001516126c4565b6000818152600d602052604090205490915060ff1661330657604051631dfd6e1360e21b815260048101829052602401610f20565b600081856080015160405160200161331f929190615613565b60408051601f1981840301815291815281516020928301206000818152600f9093529120549091508061336557604051631b44092560e11b815260040160405180910390fd5b845160208087015160408089015160608a015160808b015160a08c01519351613394978a979096959101615813565b6040516020818303038152906040528051906020012081146133c95760405163354a450b60e21b815260040160405180910390fd5b60006133d88660000151613a8a565b90508061349f578551604051631d2827a760e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163e9413d389161342c919060040161587e565b60206040518083038186803b15801561344457600080fd5b505afa158015613458573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061347c9190614f84565b90508061349f57855160405163175dadad60e01b8152610f20919060040161587e565b60008760800151826040516020016134c1929190918252602082015260400190565b6040516020818303038152906040528051906020012060001c905060006134e88983613b67565b6040805160608101825297885260208801969096529486019490945250929695505050505050565b60005a61138881101561352257600080fd5b61138881039050846040820482031161353a57600080fd5b50823b61354657600080fd5b60008083516020850160008789f1949350505050565b60008115613589576011546135829086908690600160201b900463ffffffff1686613bd2565b90506135a3565b6011546135a0908690869063ffffffff1686613c74565b90505b949350505050565b6000805b60125481101561360c57826001600160a01b0316601282815481106135d6576135d6615b6d565b6000918252602090912001546001600160a01b031614156135fa5750600192915050565b8061360481615afc565b9150506135af565b50600092915050565b60008181526005602090815260408083206006909252822054600290910180546001600160601b0380841694600160601b90940416925b818110156136b7576004600084838154811061366a5761366a615b6d565b60009182526020808320909101546001600160a01b031683528281019390935260409182018120898252909252902080546001600160401b03191690556136b081615afc565b905061364c565b50600085815260056020526040812080546001600160a01b031990811682556001820180549091169055906136ef6002830182614b9b565b505060008581526006602052604081205561370b600886613d99565b506001600160601b0384161561375e57600a80548591906000906137399084906001600160601b0316615a78565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505b6001600160601b038316156137b65782600a600c8282829054906101000a90046001600160601b03166137919190615a78565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505b5050915091565b60408051602081018690526001600160a01b03851691810191909152606081018390526001600160401b03821660808201526000908190819060a00160408051601f198184030181529082905280516020918201209250613822918991849101615613565b60408051808303601f19018152919052805160209091012097909650945050505050565b6040805160208101909152600081528161386f57506040805160208101909152600081526124bd565b63125fa26760e31b6138818385615aa0565b6001600160e01b031916146138a957604051632923fee760e11b815260040160405180910390fd5b6138b682600481866159a8565b810190610ee99190614fde565b60607f92fd13387c7fe7befbc38d303d6468778fb9731bc4583f17d92989c6fcfdeaaa826040516024016138fc91511515815260200190565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915292915050565b60004661394081613da5565b156139bd5760646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561397f57600080fd5b505afa158015613993573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139b79190614f84565b91505090565b4391505090565b6000610ee98383613dc8565b60006124bd825490565b6000610ee98383613e17565b6001600160a01b038116331415613a395760405162461bcd60e51b815260206004820152601760248201527621b0b73737ba103a3930b739b332b9103a379039b2b63360491b6044820152606401610f20565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600046613a9681613da5565b15613b5857610100836001600160401b0316613ab0613934565b613aba9190615a61565b1180613ad65750613ac9613934565b836001600160401b031610155b15613ae45750600092915050565b6040516315a03d4160e11b8152606490632b407a8290613b0890869060040161587e565b60206040518083038186803b158015613b2057600080fd5b505afa158015613b34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee99190614f84565b50506001600160401b03164090565b6000613b9b8360000151846020015185604001518660600151868860a001518960c001518a60e001518b6101000151613e41565b60038360200151604051602001613bb392919061575b565b60408051601f1981840301815291905280516020909101209392505050565b600080613c156000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061405c92505050565b905060005a613c2488886159d2565b613c2e9190615a61565b613c389085615a42565b90506000613c5163ffffffff871664e8d4a51000615a42565b905082613c5e82846159d2565b613c6891906159d2565b98975050505050505050565b600080613c7f614121565b905060008113613ca5576040516321ea67b360e11b815260048101829052602401610f20565b6000613ce76000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061405c92505050565b9050600082825a613cf88b8b6159d2565b613d029190615a61565b613d0c9088615a42565b613d1691906159d2565b613d2890670de0b6b3a7640000615a42565b613d329190615a2e565b90506000613d4b63ffffffff881664e8d4a51000615a42565b9050613d6281676765c793fa10079d601b1b615a61565b821115613d825760405163e80fa38160e01b815260040160405180910390fd5b613d8c81836159d2565b9998505050505050505050565b6000610ee983836141ec565b600061a4b1821480613db9575062066eed82145b806124bd57505062066eee1490565b6000818152600183016020526040812054613e0f575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556124bd565b5060006124bd565b6000826000018281548110613e2e57613e2e615b6d565b9060005260206000200154905092915050565b613e4a896142df565b613e935760405162461bcd60e51b815260206004820152601a6024820152797075626c6963206b6579206973206e6f74206f6e20637572766560301b6044820152606401610f20565b613e9c886142df565b613ee05760405162461bcd60e51b815260206004820152601560248201527467616d6d61206973206e6f74206f6e20637572766560581b6044820152606401610f20565b613ee9836142df565b613f355760405162461bcd60e51b815260206004820152601d60248201527f6347616d6d615769746e657373206973206e6f74206f6e2063757276650000006044820152606401610f20565b613f3e826142df565b613f895760405162461bcd60e51b815260206004820152601c60248201527b73486173685769746e657373206973206e6f74206f6e20637572766560201b6044820152606401610f20565b613f95878a88876143a2565b613fdd5760405162461bcd60e51b81526020600482015260196024820152786164647228632a706b2b732a6729213d5f755769746e65737360381b6044820152606401610f20565b6000613fe98a876144b6565b90506000613ffc898b878b86898961451a565b9050600061400d838d8d8a8661462d565b9050808a1461404e5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b210383937b7b360991b6044820152606401610f20565b505050505050505050505050565b60004661406881613da5565b156140a757606c6001600160a01b031663c6f7de0e6040518163ffffffff1660e01b815260040160206040518083038186803b158015613b2057600080fd5b6140b08161466d565b1561360c57600f602160991b016001600160a01b03166349948e0e84604051806080016040528060488152602001615bbd604891396040516020016140f69291906154df565b6040516020818303038152906040526040518263ffffffff1660e01b8152600401613b08919061563f565b600c5460035460408051633fabe5a360e21b81529051600093600160381b900463ffffffff169283151592859283926001600160a01b03169163feaf968c9160048083019260a0929190829003018186803b15801561417f57600080fd5b505afa158015614193573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141b791906153ba565b5094509092508491505080156141db57506141d28242615a61565b8463ffffffff16105b156135a35750601054949350505050565b600081815260018301602052604081205480156142d5576000614210600183615a61565b855490915060009061422490600190615a61565b905081811461428957600086600001828154811061424457614244615b6d565b906000526020600020015490508087600001848154811061426757614267615b6d565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061429a5761429a615b57565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506124bd565b60009150506124bd565b80516000906401000003d0191161432d5760405162461bcd60e51b8152602060048201526012602482015271696e76616c696420782d6f7264696e61746560701b6044820152606401610f20565b60208201516401000003d0191161437b5760405162461bcd60e51b8152602060048201526012602482015271696e76616c696420792d6f7264696e61746560701b6044820152606401610f20565b60208201516401000003d01990800961439b8360005b60200201516146a7565b1492915050565b60006001600160a01b0382166143e85760405162461bcd60e51b815260206004820152600b60248201526a626164207769746e65737360a81b6044820152606401610f20565b6020840151600090600116156143ff57601c614402565b601b5b9050600070014551231950b75fc4402da1732fc9bebe1985876000602002015109865170014551231950b75fc4402da1732fc9bebe199182039250600091908909875160408051600080825260209091019182905292935060019161446c91869188918790615621565b6020604051602081039080840390855afa15801561448e573d6000803e3d6000fd5b5050604051601f1901516001600160a01b039081169088161495505050505050949350505050565b6144be614bb9565b6144eb600184846040516020016144d793929190615568565b6040516020818303038152906040526146cb565b90505b6144f7816142df565b6124bd57805160408051602081019290925261451391016144d7565b90506144ee565b614522614bb9565b825186516401000003d01990819006910614156145815760405162461bcd60e51b815260206004820152601e60248201527f706f696e747320696e2073756d206d7573742062652064697374696e637400006044820152606401610f20565b61458c878988614719565b6145d15760405162461bcd60e51b8152602060048201526016602482015275119a5c9cdd081b5d5b0818da1958dac819985a5b195960521b6044820152606401610f20565b6145dc848685614719565b6146225760405162461bcd60e51b815260206004820152601760248201527614d958dbdb99081b5d5b0818da1958dac819985a5b1959604a1b6044820152606401610f20565b613c68868484614834565b60006002868686858760405160200161464b9695949392919061550e565b60408051601f1981840301815291905280516020909101209695505050505050565b6000600a82148061467f57506101a482145b8061468c575062aa37dc82145b80614698575061210582145b806124bd57505062014a331490565b6000806401000003d01980848509840990506401000003d019600782089392505050565b6146d3614bb9565b6146dc826148f7565b81526146f16146ec826000614391565b614932565b602082018190526002900660011415611e1e576020810180516401000003d019039052919050565b6000826147565760405162461bcd60e51b815260206004820152600b60248201526a3d32b9379039b1b0b630b960a91b6044820152606401610f20565b8351602085015160009061476c90600290615b17565b1561477857601c61477b565b601b5b9050600070014551231950b75fc4402da1732fc9bebe198387096040805160008082526020909101918290529192506001906147be908390869088908790615621565b6020604051602081039080840390855afa1580156147e0573d6000803e3d6000fd5b5050506020604051035190506000866040516020016147ff91906154cd565b60408051601f1981840301815291905280516020909101206001600160a01b0392831692169190911498975050505050505050565b61483c614bb9565b83516020808601518551918601516000938493849361485d93909190614952565b919450925090506401000003d0198582096001146148b95760405162461bcd60e51b815260206004820152601960248201527834b73b2d1036bab9ba1031329034b73b32b939b29037b3103d60391b6044820152606401610f20565b60405180604001604052806401000003d019806148d8576148d8615b41565b87860981526020016401000003d0198785099052979650505050505050565b805160208201205b6401000003d0198110611e1e576040805160208082019390935281518082038401815290820190915280519101206148ff565b60006124bd82600261494b6401000003d01960016159d2565b901c614a32565b60008080600180826401000003d019896401000003d019038808905060006401000003d0198b6401000003d019038a089050600061499283838585614ac9565b90985090506149a388828e88614aed565b90985090506149b488828c87614aed565b909850905060006149c78d878b85614aed565b90985090506149d888828686614ac9565b90985090506149e988828e89614aed565b9098509050818114614a1e576401000003d019818a0998506401000003d01982890997506401000003d0198183099650614a22565b8196505b5050505050509450945094915050565b600080614a3d614bd7565b6020808252818101819052604082015260608101859052608081018490526401000003d01960a0820152614a6f614bf5565b60208160c0846005600019fa925082614abf5760405162461bcd60e51b81526020600482015260126024820152716269674d6f64457870206661696c7572652160701b6044820152606401610f20565b5195945050505050565b6000806401000003d0198487096401000003d0198487099097909650945050505050565b600080806401000003d019878509905060006401000003d01987876401000003d019030990506401000003d0198183086401000003d01986890990999098509650505050505050565b828054828255906000526020600020908101928215614b8b579160200282015b82811115614b8b57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614b56565b50614b97929150614c13565b5090565b508054600082559060005260206000209081019061300d9190614c13565b60405180604001604052806002906020820280368337509192915050565b6040518060c001604052806006906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b5b80821115614b975760008155600101614c14565b8035611e1e81615b99565b600082601f830112614c4457600080fd5b604080519081016001600160401b0381118282101715614c6657614c66615b83565b8060405250808385604086011115614c7d57600080fd5b60005b6002811015614c9f578135835260209283019290910190600101614c80565b509195945050505050565b8035611e1e81615bae565b60008083601f840112614cc757600080fd5b5081356001600160401b03811115614cde57600080fd5b602083019150836020828501011115614cf657600080fd5b9250929050565b600082601f830112614d0e57600080fd5b81356001600160401b03811115614d2757614d27615b83565b614d3a601f8201601f1916602001615978565b818152846020838601011115614d4f57600080fd5b816020850160208301376000918101602001919091529392505050565b600060c08284031215614d7e57600080fd5b614d8661592d565b905081356001600160401b038082168214614da057600080fd5b81835260208401356020840152614db960408501614e1f565b6040840152614dca60608501614e1f565b6060840152614ddb60808501614c28565b608084015260a0840135915080821115614df457600080fd5b50614e0184828501614cfd565b60a08301525092915050565b803561ffff81168114611e1e57600080fd5b803563ffffffff81168114611e1e57600080fd5b803560ff81168114611e1e57600080fd5b80516001600160501b0381168114611e1e57600080fd5b80356001600160601b0381168114611e1e57600080fd5b600060208284031215614e8457600080fd5b8135610ee981615b99565b60008060408385031215614ea257600080fd5b8235614ead81615b99565b91506020830135614ebd81615b99565b809150509250929050565b60008060008060608587031215614ede57600080fd5b8435614ee981615b99565b93506020850135925060408501356001600160401b03811115614f0b57600080fd5b614f1787828801614cb5565b95989497509550505050565b600060408284031215614f3557600080fd5b82604083011115614f4557600080fd5b50919050565b600060408284031215614f5d57600080fd5b610ee98383614c33565b600060208284031215614f7957600080fd5b8151610ee981615bae565b600060208284031215614f9657600080fd5b5051919050565b60008060208385031215614fb057600080fd5b82356001600160401b03811115614fc657600080fd5b614fd285828601614cb5565b90969095509350505050565b600060208284031215614ff057600080fd5b604051602081016001600160401b038111828210171561501257615012615b83565b604052823561502081615bae565b81529392505050565b60008060008385036101e081121561504057600080fd5b6101a08082121561505057600080fd5b615058615955565b91506150648787614c33565b82526150738760408801614c33565b60208301526080860135604083015260a0860135606083015260c086013560808301526150a260e08701614c28565b60a08301526101006150b688828901614c33565b60c08401526150c9886101408901614c33565b60e0840152610180870135908301529093508401356001600160401b038111156150f257600080fd5b6150fe86828701614d6c565b92505061510e6101c08501614caa565b90509250925092565b60006020828403121561512957600080fd5b81356001600160401b0381111561513f57600080fd5b820160c08185031215610ee957600080fd5b6000602080838503121561516457600080fd5b82356001600160401b038082111561517b57600080fd5b9084019060c0828703121561518f57600080fd5b61519761592d565b6151a083614e33565b8152838301358482015260408301356151b881615b99565b60408201526060830135828111156151cf57600080fd5b8301601f810188136151e057600080fd5b8035838111156151f2576151f2615b83565b8060051b9350615203868501615978565b8181528681019083880186850189018c101561521e57600080fd5b600096505b8387101561524d578035945061523885615b99565b84835260019690960195918801918801615223565b5060608501525061526391505060808401614e5b565b608082015261527460a08401614e5b565b60a08201529695505050505050565b60006020828403121561529557600080fd5b610ee982614e0d565b60008060008060008060008060006101208a8c0312156152bd57600080fd5b6152c68a614e0d565b98506152d460208b01614e1f565b97506152e260408b01614e1f565b96506152f060608b01614e1f565b955060808a0135945061530560a08b01614e1f565b935061531360c08b01614e1f565b925061532160e08b01614e33565b91506153306101008b01614e33565b90509295985092959850929598565b60006020828403121561535157600080fd5b5035919050565b6000806040838503121561536b57600080fd5b823591506020830135614ebd81615b99565b6000806040838503121561539057600080fd5b50508035926020909101359150565b6000602082840312156153b157600080fd5b610ee982614e1f565b600080600080600060a086880312156153d257600080fd5b6153db86614e44565b94506020860151935060408601519250606086015191506153fe60808701614e44565b90509295509295909350565b600081518084526020808501945080840160005b838110156154435781516001600160a01b03168752958201959082019060010161541e565b509495945050505050565b8060005b6002811015612c76578151845260209384019390910190600101615452565b600081518084526020808501945080840160005b8381101561544357815187529582019590820190600101615485565b600081518084526154b9816020860160208601615ad0565b601f01601f19169290920160200192915050565b6154d7818361544e565b604001919050565b600083516154f1818460208801615ad0565b835190830190615505818360208801615ad0565b01949350505050565b86815261551e602082018761544e565b61552b606082018661544e565b61553860a082018561544e565b61554560e082018461544e565b60609190911b6001600160601b0319166101208201526101340195945050505050565b838152615578602082018461544e565b606081019190915260800192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039290921682526001600160601b0316602082015260400190565b604081016124bd828461544e565b602081526000610ee96020830184615471565b918252602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b602081526000610ee960208301846154a1565b6020815260ff82511660208201526020820151604082015260018060a01b0360408301511660608201526000606083015160c0608084015261569760e084018261540a565b60808501516001600160601b0390811660a0868101919091529095015190941660c0909301929092525090919050565b61ffff93841681529183166020830152909116604082015260600190565b60006060820161ffff86168352602063ffffffff86168185015260606040850152818551808452608086019150828701935060005b818110156157365784518352938301939183019160010161571a565b509098975050505050505050565b9182526001600160a01b0316602082015260400190565b82815260608101610ee9602083018461544e565b8281526040602082015260006135a36040830184615471565b86815285602082015261ffff85166040820152600063ffffffff808616606084015280851660808401525060c060a0830152613c6860c08301846154a1565b878152602081018790526040810186905263ffffffff8581166060830152841660808201526001600160a01b03831660a082015260e060c08201819052600090613d8c908301846154a1565b8781526001600160401b03871660208201526040810186905263ffffffff8581166060830152841660808201526001600160a01b03831660a082015260e060c08201819052600090613d8c908301846154a1565b63ffffffff92831681529116602082015260400190565b6001600160401b0391909116815260200190565b6001600160601b038681168252851660208201526001600160401b03841660408201526001600160a01b038316606082015260a0608082018190526000906158dc9083018461540a565b979650505050505050565b6000808335601e198436030181126158fe57600080fd5b8301803591506001600160401b0382111561591857600080fd5b602001915036819003821315614cf657600080fd5b60405160c081016001600160401b038111828210171561594f5761594f615b83565b60405290565b60405161012081016001600160401b038111828210171561594f5761594f615b83565b604051601f8201601f191681016001600160401b03811182821017156159a0576159a0615b83565b604052919050565b600080858511156159b857600080fd5b838611156159c557600080fd5b5050820193919092039150565b600082198211156159e5576159e5615b2b565b500190565b60006001600160401b0382811684821680830382111561550557615505615b2b565b60006001600160601b0382811684821680830382111561550557615505615b2b565b600082615a3d57615a3d615b41565b500490565b6000816000190483118215151615615a5c57615a5c615b2b565b500290565b600082821015615a7357615a73615b2b565b500390565b60006001600160601b0383811690831681811015615a9857615a98615b2b565b039392505050565b6001600160e01b03198135818116916004851015615ac85780818660040360031b1b83161692505b505092915050565b60005b83811015615aeb578181015183820152602001615ad3565b83811115612c765750506000910152565b6000600019821415615b1057615b10615b2b565b5060010190565b600082615b2657615b26615b41565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461300d57600080fd5b801515811461300d57600080fdfe307866666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666a164736f6c6343000806000a", + Bin: "0x60a06040523480156200001157600080fd5b5060405162005e7438038062005e74833981016040819052620000349162000183565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620000d7565b50505060601b6001600160601b031916608052620001b5565b6001600160a01b038116331415620001325760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000602082840312156200019657600080fd5b81516001600160a01b0381168114620001ae57600080fd5b9392505050565b60805160601c615c99620001db600039600081816104f401526134590152615c996000f3fe6080604052600436106101e05760003560e01c8062012291146101e5578063088070f5146102125780630ae09540146102e057806315c48b841461030257806318e3dd271461032a5780631b6b6d2314610369578063294daa49146103965780632f622e6b146103b2578063301f42e9146103d2578063405b84fa146103f257806340d6bb821461041257806341af6c871461043d57806351cff8d91461046d5780635d06b4ab1461048d57806364d51a2a146104ad57806365982744146104c2578063689c4517146104e257806372e9d5651461051657806379ba5097146105365780637bce14d11461054b5780638402595e1461056b57806386fe91c71461058b5780638da5cb5b146105ab57806395b55cfc146105c95780639b1c385e146105dc5780639d40a6fd1461060a578063a21a23e414610637578063a4c0ed361461064c578063a63e0bfb1461066c578063aa433aff1461068c578063aefb212f146106ac578063b2a7cac5146106d9578063bec4c08c146106f9578063caf70c4a14610719578063cb63179714610739578063ce3f471914610759578063d98e620e1461076c578063dac83d291461078c578063dc311dd3146107ac578063e72f6e30146107dd578063ee9d2d38146107fd578063f2fde38b1461082a575b600080fd5b3480156101f157600080fd5b506101fa61084a565b60405161020993929190615746565b60405180910390f35b34801561021e57600080fd5b50600c546102839061ffff81169063ffffffff62010000820481169160ff600160301b8204811692600160381b8304811692600160581b8104821692600160781b8204831692600160981b83041691600160b81b8104821691600160c01b9091041689565b6040805161ffff909a168a5263ffffffff98891660208b01529615159689019690965293861660608801529185166080870152841660a08601529290921660c084015260ff91821660e08401521661010082015261012001610209565b3480156102ec57600080fd5b506103006102fb3660046153b9565b6108c6565b005b34801561030e57600080fd5b5061031760c881565b60405161ffff9091168152602001610209565b34801561033657600080fd5b50600a5461035190600160601b90046001600160601b031681565b6040516001600160601b039091168152602001610209565b34801561037557600080fd5b50600254610389906001600160a01b031681565b60405161020991906155ea565b3480156103a257600080fd5b5060405160028152602001610209565b3480156103be57600080fd5b506103006103cd366004614ed3565b61090e565b3480156103de57600080fd5b506103516103ed36600461508a565b610a5a565b3480156103fe57600080fd5b5061030061040d3660046153b9565b610ef0565b34801561041e57600080fd5b506104286101f481565b60405163ffffffff9091168152602001610209565b34801561044957600080fd5b5061045d6104583660046153a0565b6112c1565b6040519015158152602001610209565b34801561047957600080fd5b50610300610488366004614ed3565b611467565b34801561049957600080fd5b506103006104a8366004614ed3565b6115f5565b3480156104b957600080fd5b50610317606481565b3480156104ce57600080fd5b506103006104dd366004614ef0565b6116ac565b3480156104ee57600080fd5b506103897f000000000000000000000000000000000000000000000000000000000000000081565b34801561052257600080fd5b50600354610389906001600160a01b031681565b34801561054257600080fd5b5061030061170c565b34801561055757600080fd5b50610300610566366004614f84565b6117b6565b34801561057757600080fd5b50610300610586366004614ed3565b6118af565b34801561059757600080fd5b50600a54610351906001600160601b031681565b3480156105b757600080fd5b506000546001600160a01b0316610389565b6103006105d73660046153a0565b6119bb565b3480156105e857600080fd5b506105fc6105f7366004615178565b611adc565b604051908152602001610209565b34801561061657600080fd5b5060075461062a906001600160401b031681565b60405161020991906158df565b34801561064357600080fd5b506105fc611e7b565b34801561065857600080fd5b50610300610667366004614f29565b61204e565b34801561067857600080fd5b506103006106873660046152ff565b6121c8565b34801561069857600080fd5b506103006106a73660046153a0565b6123d1565b3480156106b857600080fd5b506106cc6106c73660046153de565b612419565b6040516102099190615661565b3480156106e557600080fd5b506103006106f43660046153a0565b61251b565b34801561070557600080fd5b506103006107143660046153b9565b612610565b34801561072557600080fd5b506105fc610734366004614fac565b612702565b34801561074557600080fd5b506103006107543660046153b9565b612732565b610300610767366004614ffe565b61299d565b34801561077857600080fd5b506105fc6107873660046153a0565b612cdd565b34801561079857600080fd5b506103006107a73660046153b9565b612cfe565b3480156107b857600080fd5b506107cc6107c73660046153a0565b612d94565b6040516102099594939291906158f3565b3480156107e957600080fd5b506103006107f8366004614ed3565b612e82565b34801561080957600080fd5b506105fc6108183660046153a0565b600f6020526000908152604090205481565b34801561083657600080fd5b50610300610845366004614ed3565b61305d565b600c54600e805460408051602080840282018101909252828152600094859460609461ffff8316946201000090930463ffffffff169391928391908301828280156108b457602002820191906000526020600020905b8154815260200190600101908083116108a0575b50505050509050925092509250909192565b816108d081613071565b6108d86130d2565b6108e1836112c1565b156108ff57604051631685ecdd60e31b815260040160405180910390fd5b61090983836130ff565b505050565b6109166130d2565b61091e6132b3565b600b54600160601b90046001600160601b031661094e57604051631e9acf1760e31b815260040160405180910390fd5b600b8054600160601b90046001600160601b0316908190600c6109718380615ad9565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555080600a600c8282829054906101000a90046001600160601b03166109b99190615ad9565b92506101000a8154816001600160601b0302191690836001600160601b031602179055506000826001600160a01b0316826001600160601b031660405160006040518083038185875af1925050503d8060008114610a33576040519150601f19603f3d011682016040523d82523d6000602084013e610a38565b606091505b50509050806109095760405163950b247960e01b815260040160405180910390fd5b6000610a646130d2565b60005a90506000610a758686613306565b90506000856060015163ffffffff166001600160401b03811115610a9b57610a9b615c0b565b604051908082528060200260200182016040528015610ac4578160200160208202803683370190505b50905060005b866060015163ffffffff16811015610b3b57826040015181604051602001610af3929190615674565b6040516020818303038152906040528051906020012060001c828281518110610b1e57610b1e615bf5565b602090810291909101015280610b3381615b5d565b915050610aca565b50602080830180516000908152600f9092526040808320839055905190518291631fe543e360e01b91610b73919086906024016157d0565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252600c805460ff60301b1916600160301b1790559089015160808a0151919250600091610bd89163ffffffff169084613571565b600c805460ff60301b1916905560208a810151600090815260069091526040902054909150600160c01b90046001600160401b0316610c18816001615a4b565b6020808c0151600090815260069091526040812080546001600160401b0393909316600160c01b026001600160c01b039093169290921790915560a08b01518051610c6590600190615ac2565b81518110610c7557610c75615bf5565b602091010151600c5460f89190911c6001149150600090610ca6908a90600160581b900463ffffffff163a856135bd565b90508115610d9e576020808d01516000908152600690915260409020546001600160601b03808316600160601b909204161015610cf657604051631e9acf1760e31b815260040160405180910390fd5b60208c81015160009081526006909152604090208054829190600c90610d2d908490600160601b90046001600160601b0316615ad9565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555080600b600c8282829054906101000a90046001600160601b0316610d759190615a6d565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550610e79565b6020808d01516000908152600690915260409020546001600160601b0380831691161015610ddf57604051631e9acf1760e31b815260040160405180910390fd5b6020808d015160009081526006909152604081208054839290610e0c9084906001600160601b0316615ad9565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555080600b60008282829054906101000a90046001600160601b0316610e549190615a6d565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505b8b6020015188602001517f49580fdfd9497e1ed5c1b1cec0495087ae8e3f1267470ec2fb015db32e3d6aa78a604001518488604051610ed6939291909283526001600160601b039190911660208301521515604082015260600190565b60405180910390a3985050505050505050505b9392505050565b610ef86130d2565b610f018161360c565b610f295780604051635428d44960e01b8152600401610f2091906155ea565b60405180910390fd5b600080600080610f3886612d94565b945094505093509350336001600160a01b0316826001600160a01b031614610f9b5760405162461bcd60e51b81526020600482015260166024820152752737ba1039bab139b1b934b83a34b7b71037bbb732b960511b6044820152606401610f20565b610fa4866112c1565b15610fea5760405162461bcd60e51b815260206004820152601660248201527550656e64696e6720726571756573742065786973747360501b6044820152606401610f20565b60006040518060c00160405280610fff600290565b60ff168152602001888152602001846001600160a01b03168152602001838152602001866001600160601b03168152602001856001600160601b0316815250905060008160405160200161105391906156b3565b604051602081830303815290604052905061106d88613676565b505060405163ce3f471960e01b81526001600160a01b0388169063ce3f4719906001600160601b038816906110a69085906004016156a0565b6000604051808303818588803b1580156110bf57600080fd5b505af11580156110d3573d6000803e3d6000fd5b50506002546001600160a01b0316158015935091506110fc905057506001600160601b03861615155b156111c65760025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611133908a908a90600401615631565b602060405180830381600087803b15801561114d57600080fd5b505af1158015611161573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111859190614fc8565b6111c65760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b6044820152606401610f20565b600c805460ff60301b1916600160301b17905560005b835181101561126f578381815181106111f7576111f7615bf5565b60200260200101516001600160a01b0316638ea98117896040518263ffffffff1660e01b815260040161122a91906155ea565b600060405180830381600087803b15801561124457600080fd5b505af1158015611258573d6000803e3d6000fd5b50505050808061126790615b5d565b9150506111dc565b50600c805460ff60301b191690556040517fd63ca8cb945956747ee69bfdc3ea754c24a4caf7418db70e46052f7850be4187906112af9089908b906155fe565b60405180910390a15050505050505050565b6000818152600560209081526040808320815160608101835281546001600160a01b039081168252600183015416818501526002820180548451818702810187018652818152879693958601939092919083018282801561134b57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161132d575b505050505081525050905060005b81604001515181101561145d5760005b600e5481101561144a576000611413600e838154811061138b5761138b615bf5565b9060005260206000200154856040015185815181106113ac576113ac615bf5565b60200260200101518860046000896040015189815181106113cf576113cf615bf5565b6020908102919091018101516001600160a01b0316825281810192909252604090810160009081208d825290925290205461010090046001600160401b031661381e565b506000818152600f6020526040902054909150156114375750600195945050505050565b508061144281615b5d565b915050611369565b508061145581615b5d565b915050611359565b5060009392505050565b61146f6130d2565b6114776132b3565b6002546001600160a01b03166114a05760405163c1f0c0a160e01b815260040160405180910390fd5b600b546001600160601b03166114c957604051631e9acf1760e31b815260040160405180910390fd5b600b80546001600160601b031690819060006114e58380615ad9565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555080600a60008282829054906101000a90046001600160601b031661152d9190615ad9565b82546001600160601b039182166101009390930a92830291909202199091161790555060025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906115829085908590600401615631565b602060405180830381600087803b15801561159c57600080fd5b505af11580156115b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d49190614fc8565b6115f157604051631e9acf1760e31b815260040160405180910390fd5b5050565b6115fd6132b3565b6116068161360c565b15611626578060405163ac8a27ef60e01b8152600401610f2091906155ea565b601280546001810182556000919091527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440180546001600160a01b0319166001600160a01b0383161790556040517fb7cabbfc11e66731fc77de0444614282023bcbd41d16781c753a431d0af01625906116a19083906155ea565b60405180910390a150565b6116b46132b3565b6002546001600160a01b0316156116de57604051631688c53760e11b815260040160405180910390fd5b600280546001600160a01b039384166001600160a01b03199182161790915560038054929093169116179055565b6001546001600160a01b0316331461175f5760405162461bcd60e51b815260206004820152601660248201527526bab9ba10313290383937b837b9b2b21037bbb732b960511b6044820152606401610f20565b60008054336001600160a01b0319808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6117be6132b3565b6040805180820182526000916117ed919084906002908390839080828437600092019190915250612702915050565b6000818152600d602052604090205490915060ff161561182357604051634a0b8fa760e01b815260048101829052602401610f20565b6000818152600d6020526040808220805460ff19166001908117909155600e805491820181559092527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd909101829055517fc9583fd3afa3d7f16eb0b88d0268e7d05c09bafa4b21e092cbd1320e1bc8089d906118a39083815260200190565b60405180910390a15050565b6118b76132b3565b600a544790600160601b90046001600160601b0316818111156118f15780826040516354ced18160e11b8152600401610f20929190615674565b818110156109095760006119058284615ac2565b90506000846001600160a01b03168260405160006040518083038185875af1925050503d8060008114611954576040519150601f19603f3d011682016040523d82523d6000602084013e611959565b606091505b505090508061197b5760405163950b247960e01b815260040160405180910390fd5b7f4aed7c8eed0496c8c19ea2681fcca25741c1602342e38b045d9f1e8e905d2e9c85836040516119ac9291906155fe565b60405180910390a15050505050565b6119c36130d2565b6000818152600560205260409020546001600160a01b03166119f857604051630fb532db60e11b815260040160405180910390fd5b60008181526006602052604090208054600160601b90046001600160601b0316903490600c611a278385615a6d565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555034600a600c8282829054906101000a90046001600160601b0316611a6f9190615a6d565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550817f7603b205d03651ee812f803fccde89f1012e545a9c99f0abfea9cedd0fd8e902823484611ac29190615a33565b604051611ad0929190615674565b60405180910390a25050565b6000611ae66130d2565b6020808301356000908152600590915260409020546001600160a01b0316611b2157604051630fb532db60e11b815260040160405180910390fd5b3360009081526004602090815260408083208583013584528083529281902081518083019092525460ff811615158083526101009091046001600160401b03169282019290925290611b8e578360200135336040516379bfd40160e01b8152600401610f209291906157a5565b600c5461ffff16611ba560608601604087016152e4565b61ffff161080611bc8575060c8611bc260608601604087016152e4565b61ffff16115b15611c0257611bdd60608501604086016152e4565b600c5460405163539c34bb60e11b8152610f20929161ffff169060c890600401615728565b600c5462010000900463ffffffff16611c216080860160608701615400565b63ffffffff161115611c6757611c3d6080850160608601615400565b600c54604051637aebf00f60e11b8152610f20929162010000900463ffffffff16906004016158c8565b6101f4611c7a60a0860160808701615400565b63ffffffff161115611cb457611c9660a0850160808601615400565b6101f46040516311ce1afb60e21b8152600401610f209291906158c8565b806020018051611cc390615b78565b6001600160401b031690526020818101516000918291611ceb9188359133918a01359061381e565b90925090506000611d07611d0260a0890189615948565b6138a7565b90506000611d1482613924565b905083611d1f613995565b60208a0135611d3460808c0160608d01615400565b611d4460a08d0160808e01615400565b3386604051602001611d5c9796959493929190615828565b60405160208183030381529060405280519060200120600f600086815260200190815260200160002081905550336001600160a01b0316886020013589600001357feb0e3652e0f44f417695e6e90f2f42c99b65cd7169074c5a654b16b9748c3a4e87878d6040016020810190611dd391906152e4565b8e6060016020810190611de69190615400565b8f6080016020810190611df99190615400565b89604051611e0c969594939291906157e9565b60405180910390a4505033600090815260046020908152604080832089830135845282529091208451815492909501516001600160401b031661010002610100600160481b0319951515959095166001600160481b03199092169190911793909317909255925050505b919050565b6000611e856130d2565b6007546001600160401b031633611e9d600143615ac2565b6040516001600160601b0319606093841b81166020830152914060348201523090921b1660548201526001600160c01b031960c083901b16606882015260700160408051601f1981840301815291905280516020909101209150611f02816001615a4b565b600780546001600160401b0319166001600160401b03928316179055604080516000808252608082018352602080830182815283850183815260608086018581528a86526006855287862093518454935191516001600160601b039182166001600160c01b031990951694909417600160601b9190921602176001600160c01b0316600160c01b9290981691909102969096179055835194850184523385528481018281528585018481528884526005835294909220855181546001600160a01b03199081166001600160a01b0392831617835593516001830180549095169116179092559251805192949391926120009260028501920190614b97565b5061201091506008905084613a25565b50827f1d3015d7ba850fa198dc7b1a3f5d42779313a681035f77c8c03764c61005518d3360405161204191906155ea565b60405180910390a2505090565b6120566130d2565b6002546001600160a01b03163314612081576040516344b0e3c360e01b815260040160405180910390fd5b602081146120a257604051638129bbcd60e01b815260040160405180910390fd5b60006120b0828401846153a0565b6000818152600560205260409020549091506001600160a01b03166120e857604051630fb532db60e11b815260040160405180910390fd5b600081815260066020526040812080546001600160601b03169186919061210f8385615a6d565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555084600a60008282829054906101000a90046001600160601b03166121579190615a6d565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550817f1ced9348ff549fceab2ac57cd3a9de38edaaab274b725ee82c23e8fc8c4eec7a8287846121aa9190615a33565b6040516121b8929190615674565b60405180910390a2505050505050565b6121d06132b3565b60c861ffff8a1611156121fd57888960c860405163539c34bb60e11b8152600401610f2093929190615728565b60008513612221576040516321ea67b360e11b815260048101869052602401610f20565b604080516101208101825261ffff8b1680825263ffffffff808c16602084018190526000848601528b8216606085018190528b8316608086018190528a841660a08701819052938a1660c0870181905260ff808b1660e08901819052908a16610100909801889052600c8054600160c01b90990260ff60c01b19600160b81b9093029290921661ffff60b81b19600160981b90940263ffffffff60981b19600160781b90990298909816600160781b600160b81b0319600160581b90960263ffffffff60581b19600160381b90980297909716600160301b600160781b03196201000090990265ffffffffffff19909c16909a179a909a1796909616979097179390931791909116959095179290921793909316929092179190911790556010869055517f95cb2ddab6d2297c29a4861691de69b3969c464aa4a9c44258b101ff02ff375a906123be908b908b908b908b908b908990899061ffff97909716875263ffffffff95861660208801529385166040870152919093166060850152608084019290925260ff91821660a08401521660c082015260e00190565b60405180910390a1505050505050505050565b6123d96132b3565b6000818152600560205260409020546001600160a01b03168061240f57604051630fb532db60e11b815260040160405180910390fd5b6115f182826130ff565b606060006124276008613a31565b905080841061244957604051631390f2a160e01b815260040160405180910390fd5b60006124558486615a33565b905081811180612463575083155b61246d578061246f565b815b9050600061247d8683615ac2565b9050806001600160401b0381111561249757612497615c0b565b6040519080825280602002602001820160405280156124c0578160200160208202803683370190505b50935060005b81811015612510576124e36124db8883615a33565b600890613a3b565b8582815181106124f5576124f5615bf5565b602090810291909101015261250981615b5d565b90506124c6565b505050505b92915050565b6125236130d2565b6000818152600560205260409020546001600160a01b03168061255957604051630fb532db60e11b815260040160405180910390fd5b6000828152600560205260409020600101546001600160a01b031633146125b0576000828152600560205260409081902060010154905163d084e97560e01b8152610f20916001600160a01b0316906004016155ea565b600082815260056020526040908190208054336001600160a01b031991821681178355600190920180549091169055905183917fd4114ab6e9af9f597c52041f32d62dc57c5c4e4c0d4427006069635e216c938691611ad0918591615617565b8161261a81613071565b6126226130d2565b6001600160a01b03821660009081526004602090815260408083208684529091529020805460ff16156126555750505050565b6000848152600560205260409020600201805460641415612689576040516305a48e0f60e01b815260040160405180910390fd5b8154600160ff1990911681178355815490810182556000828152602090200180546001600160a01b0319166001600160a01b03861617905560405185907f1e980d04aa7648e205713e5e8ea3808672ac163d10936d36f91b2c88ac1575e1906126f39087906155ea565b60405180910390a25050505050565b6000816040516020016127159190615653565b604051602081830303815290604052805190602001209050919050565b8161273c81613071565b6127446130d2565b61274d836112c1565b1561276b57604051631685ecdd60e31b815260040160405180910390fd5b6001600160a01b038216600090815260046020908152604080832086845290915290205460ff166127b35782826040516379bfd40160e01b8152600401610f209291906157a5565b60008381526005602090815260408083206002018054825181850281018501909352808352919290919083018282801561281657602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116127f8575b5050505050905060006001825161282d9190615ac2565b905060005b825181101561293957846001600160a01b031683828151811061285757612857615bf5565b60200260200101516001600160a01b0316141561292757600083838151811061288257612882615bf5565b60200260200101519050806005600089815260200190815260200160002060020183815481106128b4576128b4615bf5565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394909416939093179092558881526005909152604090206002018054806128ff576128ff615bdf565b600082815260209020810160001990810180546001600160a01b031916905501905550612939565b8061293181615b5d565b915050612832565b506001600160a01b03841660009081526004602090815260408083208884529091529081902080546001600160481b03191690555185907f32158c6058347c1601b2d12bc696ac6901d8a9a9aa3ba10c27ab0a983e8425a7906126f39087906155ea565b60006129ab828401846151b2565b9050806000015160ff166001146129e457805160405163237d181f60e21b815260ff909116600482015260016024820152604401610f20565b8060a001516001600160601b03163414612a285760a08101516040516306acf13560e41b81523460048201526001600160601b039091166024820152604401610f20565b6020808201516000908152600590915260409020546001600160a01b031615612a64576040516326afa43560e11b815260040160405180910390fd5b60005b816060015151811015612b2d57604051806040016040528060011515815260200160006001600160401b03168152506004600084606001518481518110612ab057612ab0615bf5565b6020908102919091018101516001600160a01b0316825281810192909252604090810160009081208684015182528352208251815493909201516001600160401b031661010002610100600160481b0319921515929092166001600160481b03199093169290921717905580612b2581615b5d565b915050612a67565b50604080516060808201835260808401516001600160601b03908116835260a0850151811660208085019182526000858701818152828901805183526006845288832097518854955192516001600160401b0316600160c01b026001600160c01b03938816600160601b026001600160c01b0319909716919097161794909417169390931790945584518084018652868601516001600160a01b03908116825281860184815294880151828801908152925184526005865295909220825181549087166001600160a01b0319918216178255935160018201805491909716941693909317909455925180519192612c2c92600285019290910190614b97565b5050506080810151600a8054600090612c4f9084906001600160601b0316615a6d565b92506101000a8154816001600160601b0302191690836001600160601b031602179055508060a00151600a600c8282829054906101000a90046001600160601b0316612c9b9190615a6d565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550612cd781602001516008613a2590919063ffffffff16565b50505050565b600e8181548110612ced57600080fd5b600091825260209091200154905081565b81612d0881613071565b612d106130d2565b600083815260056020526040902060018101546001600160a01b03848116911614612cd7576001810180546001600160a01b0319166001600160a01b03851617905560405184907f21a4dad170a6bf476c31bbcf4a16628295b0e450672eec25d7c93308e05344a190612d869033908790615617565b60405180910390a250505050565b600081815260056020526040812054819081906001600160a01b0316606081612dd057604051630fb532db60e11b815260040160405180910390fd5b600086815260066020908152604080832054600583529281902060020180548251818502810185019093528083526001600160601b0380861695600160601b810490911694600160c01b9091046001600160401b0316938893929091839190830182828015612e6857602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612e4a575b505050505090509450945094509450945091939590929450565b612e8a6132b3565b6002546001600160a01b0316612eb35760405163c1f0c0a160e01b815260040160405180910390fd5b6002546040516370a0823160e01b81526000916001600160a01b0316906370a0823190612ee49030906004016155ea565b60206040518083038186803b158015612efc57600080fd5b505afa158015612f10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f349190614fe5565b600a549091506001600160601b031681811115612f685780826040516354ced18160e11b8152600401610f20929190615674565b81811015610909576000612f7c8284615ac2565b60025460405163a9059cbb60e01b81529192506001600160a01b03169063a9059cbb90612faf90879085906004016155fe565b602060405180830381600087803b158015612fc957600080fd5b505af1158015612fdd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130019190614fc8565b61301e57604051631f01ff1360e21b815260040160405180910390fd5b7f59bfc682b673f8cbf945f1e454df9334834abf7dfe7f92237ca29ecb9b436600848260405161304f9291906155fe565b60405180910390a150505050565b6130656132b3565b61306e81613a47565b50565b6000818152600560205260409020546001600160a01b0316806130a757604051630fb532db60e11b815260040160405180910390fd5b336001600160a01b038216146115f15780604051636c51fda960e11b8152600401610f2091906155ea565b600c54600160301b900460ff16156130fd5760405163769dd35360e11b815260040160405180910390fd5b565b60008061310b84613676565b60025491935091506001600160a01b03161580159061313257506001600160601b03821615155b156131e15760025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906131729086906001600160601b038716906004016155fe565b602060405180830381600087803b15801561318c57600080fd5b505af11580156131a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131c49190614fc8565b6131e157604051631e9acf1760e31b815260040160405180910390fd5b6000836001600160a01b0316826001600160601b031660405160006040518083038185875af1925050503d8060008114613237576040519150601f19603f3d011682016040523d82523d6000602084013e61323c565b606091505b505090508061325e5760405163950b247960e01b815260040160405180910390fd5b604080516001600160a01b03861681526001600160601b03808616602083015284169181019190915285907f8c74ce8b8cf87f5eb001275c8be27eb34ea2b62bfab6814fcc62192bb63e81c4906060016126f3565b6000546001600160a01b031633146130fd5760405162461bcd60e51b815260206004820152601660248201527527b7363c9031b0b63630b1363290313c9037bbb732b960511b6044820152606401610f20565b604080516060810182526000808252602082018190529181019190915260006133328460000151612702565b6000818152600d602052604090205490915060ff1661336757604051631dfd6e1360e21b815260048101829052602401610f20565b6000818560800151604051602001613380929190615674565b60408051601f1981840301815291815281516020928301206000818152600f909352912054909150806133c657604051631b44092560e11b815260040160405180910390fd5b845160208087015160408089015160608a015160808b015160a08c015193516133f5978a979096959101615874565b60405160208183030381529060405280519060200120811461342a5760405163354a450b60e21b815260040160405180910390fd5b60006134398660000151613aeb565b905080613500578551604051631d2827a760e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163e9413d389161348d91906004016158df565b60206040518083038186803b1580156134a557600080fd5b505afa1580156134b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134dd9190614fe5565b90508061350057855160405163175dadad60e01b8152610f2091906004016158df565b6000876080015182604051602001613522929190918252602082015260400190565b6040516020818303038152906040528051906020012060001c905060006135498983613bc8565b6040805160608101825297885260208801969096529486019490945250929695505050505050565b60005a61138881101561358357600080fd5b61138881039050846040820482031161359b57600080fd5b50823b6135a757600080fd5b60008083516020850160008789f1949350505050565b600081156135ea576011546135e39086908690600160201b900463ffffffff1686613c33565b9050613604565b601154613601908690869063ffffffff1686613cd5565b90505b949350505050565b6000805b60125481101561366d57826001600160a01b03166012828154811061363757613637615bf5565b6000918252602090912001546001600160a01b0316141561365b5750600192915050565b8061366581615b5d565b915050613610565b50600092915050565b60008181526005602090815260408083206006909252822054600290910180546001600160601b0380841694600160601b90940416925b8181101561371857600460008483815481106136cb576136cb615bf5565b60009182526020808320909101546001600160a01b031683528281019390935260409182018120898252909252902080546001600160481b031916905561371181615b5d565b90506136ad565b50600085815260056020526040812080546001600160a01b031990811682556001820180549091169055906137506002830182614bfc565b505060008581526006602052604081205561376c600886613dfa565b506001600160601b038416156137bf57600a805485919060009061379a9084906001600160601b0316615ad9565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505b6001600160601b038316156138175782600a600c8282829054906101000a90046001600160601b03166137f29190615ad9565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505b5050915091565b60408051602081018690526001600160a01b03851691810191909152606081018390526001600160401b03821660808201526000908190819060a00160408051601f198184030181529082905280516020918201209250613883918991849101615674565b60408051808303601f19018152919052805160209091012097909650945050505050565b604080516020810190915260008152816138d05750604080516020810190915260008152612515565b63125fa26760e31b6138e28385615b01565b6001600160e01b0319161461390a57604051632923fee760e11b815260040160405180910390fd5b6139178260048186615a09565b810190610ee9919061503f565b60607f92fd13387c7fe7befbc38d303d6468778fb9731bc4583f17d92989c6fcfdeaaa8260405160240161395d91511515815260200190565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915292915050565b6000466139a181613e06565b15613a1e5760646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b815260040160206040518083038186803b1580156139e057600080fd5b505afa1580156139f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a189190614fe5565b91505090565b4391505090565b6000610ee98383613e29565b6000612515825490565b6000610ee98383613e78565b6001600160a01b038116331415613a9a5760405162461bcd60e51b815260206004820152601760248201527621b0b73737ba103a3930b739b332b9103a379039b2b63360491b6044820152606401610f20565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600046613af781613e06565b15613bb957610100836001600160401b0316613b11613995565b613b1b9190615ac2565b1180613b375750613b2a613995565b836001600160401b031610155b15613b455750600092915050565b6040516315a03d4160e11b8152606490632b407a8290613b699086906004016158df565b60206040518083038186803b158015613b8157600080fd5b505afa158015613b95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee99190614fe5565b50506001600160401b03164090565b6000613bfc8360000151846020015185604001518660600151868860a001518960c001518a60e001518b6101000151613ea2565b60038360200151604051602001613c149291906157bc565b60408051601f1981840301815291905280516020909101209392505050565b600080613c766000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506140bd92505050565b905060005a613c858888615a33565b613c8f9190615ac2565b613c999085615aa3565b90506000613cb263ffffffff871664e8d4a51000615aa3565b905082613cbf8284615a33565b613cc99190615a33565b98975050505050505050565b600080613ce0614182565b905060008113613d06576040516321ea67b360e11b815260048101829052602401610f20565b6000613d486000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506140bd92505050565b9050600082825a613d598b8b615a33565b613d639190615ac2565b613d6d9088615aa3565b613d779190615a33565b613d8990670de0b6b3a7640000615aa3565b613d939190615a8f565b90506000613dac63ffffffff881664e8d4a51000615aa3565b9050613dc381676765c793fa10079d601b1b615ac2565b821115613de35760405163e80fa38160e01b815260040160405180910390fd5b613ded8183615a33565b9998505050505050505050565b6000610ee9838361424d565b600061a4b1821480613e1a575062066eed82145b8061251557505062066eee1490565b6000818152600183016020526040812054613e7057508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155612515565b506000612515565b6000826000018281548110613e8f57613e8f615bf5565b9060005260206000200154905092915050565b613eab89614340565b613ef45760405162461bcd60e51b815260206004820152601a6024820152797075626c6963206b6579206973206e6f74206f6e20637572766560301b6044820152606401610f20565b613efd88614340565b613f415760405162461bcd60e51b815260206004820152601560248201527467616d6d61206973206e6f74206f6e20637572766560581b6044820152606401610f20565b613f4a83614340565b613f965760405162461bcd60e51b815260206004820152601d60248201527f6347616d6d615769746e657373206973206e6f74206f6e2063757276650000006044820152606401610f20565b613f9f82614340565b613fea5760405162461bcd60e51b815260206004820152601c60248201527b73486173685769746e657373206973206e6f74206f6e20637572766560201b6044820152606401610f20565b613ff6878a8887614403565b61403e5760405162461bcd60e51b81526020600482015260196024820152786164647228632a706b2b732a6729213d5f755769746e65737360381b6044820152606401610f20565b600061404a8a87614517565b9050600061405d898b878b86898961457b565b9050600061406e838d8d8a8661468e565b9050808a146140af5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b210383937b7b360991b6044820152606401610f20565b505050505050505050505050565b6000466140c981613e06565b1561410857606c6001600160a01b031663c6f7de0e6040518163ffffffff1660e01b815260040160206040518083038186803b158015613b8157600080fd5b614111816146ce565b1561366d57600f602160991b016001600160a01b03166349948e0e84604051806080016040528060488152602001615c4560489139604051602001614157929190615540565b6040516020818303038152906040526040518263ffffffff1660e01b8152600401613b6991906156a0565b600c5460035460408051633fabe5a360e21b81529051600093600160381b900463ffffffff169283151592859283926001600160a01b03169163feaf968c9160048083019260a0929190829003018186803b1580156141e057600080fd5b505afa1580156141f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614218919061541b565b50945090925084915050801561423c57506142338242615ac2565b8463ffffffff16105b156136045750601054949350505050565b60008181526001830160205260408120548015614336576000614271600183615ac2565b855490915060009061428590600190615ac2565b90508181146142ea5760008660000182815481106142a5576142a5615bf5565b90600052602060002001549050808760000184815481106142c8576142c8615bf5565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806142fb576142fb615bdf565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612515565b6000915050612515565b80516000906401000003d0191161438e5760405162461bcd60e51b8152602060048201526012602482015271696e76616c696420782d6f7264696e61746560701b6044820152606401610f20565b60208201516401000003d019116143dc5760405162461bcd60e51b8152602060048201526012602482015271696e76616c696420792d6f7264696e61746560701b6044820152606401610f20565b60208201516401000003d0199080096143fc8360005b6020020151614708565b1492915050565b60006001600160a01b0382166144495760405162461bcd60e51b815260206004820152600b60248201526a626164207769746e65737360a81b6044820152606401610f20565b60208401516000906001161561446057601c614463565b601b5b9050600070014551231950b75fc4402da1732fc9bebe1985876000602002015109865170014551231950b75fc4402da1732fc9bebe19918203925060009190890987516040805160008082526020909101918290529293506001916144cd91869188918790615682565b6020604051602081039080840390855afa1580156144ef573d6000803e3d6000fd5b5050604051601f1901516001600160a01b039081169088161495505050505050949350505050565b61451f614c1a565b61454c60018484604051602001614538939291906155c9565b60405160208183030381529060405261472c565b90505b61455881614340565b6125155780516040805160208101929092526145749101614538565b905061454f565b614583614c1a565b825186516401000003d01990819006910614156145e25760405162461bcd60e51b815260206004820152601e60248201527f706f696e747320696e2073756d206d7573742062652064697374696e637400006044820152606401610f20565b6145ed87898861477a565b6146325760405162461bcd60e51b8152602060048201526016602482015275119a5c9cdd081b5d5b0818da1958dac819985a5b195960521b6044820152606401610f20565b61463d84868561477a565b6146835760405162461bcd60e51b815260206004820152601760248201527614d958dbdb99081b5d5b0818da1958dac819985a5b1959604a1b6044820152606401610f20565b613cc9868484614895565b6000600286868685876040516020016146ac9695949392919061556f565b60408051601f1981840301815291905280516020909101209695505050505050565b6000600a8214806146e057506101a482145b806146ed575062aa37dc82145b806146f9575061210582145b8061251557505062014a331490565b6000806401000003d01980848509840990506401000003d019600782089392505050565b614734614c1a565b61473d82614958565b815261475261474d8260006143f2565b614993565b602082018190526002900660011415611e76576020810180516401000003d019039052919050565b6000826147b75760405162461bcd60e51b815260206004820152600b60248201526a3d32b9379039b1b0b630b960a91b6044820152606401610f20565b835160208501516000906147cd90600290615b9f565b156147d957601c6147dc565b601b5b9050600070014551231950b75fc4402da1732fc9bebe1983870960408051600080825260209091019182905291925060019061481f908390869088908790615682565b6020604051602081039080840390855afa158015614841573d6000803e3d6000fd5b505050602060405103519050600086604051602001614860919061552e565b60408051601f1981840301815291905280516020909101206001600160a01b0392831692169190911498975050505050505050565b61489d614c1a565b8351602080860151855191860151600093849384936148be939091906149b3565b919450925090506401000003d01985820960011461491a5760405162461bcd60e51b815260206004820152601960248201527834b73b2d1036bab9ba1031329034b73b32b939b29037b3103d60391b6044820152606401610f20565b60405180604001604052806401000003d0198061493957614939615bc9565b87860981526020016401000003d0198785099052979650505050505050565b805160208201205b6401000003d0198110611e7657604080516020808201939093528151808203840181529082019091528051910120614960565b60006125158260026149ac6401000003d0196001615a33565b901c614a93565b60008080600180826401000003d019896401000003d019038808905060006401000003d0198b6401000003d019038a08905060006149f383838585614b2a565b9098509050614a0488828e88614b4e565b9098509050614a1588828c87614b4e565b90985090506000614a288d878b85614b4e565b9098509050614a3988828686614b2a565b9098509050614a4a88828e89614b4e565b9098509050818114614a7f576401000003d019818a0998506401000003d01982890997506401000003d0198183099650614a83565b8196505b5050505050509450945094915050565b600080614a9e614c38565b6020808252818101819052604082015260608101859052608081018490526401000003d01960a0820152614ad0614c56565b60208160c0846005600019fa925082614b205760405162461bcd60e51b81526020600482015260126024820152716269674d6f64457870206661696c7572652160701b6044820152606401610f20565b5195945050505050565b6000806401000003d0198487096401000003d0198487099097909650945050505050565b600080806401000003d019878509905060006401000003d01987876401000003d019030990506401000003d0198183086401000003d01986890990999098509650505050505050565b828054828255906000526020600020908101928215614bec579160200282015b82811115614bec57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614bb7565b50614bf8929150614c74565b5090565b508054600082559060005260206000209081019061306e9190614c74565b60405180604001604052806002906020820280368337509192915050565b6040518060c001604052806006906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b5b80821115614bf85760008155600101614c75565b8035611e7681615c21565b600082601f830112614ca557600080fd5b604080519081016001600160401b0381118282101715614cc757614cc7615c0b565b8060405250808385604086011115614cde57600080fd5b60005b6002811015614d00578135835260209283019290910190600101614ce1565b509195945050505050565b8035611e7681615c36565b60008083601f840112614d2857600080fd5b5081356001600160401b03811115614d3f57600080fd5b602083019150836020828501011115614d5757600080fd5b9250929050565b600082601f830112614d6f57600080fd5b81356001600160401b03811115614d8857614d88615c0b565b614d9b601f8201601f19166020016159d9565b818152846020838601011115614db057600080fd5b816020850160208301376000918101602001919091529392505050565b600060c08284031215614ddf57600080fd5b614de761598e565b905081356001600160401b038082168214614e0157600080fd5b81835260208401356020840152614e1a60408501614e80565b6040840152614e2b60608501614e80565b6060840152614e3c60808501614c89565b608084015260a0840135915080821115614e5557600080fd5b50614e6284828501614d5e565b60a08301525092915050565b803561ffff81168114611e7657600080fd5b803563ffffffff81168114611e7657600080fd5b803560ff81168114611e7657600080fd5b80516001600160501b0381168114611e7657600080fd5b80356001600160601b0381168114611e7657600080fd5b600060208284031215614ee557600080fd5b8135610ee981615c21565b60008060408385031215614f0357600080fd5b8235614f0e81615c21565b91506020830135614f1e81615c21565b809150509250929050565b60008060008060608587031215614f3f57600080fd5b8435614f4a81615c21565b93506020850135925060408501356001600160401b03811115614f6c57600080fd5b614f7887828801614d16565b95989497509550505050565b600060408284031215614f9657600080fd5b82604083011115614fa657600080fd5b50919050565b600060408284031215614fbe57600080fd5b610ee98383614c94565b600060208284031215614fda57600080fd5b8151610ee981615c36565b600060208284031215614ff757600080fd5b5051919050565b6000806020838503121561501157600080fd5b82356001600160401b0381111561502757600080fd5b61503385828601614d16565b90969095509350505050565b60006020828403121561505157600080fd5b604051602081016001600160401b038111828210171561507357615073615c0b565b604052823561508181615c36565b81529392505050565b60008060008385036101e08112156150a157600080fd5b6101a0808212156150b157600080fd5b6150b96159b6565b91506150c58787614c94565b82526150d48760408801614c94565b60208301526080860135604083015260a0860135606083015260c0860135608083015261510360e08701614c89565b60a083015261010061511788828901614c94565b60c084015261512a886101408901614c94565b60e0840152610180870135908301529093508401356001600160401b0381111561515357600080fd5b61515f86828701614dcd565b92505061516f6101c08501614d0b565b90509250925092565b60006020828403121561518a57600080fd5b81356001600160401b038111156151a057600080fd5b820160c08185031215610ee957600080fd5b600060208083850312156151c557600080fd5b82356001600160401b03808211156151dc57600080fd5b9084019060c082870312156151f057600080fd5b6151f861598e565b61520183614e94565b81528383013584820152604083013561521981615c21565b604082015260608301358281111561523057600080fd5b8301601f8101881361524157600080fd5b80358381111561525357615253615c0b565b8060051b93506152648685016159d9565b8181528681019083880186850189018c101561527f57600080fd5b600096505b838710156152ae578035945061529985615c21565b84835260019690960195918801918801615284565b506060850152506152c491505060808401614ebc565b60808201526152d560a08401614ebc565b60a08201529695505050505050565b6000602082840312156152f657600080fd5b610ee982614e6e565b60008060008060008060008060006101208a8c03121561531e57600080fd5b6153278a614e6e565b985061533560208b01614e80565b975061534360408b01614e80565b965061535160608b01614e80565b955060808a0135945061536660a08b01614e80565b935061537460c08b01614e80565b925061538260e08b01614e94565b91506153916101008b01614e94565b90509295985092959850929598565b6000602082840312156153b257600080fd5b5035919050565b600080604083850312156153cc57600080fd5b823591506020830135614f1e81615c21565b600080604083850312156153f157600080fd5b50508035926020909101359150565b60006020828403121561541257600080fd5b610ee982614e80565b600080600080600060a0868803121561543357600080fd5b61543c86614ea5565b945060208601519350604086015192506060860151915061545f60808701614ea5565b90509295509295909350565b600081518084526020808501945080840160005b838110156154a45781516001600160a01b03168752958201959082019060010161547f565b509495945050505050565b8060005b6002811015612cd75781518452602093840193909101906001016154b3565b600081518084526020808501945080840160005b838110156154a4578151875295820195908201906001016154e6565b6000815180845261551a816020860160208601615b31565b601f01601f19169290920160200192915050565b61553881836154af565b604001919050565b60008351615552818460208801615b31565b835190830190615566818360208801615b31565b01949350505050565b86815261557f60208201876154af565b61558c60608201866154af565b61559960a08201856154af565b6155a660e08201846154af565b60609190911b6001600160601b0319166101208201526101340195945050505050565b8381526155d960208201846154af565b606081019190915260800192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039290921682526001600160601b0316602082015260400190565b6040810161251582846154af565b602081526000610ee960208301846154d2565b918252602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b602081526000610ee96020830184615502565b6020815260ff82511660208201526020820151604082015260018060a01b0360408301511660608201526000606083015160c060808401526156f860e084018261546b565b60808501516001600160601b0390811660a0868101919091529095015190941660c0909301929092525090919050565b61ffff93841681529183166020830152909116604082015260600190565b60006060820161ffff86168352602063ffffffff86168185015260606040850152818551808452608086019150828701935060005b818110156157975784518352938301939183019160010161577b565b509098975050505050505050565b9182526001600160a01b0316602082015260400190565b82815260608101610ee960208301846154af565b82815260406020820152600061360460408301846154d2565b86815285602082015261ffff85166040820152600063ffffffff808616606084015280851660808401525060c060a0830152613cc960c0830184615502565b878152602081018790526040810186905263ffffffff8581166060830152841660808201526001600160a01b03831660a082015260e060c08201819052600090613ded90830184615502565b8781526001600160401b03871660208201526040810186905263ffffffff8581166060830152841660808201526001600160a01b03831660a082015260e060c08201819052600090613ded90830184615502565b63ffffffff92831681529116602082015260400190565b6001600160401b0391909116815260200190565b6001600160601b038681168252851660208201526001600160401b03841660408201526001600160a01b038316606082015260a06080820181905260009061593d9083018461546b565b979650505050505050565b6000808335601e1984360301811261595f57600080fd5b8301803591506001600160401b0382111561597957600080fd5b602001915036819003821315614d5757600080fd5b60405160c081016001600160401b03811182821017156159b0576159b0615c0b565b60405290565b60405161012081016001600160401b03811182821017156159b0576159b0615c0b565b604051601f8201601f191681016001600160401b0381118282101715615a0157615a01615c0b565b604052919050565b60008085851115615a1957600080fd5b83861115615a2657600080fd5b5050820193919092039150565b60008219821115615a4657615a46615bb3565b500190565b60006001600160401b0382811684821680830382111561556657615566615bb3565b60006001600160601b0382811684821680830382111561556657615566615bb3565b600082615a9e57615a9e615bc9565b500490565b6000816000190483118215151615615abd57615abd615bb3565b500290565b600082821015615ad457615ad4615bb3565b500390565b60006001600160601b0383811690831681811015615af957615af9615bb3565b039392505050565b6001600160e01b03198135818116916004851015615b295780818660040360031b1b83161692505b505092915050565b60005b83811015615b4c578181015183820152602001615b34565b83811115612cd75750506000910152565b6000600019821415615b7157615b71615bb3565b5060010190565b60006001600160401b0382811680821415615b9557615b95615bb3565b6001019392505050565b600082615bae57615bae615bc9565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461306e57600080fd5b801515811461306e57600080fdfe307866666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666a164736f6c6343000806000a", } var VRFCoordinatorV2PlusUpgradedVersionABI = VRFCoordinatorV2PlusUpgradedVersionMetaData.ABI diff --git a/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt index 9951fa772ef..bac87e21db9 100644 --- a/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -95,7 +95,7 @@ vrf_consumer_v2_upgradeable_example: ../../contracts/solc/v0.8.6/VRFConsumerV2Up vrf_coordinator_mock: ../../contracts/solc/v0.8.6/VRFCoordinatorMock/VRFCoordinatorMock.abi ../../contracts/solc/v0.8.6/VRFCoordinatorMock/VRFCoordinatorMock.bin 5c495cf8df1f46d8736b9150cdf174cce358cb8352f60f0d5bb9581e23920501 vrf_coordinator_test_v2: ../../contracts/solc/v0.8.6/VRFCoordinatorTestV2/VRFCoordinatorTestV2.abi ../../contracts/solc/v0.8.6/VRFCoordinatorTestV2/VRFCoordinatorTestV2.bin eaefd785c38bac67fb11a7fc2737ab2da68c988ca170e7db8ff235c80893e01c vrf_coordinator_v2: ../../contracts/solc/v0.8.6/VRFCoordinatorV2/VRFCoordinatorV2.abi ../../contracts/solc/v0.8.6/VRFCoordinatorV2/VRFCoordinatorV2.bin 295f35ce282060317dfd01f45959f5a2b05ba26913e422fbd4fb6bf90b107006 -vrf_coordinator_v2_5: ../../contracts/solc/v0.8.6/VRFCoordinatorV2_5/VRFCoordinatorV2_5.abi ../../contracts/solc/v0.8.6/VRFCoordinatorV2_5/VRFCoordinatorV2_5.bin 459b97ff4b2e1df90b2e6984afb7fbdf9a683904a0a09c16dddf0aa5d970ebfb +vrf_coordinator_v2_5: ../../contracts/solc/v0.8.6/VRFCoordinatorV2_5/VRFCoordinatorV2_5.abi ../../contracts/solc/v0.8.6/VRFCoordinatorV2_5/VRFCoordinatorV2_5.bin 6b4c50e8c8bbe877e5450d679e968dbde896f7c9043d29f3ecf79aefc28a0ef3 vrf_coordinator_v2_plus_v2_example: ../../contracts/solc/v0.8.6/VRFCoordinatorV2Plus_V2Example/VRFCoordinatorV2Plus_V2Example.abi ../../contracts/solc/v0.8.6/VRFCoordinatorV2Plus_V2Example/VRFCoordinatorV2Plus_V2Example.bin 4a5b86701983b1b65f0a8dfa116b3f6d75f8f706fa274004b57bdf5992e4cec3 vrf_coordinator_v2plus_interface: ../../contracts/solc/v0.8.6/IVRFCoordinatorV2PlusInternal/IVRFCoordinatorV2PlusInternal.abi ../../contracts/solc/v0.8.6/IVRFCoordinatorV2PlusInternal/IVRFCoordinatorV2PlusInternal.bin 86b8e23aab28c5b98e3d2384dc4f702b093e382dc985c88101278e6e4bf6f7b8 vrf_external_sub_owner_example: ../../contracts/solc/v0.8.6/VRFExternalSubOwnerExample/VRFExternalSubOwnerExample.abi ../../contracts/solc/v0.8.6/VRFExternalSubOwnerExample/VRFExternalSubOwnerExample.bin 14f888eb313930b50233a6f01ea31eba0206b7f41a41f6311670da8bb8a26963 @@ -114,7 +114,7 @@ vrf_v2_consumer_wrapper: ../../contracts/solc/v0.8.6/VRFv2Consumer/VRFv2Consumer vrf_v2plus_load_test_with_metrics: ../../contracts/solc/v0.8.6/VRFV2PlusLoadTestWithMetrics/VRFV2PlusLoadTestWithMetrics.abi ../../contracts/solc/v0.8.6/VRFV2PlusLoadTestWithMetrics/VRFV2PlusLoadTestWithMetrics.bin e8c6888df57e63e8b9a835b68e9e575631a2385feeb08c02c59732f699cc1f58 vrf_v2plus_single_consumer: ../../contracts/solc/v0.8.6/VRFV2PlusSingleConsumerExample/VRFV2PlusSingleConsumerExample.abi ../../contracts/solc/v0.8.6/VRFV2PlusSingleConsumerExample/VRFV2PlusSingleConsumerExample.bin 12b5d322db7dbf8af71955699e411109a4cc40811b606273ea0b5ecc8dbc639d vrf_v2plus_sub_owner: ../../contracts/solc/v0.8.6/VRFV2PlusExternalSubOwnerExample/VRFV2PlusExternalSubOwnerExample.abi ../../contracts/solc/v0.8.6/VRFV2PlusExternalSubOwnerExample/VRFV2PlusExternalSubOwnerExample.bin 7b4f5ffe8fc293d2f4294d3d8348ed8dd480e909cef0743393095e5b20dc9c34 -vrf_v2plus_upgraded_version: ../../contracts/solc/v0.8.6/VRFCoordinatorV2PlusUpgradedVersion/VRFCoordinatorV2PlusUpgradedVersion.abi ../../contracts/solc/v0.8.6/VRFCoordinatorV2PlusUpgradedVersion/VRFCoordinatorV2PlusUpgradedVersion.bin 09e4186c64cdaf1e5d36405467fb86996d7e4177cb08ecec425a4352d4246140 +vrf_v2plus_upgraded_version: ../../contracts/solc/v0.8.6/VRFCoordinatorV2PlusUpgradedVersion/VRFCoordinatorV2PlusUpgradedVersion.abi ../../contracts/solc/v0.8.6/VRFCoordinatorV2PlusUpgradedVersion/VRFCoordinatorV2PlusUpgradedVersion.bin 1695b5f9990dfe1c7d71c6f47f4be3488be15d09def9d984ffbc1db0f207a08a vrfv2_proxy_admin: ../../contracts/solc/v0.8.6/VRFV2ProxyAdmin/VRFV2ProxyAdmin.abi ../../contracts/solc/v0.8.6/VRFV2ProxyAdmin/VRFV2ProxyAdmin.bin 402b1103087ffe1aa598854a8f8b38f8cd3de2e3aaa86369e28017a9157f4980 vrfv2_reverting_example: ../../contracts/solc/v0.8.6/VRFV2RevertingExample/VRFV2RevertingExample.abi ../../contracts/solc/v0.8.6/VRFV2RevertingExample/VRFV2RevertingExample.bin 1ae46f80351d428bd85ba58b9041b2a608a1845300d79a8fed83edf96606de87 vrfv2_transparent_upgradeable_proxy: ../../contracts/solc/v0.8.6/VRFV2TransparentUpgradeableProxy/VRFV2TransparentUpgradeableProxy.abi ../../contracts/solc/v0.8.6/VRFV2TransparentUpgradeableProxy/VRFV2TransparentUpgradeableProxy.bin fe1a8e6852fbd06d91f64315c5cede86d340891f5b5cc981fb5b86563f7eac3f diff --git a/core/scripts/vrfv2plus/testnet/proofs.go b/core/scripts/vrfv2plus/testnet/proofs.go index 306d237caf4..ef35fd3e0ec 100644 --- a/core/scripts/vrfv2plus/testnet/proofs.go +++ b/core/scripts/vrfv2plus/testnet/proofs.go @@ -49,7 +49,7 @@ var rcTemplate = `{ callbackGasLimit: %d, numWords: %d, sender: %s, - nativePayment: %t + extraArgs: %s } `