From 8f1cc1e89ff039115eabea60d028469365c95877 Mon Sep 17 00:00:00 2001 From: Aleksandr Kuperman Date: Mon, 23 Oct 2023 13:10:48 +0100 Subject: [PATCH 1/8] feat: tracking undelivered request Ids --- .gitignore | 1 + .gitmodules | 1 - abis/README.md | 3 +++ contracts/AgentMech.sol | 53 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 abis/README.md diff --git a/.gitignore b/.gitignore index 495dc1b..a6962ac 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ coverage coverage.json typechain *.DS_Store +.idea # Hardhat files artifacts diff --git a/.gitmodules b/.gitmodules index fb32208..3151ef3 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,3 @@ - [submodule "lib/mech"] path = lib/mech url = https://github.com/gnosis/mech.git diff --git a/abis/README.md b/abis/README.md new file mode 100644 index 0000000..b959cba --- /dev/null +++ b/abis/README.md @@ -0,0 +1,3 @@ +# AI registry mech ABIs +0.8.19 ABIs were obtained with 750 optimization passes. +0.8.21 ABIs were obtained with 1000000 optimization passes. diff --git a/contracts/AgentMech.sol b/contracts/AgentMech.sol index b209994..cb9e38f 100644 --- a/contracts/AgentMech.sol +++ b/contracts/AgentMech.sol @@ -32,9 +32,13 @@ contract AgentMech is ERC721Mech { // Minimum required price uint256 public price; + // Number of undelivered requests + uint256 public numUndeliveredRequests; // Map of requests counts for corresponding addresses mapping (address => uint256) public mapRequestsCounts; + // Map of request Ids + mapping (uint256 => uint256[2]) public mapRequestIds; /// @dev AgentMech constructor. /// @param _token Address of the token contract. @@ -52,6 +56,7 @@ contract AgentMech is ERC721Mech { revert AgentNotFound(_tokenId); } + // Record the price price = _price; } @@ -62,8 +67,32 @@ contract AgentMech is ERC721Mech { revert NotEnoughPaid(msg.value, price); } + // Get the request Id requestId = getRequestId(msg.sender, data); + // Increase the requests count supplied by the sender mapRequestsCounts[msg.sender]++; + + // Record the request Id in the map + // Get previous and next request Ids of the first element + uint256[2] storage requestIds = mapRequestIds[0]; + // Create the new element + uint256[2] storage newRequestIds = mapRequestIds[requestId]; + + // Previous element will be zero, next element will be the current next element + uint256 curNextRequestId = requestIds[1]; + newRequestIds[1] = curNextRequestId; + // Next element of the zero element will be the newly created element + requestIds[1] = requestId; + // Previous element of the current next element will be the newly created element + mapRequestIds[curNextRequestId][0] = requestId; + + // Check for the previous element of the zero one to exist, and if there is none - assign the newly created one + if (requestIds[0] == 0) { + requestIds[0] = requestId; + } + // Increase the number of undelivered requests + numUndeliveredRequests++; + emit Request(msg.sender, requestId, data); } @@ -71,6 +100,16 @@ contract AgentMech is ERC721Mech { /// @param requestId Request id. /// @param data Self-descriptive opaque data-blob. function deliver(uint256 requestId, bytes memory data) external onlyOperator { + // Remove delivered request Id from the request Ids map + uint256[2] memory requestIds = mapRequestIds[requestId]; + // Re-link previous and next elements between themselves + mapRequestIds[requestIds[0]][1] = requestIds[1]; + mapRequestIds[requestIds[1]][0] = requestIds[0]; + // Delete the delivered element from the map + delete mapRequestIds[requestId]; + // Decrease the number of undelivered requests + numUndeliveredRequests--; + emit Deliver(msg.sender, requestId, data); } @@ -95,4 +134,18 @@ contract AgentMech is ERC721Mech { function getRequestsCount(address account) external view returns (uint256 requestsCount) { requestsCount = mapRequestsCounts[account]; } + + /// @dev Gets the set of undelivered request Ids. + /// @return requestIds Set of undelivered request Ids. + function getUndeliveredRequestIds() external view returns (uint256[] memory requestIds) { + uint256 numRequests = numUndeliveredRequests; + requestIds = new uint256[](numRequests); + + // The first request Id is the next request Id of the zero element in the request Ids map + uint256 curRequestId = mapRequestIds[0][1]; + for (uint256 i = 0; i < numRequests; ++i) { + requestIds[i] = curRequestId; + curRequestId = mapRequestIds[curRequestId][1]; + } + } } From ec14f36bfbcba698bc5ee1eba78844fb944ae7f9 Mon Sep 17 00:00:00 2001 From: Aleksandr Kuperman Date: Mon, 23 Oct 2023 16:32:10 +0100 Subject: [PATCH 2/8] refactor and test: track undelivered request Ids --- abis/0.8.21/AgentFactory.json | 4 +- abis/0.8.21/AgentMech.json | 84 ++++++++++++++++++++++++-------- contracts/AgentMech.sol | 28 ++++++++--- test/AgentMech.js | 90 +++++++++++++++++++++++++++++++++++ 4 files changed, 176 insertions(+), 30 deletions(-) diff --git a/abis/0.8.21/AgentFactory.json b/abis/0.8.21/AgentFactory.json index bd9ce9b..1980ffb 100644 --- a/abis/0.8.21/AgentFactory.json +++ b/abis/0.8.21/AgentFactory.json @@ -527,8 +527,8 @@ "type": "function" } ], - "bytecode": "0x60a060405234801561000f575f80fd5b50604051612b67380380612b6783398101604081905261002e91610050565b6001600160a01b03166080525f80546001600160a01b0319163317905561007d565b5f60208284031215610060575f80fd5b81516001600160a01b0381168114610076575f80fd5b9392505050565b608051612ac56100a25f395f8181609a0152818161043e01526104f40152612ac55ff3fe608060405234801562000010575f80fd5b506004361062000090575f3560e01c80638da5cb5b116200005f5780638da5cb5b14620001325780638f9ade5e1462000152578063a6f9dae11462000194578063ffa1ad7414620001ab575f80fd5b80630d1cfcae14620000945780633f4ba83a14620000e65780635c975abb14620000f25780638456cb591462000128575b5f80fd5b620000bc7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b620000f0620001f7565b005b5f54620001179074010000000000000000000000000000000000000000900460ff1681565b6040519015158152602001620000dd565b620000f0620002bf565b5f54620000bc9073ffffffffffffffffffffffffffffffffffffffff1681565b620001696200016336600462000720565b6200039a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620000dd565b620000f0620001a536600462000753565b620005bc565b620001e86040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b604051620000dd919062000776565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146200026e575f546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff90911660248201526044015b60405180910390fd5b5f80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16815560405133917faeb196d352664784d1900b0e7414a8face7d29f4dae8c4b0cf68ed477423bbf491a2565b5f5473ffffffffffffffffffffffffffffffffffffffff16331462000332575f546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440162000265565b5f80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017815560405133917f5ee71a369c8672edded508e624ffc9257fa1ae6886ef32905c18e60196bca39991a2565b5f8054819074010000000000000000000000000000000000000000900460ff1615620003f2576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fa3def92300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152602482018690527f0000000000000000000000000000000000000000000000000000000000000000169063a3def923906044016020604051808303815f875af115801562000485573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620004ab9190620007e1565b6040805173ffffffffffffffffffffffffffffffffffffffff881660208201529081018290529092505f90606001604051602081830303815290604052805190602001209050807f000000000000000000000000000000000000000000000000000000000000000084866040516200052390620006e9565b73ffffffffffffffffffffffffffffffffffffffff9093168352602083019190915260408201526060018190604051809103905ff59050801580156200056b573d5f803e3d5ffd5b50915083838373ffffffffffffffffffffffffffffffffffffffff167f67a2e45041c70013518c5b9b849a6944a6c17ff44d66be1c707020460ecbd1db60405160405180910390a450935093915050565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146200062f575f546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440162000265565b73ffffffffffffffffffffffffffffffffffffffff81166200067d576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405190917f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b91a250565b61229680620007fa83390190565b803573ffffffffffffffffffffffffffffffffffffffff811681146200071b575f80fd5b919050565b5f805f6060848603121562000733575f80fd5b6200073e84620006f7565b95602085013595506040909401359392505050565b5f6020828403121562000764575f80fd5b6200076f82620006f7565b9392505050565b5f6020808352835180828501525f5b81811015620007a35785810183015185820160400152820162000785565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b5f60208284031215620007f2575f80fd5b505191905056fe60806040525f805534801562000013575f80fd5b506040516200229638038062002296833981016040819052620000369162000391565b604080516001600160a01b03851660208201528082018490528151808203830181526060909101909152839083906200006f8162000145565b5050506001600160a01b0383166200009a5760405163d92e233d60e01b815260040160405180910390fd5b6040516331a9108f60e11b8152600481018390525f906001600160a01b03851690636352211e90602401602060405180830381865afa158015620000e0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001069190620003c6565b90506001600160a01b0381166200013857604051630ede975960e01b8152600481018490526024015b60405180910390fd5b50600155506200049a9050565b6200014f620001ad565b51156200019f5760405162461bcd60e51b815260206004820152601360248201527f416c726561647920696e697469616c697a65640000000000000000000000000060448201526064016200012f565b620001aa8162000218565b50565b6060620002136200020d604051606b60f91b6020820152602560fa1b60218201526001600160601b03193060601b166022820152600160f81b60368201525f90603701604051602081830303815290604052805190602001205f1c905090565b620002e1565b905090565b5f620002248262000339565b90505f8151602083015ff090506200028b604051606b60f91b6020820152602560fa1b60218201526001600160601b03193060601b166022820152600160f81b60368201525f90603701604051602081830303815290604052805190602001205f1c905090565b6001600160a01b0316816001600160a01b031614620002dc5760405162461bcd60e51b815260206004820152600c60248201526b15dc9a5d194819985a5b195960a21b60448201526064016200012f565b505050565b6060813b600181116200030357505060408051602081019091525f8152919050565b806200030f81620003fd565b9150506040519150601f19601f602083010116820160405280825280600160208401853c50919050565b6060815160016200034b919062000415565b826040516020016200035f92919062000431565b6040516020818303038152906040529050919050565b80516001600160a01b03811681146200038c575f80fd5b919050565b5f805f60608486031215620003a4575f80fd5b620003af8462000375565b925060208401519150604084015190509250925092565b5f60208284031215620003d7575f80fd5b620003e28262000375565b9392505050565b634e487b7160e01b5f52601160045260245ffd5b5f816200040e576200040e620003e9565b505f190190565b808201808211156200042b576200042b620003e9565b92915050565b606360f81b815260e083901b6001600160e01b03191660018201526880600e6000396000f360b81b60058201525f600e82018190528251815b8181101562000489576020818601810151600f8684010152016200046a565b505f9201600f019182525092915050565b611dee80620004a85f395ff3fe608060405260043610610159575f3560e01c8063a035b1fe116100bb578063bc197c8111610071578063e00b911811610057578063e00b911814610451578063f23a6e6114610470578063fc0c546a146104b5575f80fd5b8063bc197c81146103de578063c7dec3fc14610425575f80fd5b8063affed0e0116100a1578063affed0e014610371578063b0d691fe14610384578063b94207d3146103cb575f80fd5b8063a035b1fe1461033d578063a4f9edbf14610352575f80fd5b80633a871cdd116101105780636d70f7ae116100f65780636d70f7ae146102ae5780637af73473146102dd57806391b7f5ed1461031e575f80fd5b80633a871cdd146102645780635fee608514610283575f80fd5b8063157305fe11610140578063157305fe146102045780631626ba7e1461022357806317d70f7c14610242575f80fd5b806223de2914610164578063150b7a021461018a575f80fd5b3661016057005b5f80fd5b34801561016f575f80fd5b5061018861017e36600461159d565b5050505050505050565b005b348015610195575f80fd5b506101ce6101a4366004611647565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020015b60405180910390f35b34801561020f575f80fd5b5061018861021e366004611789565b6104c9565b34801561022e575f80fd5b506101ce61023d366004611789565b6105d5565b34801561024d575f80fd5b50610256610778565b6040519081526020016101fb565b34801561026f575f80fd5b5061025661027e3660046117cd565b61079c565b34801561028e575f80fd5b5061025661029d36600461181c565b60026020525f908152604090205481565b3480156102b9575f80fd5b506102cd6102c836600461181c565b6107d8565b60405190151581526020016101fb565b3480156102e8575f80fd5b506102566102f736600461181c565b73ffffffffffffffffffffffffffffffffffffffff165f9081526002602052604090205490565b348015610329575f80fd5b50610188610338366004611837565b6108aa565b348015610348575f80fd5b5061025660015481565b34801561035d575f80fd5b5061018861036c36600461184e565b610998565b34801561037c575f80fd5b505f54610256565b34801561038f575f80fd5b50730576a174d229e3cfa37253523e645a78a0c91b575b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101fb565b6102566103d936600461184e565b610a14565b3480156103e9575f80fd5b506101ce6103f83660046118c9565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b348015610430575f80fd5b5061044461043f36600461195f565b610adf565b6040516101fb9190611a3c565b34801561045c575f80fd5b5061025661046b366004611a4e565b610bc9565b34801561047b575f80fd5b506101ce61048a366004611a85565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b3480156104c0575f80fd5b506103a6610c1a565b6104d2336107d8565b806104f0575033730576a174d229e3cfa37253523e645a78a0c91b57145b610581576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084015b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f0cd979445339c62199996f208428d987b1cea24d18e62b79ec24d94b636e8b7083836040516105c9929190611afc565b60405180910390a25050565b5f805f806105f585602081015160408201516060909201515f1a92909190565b9094509250905060ff81165f0361070b5782858301602001610616826107d8565b158015610639575073ffffffffffffffffffffffffffffffffffffffff82163014155b1561066c57507fffffffff0000000000000000000000000000000000000000000000000000000094506107729350505050565b6040517f1626ba7e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831690631626ba7e906106c0908b908590600401611afc565b602060405180830381865afa1580156106db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ff9190611b14565b95505050505050610772565b61071a6102c887838686610c37565b1561074b57507f1626ba7e000000000000000000000000000000000000000000000000000000009250610772915050565b507fffffffff00000000000000000000000000000000000000000000000000000000925050505b92915050565b5f80610782610c53565b8060200190518101906107959190611b53565b9392505050565b5f6107a5610d27565b6107af8484610da6565b90506107be6040850185611b7f565b90505f036107cf576107cf84610ea6565b61079582610f24565b5f805f6107e3610c53565b8060200190518101906107f69190611b53565b915091508373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b815260040161084c91815260200190565b602060405180830381865afa158015610867573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061088b9190611be0565b73ffffffffffffffffffffffffffffffffffffffff1614949350505050565b6108b3336107d8565b806108d1575033730576a174d229e3cfa37253523e645a78a0c91b57145b61095d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e747261637400006064820152608401610578565b60018190556040518181527f66cbca4f3c64fecf1dcb9ce094abcf7f68c3450a1d4e3a8e917dd621edb4ebe09060200160405180910390a150565b6109a0610c53565b5115610a08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a6564000000000000000000000000006044820152606401610578565b610a1181610f98565b50565b5f600154341015610a5e576001546040517fb48978280000000000000000000000000000000000000000000000000000000081523460048201526024810191909152604401610578565b610a683383610bc9565b335f908152600260205260408120805492935090610a8583611c28565b91905055503373ffffffffffffffffffffffffffffffffffffffff167f4bda649efe6b98b0f9c1d5e859c29e20910f45c66dabfe6fad4a4881f7faf9cc8284604051610ad2929190611afc565b60405180910390a2919050565b6060610aea336107d8565b80610b08575033730576a174d229e3cfa37253523e645a78a0c91b57145b610b94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e747261637400006064820152608401610578565b5f610bae878787878715610ba8578761110d565b5a61110d565b9250905080610bbf57815160208301fd5b5095945050505050565b5f8282604051602001610bdd929190611c5f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209392505050565b5f80610c24610c53565b8060200190518101906107729190611be0565b5f805f610c4687878787611210565b91509150610bbf816112f8565b6060610d22610d1d6040517fd60000000000000000000000000000000000000000000000000000000000000060208201527f940000000000000000000000000000000000000000000000000000000000000060218201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660228201527f010000000000000000000000000000000000000000000000000000000000000060368201525f90603701604051602081830303815290604052805190602001205f1c905090565b6114aa565b905090565b33730576a174d229e3cfa37253523e645a78a0c91b5714610da4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e74000000006044820152606401610578565b565b5f80610dfe836040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018290525f90605c01604051602081830303815290604052805190602001209050919050565b90507f1626ba7e00000000000000000000000000000000000000000000000000000000610e6c82610e33610140880188611b7f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506105d592505050565b7fffffffff000000000000000000000000000000000000000000000000000000001614610e9d576001915050610772565b505f9392505050565b5f805460208301359180610eb983611c28565b9190505514610a11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496e76616c6964206e6f6e6365000000000000000000000000000000000000006044820152606401610578565b8015610a11576040515f9033907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90849084818181858888f193505050503d805f8114610f8c576040519150601f19603f3d011682016040523d82523d5f602084013e610f91565b606091505b5050505050565b5f610fa2826114ff565b90505f8151602083015ff090506110746040517fd60000000000000000000000000000000000000000000000000000000000000060208201527f940000000000000000000000000000000000000000000000000000000000000060218201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660228201527f010000000000000000000000000000000000000000000000000000000000000060368201525f90603701604051602081830303815290604052805190602001205f1c905090565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611108576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5772697465206661696c656400000000000000000000000000000000000000006044820152606401610578565b505050565b5f6060600184600181111561112457611124611c8d565b03611198578673ffffffffffffffffffffffffffffffffffffffff16838660405161114f9190611cba565b5f604051808303818686f4925050503d805f8114611188576040519150601f19603f3d011682016040523d82523d5f602084013e61118d565b606091505b509092509050611206565b8673ffffffffffffffffffffffffffffffffffffffff168387876040516111bf9190611cba565b5f60405180830381858888f193505050503d805f81146111fa576040519150601f19603f3d011682016040523d82523d5f602084013e6111ff565b606091505b5090925090505b9550959350505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561124557505f905060036112ef565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611296573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166112e9575f600192509250506112ef565b91505f90505b94509492505050565b5f81600481111561130b5761130b611c8d565b036113135750565b600181600481111561132757611327611c8d565b0361138e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610578565b60028160048111156113a2576113a2611c8d565b03611409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610578565b600381600481111561141d5761141d611c8d565b03610a11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610578565b6060813b600181116114cb57505060408051602081019091525f8152919050565b806114d581611cd5565b9150506040519150601f19601f602083010116820160405280825280600160208401853c50919050565b60608151600161150f9190611d09565b82604051602001611521929190611d1c565b6040516020818303038152906040529050919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610a11575f80fd5b5f8083601f840112611568575f80fd5b50813567ffffffffffffffff81111561157f575f80fd5b602083019150836020828501011115611596575f80fd5b9250929050565b5f805f805f805f8060c0898b0312156115b4575f80fd5b88356115bf81611537565b975060208901356115cf81611537565b965060408901356115df81611537565b955060608901359450608089013567ffffffffffffffff80821115611602575f80fd5b61160e8c838d01611558565b909650945060a08b0135915080821115611626575f80fd5b506116338b828c01611558565b999c989b5096995094979396929594505050565b5f805f805f6080868803121561165b575f80fd5b853561166681611537565b9450602086013561167681611537565b935060408601359250606086013567ffffffffffffffff811115611698575f80fd5b6116a488828901611558565b969995985093965092949392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126116f1575f80fd5b813567ffffffffffffffff8082111561170c5761170c6116b5565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715611752576117526116b5565b8160405283815286602085880101111561176a575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f806040838503121561179a575f80fd5b82359150602083013567ffffffffffffffff8111156117b7575f80fd5b6117c3858286016116e2565b9150509250929050565b5f805f606084860312156117df575f80fd5b833567ffffffffffffffff8111156117f5575f80fd5b84016101608187031215611807575f80fd5b95602085013595506040909401359392505050565b5f6020828403121561182c575f80fd5b813561079581611537565b5f60208284031215611847575f80fd5b5035919050565b5f6020828403121561185e575f80fd5b813567ffffffffffffffff811115611874575f80fd5b611880848285016116e2565b949350505050565b5f8083601f840112611898575f80fd5b50813567ffffffffffffffff8111156118af575f80fd5b6020830191508360208260051b8501011115611596575f80fd5b5f805f805f805f8060a0898b0312156118e0575f80fd5b88356118eb81611537565b975060208901356118fb81611537565b9650604089013567ffffffffffffffff80821115611917575f80fd5b6119238c838d01611888565b909850965060608b013591508082111561193b575f80fd5b6119478c838d01611888565b909650945060808b0135915080821115611626575f80fd5b5f805f805f60a08688031215611973575f80fd5b853561197e81611537565b945060208601359350604086013567ffffffffffffffff8111156119a0575f80fd5b6119ac888289016116e2565b9350506060860135600281106119c0575f80fd5b949793965091946080013592915050565b5f5b838110156119eb5781810151838201526020016119d3565b50505f910152565b5f8151808452611a0a8160208601602086016119d1565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61079560208301846119f3565b5f8060408385031215611a5f575f80fd5b8235611a6a81611537565b9150602083013567ffffffffffffffff8111156117b7575f80fd5b5f805f805f8060a08789031215611a9a575f80fd5b8635611aa581611537565b95506020870135611ab581611537565b94506040870135935060608701359250608087013567ffffffffffffffff811115611ade575f80fd5b611aea89828a01611558565b979a9699509497509295939492505050565b828152604060208201525f61188060408301846119f3565b5f60208284031215611b24575f80fd5b81517fffffffff0000000000000000000000000000000000000000000000000000000081168114610795575f80fd5b5f8060408385031215611b64575f80fd5b8251611b6f81611537565b6020939093015192949293505050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611bb2575f80fd5b83018035915067ffffffffffffffff821115611bcc575f80fd5b602001915036819003821315611596575f80fd5b5f60208284031215611bf0575f80fd5b815161079581611537565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611c5857611c58611bfb565b5060010190565b73ffffffffffffffffffffffffffffffffffffffff83168152604060208201525f61188060408301846119f3565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f8251611ccb8184602087016119d1565b9190910192915050565b5f81611ce357611ce3611bfb565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b8082018082111561077257610772611bfb565b7f630000000000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000008360e01b1660018201527f80600e6000396000f3000000000000000000000000000000000000000000000060058201525f600e8201525f8251611daa81600f8501602087016119d1565b91909101600f01939250505056fea264697066735822122095f8b9d54e488640bb8af3a1548faf779501856a06c519d628fea3d064487ff064736f6c63430008150033a2646970667358221220a58b6ef545ce7a5d7b7c9ac3ff4ed2e55511c5eb8cfd479a1816762039663d8064736f6c63430008150033", - "deployedBytecode": "0x608060405234801562000010575f80fd5b506004361062000090575f3560e01c80638da5cb5b116200005f5780638da5cb5b14620001325780638f9ade5e1462000152578063a6f9dae11462000194578063ffa1ad7414620001ab575f80fd5b80630d1cfcae14620000945780633f4ba83a14620000e65780635c975abb14620000f25780638456cb591462000128575b5f80fd5b620000bc7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b620000f0620001f7565b005b5f54620001179074010000000000000000000000000000000000000000900460ff1681565b6040519015158152602001620000dd565b620000f0620002bf565b5f54620000bc9073ffffffffffffffffffffffffffffffffffffffff1681565b620001696200016336600462000720565b6200039a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620000dd565b620000f0620001a536600462000753565b620005bc565b620001e86040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b604051620000dd919062000776565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146200026e575f546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff90911660248201526044015b60405180910390fd5b5f80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16815560405133917faeb196d352664784d1900b0e7414a8face7d29f4dae8c4b0cf68ed477423bbf491a2565b5f5473ffffffffffffffffffffffffffffffffffffffff16331462000332575f546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440162000265565b5f80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017815560405133917f5ee71a369c8672edded508e624ffc9257fa1ae6886ef32905c18e60196bca39991a2565b5f8054819074010000000000000000000000000000000000000000900460ff1615620003f2576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fa3def92300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152602482018690527f0000000000000000000000000000000000000000000000000000000000000000169063a3def923906044016020604051808303815f875af115801562000485573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620004ab9190620007e1565b6040805173ffffffffffffffffffffffffffffffffffffffff881660208201529081018290529092505f90606001604051602081830303815290604052805190602001209050807f000000000000000000000000000000000000000000000000000000000000000084866040516200052390620006e9565b73ffffffffffffffffffffffffffffffffffffffff9093168352602083019190915260408201526060018190604051809103905ff59050801580156200056b573d5f803e3d5ffd5b50915083838373ffffffffffffffffffffffffffffffffffffffff167f67a2e45041c70013518c5b9b849a6944a6c17ff44d66be1c707020460ecbd1db60405160405180910390a450935093915050565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146200062f575f546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440162000265565b73ffffffffffffffffffffffffffffffffffffffff81166200067d576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405190917f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b91a250565b61229680620007fa83390190565b803573ffffffffffffffffffffffffffffffffffffffff811681146200071b575f80fd5b919050565b5f805f6060848603121562000733575f80fd5b6200073e84620006f7565b95602085013595506040909401359392505050565b5f6020828403121562000764575f80fd5b6200076f82620006f7565b9392505050565b5f6020808352835180828501525f5b81811015620007a35785810183015185820160400152820162000785565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b5f60208284031215620007f2575f80fd5b505191905056fe60806040525f805534801562000013575f80fd5b506040516200229638038062002296833981016040819052620000369162000391565b604080516001600160a01b03851660208201528082018490528151808203830181526060909101909152839083906200006f8162000145565b5050506001600160a01b0383166200009a5760405163d92e233d60e01b815260040160405180910390fd5b6040516331a9108f60e11b8152600481018390525f906001600160a01b03851690636352211e90602401602060405180830381865afa158015620000e0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001069190620003c6565b90506001600160a01b0381166200013857604051630ede975960e01b8152600481018490526024015b60405180910390fd5b50600155506200049a9050565b6200014f620001ad565b51156200019f5760405162461bcd60e51b815260206004820152601360248201527f416c726561647920696e697469616c697a65640000000000000000000000000060448201526064016200012f565b620001aa8162000218565b50565b6060620002136200020d604051606b60f91b6020820152602560fa1b60218201526001600160601b03193060601b166022820152600160f81b60368201525f90603701604051602081830303815290604052805190602001205f1c905090565b620002e1565b905090565b5f620002248262000339565b90505f8151602083015ff090506200028b604051606b60f91b6020820152602560fa1b60218201526001600160601b03193060601b166022820152600160f81b60368201525f90603701604051602081830303815290604052805190602001205f1c905090565b6001600160a01b0316816001600160a01b031614620002dc5760405162461bcd60e51b815260206004820152600c60248201526b15dc9a5d194819985a5b195960a21b60448201526064016200012f565b505050565b6060813b600181116200030357505060408051602081019091525f8152919050565b806200030f81620003fd565b9150506040519150601f19601f602083010116820160405280825280600160208401853c50919050565b6060815160016200034b919062000415565b826040516020016200035f92919062000431565b6040516020818303038152906040529050919050565b80516001600160a01b03811681146200038c575f80fd5b919050565b5f805f60608486031215620003a4575f80fd5b620003af8462000375565b925060208401519150604084015190509250925092565b5f60208284031215620003d7575f80fd5b620003e28262000375565b9392505050565b634e487b7160e01b5f52601160045260245ffd5b5f816200040e576200040e620003e9565b505f190190565b808201808211156200042b576200042b620003e9565b92915050565b606360f81b815260e083901b6001600160e01b03191660018201526880600e6000396000f360b81b60058201525f600e82018190528251815b8181101562000489576020818601810151600f8684010152016200046a565b505f9201600f019182525092915050565b611dee80620004a85f395ff3fe608060405260043610610159575f3560e01c8063a035b1fe116100bb578063bc197c8111610071578063e00b911811610057578063e00b911814610451578063f23a6e6114610470578063fc0c546a146104b5575f80fd5b8063bc197c81146103de578063c7dec3fc14610425575f80fd5b8063affed0e0116100a1578063affed0e014610371578063b0d691fe14610384578063b94207d3146103cb575f80fd5b8063a035b1fe1461033d578063a4f9edbf14610352575f80fd5b80633a871cdd116101105780636d70f7ae116100f65780636d70f7ae146102ae5780637af73473146102dd57806391b7f5ed1461031e575f80fd5b80633a871cdd146102645780635fee608514610283575f80fd5b8063157305fe11610140578063157305fe146102045780631626ba7e1461022357806317d70f7c14610242575f80fd5b806223de2914610164578063150b7a021461018a575f80fd5b3661016057005b5f80fd5b34801561016f575f80fd5b5061018861017e36600461159d565b5050505050505050565b005b348015610195575f80fd5b506101ce6101a4366004611647565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020015b60405180910390f35b34801561020f575f80fd5b5061018861021e366004611789565b6104c9565b34801561022e575f80fd5b506101ce61023d366004611789565b6105d5565b34801561024d575f80fd5b50610256610778565b6040519081526020016101fb565b34801561026f575f80fd5b5061025661027e3660046117cd565b61079c565b34801561028e575f80fd5b5061025661029d36600461181c565b60026020525f908152604090205481565b3480156102b9575f80fd5b506102cd6102c836600461181c565b6107d8565b60405190151581526020016101fb565b3480156102e8575f80fd5b506102566102f736600461181c565b73ffffffffffffffffffffffffffffffffffffffff165f9081526002602052604090205490565b348015610329575f80fd5b50610188610338366004611837565b6108aa565b348015610348575f80fd5b5061025660015481565b34801561035d575f80fd5b5061018861036c36600461184e565b610998565b34801561037c575f80fd5b505f54610256565b34801561038f575f80fd5b50730576a174d229e3cfa37253523e645a78a0c91b575b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101fb565b6102566103d936600461184e565b610a14565b3480156103e9575f80fd5b506101ce6103f83660046118c9565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b348015610430575f80fd5b5061044461043f36600461195f565b610adf565b6040516101fb9190611a3c565b34801561045c575f80fd5b5061025661046b366004611a4e565b610bc9565b34801561047b575f80fd5b506101ce61048a366004611a85565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b3480156104c0575f80fd5b506103a6610c1a565b6104d2336107d8565b806104f0575033730576a174d229e3cfa37253523e645a78a0c91b57145b610581576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084015b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f0cd979445339c62199996f208428d987b1cea24d18e62b79ec24d94b636e8b7083836040516105c9929190611afc565b60405180910390a25050565b5f805f806105f585602081015160408201516060909201515f1a92909190565b9094509250905060ff81165f0361070b5782858301602001610616826107d8565b158015610639575073ffffffffffffffffffffffffffffffffffffffff82163014155b1561066c57507fffffffff0000000000000000000000000000000000000000000000000000000094506107729350505050565b6040517f1626ba7e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831690631626ba7e906106c0908b908590600401611afc565b602060405180830381865afa1580156106db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ff9190611b14565b95505050505050610772565b61071a6102c887838686610c37565b1561074b57507f1626ba7e000000000000000000000000000000000000000000000000000000009250610772915050565b507fffffffff00000000000000000000000000000000000000000000000000000000925050505b92915050565b5f80610782610c53565b8060200190518101906107959190611b53565b9392505050565b5f6107a5610d27565b6107af8484610da6565b90506107be6040850185611b7f565b90505f036107cf576107cf84610ea6565b61079582610f24565b5f805f6107e3610c53565b8060200190518101906107f69190611b53565b915091508373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b815260040161084c91815260200190565b602060405180830381865afa158015610867573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061088b9190611be0565b73ffffffffffffffffffffffffffffffffffffffff1614949350505050565b6108b3336107d8565b806108d1575033730576a174d229e3cfa37253523e645a78a0c91b57145b61095d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e747261637400006064820152608401610578565b60018190556040518181527f66cbca4f3c64fecf1dcb9ce094abcf7f68c3450a1d4e3a8e917dd621edb4ebe09060200160405180910390a150565b6109a0610c53565b5115610a08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a6564000000000000000000000000006044820152606401610578565b610a1181610f98565b50565b5f600154341015610a5e576001546040517fb48978280000000000000000000000000000000000000000000000000000000081523460048201526024810191909152604401610578565b610a683383610bc9565b335f908152600260205260408120805492935090610a8583611c28565b91905055503373ffffffffffffffffffffffffffffffffffffffff167f4bda649efe6b98b0f9c1d5e859c29e20910f45c66dabfe6fad4a4881f7faf9cc8284604051610ad2929190611afc565b60405180910390a2919050565b6060610aea336107d8565b80610b08575033730576a174d229e3cfa37253523e645a78a0c91b57145b610b94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e747261637400006064820152608401610578565b5f610bae878787878715610ba8578761110d565b5a61110d565b9250905080610bbf57815160208301fd5b5095945050505050565b5f8282604051602001610bdd929190611c5f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209392505050565b5f80610c24610c53565b8060200190518101906107729190611be0565b5f805f610c4687878787611210565b91509150610bbf816112f8565b6060610d22610d1d6040517fd60000000000000000000000000000000000000000000000000000000000000060208201527f940000000000000000000000000000000000000000000000000000000000000060218201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660228201527f010000000000000000000000000000000000000000000000000000000000000060368201525f90603701604051602081830303815290604052805190602001205f1c905090565b6114aa565b905090565b33730576a174d229e3cfa37253523e645a78a0c91b5714610da4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e74000000006044820152606401610578565b565b5f80610dfe836040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018290525f90605c01604051602081830303815290604052805190602001209050919050565b90507f1626ba7e00000000000000000000000000000000000000000000000000000000610e6c82610e33610140880188611b7f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506105d592505050565b7fffffffff000000000000000000000000000000000000000000000000000000001614610e9d576001915050610772565b505f9392505050565b5f805460208301359180610eb983611c28565b9190505514610a11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496e76616c6964206e6f6e6365000000000000000000000000000000000000006044820152606401610578565b8015610a11576040515f9033907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90849084818181858888f193505050503d805f8114610f8c576040519150601f19603f3d011682016040523d82523d5f602084013e610f91565b606091505b5050505050565b5f610fa2826114ff565b90505f8151602083015ff090506110746040517fd60000000000000000000000000000000000000000000000000000000000000060208201527f940000000000000000000000000000000000000000000000000000000000000060218201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660228201527f010000000000000000000000000000000000000000000000000000000000000060368201525f90603701604051602081830303815290604052805190602001205f1c905090565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611108576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5772697465206661696c656400000000000000000000000000000000000000006044820152606401610578565b505050565b5f6060600184600181111561112457611124611c8d565b03611198578673ffffffffffffffffffffffffffffffffffffffff16838660405161114f9190611cba565b5f604051808303818686f4925050503d805f8114611188576040519150601f19603f3d011682016040523d82523d5f602084013e61118d565b606091505b509092509050611206565b8673ffffffffffffffffffffffffffffffffffffffff168387876040516111bf9190611cba565b5f60405180830381858888f193505050503d805f81146111fa576040519150601f19603f3d011682016040523d82523d5f602084013e6111ff565b606091505b5090925090505b9550959350505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561124557505f905060036112ef565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611296573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166112e9575f600192509250506112ef565b91505f90505b94509492505050565b5f81600481111561130b5761130b611c8d565b036113135750565b600181600481111561132757611327611c8d565b0361138e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610578565b60028160048111156113a2576113a2611c8d565b03611409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610578565b600381600481111561141d5761141d611c8d565b03610a11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610578565b6060813b600181116114cb57505060408051602081019091525f8152919050565b806114d581611cd5565b9150506040519150601f19601f602083010116820160405280825280600160208401853c50919050565b60608151600161150f9190611d09565b82604051602001611521929190611d1c565b6040516020818303038152906040529050919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610a11575f80fd5b5f8083601f840112611568575f80fd5b50813567ffffffffffffffff81111561157f575f80fd5b602083019150836020828501011115611596575f80fd5b9250929050565b5f805f805f805f8060c0898b0312156115b4575f80fd5b88356115bf81611537565b975060208901356115cf81611537565b965060408901356115df81611537565b955060608901359450608089013567ffffffffffffffff80821115611602575f80fd5b61160e8c838d01611558565b909650945060a08b0135915080821115611626575f80fd5b506116338b828c01611558565b999c989b5096995094979396929594505050565b5f805f805f6080868803121561165b575f80fd5b853561166681611537565b9450602086013561167681611537565b935060408601359250606086013567ffffffffffffffff811115611698575f80fd5b6116a488828901611558565b969995985093965092949392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126116f1575f80fd5b813567ffffffffffffffff8082111561170c5761170c6116b5565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715611752576117526116b5565b8160405283815286602085880101111561176a575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f806040838503121561179a575f80fd5b82359150602083013567ffffffffffffffff8111156117b7575f80fd5b6117c3858286016116e2565b9150509250929050565b5f805f606084860312156117df575f80fd5b833567ffffffffffffffff8111156117f5575f80fd5b84016101608187031215611807575f80fd5b95602085013595506040909401359392505050565b5f6020828403121561182c575f80fd5b813561079581611537565b5f60208284031215611847575f80fd5b5035919050565b5f6020828403121561185e575f80fd5b813567ffffffffffffffff811115611874575f80fd5b611880848285016116e2565b949350505050565b5f8083601f840112611898575f80fd5b50813567ffffffffffffffff8111156118af575f80fd5b6020830191508360208260051b8501011115611596575f80fd5b5f805f805f805f8060a0898b0312156118e0575f80fd5b88356118eb81611537565b975060208901356118fb81611537565b9650604089013567ffffffffffffffff80821115611917575f80fd5b6119238c838d01611888565b909850965060608b013591508082111561193b575f80fd5b6119478c838d01611888565b909650945060808b0135915080821115611626575f80fd5b5f805f805f60a08688031215611973575f80fd5b853561197e81611537565b945060208601359350604086013567ffffffffffffffff8111156119a0575f80fd5b6119ac888289016116e2565b9350506060860135600281106119c0575f80fd5b949793965091946080013592915050565b5f5b838110156119eb5781810151838201526020016119d3565b50505f910152565b5f8151808452611a0a8160208601602086016119d1565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61079560208301846119f3565b5f8060408385031215611a5f575f80fd5b8235611a6a81611537565b9150602083013567ffffffffffffffff8111156117b7575f80fd5b5f805f805f8060a08789031215611a9a575f80fd5b8635611aa581611537565b95506020870135611ab581611537565b94506040870135935060608701359250608087013567ffffffffffffffff811115611ade575f80fd5b611aea89828a01611558565b979a9699509497509295939492505050565b828152604060208201525f61188060408301846119f3565b5f60208284031215611b24575f80fd5b81517fffffffff0000000000000000000000000000000000000000000000000000000081168114610795575f80fd5b5f8060408385031215611b64575f80fd5b8251611b6f81611537565b6020939093015192949293505050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611bb2575f80fd5b83018035915067ffffffffffffffff821115611bcc575f80fd5b602001915036819003821315611596575f80fd5b5f60208284031215611bf0575f80fd5b815161079581611537565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611c5857611c58611bfb565b5060010190565b73ffffffffffffffffffffffffffffffffffffffff83168152604060208201525f61188060408301846119f3565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f8251611ccb8184602087016119d1565b9190910192915050565b5f81611ce357611ce3611bfb565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b8082018082111561077257610772611bfb565b7f630000000000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000008360e01b1660018201527f80600e6000396000f3000000000000000000000000000000000000000000000060058201525f600e8201525f8251611daa81600f8501602087016119d1565b91909101600f01939250505056fea264697066735822122095f8b9d54e488640bb8af3a1548faf779501856a06c519d628fea3d064487ff064736f6c63430008150033a2646970667358221220a58b6ef545ce7a5d7b7c9ac3ff4ed2e55511c5eb8cfd479a1816762039663d8064736f6c63430008150033", + "bytecode": "0x60a060405234801561000f575f80fd5b50604051612f08380380612f0883398101604081905261002e91610050565b6001600160a01b03166080525f80546001600160a01b0319163317905561007d565b5f60208284031215610060575f80fd5b81516001600160a01b0381168114610076575f80fd5b9392505050565b608051612e666100a25f395f8181609a0152818161043e01526104f40152612e665ff3fe608060405234801562000010575f80fd5b506004361062000090575f3560e01c80638da5cb5b116200005f5780638da5cb5b14620001325780638f9ade5e1462000152578063a6f9dae11462000194578063ffa1ad7414620001ab575f80fd5b80630d1cfcae14620000945780633f4ba83a14620000e65780635c975abb14620000f25780638456cb591462000128575b5f80fd5b620000bc7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b620000f0620001f7565b005b5f54620001179074010000000000000000000000000000000000000000900460ff1681565b6040519015158152602001620000dd565b620000f0620002bf565b5f54620000bc9073ffffffffffffffffffffffffffffffffffffffff1681565b620001696200016336600462000720565b6200039a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620000dd565b620000f0620001a536600462000753565b620005bc565b620001e86040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b604051620000dd919062000776565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146200026e575f546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff90911660248201526044015b60405180910390fd5b5f80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16815560405133917faeb196d352664784d1900b0e7414a8face7d29f4dae8c4b0cf68ed477423bbf491a2565b5f5473ffffffffffffffffffffffffffffffffffffffff16331462000332575f546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440162000265565b5f80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017815560405133917f5ee71a369c8672edded508e624ffc9257fa1ae6886ef32905c18e60196bca39991a2565b5f8054819074010000000000000000000000000000000000000000900460ff1615620003f2576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fa3def92300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152602482018690527f0000000000000000000000000000000000000000000000000000000000000000169063a3def923906044016020604051808303815f875af115801562000485573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620004ab9190620007e1565b6040805173ffffffffffffffffffffffffffffffffffffffff881660208201529081018290529092505f90606001604051602081830303815290604052805190602001209050807f000000000000000000000000000000000000000000000000000000000000000084866040516200052390620006e9565b73ffffffffffffffffffffffffffffffffffffffff9093168352602083019190915260408201526060018190604051809103905ff59050801580156200056b573d5f803e3d5ffd5b50915083838373ffffffffffffffffffffffffffffffffffffffff167f67a2e45041c70013518c5b9b849a6944a6c17ff44d66be1c707020460ecbd1db60405160405180910390a450935093915050565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146200062f575f546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440162000265565b73ffffffffffffffffffffffffffffffffffffffff81166200067d576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405190917f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b91a250565b61263780620007fa83390190565b803573ffffffffffffffffffffffffffffffffffffffff811681146200071b575f80fd5b919050565b5f805f6060848603121562000733575f80fd5b6200073e84620006f7565b95602085013595506040909401359392505050565b5f6020828403121562000764575f80fd5b6200076f82620006f7565b9392505050565b5f6020808352835180828501525f5b81811015620007a35785810183015185820160400152820162000785565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b5f60208284031215620007f2575f80fd5b505191905056fe60806040525f805534801562000013575f80fd5b506040516200263738038062002637833981016040819052620000369162000391565b604080516001600160a01b03851660208201528082018490528151808203830181526060909101909152839083906200006f8162000145565b5050506001600160a01b0383166200009a5760405163d92e233d60e01b815260040160405180910390fd5b6040516331a9108f60e11b8152600481018390525f906001600160a01b03851690636352211e90602401602060405180830381865afa158015620000e0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001069190620003c6565b90506001600160a01b0381166200013857604051630ede975960e01b8152600481018490526024015b60405180910390fd5b50600155506200049a9050565b6200014f620001ad565b51156200019f5760405162461bcd60e51b815260206004820152601360248201527f416c726561647920696e697469616c697a65640000000000000000000000000060448201526064016200012f565b620001aa8162000218565b50565b6060620002136200020d604051606b60f91b6020820152602560fa1b60218201526001600160601b03193060601b166022820152600160f81b60368201525f90603701604051602081830303815290604052805190602001205f1c905090565b620002e1565b905090565b5f620002248262000339565b90505f8151602083015ff090506200028b604051606b60f91b6020820152602560fa1b60218201526001600160601b03193060601b166022820152600160f81b60368201525f90603701604051602081830303815290604052805190602001205f1c905090565b6001600160a01b0316816001600160a01b031614620002dc5760405162461bcd60e51b815260206004820152600c60248201526b15dc9a5d194819985a5b195960a21b60448201526064016200012f565b505050565b6060813b600181116200030357505060408051602081019091525f8152919050565b806200030f81620003fd565b9150506040519150601f19601f602083010116820160405280825280600160208401853c50919050565b6060815160016200034b919062000415565b826040516020016200035f92919062000431565b6040516020818303038152906040529050919050565b80516001600160a01b03811681146200038c575f80fd5b919050565b5f805f60608486031215620003a4575f80fd5b620003af8462000375565b925060208401519150604084015190509250925092565b5f60208284031215620003d7575f80fd5b620003e28262000375565b9392505050565b634e487b7160e01b5f52601160045260245ffd5b5f816200040e576200040e620003e9565b505f190190565b808201808211156200042b576200042b620003e9565b92915050565b606360f81b815260e083901b6001600160e01b03191660018201526880600e6000396000f360b81b60058201525f600e82018190528251815b8181101562000489576020818601810151600f8684010152016200046a565b505f9201600f019182525092915050565b61218f80620004a85f395ff3fe60806040526004361061017a575f3560e01c8063a035b1fe116100d1578063bdf863171161007c578063f23a6e6111610057578063f23a6e61146104c7578063f6171e441461050c578063fc0c546a1461052b575f80fd5b8063bdf8631714610467578063c7dec3fc1461047c578063e00b9118146104a8575f80fd5b8063b0d691fe116100ac578063b0d691fe146103c6578063b94207d31461040d578063bc197c8114610420575f80fd5b8063a035b1fe1461037f578063a4f9edbf14610394578063affed0e0146103b3575f80fd5b80633a871cdd116101315780636e3ec0391161010c5780636e3ec039146102fe5780637af734731461031f57806391b7f5ed14610360575f80fd5b80633a871cdd146102855780635fee6085146102a45780636d70f7ae146102cf575f80fd5b8063157305fe11610161578063157305fe146102255780631626ba7e1461024457806317d70f7c14610263575f80fd5b806223de2914610185578063150b7a02146101ab575f80fd5b3661018157005b5f80fd5b348015610190575f80fd5b506101a961019f3660046118ae565b5050505050505050565b005b3480156101b6575f80fd5b506101ef6101c5366004611958565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020015b60405180910390f35b348015610230575f80fd5b506101a961023f366004611a9a565b61053f565b34801561024f575f80fd5b506101ef61025e366004611a9a565b610766565b34801561026e575f80fd5b50610277610909565b60405190815260200161021c565b348015610290575f80fd5b5061027761029f366004611ade565b61092d565b3480156102af575f80fd5b506102776102be366004611b2d565b60036020525f908152604090205481565b3480156102da575f80fd5b506102ee6102e9366004611b2d565b610969565b604051901515815260200161021c565b348015610309575f80fd5b50610312610a3b565b60405161021c9190611b48565b34801561032a575f80fd5b50610277610339366004611b2d565b73ffffffffffffffffffffffffffffffffffffffff165f9081526003602052604090205490565b34801561036b575f80fd5b506101a961037a366004611b8b565b610b0c565b34801561038a575f80fd5b5061027760015481565b34801561039f575f80fd5b506101a96103ae366004611ba2565b610bfa565b3480156103be575f80fd5b505f54610277565b3480156103d1575f80fd5b50730576a174d229e3cfa37253523e645a78a0c91b575b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161021c565b61027761041b366004611ba2565b610c76565b34801561042b575f80fd5b506101ef61043a366004611c1d565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b348015610472575f80fd5b5061027760025481565b348015610487575f80fd5b5061049b610496366004611cb3565b610dce565b60405161021c9190611d90565b3480156104b3575f80fd5b506102776104c2366004611da2565b610eb8565b3480156104d2575f80fd5b506101ef6104e1366004611dd9565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b348015610517575f80fd5b50610277610526366004611e50565b610f09565b348015610536575f80fd5b506103e8610f2b565b61054833610969565b80610566575033730576a174d229e3cfa37253523e645a78a0c91b57145b6105f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084015b60405180910390fd5b5f828152600460205260408082208151808301928390529160029082845b8154815260200190600101908083116106155750505050509050805f6002811061064157610641611e70565b602002015115801561065557506020810151155b801561068a57505f805260046020527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ed548314155b156106c4576040517ffe239804000000000000000000000000000000000000000000000000000000008152600481018490526024016105ee565b6020818101805183515f908152600490935260408084206001908101929092558451925184528084209290925585835290822082815501819055600280549161070c83611eca565b91905055503373ffffffffffffffffffffffffffffffffffffffff167f0cd979445339c62199996f208428d987b1cea24d18e62b79ec24d94b636e8b708484604051610759929190611efe565b60405180910390a2505050565b5f805f8061078685602081015160408201516060909201515f1a92909190565b9094509250905060ff81165f0361089c57828583016020016107a782610969565b1580156107ca575073ffffffffffffffffffffffffffffffffffffffff82163014155b156107fd57507fffffffff0000000000000000000000000000000000000000000000000000000094506109039350505050565b6040517f1626ba7e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831690631626ba7e90610851908b908590600401611efe565b602060405180830381865afa15801561086c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108909190611f16565b95505050505050610903565b6108ab6102e987838686610f48565b156108dc57507f1626ba7e000000000000000000000000000000000000000000000000000000009250610903915050565b507fffffffff00000000000000000000000000000000000000000000000000000000925050505b92915050565b5f80610913610f64565b8060200190518101906109269190611f55565b9392505050565b5f610936611038565b61094084846110b7565b905061094f6040850185611f81565b90505f0361096057610960846111b7565b61092682611235565b5f805f610974610f64565b8060200190518101906109879190611f55565b915091508373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016109dd91815260200190565b602060405180830381865afa1580156109f8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a1c9190611fe2565b73ffffffffffffffffffffffffffffffffffffffff1614949350505050565b6002546060908015610b08578067ffffffffffffffff811115610a6057610a606119c6565b604051908082528060200260200182016040528015610a89578160200160208202803683370190505b505f80805260046020527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ed549193505b82811015610b055781848281518110610ad457610ad4611e70565b6020908102919091018101919091525f9283526004905260409091206001015490610afe81611ffd565b9050610ab9565b50505b5090565b610b1533610969565b80610b33575033730576a174d229e3cfa37253523e645a78a0c91b57145b610bbf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084016105ee565b60018190556040518181527f66cbca4f3c64fecf1dcb9ce094abcf7f68c3450a1d4e3a8e917dd621edb4ebe09060200160405180910390a150565b610c02610f64565b5115610c6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a65640000000000000000000000000060448201526064016105ee565b610c73816112a9565b50565b5f600154341015610cc0576001546040517fb489782800000000000000000000000000000000000000000000000000000000815234600482015260248101919091526044016105ee565b610cca3383610eb8565b335f908152600360205260408120805492935090610ce783611ffd565b909155505060046020525f81815260408082207f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ed805460018301819055908590558084529183208490557f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec8054909391929103610d62578383555b60028054905f610d7183611ffd565b91905055503373ffffffffffffffffffffffffffffffffffffffff167f4bda649efe6b98b0f9c1d5e859c29e20910f45c66dabfe6fad4a4881f7faf9cc8587604051610dbe929190611efe565b60405180910390a2505050919050565b6060610dd933610969565b80610df7575033730576a174d229e3cfa37253523e645a78a0c91b57145b610e83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084016105ee565b5f610e9d878787878715610e97578761141e565b5a61141e565b9250905080610eae57815160208301fd5b5095945050505050565b5f8282604051602001610ecc929190612034565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209392505050565b6004602052815f5260405f208160028110610f22575f80fd5b01549150829050565b5f80610f35610f64565b8060200190518101906109039190611fe2565b5f805f610f5787878787611521565b91509150610eae81611609565b606061103361102e6040517fd60000000000000000000000000000000000000000000000000000000000000060208201527f940000000000000000000000000000000000000000000000000000000000000060218201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660228201527f010000000000000000000000000000000000000000000000000000000000000060368201525f90603701604051602081830303815290604052805190602001205f1c905090565b6117bb565b905090565b33730576a174d229e3cfa37253523e645a78a0c91b57146110b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e740000000060448201526064016105ee565b565b5f8061110f836040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018290525f90605c01604051602081830303815290604052805190602001209050919050565b90507f1626ba7e0000000000000000000000000000000000000000000000000000000061117d82611144610140880188611f81565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061076692505050565b7fffffffff0000000000000000000000000000000000000000000000000000000016146111ae576001915050610903565b505f9392505050565b5f8054602083013591806111ca83611ffd565b9190505514610c73576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496e76616c6964206e6f6e63650000000000000000000000000000000000000060448201526064016105ee565b8015610c73576040515f9033907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90849084818181858888f193505050503d805f811461129d576040519150601f19603f3d011682016040523d82523d5f602084013e6112a2565b606091505b5050505050565b5f6112b382611810565b90505f8151602083015ff090506113856040517fd60000000000000000000000000000000000000000000000000000000000000060208201527f940000000000000000000000000000000000000000000000000000000000000060218201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660228201527f010000000000000000000000000000000000000000000000000000000000000060368201525f90603701604051602081830303815290604052805190602001205f1c905090565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611419576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5772697465206661696c6564000000000000000000000000000000000000000060448201526064016105ee565b505050565b5f6060600184600181111561143557611435612062565b036114a9578673ffffffffffffffffffffffffffffffffffffffff168386604051611460919061208f565b5f604051808303818686f4925050503d805f8114611499576040519150601f19603f3d011682016040523d82523d5f602084013e61149e565b606091505b509092509050611517565b8673ffffffffffffffffffffffffffffffffffffffff168387876040516114d0919061208f565b5f60405180830381858888f193505050503d805f811461150b576040519150601f19603f3d011682016040523d82523d5f602084013e611510565b606091505b5090925090505b9550959350505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561155657505f90506003611600565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156115a7573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166115fa575f60019250925050611600565b91505f90505b94509492505050565b5f81600481111561161c5761161c612062565b036116245750565b600181600481111561163857611638612062565b0361169f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016105ee565b60028160048111156116b3576116b3612062565b0361171a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016105ee565b600381600481111561172e5761172e612062565b03610c73576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016105ee565b6060813b600181116117dc57505060408051602081019091525f8152919050565b806117e681611eca565b9150506040519150601f19601f602083010116820160405280825280600160208401853c50919050565b60608151600161182091906120aa565b826040516020016118329291906120bd565b6040516020818303038152906040529050919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610c73575f80fd5b5f8083601f840112611879575f80fd5b50813567ffffffffffffffff811115611890575f80fd5b6020830191508360208285010111156118a7575f80fd5b9250929050565b5f805f805f805f8060c0898b0312156118c5575f80fd5b88356118d081611848565b975060208901356118e081611848565b965060408901356118f081611848565b955060608901359450608089013567ffffffffffffffff80821115611913575f80fd5b61191f8c838d01611869565b909650945060a08b0135915080821115611937575f80fd5b506119448b828c01611869565b999c989b5096995094979396929594505050565b5f805f805f6080868803121561196c575f80fd5b853561197781611848565b9450602086013561198781611848565b935060408601359250606086013567ffffffffffffffff8111156119a9575f80fd5b6119b588828901611869565b969995985093965092949392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112611a02575f80fd5b813567ffffffffffffffff80821115611a1d57611a1d6119c6565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715611a6357611a636119c6565b81604052838152866020858801011115611a7b575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f8060408385031215611aab575f80fd5b82359150602083013567ffffffffffffffff811115611ac8575f80fd5b611ad4858286016119f3565b9150509250929050565b5f805f60608486031215611af0575f80fd5b833567ffffffffffffffff811115611b06575f80fd5b84016101608187031215611b18575f80fd5b95602085013595506040909401359392505050565b5f60208284031215611b3d575f80fd5b813561092681611848565b602080825282518282018190525f9190848201906040850190845b81811015611b7f57835183529284019291840191600101611b63565b50909695505050505050565b5f60208284031215611b9b575f80fd5b5035919050565b5f60208284031215611bb2575f80fd5b813567ffffffffffffffff811115611bc8575f80fd5b611bd4848285016119f3565b949350505050565b5f8083601f840112611bec575f80fd5b50813567ffffffffffffffff811115611c03575f80fd5b6020830191508360208260051b85010111156118a7575f80fd5b5f805f805f805f8060a0898b031215611c34575f80fd5b8835611c3f81611848565b97506020890135611c4f81611848565b9650604089013567ffffffffffffffff80821115611c6b575f80fd5b611c778c838d01611bdc565b909850965060608b0135915080821115611c8f575f80fd5b611c9b8c838d01611bdc565b909650945060808b0135915080821115611937575f80fd5b5f805f805f60a08688031215611cc7575f80fd5b8535611cd281611848565b945060208601359350604086013567ffffffffffffffff811115611cf4575f80fd5b611d00888289016119f3565b935050606086013560028110611d14575f80fd5b949793965091946080013592915050565b5f5b83811015611d3f578181015183820152602001611d27565b50505f910152565b5f8151808452611d5e816020860160208601611d25565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6109266020830184611d47565b5f8060408385031215611db3575f80fd5b8235611dbe81611848565b9150602083013567ffffffffffffffff811115611ac8575f80fd5b5f805f805f8060a08789031215611dee575f80fd5b8635611df981611848565b95506020870135611e0981611848565b94506040870135935060608701359250608087013567ffffffffffffffff811115611e32575f80fd5b611e3e89828a01611869565b979a9699509497509295939492505050565b5f8060408385031215611e61575f80fd5b50508035926020909101359150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f81611ed857611ed8611e9d565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b828152604060208201525f611bd46040830184611d47565b5f60208284031215611f26575f80fd5b81517fffffffff0000000000000000000000000000000000000000000000000000000081168114610926575f80fd5b5f8060408385031215611f66575f80fd5b8251611f7181611848565b6020939093015192949293505050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611fb4575f80fd5b83018035915067ffffffffffffffff821115611fce575f80fd5b6020019150368190038213156118a7575f80fd5b5f60208284031215611ff2575f80fd5b815161092681611848565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361202d5761202d611e9d565b5060010190565b73ffffffffffffffffffffffffffffffffffffffff83168152604060208201525f611bd46040830184611d47565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f82516120a0818460208701611d25565b9190910192915050565b8082018082111561090357610903611e9d565b7f630000000000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000008360e01b1660018201527f80600e6000396000f3000000000000000000000000000000000000000000000060058201525f600e8201525f825161214b81600f850160208701611d25565b91909101600f01939250505056fea26469706673582212208ee99f5816e66f69a8926786a9858f1caf0bbd099c82d85d9db66d927e9986f664736f6c63430008150033a26469706673582212208c567fe1bca2e8845ee63761d92e29a21b1c2be026fa2116ead8140c095e0f4164736f6c63430008150033", + "deployedBytecode": "0x608060405234801562000010575f80fd5b506004361062000090575f3560e01c80638da5cb5b116200005f5780638da5cb5b14620001325780638f9ade5e1462000152578063a6f9dae11462000194578063ffa1ad7414620001ab575f80fd5b80630d1cfcae14620000945780633f4ba83a14620000e65780635c975abb14620000f25780638456cb591462000128575b5f80fd5b620000bc7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b620000f0620001f7565b005b5f54620001179074010000000000000000000000000000000000000000900460ff1681565b6040519015158152602001620000dd565b620000f0620002bf565b5f54620000bc9073ffffffffffffffffffffffffffffffffffffffff1681565b620001696200016336600462000720565b6200039a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620000dd565b620000f0620001a536600462000753565b620005bc565b620001e86040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b604051620000dd919062000776565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146200026e575f546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff90911660248201526044015b60405180910390fd5b5f80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16815560405133917faeb196d352664784d1900b0e7414a8face7d29f4dae8c4b0cf68ed477423bbf491a2565b5f5473ffffffffffffffffffffffffffffffffffffffff16331462000332575f546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440162000265565b5f80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017815560405133917f5ee71a369c8672edded508e624ffc9257fa1ae6886ef32905c18e60196bca39991a2565b5f8054819074010000000000000000000000000000000000000000900460ff1615620003f2576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fa3def92300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152602482018690527f0000000000000000000000000000000000000000000000000000000000000000169063a3def923906044016020604051808303815f875af115801562000485573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620004ab9190620007e1565b6040805173ffffffffffffffffffffffffffffffffffffffff881660208201529081018290529092505f90606001604051602081830303815290604052805190602001209050807f000000000000000000000000000000000000000000000000000000000000000084866040516200052390620006e9565b73ffffffffffffffffffffffffffffffffffffffff9093168352602083019190915260408201526060018190604051809103905ff59050801580156200056b573d5f803e3d5ffd5b50915083838373ffffffffffffffffffffffffffffffffffffffff167f67a2e45041c70013518c5b9b849a6944a6c17ff44d66be1c707020460ecbd1db60405160405180910390a450935093915050565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146200062f575f546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440162000265565b73ffffffffffffffffffffffffffffffffffffffff81166200067d576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405190917f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b91a250565b61263780620007fa83390190565b803573ffffffffffffffffffffffffffffffffffffffff811681146200071b575f80fd5b919050565b5f805f6060848603121562000733575f80fd5b6200073e84620006f7565b95602085013595506040909401359392505050565b5f6020828403121562000764575f80fd5b6200076f82620006f7565b9392505050565b5f6020808352835180828501525f5b81811015620007a35785810183015185820160400152820162000785565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b5f60208284031215620007f2575f80fd5b505191905056fe60806040525f805534801562000013575f80fd5b506040516200263738038062002637833981016040819052620000369162000391565b604080516001600160a01b03851660208201528082018490528151808203830181526060909101909152839083906200006f8162000145565b5050506001600160a01b0383166200009a5760405163d92e233d60e01b815260040160405180910390fd5b6040516331a9108f60e11b8152600481018390525f906001600160a01b03851690636352211e90602401602060405180830381865afa158015620000e0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001069190620003c6565b90506001600160a01b0381166200013857604051630ede975960e01b8152600481018490526024015b60405180910390fd5b50600155506200049a9050565b6200014f620001ad565b51156200019f5760405162461bcd60e51b815260206004820152601360248201527f416c726561647920696e697469616c697a65640000000000000000000000000060448201526064016200012f565b620001aa8162000218565b50565b6060620002136200020d604051606b60f91b6020820152602560fa1b60218201526001600160601b03193060601b166022820152600160f81b60368201525f90603701604051602081830303815290604052805190602001205f1c905090565b620002e1565b905090565b5f620002248262000339565b90505f8151602083015ff090506200028b604051606b60f91b6020820152602560fa1b60218201526001600160601b03193060601b166022820152600160f81b60368201525f90603701604051602081830303815290604052805190602001205f1c905090565b6001600160a01b0316816001600160a01b031614620002dc5760405162461bcd60e51b815260206004820152600c60248201526b15dc9a5d194819985a5b195960a21b60448201526064016200012f565b505050565b6060813b600181116200030357505060408051602081019091525f8152919050565b806200030f81620003fd565b9150506040519150601f19601f602083010116820160405280825280600160208401853c50919050565b6060815160016200034b919062000415565b826040516020016200035f92919062000431565b6040516020818303038152906040529050919050565b80516001600160a01b03811681146200038c575f80fd5b919050565b5f805f60608486031215620003a4575f80fd5b620003af8462000375565b925060208401519150604084015190509250925092565b5f60208284031215620003d7575f80fd5b620003e28262000375565b9392505050565b634e487b7160e01b5f52601160045260245ffd5b5f816200040e576200040e620003e9565b505f190190565b808201808211156200042b576200042b620003e9565b92915050565b606360f81b815260e083901b6001600160e01b03191660018201526880600e6000396000f360b81b60058201525f600e82018190528251815b8181101562000489576020818601810151600f8684010152016200046a565b505f9201600f019182525092915050565b61218f80620004a85f395ff3fe60806040526004361061017a575f3560e01c8063a035b1fe116100d1578063bdf863171161007c578063f23a6e6111610057578063f23a6e61146104c7578063f6171e441461050c578063fc0c546a1461052b575f80fd5b8063bdf8631714610467578063c7dec3fc1461047c578063e00b9118146104a8575f80fd5b8063b0d691fe116100ac578063b0d691fe146103c6578063b94207d31461040d578063bc197c8114610420575f80fd5b8063a035b1fe1461037f578063a4f9edbf14610394578063affed0e0146103b3575f80fd5b80633a871cdd116101315780636e3ec0391161010c5780636e3ec039146102fe5780637af734731461031f57806391b7f5ed14610360575f80fd5b80633a871cdd146102855780635fee6085146102a45780636d70f7ae146102cf575f80fd5b8063157305fe11610161578063157305fe146102255780631626ba7e1461024457806317d70f7c14610263575f80fd5b806223de2914610185578063150b7a02146101ab575f80fd5b3661018157005b5f80fd5b348015610190575f80fd5b506101a961019f3660046118ae565b5050505050505050565b005b3480156101b6575f80fd5b506101ef6101c5366004611958565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020015b60405180910390f35b348015610230575f80fd5b506101a961023f366004611a9a565b61053f565b34801561024f575f80fd5b506101ef61025e366004611a9a565b610766565b34801561026e575f80fd5b50610277610909565b60405190815260200161021c565b348015610290575f80fd5b5061027761029f366004611ade565b61092d565b3480156102af575f80fd5b506102776102be366004611b2d565b60036020525f908152604090205481565b3480156102da575f80fd5b506102ee6102e9366004611b2d565b610969565b604051901515815260200161021c565b348015610309575f80fd5b50610312610a3b565b60405161021c9190611b48565b34801561032a575f80fd5b50610277610339366004611b2d565b73ffffffffffffffffffffffffffffffffffffffff165f9081526003602052604090205490565b34801561036b575f80fd5b506101a961037a366004611b8b565b610b0c565b34801561038a575f80fd5b5061027760015481565b34801561039f575f80fd5b506101a96103ae366004611ba2565b610bfa565b3480156103be575f80fd5b505f54610277565b3480156103d1575f80fd5b50730576a174d229e3cfa37253523e645a78a0c91b575b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161021c565b61027761041b366004611ba2565b610c76565b34801561042b575f80fd5b506101ef61043a366004611c1d565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b348015610472575f80fd5b5061027760025481565b348015610487575f80fd5b5061049b610496366004611cb3565b610dce565b60405161021c9190611d90565b3480156104b3575f80fd5b506102776104c2366004611da2565b610eb8565b3480156104d2575f80fd5b506101ef6104e1366004611dd9565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b348015610517575f80fd5b50610277610526366004611e50565b610f09565b348015610536575f80fd5b506103e8610f2b565b61054833610969565b80610566575033730576a174d229e3cfa37253523e645a78a0c91b57145b6105f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084015b60405180910390fd5b5f828152600460205260408082208151808301928390529160029082845b8154815260200190600101908083116106155750505050509050805f6002811061064157610641611e70565b602002015115801561065557506020810151155b801561068a57505f805260046020527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ed548314155b156106c4576040517ffe239804000000000000000000000000000000000000000000000000000000008152600481018490526024016105ee565b6020818101805183515f908152600490935260408084206001908101929092558451925184528084209290925585835290822082815501819055600280549161070c83611eca565b91905055503373ffffffffffffffffffffffffffffffffffffffff167f0cd979445339c62199996f208428d987b1cea24d18e62b79ec24d94b636e8b708484604051610759929190611efe565b60405180910390a2505050565b5f805f8061078685602081015160408201516060909201515f1a92909190565b9094509250905060ff81165f0361089c57828583016020016107a782610969565b1580156107ca575073ffffffffffffffffffffffffffffffffffffffff82163014155b156107fd57507fffffffff0000000000000000000000000000000000000000000000000000000094506109039350505050565b6040517f1626ba7e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831690631626ba7e90610851908b908590600401611efe565b602060405180830381865afa15801561086c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108909190611f16565b95505050505050610903565b6108ab6102e987838686610f48565b156108dc57507f1626ba7e000000000000000000000000000000000000000000000000000000009250610903915050565b507fffffffff00000000000000000000000000000000000000000000000000000000925050505b92915050565b5f80610913610f64565b8060200190518101906109269190611f55565b9392505050565b5f610936611038565b61094084846110b7565b905061094f6040850185611f81565b90505f0361096057610960846111b7565b61092682611235565b5f805f610974610f64565b8060200190518101906109879190611f55565b915091508373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016109dd91815260200190565b602060405180830381865afa1580156109f8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a1c9190611fe2565b73ffffffffffffffffffffffffffffffffffffffff1614949350505050565b6002546060908015610b08578067ffffffffffffffff811115610a6057610a606119c6565b604051908082528060200260200182016040528015610a89578160200160208202803683370190505b505f80805260046020527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ed549193505b82811015610b055781848281518110610ad457610ad4611e70565b6020908102919091018101919091525f9283526004905260409091206001015490610afe81611ffd565b9050610ab9565b50505b5090565b610b1533610969565b80610b33575033730576a174d229e3cfa37253523e645a78a0c91b57145b610bbf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084016105ee565b60018190556040518181527f66cbca4f3c64fecf1dcb9ce094abcf7f68c3450a1d4e3a8e917dd621edb4ebe09060200160405180910390a150565b610c02610f64565b5115610c6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a65640000000000000000000000000060448201526064016105ee565b610c73816112a9565b50565b5f600154341015610cc0576001546040517fb489782800000000000000000000000000000000000000000000000000000000815234600482015260248101919091526044016105ee565b610cca3383610eb8565b335f908152600360205260408120805492935090610ce783611ffd565b909155505060046020525f81815260408082207f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ed805460018301819055908590558084529183208490557f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec8054909391929103610d62578383555b60028054905f610d7183611ffd565b91905055503373ffffffffffffffffffffffffffffffffffffffff167f4bda649efe6b98b0f9c1d5e859c29e20910f45c66dabfe6fad4a4881f7faf9cc8587604051610dbe929190611efe565b60405180910390a2505050919050565b6060610dd933610969565b80610df7575033730576a174d229e3cfa37253523e645a78a0c91b57145b610e83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084016105ee565b5f610e9d878787878715610e97578761141e565b5a61141e565b9250905080610eae57815160208301fd5b5095945050505050565b5f8282604051602001610ecc929190612034565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209392505050565b6004602052815f5260405f208160028110610f22575f80fd5b01549150829050565b5f80610f35610f64565b8060200190518101906109039190611fe2565b5f805f610f5787878787611521565b91509150610eae81611609565b606061103361102e6040517fd60000000000000000000000000000000000000000000000000000000000000060208201527f940000000000000000000000000000000000000000000000000000000000000060218201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660228201527f010000000000000000000000000000000000000000000000000000000000000060368201525f90603701604051602081830303815290604052805190602001205f1c905090565b6117bb565b905090565b33730576a174d229e3cfa37253523e645a78a0c91b57146110b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e740000000060448201526064016105ee565b565b5f8061110f836040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018290525f90605c01604051602081830303815290604052805190602001209050919050565b90507f1626ba7e0000000000000000000000000000000000000000000000000000000061117d82611144610140880188611f81565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061076692505050565b7fffffffff0000000000000000000000000000000000000000000000000000000016146111ae576001915050610903565b505f9392505050565b5f8054602083013591806111ca83611ffd565b9190505514610c73576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496e76616c6964206e6f6e63650000000000000000000000000000000000000060448201526064016105ee565b8015610c73576040515f9033907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90849084818181858888f193505050503d805f811461129d576040519150601f19603f3d011682016040523d82523d5f602084013e6112a2565b606091505b5050505050565b5f6112b382611810565b90505f8151602083015ff090506113856040517fd60000000000000000000000000000000000000000000000000000000000000060208201527f940000000000000000000000000000000000000000000000000000000000000060218201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660228201527f010000000000000000000000000000000000000000000000000000000000000060368201525f90603701604051602081830303815290604052805190602001205f1c905090565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611419576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5772697465206661696c6564000000000000000000000000000000000000000060448201526064016105ee565b505050565b5f6060600184600181111561143557611435612062565b036114a9578673ffffffffffffffffffffffffffffffffffffffff168386604051611460919061208f565b5f604051808303818686f4925050503d805f8114611499576040519150601f19603f3d011682016040523d82523d5f602084013e61149e565b606091505b509092509050611517565b8673ffffffffffffffffffffffffffffffffffffffff168387876040516114d0919061208f565b5f60405180830381858888f193505050503d805f811461150b576040519150601f19603f3d011682016040523d82523d5f602084013e611510565b606091505b5090925090505b9550959350505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561155657505f90506003611600565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156115a7573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166115fa575f60019250925050611600565b91505f90505b94509492505050565b5f81600481111561161c5761161c612062565b036116245750565b600181600481111561163857611638612062565b0361169f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016105ee565b60028160048111156116b3576116b3612062565b0361171a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016105ee565b600381600481111561172e5761172e612062565b03610c73576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016105ee565b6060813b600181116117dc57505060408051602081019091525f8152919050565b806117e681611eca565b9150506040519150601f19601f602083010116820160405280825280600160208401853c50919050565b60608151600161182091906120aa565b826040516020016118329291906120bd565b6040516020818303038152906040529050919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610c73575f80fd5b5f8083601f840112611879575f80fd5b50813567ffffffffffffffff811115611890575f80fd5b6020830191508360208285010111156118a7575f80fd5b9250929050565b5f805f805f805f8060c0898b0312156118c5575f80fd5b88356118d081611848565b975060208901356118e081611848565b965060408901356118f081611848565b955060608901359450608089013567ffffffffffffffff80821115611913575f80fd5b61191f8c838d01611869565b909650945060a08b0135915080821115611937575f80fd5b506119448b828c01611869565b999c989b5096995094979396929594505050565b5f805f805f6080868803121561196c575f80fd5b853561197781611848565b9450602086013561198781611848565b935060408601359250606086013567ffffffffffffffff8111156119a9575f80fd5b6119b588828901611869565b969995985093965092949392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112611a02575f80fd5b813567ffffffffffffffff80821115611a1d57611a1d6119c6565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715611a6357611a636119c6565b81604052838152866020858801011115611a7b575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f8060408385031215611aab575f80fd5b82359150602083013567ffffffffffffffff811115611ac8575f80fd5b611ad4858286016119f3565b9150509250929050565b5f805f60608486031215611af0575f80fd5b833567ffffffffffffffff811115611b06575f80fd5b84016101608187031215611b18575f80fd5b95602085013595506040909401359392505050565b5f60208284031215611b3d575f80fd5b813561092681611848565b602080825282518282018190525f9190848201906040850190845b81811015611b7f57835183529284019291840191600101611b63565b50909695505050505050565b5f60208284031215611b9b575f80fd5b5035919050565b5f60208284031215611bb2575f80fd5b813567ffffffffffffffff811115611bc8575f80fd5b611bd4848285016119f3565b949350505050565b5f8083601f840112611bec575f80fd5b50813567ffffffffffffffff811115611c03575f80fd5b6020830191508360208260051b85010111156118a7575f80fd5b5f805f805f805f8060a0898b031215611c34575f80fd5b8835611c3f81611848565b97506020890135611c4f81611848565b9650604089013567ffffffffffffffff80821115611c6b575f80fd5b611c778c838d01611bdc565b909850965060608b0135915080821115611c8f575f80fd5b611c9b8c838d01611bdc565b909650945060808b0135915080821115611937575f80fd5b5f805f805f60a08688031215611cc7575f80fd5b8535611cd281611848565b945060208601359350604086013567ffffffffffffffff811115611cf4575f80fd5b611d00888289016119f3565b935050606086013560028110611d14575f80fd5b949793965091946080013592915050565b5f5b83811015611d3f578181015183820152602001611d27565b50505f910152565b5f8151808452611d5e816020860160208601611d25565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6109266020830184611d47565b5f8060408385031215611db3575f80fd5b8235611dbe81611848565b9150602083013567ffffffffffffffff811115611ac8575f80fd5b5f805f805f8060a08789031215611dee575f80fd5b8635611df981611848565b95506020870135611e0981611848565b94506040870135935060608701359250608087013567ffffffffffffffff811115611e32575f80fd5b611e3e89828a01611869565b979a9699509497509295939492505050565b5f8060408385031215611e61575f80fd5b50508035926020909101359150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f81611ed857611ed8611e9d565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b828152604060208201525f611bd46040830184611d47565b5f60208284031215611f26575f80fd5b81517fffffffff0000000000000000000000000000000000000000000000000000000081168114610926575f80fd5b5f8060408385031215611f66575f80fd5b8251611f7181611848565b6020939093015192949293505050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611fb4575f80fd5b83018035915067ffffffffffffffff821115611fce575f80fd5b6020019150368190038213156118a7575f80fd5b5f60208284031215611ff2575f80fd5b815161092681611848565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361202d5761202d611e9d565b5060010190565b73ffffffffffffffffffffffffffffffffffffffff83168152604060208201525f611bd46040830184611d47565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f82516120a0818460208701611d25565b9190910192915050565b8082018082111561090357610903611e9d565b7f630000000000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000008360e01b1660018201527f80600e6000396000f3000000000000000000000000000000000000000000000060058201525f600e8201525f825161214b81600f850160208701611d25565b91909101600f01939250505056fea26469706673582212208ee99f5816e66f69a8926786a9858f1caf0bbd099c82d85d9db66d927e9986f664736f6c63430008150033a26469706673582212208c567fe1bca2e8845ee63761d92e29a21b1c2be026fa2116ead8140c095e0f4164736f6c63430008150033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/abis/0.8.21/AgentMech.json b/abis/0.8.21/AgentMech.json index 7147d65..725c934 100644 --- a/abis/0.8.21/AgentMech.json +++ b/abis/0.8.21/AgentMech.json @@ -51,6 +51,17 @@ "name": "NotEnoughPaid", "type": "error" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "requestId", + "type": "uint256" + } + ], + "name": "RequestIdNotFound", + "type": "error" + }, { "inputs": [], "name": "ZeroAddress", @@ -81,25 +92,6 @@ "name": "Deliver", "type": "event" }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "taskHash", - "type": "bytes32" - } - ], - "name": "Perform", - "type": "event" - }, { "anonymous": false, "inputs": [ @@ -251,6 +243,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "getUndeliveredRequestIds", + "outputs": [ + { + "internalType": "uint256[]", + "name": "requestIds", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -294,6 +299,30 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "mapRequestIds", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -326,6 +355,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "numUndeliveredRequests", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -651,8 +693,8 @@ "type": "receive" } ], - "bytecode": "0x60806040525f805534801562000013575f80fd5b506040516200229638038062002296833981016040819052620000369162000391565b604080516001600160a01b03851660208201528082018490528151808203830181526060909101909152839083906200006f8162000145565b5050506001600160a01b0383166200009a5760405163d92e233d60e01b815260040160405180910390fd5b6040516331a9108f60e11b8152600481018390525f906001600160a01b03851690636352211e90602401602060405180830381865afa158015620000e0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001069190620003c6565b90506001600160a01b0381166200013857604051630ede975960e01b8152600481018490526024015b60405180910390fd5b50600155506200049a9050565b6200014f620001ad565b51156200019f5760405162461bcd60e51b815260206004820152601360248201527f416c726561647920696e697469616c697a65640000000000000000000000000060448201526064016200012f565b620001aa8162000218565b50565b6060620002136200020d604051606b60f91b6020820152602560fa1b60218201526001600160601b03193060601b166022820152600160f81b60368201525f90603701604051602081830303815290604052805190602001205f1c905090565b620002e1565b905090565b5f620002248262000339565b90505f8151602083015ff090506200028b604051606b60f91b6020820152602560fa1b60218201526001600160601b03193060601b166022820152600160f81b60368201525f90603701604051602081830303815290604052805190602001205f1c905090565b6001600160a01b0316816001600160a01b031614620002dc5760405162461bcd60e51b815260206004820152600c60248201526b15dc9a5d194819985a5b195960a21b60448201526064016200012f565b505050565b6060813b600181116200030357505060408051602081019091525f8152919050565b806200030f81620003fd565b9150506040519150601f19601f602083010116820160405280825280600160208401853c50919050565b6060815160016200034b919062000415565b826040516020016200035f92919062000431565b6040516020818303038152906040529050919050565b80516001600160a01b03811681146200038c575f80fd5b919050565b5f805f60608486031215620003a4575f80fd5b620003af8462000375565b925060208401519150604084015190509250925092565b5f60208284031215620003d7575f80fd5b620003e28262000375565b9392505050565b634e487b7160e01b5f52601160045260245ffd5b5f816200040e576200040e620003e9565b505f190190565b808201808211156200042b576200042b620003e9565b92915050565b606360f81b815260e083901b6001600160e01b03191660018201526880600e6000396000f360b81b60058201525f600e82018190528251815b8181101562000489576020818601810151600f8684010152016200046a565b505f9201600f019182525092915050565b611dee80620004a85f395ff3fe608060405260043610610159575f3560e01c8063a035b1fe116100bb578063bc197c8111610071578063e00b911811610057578063e00b911814610451578063f23a6e6114610470578063fc0c546a146104b5575f80fd5b8063bc197c81146103de578063c7dec3fc14610425575f80fd5b8063affed0e0116100a1578063affed0e014610371578063b0d691fe14610384578063b94207d3146103cb575f80fd5b8063a035b1fe1461033d578063a4f9edbf14610352575f80fd5b80633a871cdd116101105780636d70f7ae116100f65780636d70f7ae146102ae5780637af73473146102dd57806391b7f5ed1461031e575f80fd5b80633a871cdd146102645780635fee608514610283575f80fd5b8063157305fe11610140578063157305fe146102045780631626ba7e1461022357806317d70f7c14610242575f80fd5b806223de2914610164578063150b7a021461018a575f80fd5b3661016057005b5f80fd5b34801561016f575f80fd5b5061018861017e36600461159d565b5050505050505050565b005b348015610195575f80fd5b506101ce6101a4366004611647565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020015b60405180910390f35b34801561020f575f80fd5b5061018861021e366004611789565b6104c9565b34801561022e575f80fd5b506101ce61023d366004611789565b6105d5565b34801561024d575f80fd5b50610256610778565b6040519081526020016101fb565b34801561026f575f80fd5b5061025661027e3660046117cd565b61079c565b34801561028e575f80fd5b5061025661029d36600461181c565b60026020525f908152604090205481565b3480156102b9575f80fd5b506102cd6102c836600461181c565b6107d8565b60405190151581526020016101fb565b3480156102e8575f80fd5b506102566102f736600461181c565b73ffffffffffffffffffffffffffffffffffffffff165f9081526002602052604090205490565b348015610329575f80fd5b50610188610338366004611837565b6108aa565b348015610348575f80fd5b5061025660015481565b34801561035d575f80fd5b5061018861036c36600461184e565b610998565b34801561037c575f80fd5b505f54610256565b34801561038f575f80fd5b50730576a174d229e3cfa37253523e645a78a0c91b575b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101fb565b6102566103d936600461184e565b610a14565b3480156103e9575f80fd5b506101ce6103f83660046118c9565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b348015610430575f80fd5b5061044461043f36600461195f565b610adf565b6040516101fb9190611a3c565b34801561045c575f80fd5b5061025661046b366004611a4e565b610bc9565b34801561047b575f80fd5b506101ce61048a366004611a85565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b3480156104c0575f80fd5b506103a6610c1a565b6104d2336107d8565b806104f0575033730576a174d229e3cfa37253523e645a78a0c91b57145b610581576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084015b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f0cd979445339c62199996f208428d987b1cea24d18e62b79ec24d94b636e8b7083836040516105c9929190611afc565b60405180910390a25050565b5f805f806105f585602081015160408201516060909201515f1a92909190565b9094509250905060ff81165f0361070b5782858301602001610616826107d8565b158015610639575073ffffffffffffffffffffffffffffffffffffffff82163014155b1561066c57507fffffffff0000000000000000000000000000000000000000000000000000000094506107729350505050565b6040517f1626ba7e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831690631626ba7e906106c0908b908590600401611afc565b602060405180830381865afa1580156106db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ff9190611b14565b95505050505050610772565b61071a6102c887838686610c37565b1561074b57507f1626ba7e000000000000000000000000000000000000000000000000000000009250610772915050565b507fffffffff00000000000000000000000000000000000000000000000000000000925050505b92915050565b5f80610782610c53565b8060200190518101906107959190611b53565b9392505050565b5f6107a5610d27565b6107af8484610da6565b90506107be6040850185611b7f565b90505f036107cf576107cf84610ea6565b61079582610f24565b5f805f6107e3610c53565b8060200190518101906107f69190611b53565b915091508373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b815260040161084c91815260200190565b602060405180830381865afa158015610867573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061088b9190611be0565b73ffffffffffffffffffffffffffffffffffffffff1614949350505050565b6108b3336107d8565b806108d1575033730576a174d229e3cfa37253523e645a78a0c91b57145b61095d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e747261637400006064820152608401610578565b60018190556040518181527f66cbca4f3c64fecf1dcb9ce094abcf7f68c3450a1d4e3a8e917dd621edb4ebe09060200160405180910390a150565b6109a0610c53565b5115610a08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a6564000000000000000000000000006044820152606401610578565b610a1181610f98565b50565b5f600154341015610a5e576001546040517fb48978280000000000000000000000000000000000000000000000000000000081523460048201526024810191909152604401610578565b610a683383610bc9565b335f908152600260205260408120805492935090610a8583611c28565b91905055503373ffffffffffffffffffffffffffffffffffffffff167f4bda649efe6b98b0f9c1d5e859c29e20910f45c66dabfe6fad4a4881f7faf9cc8284604051610ad2929190611afc565b60405180910390a2919050565b6060610aea336107d8565b80610b08575033730576a174d229e3cfa37253523e645a78a0c91b57145b610b94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e747261637400006064820152608401610578565b5f610bae878787878715610ba8578761110d565b5a61110d565b9250905080610bbf57815160208301fd5b5095945050505050565b5f8282604051602001610bdd929190611c5f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209392505050565b5f80610c24610c53565b8060200190518101906107729190611be0565b5f805f610c4687878787611210565b91509150610bbf816112f8565b6060610d22610d1d6040517fd60000000000000000000000000000000000000000000000000000000000000060208201527f940000000000000000000000000000000000000000000000000000000000000060218201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660228201527f010000000000000000000000000000000000000000000000000000000000000060368201525f90603701604051602081830303815290604052805190602001205f1c905090565b6114aa565b905090565b33730576a174d229e3cfa37253523e645a78a0c91b5714610da4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e74000000006044820152606401610578565b565b5f80610dfe836040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018290525f90605c01604051602081830303815290604052805190602001209050919050565b90507f1626ba7e00000000000000000000000000000000000000000000000000000000610e6c82610e33610140880188611b7f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506105d592505050565b7fffffffff000000000000000000000000000000000000000000000000000000001614610e9d576001915050610772565b505f9392505050565b5f805460208301359180610eb983611c28565b9190505514610a11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496e76616c6964206e6f6e6365000000000000000000000000000000000000006044820152606401610578565b8015610a11576040515f9033907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90849084818181858888f193505050503d805f8114610f8c576040519150601f19603f3d011682016040523d82523d5f602084013e610f91565b606091505b5050505050565b5f610fa2826114ff565b90505f8151602083015ff090506110746040517fd60000000000000000000000000000000000000000000000000000000000000060208201527f940000000000000000000000000000000000000000000000000000000000000060218201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660228201527f010000000000000000000000000000000000000000000000000000000000000060368201525f90603701604051602081830303815290604052805190602001205f1c905090565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611108576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5772697465206661696c656400000000000000000000000000000000000000006044820152606401610578565b505050565b5f6060600184600181111561112457611124611c8d565b03611198578673ffffffffffffffffffffffffffffffffffffffff16838660405161114f9190611cba565b5f604051808303818686f4925050503d805f8114611188576040519150601f19603f3d011682016040523d82523d5f602084013e61118d565b606091505b509092509050611206565b8673ffffffffffffffffffffffffffffffffffffffff168387876040516111bf9190611cba565b5f60405180830381858888f193505050503d805f81146111fa576040519150601f19603f3d011682016040523d82523d5f602084013e6111ff565b606091505b5090925090505b9550959350505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561124557505f905060036112ef565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611296573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166112e9575f600192509250506112ef565b91505f90505b94509492505050565b5f81600481111561130b5761130b611c8d565b036113135750565b600181600481111561132757611327611c8d565b0361138e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610578565b60028160048111156113a2576113a2611c8d565b03611409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610578565b600381600481111561141d5761141d611c8d565b03610a11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610578565b6060813b600181116114cb57505060408051602081019091525f8152919050565b806114d581611cd5565b9150506040519150601f19601f602083010116820160405280825280600160208401853c50919050565b60608151600161150f9190611d09565b82604051602001611521929190611d1c565b6040516020818303038152906040529050919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610a11575f80fd5b5f8083601f840112611568575f80fd5b50813567ffffffffffffffff81111561157f575f80fd5b602083019150836020828501011115611596575f80fd5b9250929050565b5f805f805f805f8060c0898b0312156115b4575f80fd5b88356115bf81611537565b975060208901356115cf81611537565b965060408901356115df81611537565b955060608901359450608089013567ffffffffffffffff80821115611602575f80fd5b61160e8c838d01611558565b909650945060a08b0135915080821115611626575f80fd5b506116338b828c01611558565b999c989b5096995094979396929594505050565b5f805f805f6080868803121561165b575f80fd5b853561166681611537565b9450602086013561167681611537565b935060408601359250606086013567ffffffffffffffff811115611698575f80fd5b6116a488828901611558565b969995985093965092949392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126116f1575f80fd5b813567ffffffffffffffff8082111561170c5761170c6116b5565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715611752576117526116b5565b8160405283815286602085880101111561176a575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f806040838503121561179a575f80fd5b82359150602083013567ffffffffffffffff8111156117b7575f80fd5b6117c3858286016116e2565b9150509250929050565b5f805f606084860312156117df575f80fd5b833567ffffffffffffffff8111156117f5575f80fd5b84016101608187031215611807575f80fd5b95602085013595506040909401359392505050565b5f6020828403121561182c575f80fd5b813561079581611537565b5f60208284031215611847575f80fd5b5035919050565b5f6020828403121561185e575f80fd5b813567ffffffffffffffff811115611874575f80fd5b611880848285016116e2565b949350505050565b5f8083601f840112611898575f80fd5b50813567ffffffffffffffff8111156118af575f80fd5b6020830191508360208260051b8501011115611596575f80fd5b5f805f805f805f8060a0898b0312156118e0575f80fd5b88356118eb81611537565b975060208901356118fb81611537565b9650604089013567ffffffffffffffff80821115611917575f80fd5b6119238c838d01611888565b909850965060608b013591508082111561193b575f80fd5b6119478c838d01611888565b909650945060808b0135915080821115611626575f80fd5b5f805f805f60a08688031215611973575f80fd5b853561197e81611537565b945060208601359350604086013567ffffffffffffffff8111156119a0575f80fd5b6119ac888289016116e2565b9350506060860135600281106119c0575f80fd5b949793965091946080013592915050565b5f5b838110156119eb5781810151838201526020016119d3565b50505f910152565b5f8151808452611a0a8160208601602086016119d1565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61079560208301846119f3565b5f8060408385031215611a5f575f80fd5b8235611a6a81611537565b9150602083013567ffffffffffffffff8111156117b7575f80fd5b5f805f805f8060a08789031215611a9a575f80fd5b8635611aa581611537565b95506020870135611ab581611537565b94506040870135935060608701359250608087013567ffffffffffffffff811115611ade575f80fd5b611aea89828a01611558565b979a9699509497509295939492505050565b828152604060208201525f61188060408301846119f3565b5f60208284031215611b24575f80fd5b81517fffffffff0000000000000000000000000000000000000000000000000000000081168114610795575f80fd5b5f8060408385031215611b64575f80fd5b8251611b6f81611537565b6020939093015192949293505050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611bb2575f80fd5b83018035915067ffffffffffffffff821115611bcc575f80fd5b602001915036819003821315611596575f80fd5b5f60208284031215611bf0575f80fd5b815161079581611537565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611c5857611c58611bfb565b5060010190565b73ffffffffffffffffffffffffffffffffffffffff83168152604060208201525f61188060408301846119f3565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f8251611ccb8184602087016119d1565b9190910192915050565b5f81611ce357611ce3611bfb565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b8082018082111561077257610772611bfb565b7f630000000000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000008360e01b1660018201527f80600e6000396000f3000000000000000000000000000000000000000000000060058201525f600e8201525f8251611daa81600f8501602087016119d1565b91909101600f01939250505056fea264697066735822122095f8b9d54e488640bb8af3a1548faf779501856a06c519d628fea3d064487ff064736f6c63430008150033", - "deployedBytecode": "0x608060405260043610610159575f3560e01c8063a035b1fe116100bb578063bc197c8111610071578063e00b911811610057578063e00b911814610451578063f23a6e6114610470578063fc0c546a146104b5575f80fd5b8063bc197c81146103de578063c7dec3fc14610425575f80fd5b8063affed0e0116100a1578063affed0e014610371578063b0d691fe14610384578063b94207d3146103cb575f80fd5b8063a035b1fe1461033d578063a4f9edbf14610352575f80fd5b80633a871cdd116101105780636d70f7ae116100f65780636d70f7ae146102ae5780637af73473146102dd57806391b7f5ed1461031e575f80fd5b80633a871cdd146102645780635fee608514610283575f80fd5b8063157305fe11610140578063157305fe146102045780631626ba7e1461022357806317d70f7c14610242575f80fd5b806223de2914610164578063150b7a021461018a575f80fd5b3661016057005b5f80fd5b34801561016f575f80fd5b5061018861017e36600461159d565b5050505050505050565b005b348015610195575f80fd5b506101ce6101a4366004611647565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020015b60405180910390f35b34801561020f575f80fd5b5061018861021e366004611789565b6104c9565b34801561022e575f80fd5b506101ce61023d366004611789565b6105d5565b34801561024d575f80fd5b50610256610778565b6040519081526020016101fb565b34801561026f575f80fd5b5061025661027e3660046117cd565b61079c565b34801561028e575f80fd5b5061025661029d36600461181c565b60026020525f908152604090205481565b3480156102b9575f80fd5b506102cd6102c836600461181c565b6107d8565b60405190151581526020016101fb565b3480156102e8575f80fd5b506102566102f736600461181c565b73ffffffffffffffffffffffffffffffffffffffff165f9081526002602052604090205490565b348015610329575f80fd5b50610188610338366004611837565b6108aa565b348015610348575f80fd5b5061025660015481565b34801561035d575f80fd5b5061018861036c36600461184e565b610998565b34801561037c575f80fd5b505f54610256565b34801561038f575f80fd5b50730576a174d229e3cfa37253523e645a78a0c91b575b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101fb565b6102566103d936600461184e565b610a14565b3480156103e9575f80fd5b506101ce6103f83660046118c9565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b348015610430575f80fd5b5061044461043f36600461195f565b610adf565b6040516101fb9190611a3c565b34801561045c575f80fd5b5061025661046b366004611a4e565b610bc9565b34801561047b575f80fd5b506101ce61048a366004611a85565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b3480156104c0575f80fd5b506103a6610c1a565b6104d2336107d8565b806104f0575033730576a174d229e3cfa37253523e645a78a0c91b57145b610581576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084015b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167f0cd979445339c62199996f208428d987b1cea24d18e62b79ec24d94b636e8b7083836040516105c9929190611afc565b60405180910390a25050565b5f805f806105f585602081015160408201516060909201515f1a92909190565b9094509250905060ff81165f0361070b5782858301602001610616826107d8565b158015610639575073ffffffffffffffffffffffffffffffffffffffff82163014155b1561066c57507fffffffff0000000000000000000000000000000000000000000000000000000094506107729350505050565b6040517f1626ba7e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831690631626ba7e906106c0908b908590600401611afc565b602060405180830381865afa1580156106db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ff9190611b14565b95505050505050610772565b61071a6102c887838686610c37565b1561074b57507f1626ba7e000000000000000000000000000000000000000000000000000000009250610772915050565b507fffffffff00000000000000000000000000000000000000000000000000000000925050505b92915050565b5f80610782610c53565b8060200190518101906107959190611b53565b9392505050565b5f6107a5610d27565b6107af8484610da6565b90506107be6040850185611b7f565b90505f036107cf576107cf84610ea6565b61079582610f24565b5f805f6107e3610c53565b8060200190518101906107f69190611b53565b915091508373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b815260040161084c91815260200190565b602060405180830381865afa158015610867573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061088b9190611be0565b73ffffffffffffffffffffffffffffffffffffffff1614949350505050565b6108b3336107d8565b806108d1575033730576a174d229e3cfa37253523e645a78a0c91b57145b61095d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e747261637400006064820152608401610578565b60018190556040518181527f66cbca4f3c64fecf1dcb9ce094abcf7f68c3450a1d4e3a8e917dd621edb4ebe09060200160405180910390a150565b6109a0610c53565b5115610a08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a6564000000000000000000000000006044820152606401610578565b610a1181610f98565b50565b5f600154341015610a5e576001546040517fb48978280000000000000000000000000000000000000000000000000000000081523460048201526024810191909152604401610578565b610a683383610bc9565b335f908152600260205260408120805492935090610a8583611c28565b91905055503373ffffffffffffffffffffffffffffffffffffffff167f4bda649efe6b98b0f9c1d5e859c29e20910f45c66dabfe6fad4a4881f7faf9cc8284604051610ad2929190611afc565b60405180910390a2919050565b6060610aea336107d8565b80610b08575033730576a174d229e3cfa37253523e645a78a0c91b57145b610b94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e747261637400006064820152608401610578565b5f610bae878787878715610ba8578761110d565b5a61110d565b9250905080610bbf57815160208301fd5b5095945050505050565b5f8282604051602001610bdd929190611c5f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209392505050565b5f80610c24610c53565b8060200190518101906107729190611be0565b5f805f610c4687878787611210565b91509150610bbf816112f8565b6060610d22610d1d6040517fd60000000000000000000000000000000000000000000000000000000000000060208201527f940000000000000000000000000000000000000000000000000000000000000060218201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660228201527f010000000000000000000000000000000000000000000000000000000000000060368201525f90603701604051602081830303815290604052805190602001205f1c905090565b6114aa565b905090565b33730576a174d229e3cfa37253523e645a78a0c91b5714610da4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e74000000006044820152606401610578565b565b5f80610dfe836040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018290525f90605c01604051602081830303815290604052805190602001209050919050565b90507f1626ba7e00000000000000000000000000000000000000000000000000000000610e6c82610e33610140880188611b7f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506105d592505050565b7fffffffff000000000000000000000000000000000000000000000000000000001614610e9d576001915050610772565b505f9392505050565b5f805460208301359180610eb983611c28565b9190505514610a11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496e76616c6964206e6f6e6365000000000000000000000000000000000000006044820152606401610578565b8015610a11576040515f9033907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90849084818181858888f193505050503d805f8114610f8c576040519150601f19603f3d011682016040523d82523d5f602084013e610f91565b606091505b5050505050565b5f610fa2826114ff565b90505f8151602083015ff090506110746040517fd60000000000000000000000000000000000000000000000000000000000000060208201527f940000000000000000000000000000000000000000000000000000000000000060218201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660228201527f010000000000000000000000000000000000000000000000000000000000000060368201525f90603701604051602081830303815290604052805190602001205f1c905090565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611108576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5772697465206661696c656400000000000000000000000000000000000000006044820152606401610578565b505050565b5f6060600184600181111561112457611124611c8d565b03611198578673ffffffffffffffffffffffffffffffffffffffff16838660405161114f9190611cba565b5f604051808303818686f4925050503d805f8114611188576040519150601f19603f3d011682016040523d82523d5f602084013e61118d565b606091505b509092509050611206565b8673ffffffffffffffffffffffffffffffffffffffff168387876040516111bf9190611cba565b5f60405180830381858888f193505050503d805f81146111fa576040519150601f19603f3d011682016040523d82523d5f602084013e6111ff565b606091505b5090925090505b9550959350505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561124557505f905060036112ef565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611296573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166112e9575f600192509250506112ef565b91505f90505b94509492505050565b5f81600481111561130b5761130b611c8d565b036113135750565b600181600481111561132757611327611c8d565b0361138e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610578565b60028160048111156113a2576113a2611c8d565b03611409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610578565b600381600481111561141d5761141d611c8d565b03610a11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610578565b6060813b600181116114cb57505060408051602081019091525f8152919050565b806114d581611cd5565b9150506040519150601f19601f602083010116820160405280825280600160208401853c50919050565b60608151600161150f9190611d09565b82604051602001611521929190611d1c565b6040516020818303038152906040529050919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610a11575f80fd5b5f8083601f840112611568575f80fd5b50813567ffffffffffffffff81111561157f575f80fd5b602083019150836020828501011115611596575f80fd5b9250929050565b5f805f805f805f8060c0898b0312156115b4575f80fd5b88356115bf81611537565b975060208901356115cf81611537565b965060408901356115df81611537565b955060608901359450608089013567ffffffffffffffff80821115611602575f80fd5b61160e8c838d01611558565b909650945060a08b0135915080821115611626575f80fd5b506116338b828c01611558565b999c989b5096995094979396929594505050565b5f805f805f6080868803121561165b575f80fd5b853561166681611537565b9450602086013561167681611537565b935060408601359250606086013567ffffffffffffffff811115611698575f80fd5b6116a488828901611558565b969995985093965092949392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126116f1575f80fd5b813567ffffffffffffffff8082111561170c5761170c6116b5565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715611752576117526116b5565b8160405283815286602085880101111561176a575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f806040838503121561179a575f80fd5b82359150602083013567ffffffffffffffff8111156117b7575f80fd5b6117c3858286016116e2565b9150509250929050565b5f805f606084860312156117df575f80fd5b833567ffffffffffffffff8111156117f5575f80fd5b84016101608187031215611807575f80fd5b95602085013595506040909401359392505050565b5f6020828403121561182c575f80fd5b813561079581611537565b5f60208284031215611847575f80fd5b5035919050565b5f6020828403121561185e575f80fd5b813567ffffffffffffffff811115611874575f80fd5b611880848285016116e2565b949350505050565b5f8083601f840112611898575f80fd5b50813567ffffffffffffffff8111156118af575f80fd5b6020830191508360208260051b8501011115611596575f80fd5b5f805f805f805f8060a0898b0312156118e0575f80fd5b88356118eb81611537565b975060208901356118fb81611537565b9650604089013567ffffffffffffffff80821115611917575f80fd5b6119238c838d01611888565b909850965060608b013591508082111561193b575f80fd5b6119478c838d01611888565b909650945060808b0135915080821115611626575f80fd5b5f805f805f60a08688031215611973575f80fd5b853561197e81611537565b945060208601359350604086013567ffffffffffffffff8111156119a0575f80fd5b6119ac888289016116e2565b9350506060860135600281106119c0575f80fd5b949793965091946080013592915050565b5f5b838110156119eb5781810151838201526020016119d3565b50505f910152565b5f8151808452611a0a8160208601602086016119d1565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f61079560208301846119f3565b5f8060408385031215611a5f575f80fd5b8235611a6a81611537565b9150602083013567ffffffffffffffff8111156117b7575f80fd5b5f805f805f8060a08789031215611a9a575f80fd5b8635611aa581611537565b95506020870135611ab581611537565b94506040870135935060608701359250608087013567ffffffffffffffff811115611ade575f80fd5b611aea89828a01611558565b979a9699509497509295939492505050565b828152604060208201525f61188060408301846119f3565b5f60208284031215611b24575f80fd5b81517fffffffff0000000000000000000000000000000000000000000000000000000081168114610795575f80fd5b5f8060408385031215611b64575f80fd5b8251611b6f81611537565b6020939093015192949293505050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611bb2575f80fd5b83018035915067ffffffffffffffff821115611bcc575f80fd5b602001915036819003821315611596575f80fd5b5f60208284031215611bf0575f80fd5b815161079581611537565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611c5857611c58611bfb565b5060010190565b73ffffffffffffffffffffffffffffffffffffffff83168152604060208201525f61188060408301846119f3565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f8251611ccb8184602087016119d1565b9190910192915050565b5f81611ce357611ce3611bfb565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b8082018082111561077257610772611bfb565b7f630000000000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000008360e01b1660018201527f80600e6000396000f3000000000000000000000000000000000000000000000060058201525f600e8201525f8251611daa81600f8501602087016119d1565b91909101600f01939250505056fea264697066735822122095f8b9d54e488640bb8af3a1548faf779501856a06c519d628fea3d064487ff064736f6c63430008150033", + "bytecode": "0x60806040525f805534801562000013575f80fd5b506040516200263738038062002637833981016040819052620000369162000391565b604080516001600160a01b03851660208201528082018490528151808203830181526060909101909152839083906200006f8162000145565b5050506001600160a01b0383166200009a5760405163d92e233d60e01b815260040160405180910390fd5b6040516331a9108f60e11b8152600481018390525f906001600160a01b03851690636352211e90602401602060405180830381865afa158015620000e0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001069190620003c6565b90506001600160a01b0381166200013857604051630ede975960e01b8152600481018490526024015b60405180910390fd5b50600155506200049a9050565b6200014f620001ad565b51156200019f5760405162461bcd60e51b815260206004820152601360248201527f416c726561647920696e697469616c697a65640000000000000000000000000060448201526064016200012f565b620001aa8162000218565b50565b6060620002136200020d604051606b60f91b6020820152602560fa1b60218201526001600160601b03193060601b166022820152600160f81b60368201525f90603701604051602081830303815290604052805190602001205f1c905090565b620002e1565b905090565b5f620002248262000339565b90505f8151602083015ff090506200028b604051606b60f91b6020820152602560fa1b60218201526001600160601b03193060601b166022820152600160f81b60368201525f90603701604051602081830303815290604052805190602001205f1c905090565b6001600160a01b0316816001600160a01b031614620002dc5760405162461bcd60e51b815260206004820152600c60248201526b15dc9a5d194819985a5b195960a21b60448201526064016200012f565b505050565b6060813b600181116200030357505060408051602081019091525f8152919050565b806200030f81620003fd565b9150506040519150601f19601f602083010116820160405280825280600160208401853c50919050565b6060815160016200034b919062000415565b826040516020016200035f92919062000431565b6040516020818303038152906040529050919050565b80516001600160a01b03811681146200038c575f80fd5b919050565b5f805f60608486031215620003a4575f80fd5b620003af8462000375565b925060208401519150604084015190509250925092565b5f60208284031215620003d7575f80fd5b620003e28262000375565b9392505050565b634e487b7160e01b5f52601160045260245ffd5b5f816200040e576200040e620003e9565b505f190190565b808201808211156200042b576200042b620003e9565b92915050565b606360f81b815260e083901b6001600160e01b03191660018201526880600e6000396000f360b81b60058201525f600e82018190528251815b8181101562000489576020818601810151600f8684010152016200046a565b505f9201600f019182525092915050565b61218f80620004a85f395ff3fe60806040526004361061017a575f3560e01c8063a035b1fe116100d1578063bdf863171161007c578063f23a6e6111610057578063f23a6e61146104c7578063f6171e441461050c578063fc0c546a1461052b575f80fd5b8063bdf8631714610467578063c7dec3fc1461047c578063e00b9118146104a8575f80fd5b8063b0d691fe116100ac578063b0d691fe146103c6578063b94207d31461040d578063bc197c8114610420575f80fd5b8063a035b1fe1461037f578063a4f9edbf14610394578063affed0e0146103b3575f80fd5b80633a871cdd116101315780636e3ec0391161010c5780636e3ec039146102fe5780637af734731461031f57806391b7f5ed14610360575f80fd5b80633a871cdd146102855780635fee6085146102a45780636d70f7ae146102cf575f80fd5b8063157305fe11610161578063157305fe146102255780631626ba7e1461024457806317d70f7c14610263575f80fd5b806223de2914610185578063150b7a02146101ab575f80fd5b3661018157005b5f80fd5b348015610190575f80fd5b506101a961019f3660046118ae565b5050505050505050565b005b3480156101b6575f80fd5b506101ef6101c5366004611958565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020015b60405180910390f35b348015610230575f80fd5b506101a961023f366004611a9a565b61053f565b34801561024f575f80fd5b506101ef61025e366004611a9a565b610766565b34801561026e575f80fd5b50610277610909565b60405190815260200161021c565b348015610290575f80fd5b5061027761029f366004611ade565b61092d565b3480156102af575f80fd5b506102776102be366004611b2d565b60036020525f908152604090205481565b3480156102da575f80fd5b506102ee6102e9366004611b2d565b610969565b604051901515815260200161021c565b348015610309575f80fd5b50610312610a3b565b60405161021c9190611b48565b34801561032a575f80fd5b50610277610339366004611b2d565b73ffffffffffffffffffffffffffffffffffffffff165f9081526003602052604090205490565b34801561036b575f80fd5b506101a961037a366004611b8b565b610b0c565b34801561038a575f80fd5b5061027760015481565b34801561039f575f80fd5b506101a96103ae366004611ba2565b610bfa565b3480156103be575f80fd5b505f54610277565b3480156103d1575f80fd5b50730576a174d229e3cfa37253523e645a78a0c91b575b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161021c565b61027761041b366004611ba2565b610c76565b34801561042b575f80fd5b506101ef61043a366004611c1d565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b348015610472575f80fd5b5061027760025481565b348015610487575f80fd5b5061049b610496366004611cb3565b610dce565b60405161021c9190611d90565b3480156104b3575f80fd5b506102776104c2366004611da2565b610eb8565b3480156104d2575f80fd5b506101ef6104e1366004611dd9565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b348015610517575f80fd5b50610277610526366004611e50565b610f09565b348015610536575f80fd5b506103e8610f2b565b61054833610969565b80610566575033730576a174d229e3cfa37253523e645a78a0c91b57145b6105f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084015b60405180910390fd5b5f828152600460205260408082208151808301928390529160029082845b8154815260200190600101908083116106155750505050509050805f6002811061064157610641611e70565b602002015115801561065557506020810151155b801561068a57505f805260046020527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ed548314155b156106c4576040517ffe239804000000000000000000000000000000000000000000000000000000008152600481018490526024016105ee565b6020818101805183515f908152600490935260408084206001908101929092558451925184528084209290925585835290822082815501819055600280549161070c83611eca565b91905055503373ffffffffffffffffffffffffffffffffffffffff167f0cd979445339c62199996f208428d987b1cea24d18e62b79ec24d94b636e8b708484604051610759929190611efe565b60405180910390a2505050565b5f805f8061078685602081015160408201516060909201515f1a92909190565b9094509250905060ff81165f0361089c57828583016020016107a782610969565b1580156107ca575073ffffffffffffffffffffffffffffffffffffffff82163014155b156107fd57507fffffffff0000000000000000000000000000000000000000000000000000000094506109039350505050565b6040517f1626ba7e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831690631626ba7e90610851908b908590600401611efe565b602060405180830381865afa15801561086c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108909190611f16565b95505050505050610903565b6108ab6102e987838686610f48565b156108dc57507f1626ba7e000000000000000000000000000000000000000000000000000000009250610903915050565b507fffffffff00000000000000000000000000000000000000000000000000000000925050505b92915050565b5f80610913610f64565b8060200190518101906109269190611f55565b9392505050565b5f610936611038565b61094084846110b7565b905061094f6040850185611f81565b90505f0361096057610960846111b7565b61092682611235565b5f805f610974610f64565b8060200190518101906109879190611f55565b915091508373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016109dd91815260200190565b602060405180830381865afa1580156109f8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a1c9190611fe2565b73ffffffffffffffffffffffffffffffffffffffff1614949350505050565b6002546060908015610b08578067ffffffffffffffff811115610a6057610a606119c6565b604051908082528060200260200182016040528015610a89578160200160208202803683370190505b505f80805260046020527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ed549193505b82811015610b055781848281518110610ad457610ad4611e70565b6020908102919091018101919091525f9283526004905260409091206001015490610afe81611ffd565b9050610ab9565b50505b5090565b610b1533610969565b80610b33575033730576a174d229e3cfa37253523e645a78a0c91b57145b610bbf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084016105ee565b60018190556040518181527f66cbca4f3c64fecf1dcb9ce094abcf7f68c3450a1d4e3a8e917dd621edb4ebe09060200160405180910390a150565b610c02610f64565b5115610c6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a65640000000000000000000000000060448201526064016105ee565b610c73816112a9565b50565b5f600154341015610cc0576001546040517fb489782800000000000000000000000000000000000000000000000000000000815234600482015260248101919091526044016105ee565b610cca3383610eb8565b335f908152600360205260408120805492935090610ce783611ffd565b909155505060046020525f81815260408082207f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ed805460018301819055908590558084529183208490557f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec8054909391929103610d62578383555b60028054905f610d7183611ffd565b91905055503373ffffffffffffffffffffffffffffffffffffffff167f4bda649efe6b98b0f9c1d5e859c29e20910f45c66dabfe6fad4a4881f7faf9cc8587604051610dbe929190611efe565b60405180910390a2505050919050565b6060610dd933610969565b80610df7575033730576a174d229e3cfa37253523e645a78a0c91b57145b610e83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084016105ee565b5f610e9d878787878715610e97578761141e565b5a61141e565b9250905080610eae57815160208301fd5b5095945050505050565b5f8282604051602001610ecc929190612034565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209392505050565b6004602052815f5260405f208160028110610f22575f80fd5b01549150829050565b5f80610f35610f64565b8060200190518101906109039190611fe2565b5f805f610f5787878787611521565b91509150610eae81611609565b606061103361102e6040517fd60000000000000000000000000000000000000000000000000000000000000060208201527f940000000000000000000000000000000000000000000000000000000000000060218201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660228201527f010000000000000000000000000000000000000000000000000000000000000060368201525f90603701604051602081830303815290604052805190602001205f1c905090565b6117bb565b905090565b33730576a174d229e3cfa37253523e645a78a0c91b57146110b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e740000000060448201526064016105ee565b565b5f8061110f836040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018290525f90605c01604051602081830303815290604052805190602001209050919050565b90507f1626ba7e0000000000000000000000000000000000000000000000000000000061117d82611144610140880188611f81565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061076692505050565b7fffffffff0000000000000000000000000000000000000000000000000000000016146111ae576001915050610903565b505f9392505050565b5f8054602083013591806111ca83611ffd565b9190505514610c73576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496e76616c6964206e6f6e63650000000000000000000000000000000000000060448201526064016105ee565b8015610c73576040515f9033907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90849084818181858888f193505050503d805f811461129d576040519150601f19603f3d011682016040523d82523d5f602084013e6112a2565b606091505b5050505050565b5f6112b382611810565b90505f8151602083015ff090506113856040517fd60000000000000000000000000000000000000000000000000000000000000060208201527f940000000000000000000000000000000000000000000000000000000000000060218201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660228201527f010000000000000000000000000000000000000000000000000000000000000060368201525f90603701604051602081830303815290604052805190602001205f1c905090565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611419576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5772697465206661696c6564000000000000000000000000000000000000000060448201526064016105ee565b505050565b5f6060600184600181111561143557611435612062565b036114a9578673ffffffffffffffffffffffffffffffffffffffff168386604051611460919061208f565b5f604051808303818686f4925050503d805f8114611499576040519150601f19603f3d011682016040523d82523d5f602084013e61149e565b606091505b509092509050611517565b8673ffffffffffffffffffffffffffffffffffffffff168387876040516114d0919061208f565b5f60405180830381858888f193505050503d805f811461150b576040519150601f19603f3d011682016040523d82523d5f602084013e611510565b606091505b5090925090505b9550959350505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561155657505f90506003611600565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156115a7573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166115fa575f60019250925050611600565b91505f90505b94509492505050565b5f81600481111561161c5761161c612062565b036116245750565b600181600481111561163857611638612062565b0361169f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016105ee565b60028160048111156116b3576116b3612062565b0361171a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016105ee565b600381600481111561172e5761172e612062565b03610c73576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016105ee565b6060813b600181116117dc57505060408051602081019091525f8152919050565b806117e681611eca565b9150506040519150601f19601f602083010116820160405280825280600160208401853c50919050565b60608151600161182091906120aa565b826040516020016118329291906120bd565b6040516020818303038152906040529050919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610c73575f80fd5b5f8083601f840112611879575f80fd5b50813567ffffffffffffffff811115611890575f80fd5b6020830191508360208285010111156118a7575f80fd5b9250929050565b5f805f805f805f8060c0898b0312156118c5575f80fd5b88356118d081611848565b975060208901356118e081611848565b965060408901356118f081611848565b955060608901359450608089013567ffffffffffffffff80821115611913575f80fd5b61191f8c838d01611869565b909650945060a08b0135915080821115611937575f80fd5b506119448b828c01611869565b999c989b5096995094979396929594505050565b5f805f805f6080868803121561196c575f80fd5b853561197781611848565b9450602086013561198781611848565b935060408601359250606086013567ffffffffffffffff8111156119a9575f80fd5b6119b588828901611869565b969995985093965092949392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112611a02575f80fd5b813567ffffffffffffffff80821115611a1d57611a1d6119c6565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715611a6357611a636119c6565b81604052838152866020858801011115611a7b575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f8060408385031215611aab575f80fd5b82359150602083013567ffffffffffffffff811115611ac8575f80fd5b611ad4858286016119f3565b9150509250929050565b5f805f60608486031215611af0575f80fd5b833567ffffffffffffffff811115611b06575f80fd5b84016101608187031215611b18575f80fd5b95602085013595506040909401359392505050565b5f60208284031215611b3d575f80fd5b813561092681611848565b602080825282518282018190525f9190848201906040850190845b81811015611b7f57835183529284019291840191600101611b63565b50909695505050505050565b5f60208284031215611b9b575f80fd5b5035919050565b5f60208284031215611bb2575f80fd5b813567ffffffffffffffff811115611bc8575f80fd5b611bd4848285016119f3565b949350505050565b5f8083601f840112611bec575f80fd5b50813567ffffffffffffffff811115611c03575f80fd5b6020830191508360208260051b85010111156118a7575f80fd5b5f805f805f805f8060a0898b031215611c34575f80fd5b8835611c3f81611848565b97506020890135611c4f81611848565b9650604089013567ffffffffffffffff80821115611c6b575f80fd5b611c778c838d01611bdc565b909850965060608b0135915080821115611c8f575f80fd5b611c9b8c838d01611bdc565b909650945060808b0135915080821115611937575f80fd5b5f805f805f60a08688031215611cc7575f80fd5b8535611cd281611848565b945060208601359350604086013567ffffffffffffffff811115611cf4575f80fd5b611d00888289016119f3565b935050606086013560028110611d14575f80fd5b949793965091946080013592915050565b5f5b83811015611d3f578181015183820152602001611d27565b50505f910152565b5f8151808452611d5e816020860160208601611d25565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6109266020830184611d47565b5f8060408385031215611db3575f80fd5b8235611dbe81611848565b9150602083013567ffffffffffffffff811115611ac8575f80fd5b5f805f805f8060a08789031215611dee575f80fd5b8635611df981611848565b95506020870135611e0981611848565b94506040870135935060608701359250608087013567ffffffffffffffff811115611e32575f80fd5b611e3e89828a01611869565b979a9699509497509295939492505050565b5f8060408385031215611e61575f80fd5b50508035926020909101359150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f81611ed857611ed8611e9d565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b828152604060208201525f611bd46040830184611d47565b5f60208284031215611f26575f80fd5b81517fffffffff0000000000000000000000000000000000000000000000000000000081168114610926575f80fd5b5f8060408385031215611f66575f80fd5b8251611f7181611848565b6020939093015192949293505050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611fb4575f80fd5b83018035915067ffffffffffffffff821115611fce575f80fd5b6020019150368190038213156118a7575f80fd5b5f60208284031215611ff2575f80fd5b815161092681611848565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361202d5761202d611e9d565b5060010190565b73ffffffffffffffffffffffffffffffffffffffff83168152604060208201525f611bd46040830184611d47565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f82516120a0818460208701611d25565b9190910192915050565b8082018082111561090357610903611e9d565b7f630000000000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000008360e01b1660018201527f80600e6000396000f3000000000000000000000000000000000000000000000060058201525f600e8201525f825161214b81600f850160208701611d25565b91909101600f01939250505056fea26469706673582212208ee99f5816e66f69a8926786a9858f1caf0bbd099c82d85d9db66d927e9986f664736f6c63430008150033", + "deployedBytecode": "0x60806040526004361061017a575f3560e01c8063a035b1fe116100d1578063bdf863171161007c578063f23a6e6111610057578063f23a6e61146104c7578063f6171e441461050c578063fc0c546a1461052b575f80fd5b8063bdf8631714610467578063c7dec3fc1461047c578063e00b9118146104a8575f80fd5b8063b0d691fe116100ac578063b0d691fe146103c6578063b94207d31461040d578063bc197c8114610420575f80fd5b8063a035b1fe1461037f578063a4f9edbf14610394578063affed0e0146103b3575f80fd5b80633a871cdd116101315780636e3ec0391161010c5780636e3ec039146102fe5780637af734731461031f57806391b7f5ed14610360575f80fd5b80633a871cdd146102855780635fee6085146102a45780636d70f7ae146102cf575f80fd5b8063157305fe11610161578063157305fe146102255780631626ba7e1461024457806317d70f7c14610263575f80fd5b806223de2914610185578063150b7a02146101ab575f80fd5b3661018157005b5f80fd5b348015610190575f80fd5b506101a961019f3660046118ae565b5050505050505050565b005b3480156101b6575f80fd5b506101ef6101c5366004611958565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020015b60405180910390f35b348015610230575f80fd5b506101a961023f366004611a9a565b61053f565b34801561024f575f80fd5b506101ef61025e366004611a9a565b610766565b34801561026e575f80fd5b50610277610909565b60405190815260200161021c565b348015610290575f80fd5b5061027761029f366004611ade565b61092d565b3480156102af575f80fd5b506102776102be366004611b2d565b60036020525f908152604090205481565b3480156102da575f80fd5b506102ee6102e9366004611b2d565b610969565b604051901515815260200161021c565b348015610309575f80fd5b50610312610a3b565b60405161021c9190611b48565b34801561032a575f80fd5b50610277610339366004611b2d565b73ffffffffffffffffffffffffffffffffffffffff165f9081526003602052604090205490565b34801561036b575f80fd5b506101a961037a366004611b8b565b610b0c565b34801561038a575f80fd5b5061027760015481565b34801561039f575f80fd5b506101a96103ae366004611ba2565b610bfa565b3480156103be575f80fd5b505f54610277565b3480156103d1575f80fd5b50730576a174d229e3cfa37253523e645a78a0c91b575b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161021c565b61027761041b366004611ba2565b610c76565b34801561042b575f80fd5b506101ef61043a366004611c1d565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b348015610472575f80fd5b5061027760025481565b348015610487575f80fd5b5061049b610496366004611cb3565b610dce565b60405161021c9190611d90565b3480156104b3575f80fd5b506102776104c2366004611da2565b610eb8565b3480156104d2575f80fd5b506101ef6104e1366004611dd9565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b348015610517575f80fd5b50610277610526366004611e50565b610f09565b348015610536575f80fd5b506103e8610f2b565b61054833610969565b80610566575033730576a174d229e3cfa37253523e645a78a0c91b57145b6105f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084015b60405180910390fd5b5f828152600460205260408082208151808301928390529160029082845b8154815260200190600101908083116106155750505050509050805f6002811061064157610641611e70565b602002015115801561065557506020810151155b801561068a57505f805260046020527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ed548314155b156106c4576040517ffe239804000000000000000000000000000000000000000000000000000000008152600481018490526024016105ee565b6020818101805183515f908152600490935260408084206001908101929092558451925184528084209290925585835290822082815501819055600280549161070c83611eca565b91905055503373ffffffffffffffffffffffffffffffffffffffff167f0cd979445339c62199996f208428d987b1cea24d18e62b79ec24d94b636e8b708484604051610759929190611efe565b60405180910390a2505050565b5f805f8061078685602081015160408201516060909201515f1a92909190565b9094509250905060ff81165f0361089c57828583016020016107a782610969565b1580156107ca575073ffffffffffffffffffffffffffffffffffffffff82163014155b156107fd57507fffffffff0000000000000000000000000000000000000000000000000000000094506109039350505050565b6040517f1626ba7e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831690631626ba7e90610851908b908590600401611efe565b602060405180830381865afa15801561086c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108909190611f16565b95505050505050610903565b6108ab6102e987838686610f48565b156108dc57507f1626ba7e000000000000000000000000000000000000000000000000000000009250610903915050565b507fffffffff00000000000000000000000000000000000000000000000000000000925050505b92915050565b5f80610913610f64565b8060200190518101906109269190611f55565b9392505050565b5f610936611038565b61094084846110b7565b905061094f6040850185611f81565b90505f0361096057610960846111b7565b61092682611235565b5f805f610974610f64565b8060200190518101906109879190611f55565b915091508373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016109dd91815260200190565b602060405180830381865afa1580156109f8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a1c9190611fe2565b73ffffffffffffffffffffffffffffffffffffffff1614949350505050565b6002546060908015610b08578067ffffffffffffffff811115610a6057610a606119c6565b604051908082528060200260200182016040528015610a89578160200160208202803683370190505b505f80805260046020527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ed549193505b82811015610b055781848281518110610ad457610ad4611e70565b6020908102919091018101919091525f9283526004905260409091206001015490610afe81611ffd565b9050610ab9565b50505b5090565b610b1533610969565b80610b33575033730576a174d229e3cfa37253523e645a78a0c91b57145b610bbf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084016105ee565b60018190556040518181527f66cbca4f3c64fecf1dcb9ce094abcf7f68c3450a1d4e3a8e917dd621edb4ebe09060200160405180910390a150565b610c02610f64565b5115610c6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a65640000000000000000000000000060448201526064016105ee565b610c73816112a9565b50565b5f600154341015610cc0576001546040517fb489782800000000000000000000000000000000000000000000000000000000815234600482015260248101919091526044016105ee565b610cca3383610eb8565b335f908152600360205260408120805492935090610ce783611ffd565b909155505060046020525f81815260408082207f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ed805460018301819055908590558084529183208490557f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec8054909391929103610d62578383555b60028054905f610d7183611ffd565b91905055503373ffffffffffffffffffffffffffffffffffffffff167f4bda649efe6b98b0f9c1d5e859c29e20910f45c66dabfe6fad4a4881f7faf9cc8587604051610dbe929190611efe565b60405180910390a2505050919050565b6060610dd933610969565b80610df7575033730576a174d229e3cfa37253523e645a78a0c91b57145b610e83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084016105ee565b5f610e9d878787878715610e97578761141e565b5a61141e565b9250905080610eae57815160208301fd5b5095945050505050565b5f8282604051602001610ecc929190612034565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209392505050565b6004602052815f5260405f208160028110610f22575f80fd5b01549150829050565b5f80610f35610f64565b8060200190518101906109039190611fe2565b5f805f610f5787878787611521565b91509150610eae81611609565b606061103361102e6040517fd60000000000000000000000000000000000000000000000000000000000000060208201527f940000000000000000000000000000000000000000000000000000000000000060218201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660228201527f010000000000000000000000000000000000000000000000000000000000000060368201525f90603701604051602081830303815290604052805190602001205f1c905090565b6117bb565b905090565b33730576a174d229e3cfa37253523e645a78a0c91b57146110b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e740000000060448201526064016105ee565b565b5f8061110f836040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018290525f90605c01604051602081830303815290604052805190602001209050919050565b90507f1626ba7e0000000000000000000000000000000000000000000000000000000061117d82611144610140880188611f81565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061076692505050565b7fffffffff0000000000000000000000000000000000000000000000000000000016146111ae576001915050610903565b505f9392505050565b5f8054602083013591806111ca83611ffd565b9190505514610c73576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496e76616c6964206e6f6e63650000000000000000000000000000000000000060448201526064016105ee565b8015610c73576040515f9033907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90849084818181858888f193505050503d805f811461129d576040519150601f19603f3d011682016040523d82523d5f602084013e6112a2565b606091505b5050505050565b5f6112b382611810565b90505f8151602083015ff090506113856040517fd60000000000000000000000000000000000000000000000000000000000000060208201527f940000000000000000000000000000000000000000000000000000000000000060218201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660228201527f010000000000000000000000000000000000000000000000000000000000000060368201525f90603701604051602081830303815290604052805190602001205f1c905090565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611419576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5772697465206661696c6564000000000000000000000000000000000000000060448201526064016105ee565b505050565b5f6060600184600181111561143557611435612062565b036114a9578673ffffffffffffffffffffffffffffffffffffffff168386604051611460919061208f565b5f604051808303818686f4925050503d805f8114611499576040519150601f19603f3d011682016040523d82523d5f602084013e61149e565b606091505b509092509050611517565b8673ffffffffffffffffffffffffffffffffffffffff168387876040516114d0919061208f565b5f60405180830381858888f193505050503d805f811461150b576040519150601f19603f3d011682016040523d82523d5f602084013e611510565b606091505b5090925090505b9550959350505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561155657505f90506003611600565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156115a7573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166115fa575f60019250925050611600565b91505f90505b94509492505050565b5f81600481111561161c5761161c612062565b036116245750565b600181600481111561163857611638612062565b0361169f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016105ee565b60028160048111156116b3576116b3612062565b0361171a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016105ee565b600381600481111561172e5761172e612062565b03610c73576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016105ee565b6060813b600181116117dc57505060408051602081019091525f8152919050565b806117e681611eca565b9150506040519150601f19601f602083010116820160405280825280600160208401853c50919050565b60608151600161182091906120aa565b826040516020016118329291906120bd565b6040516020818303038152906040529050919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610c73575f80fd5b5f8083601f840112611879575f80fd5b50813567ffffffffffffffff811115611890575f80fd5b6020830191508360208285010111156118a7575f80fd5b9250929050565b5f805f805f805f8060c0898b0312156118c5575f80fd5b88356118d081611848565b975060208901356118e081611848565b965060408901356118f081611848565b955060608901359450608089013567ffffffffffffffff80821115611913575f80fd5b61191f8c838d01611869565b909650945060a08b0135915080821115611937575f80fd5b506119448b828c01611869565b999c989b5096995094979396929594505050565b5f805f805f6080868803121561196c575f80fd5b853561197781611848565b9450602086013561198781611848565b935060408601359250606086013567ffffffffffffffff8111156119a9575f80fd5b6119b588828901611869565b969995985093965092949392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112611a02575f80fd5b813567ffffffffffffffff80821115611a1d57611a1d6119c6565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715611a6357611a636119c6565b81604052838152866020858801011115611a7b575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f8060408385031215611aab575f80fd5b82359150602083013567ffffffffffffffff811115611ac8575f80fd5b611ad4858286016119f3565b9150509250929050565b5f805f60608486031215611af0575f80fd5b833567ffffffffffffffff811115611b06575f80fd5b84016101608187031215611b18575f80fd5b95602085013595506040909401359392505050565b5f60208284031215611b3d575f80fd5b813561092681611848565b602080825282518282018190525f9190848201906040850190845b81811015611b7f57835183529284019291840191600101611b63565b50909695505050505050565b5f60208284031215611b9b575f80fd5b5035919050565b5f60208284031215611bb2575f80fd5b813567ffffffffffffffff811115611bc8575f80fd5b611bd4848285016119f3565b949350505050565b5f8083601f840112611bec575f80fd5b50813567ffffffffffffffff811115611c03575f80fd5b6020830191508360208260051b85010111156118a7575f80fd5b5f805f805f805f8060a0898b031215611c34575f80fd5b8835611c3f81611848565b97506020890135611c4f81611848565b9650604089013567ffffffffffffffff80821115611c6b575f80fd5b611c778c838d01611bdc565b909850965060608b0135915080821115611c8f575f80fd5b611c9b8c838d01611bdc565b909650945060808b0135915080821115611937575f80fd5b5f805f805f60a08688031215611cc7575f80fd5b8535611cd281611848565b945060208601359350604086013567ffffffffffffffff811115611cf4575f80fd5b611d00888289016119f3565b935050606086013560028110611d14575f80fd5b949793965091946080013592915050565b5f5b83811015611d3f578181015183820152602001611d27565b50505f910152565b5f8151808452611d5e816020860160208601611d25565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6109266020830184611d47565b5f8060408385031215611db3575f80fd5b8235611dbe81611848565b9150602083013567ffffffffffffffff811115611ac8575f80fd5b5f805f805f8060a08789031215611dee575f80fd5b8635611df981611848565b95506020870135611e0981611848565b94506040870135935060608701359250608087013567ffffffffffffffff811115611e32575f80fd5b611e3e89828a01611869565b979a9699509497509295939492505050565b5f8060408385031215611e61575f80fd5b50508035926020909101359150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f81611ed857611ed8611e9d565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b828152604060208201525f611bd46040830184611d47565b5f60208284031215611f26575f80fd5b81517fffffffff0000000000000000000000000000000000000000000000000000000081168114610926575f80fd5b5f8060408385031215611f66575f80fd5b8251611f7181611848565b6020939093015192949293505050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611fb4575f80fd5b83018035915067ffffffffffffffff821115611fce575f80fd5b6020019150368190038213156118a7575f80fd5b5f60208284031215611ff2575f80fd5b815161092681611848565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361202d5761202d611e9d565b5060010190565b73ffffffffffffffffffffffffffffffffffffffff83168152604060208201525f611bd46040830184611d47565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f82516120a0818460208701611d25565b9190910192915050565b8082018082111561090357610903611e9d565b7f630000000000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000008360e01b1660018201527f80600e6000396000f3000000000000000000000000000000000000000000000060058201525f600e8201525f825161214b81600f850160208701611d25565b91909101600f01939250505056fea26469706673582212208ee99f5816e66f69a8926786a9858f1caf0bbd099c82d85d9db66d927e9986f664736f6c63430008150033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/contracts/AgentMech.sol b/contracts/AgentMech.sol index cb9e38f..9249a4d 100644 --- a/contracts/AgentMech.sol +++ b/contracts/AgentMech.sol @@ -22,10 +22,13 @@ error AgentNotFound(uint256 agentId); /// @param expected Expected amount. error NotEnoughPaid(uint256 provided, uint256 expected); +/// @dev Request Id not found. +/// @param requestId Request Id. +error RequestIdNotFound(uint256 requestId); + /// @title AgentMech - Smart contract for extending ERC721Mech /// @dev A Mech that is operated by the holder of an ERC721 non-fungible token. contract AgentMech is ERC721Mech { - event Perform(address indexed sender, bytes32 taskHash); event Deliver(address indexed sender, uint256 requestId, bytes data); event Request(address indexed sender, uint256 requestId, bytes data); event PriceUpdated(uint256 price); @@ -102,6 +105,12 @@ contract AgentMech is ERC721Mech { function deliver(uint256 requestId, bytes memory data) external onlyOperator { // Remove delivered request Id from the request Ids map uint256[2] memory requestIds = mapRequestIds[requestId]; + // Check if the request Id is invalid: previous and next request Ids are zero, + // and the zero's element next request Id is not equal to the provided request Id + if (requestIds[0] == 0 && requestIds[1] == 0 && mapRequestIds[0][1] != requestId) { + revert RequestIdNotFound(requestId); + } + // Re-link previous and next elements between themselves mapRequestIds[requestIds[0]][1] = requestIds[1]; mapRequestIds[requestIds[1]][0] = requestIds[0]; @@ -138,14 +147,19 @@ contract AgentMech is ERC721Mech { /// @dev Gets the set of undelivered request Ids. /// @return requestIds Set of undelivered request Ids. function getUndeliveredRequestIds() external view returns (uint256[] memory requestIds) { + // Get the number of undelivered requests uint256 numRequests = numUndeliveredRequests; - requestIds = new uint256[](numRequests); - // The first request Id is the next request Id of the zero element in the request Ids map - uint256 curRequestId = mapRequestIds[0][1]; - for (uint256 i = 0; i < numRequests; ++i) { - requestIds[i] = curRequestId; - curRequestId = mapRequestIds[curRequestId][1]; + if (numRequests > 0) { + requestIds = new uint256[](numRequests); + + // The first request Id is the next request Id of the zero element in the request Ids map + uint256 curRequestId = mapRequestIds[0][1]; + for (uint256 i = 0; i < numRequests; ++i) { + requestIds[i] = curRequestId; + // Next request Id of the current element based on the current request Id + curRequestId = mapRequestIds[curRequestId][1]; + } } } } diff --git a/test/AgentMech.js b/test/AgentMech.js index 43c8d8b..c1351d5 100644 --- a/test/AgentMech.js +++ b/test/AgentMech.js @@ -63,7 +63,18 @@ describe("AgentMech", function () { it("Delivering a request", async function () { const account = signers[1]; const agentMech = await AgentMech.deploy(agentRegistry.address, unitId, price); + const requestId = await agentMech.getRequestId(deployer.address, data); + + // Try to deliver a non existent request + await expect( + agentMech.deliver(requestId, data) + ).to.be.revertedWithCustomError(agentMech, "RequestIdNotFound"); + + // Create a request + await agentMech.request(data, {value: price}); + + // Deliver a request await agentMech.deliver(requestId, data); // Try to deliver not by the operator (agent owner) @@ -71,6 +82,85 @@ describe("AgentMech", function () { agentMech.connect(account).request(data) ).to.be.reverted; }); + + it("Getting undelivered requests info", async function () { + const agentMech = await AgentMech.deploy(agentRegistry.address, unitId, price); + + const numRequests = 5; + const datas = new Array(); + const requestIds = new Array(); + for (let i = 0; i < numRequests; i++) { + datas[i] = data + "00".repeat(i); + requestIds[i] = await agentMech.getRequestId(deployer.address, datas[i]); + } + + // Check request Ids + let uRequestIds = await agentMech.getUndeliveredRequestIds(); + expect(uRequestIds.length).to.equal(0); + + // Create a first request + await agentMech.request(datas[0], {value: price}); + + // Check request Ids + uRequestIds = await agentMech.getUndeliveredRequestIds(); + expect(uRequestIds.length).to.equal(1); + expect(uRequestIds[0]).to.equal(requestIds[0]); + + // Deliver a request + await agentMech.deliver(requestIds[0], data); + + // Check request Ids + uRequestIds = await agentMech.getUndeliveredRequestIds(); + expect(uRequestIds.length).to.equal(0); + + // Stack all requests + for (let i = 0; i < numRequests; i++) { + await agentMech.request(datas[i], {value: price}); + } + + // Check request Ids + uRequestIds = await agentMech.getUndeliveredRequestIds(); + expect(uRequestIds.length).to.equal(numRequests); + // Requests are added in the reverse order + for (let i = 0; i < numRequests; i++) { + expect(uRequestIds[numRequests - i - 1]).to.eq(requestIds[i]); + } + + // Deliver all requests + for (let i = 0; i < numRequests; i++) { + await agentMech.deliver(requestIds[i], datas[i]); + } + + // Check request Ids + uRequestIds = await agentMech.getUndeliveredRequestIds(); + expect(uRequestIds.length).to.equal(0); + + // Add all requests again + for (let i = 0; i < numRequests; i++) { + await agentMech.request(datas[i], {value: price}); + } + + // Deliver the first request + await agentMech.deliver(requestIds[0], datas[0]); + + // Check request Ids + uRequestIds = await agentMech.getUndeliveredRequestIds(); + expect(uRequestIds.length).to.equal(numRequests - 1); + // Requests are added in the reverse order + for (let i = 1; i < numRequests; i++) { + expect(uRequestIds[numRequests - i - 1]).to.eq(requestIds[i]); + } + + // Deliver the last request + await agentMech.deliver(requestIds[numRequests - 1], datas[numRequests - 1]); + + // Check request Ids + uRequestIds = await agentMech.getUndeliveredRequestIds(); + expect(uRequestIds.length).to.equal(numRequests - 2); + for (let i = 1; i < numRequests - 1; i++) { + expect(uRequestIds[numRequests - i - 2]).to.eq(requestIds[i]); + } + }); }); context("Changing parameters", async function () { From a37a459612c018ac081752f0b570074c76d46090 Mon Sep 17 00:00:00 2001 From: Aleksandr Kuperman Date: Mon, 23 Oct 2023 16:37:52 +0100 Subject: [PATCH 3/8] chore: deployment of a new factory on chiado --- scripts/deployment/globals_gnosis_chiado.json | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/scripts/deployment/globals_gnosis_chiado.json b/scripts/deployment/globals_gnosis_chiado.json index fbe8f70..dea2896 100644 --- a/scripts/deployment/globals_gnosis_chiado.json +++ b/scripts/deployment/globals_gnosis_chiado.json @@ -1,15 +1 @@ -{ - "contractVerification": true, - "useLedger": false, - "derivationPath": "m/44'/60'/2'/0/0", - "providerName": "chiado", - "gasPriceInGwei": "2", - "baseURI": "https://gateway.autonolas.tech/ipfs/", - "agentRegistryName": "AI Agent Registry", - "agentRegistrySymbol": "AI-AGENT-V1", - "agentRegistryAddress": "0x9dEc6B62c197268242A768dc3b153AE7a2701396", - "agentFactoryAddress": "0x060268D4fE1Eb97843B14dd98cDf9ef7fbb3c720", - "agentMechAddress": "0x0a3cfc6bee9658eda040e6bb366fe963ddce82c9", - "agentId": "1", - "price": "1000000000000000000" -} \ No newline at end of file +{"contractVerification":true,"useLedger":false,"derivationPath":"m/44'/60'/2'/0/0","providerName":"chiado","gasPriceInGwei":"2","baseURI":"https://gateway.autonolas.tech/ipfs/","agentRegistryName":"AI Agent Registry","agentRegistrySymbol":"AI-AGENT-V1","agentRegistryAddress":"0x9dEc6B62c197268242A768dc3b153AE7a2701396","agentFactoryAddress":"0x1d333b46dB6e8FFd271b6C2D2B254868BD9A2dbd","agentMechAddress":"0x0a3cfc6bee9658eda040e6bb366fe963ddce82c9","agentId":"1","price":"1000000000000000000"} \ No newline at end of file From bc5f8f1df9af2de38fe40c4f101644dcca5a3f88 Mon Sep 17 00:00:00 2001 From: Aleksandr Kuperman Date: Mon, 23 Oct 2023 16:43:39 +0100 Subject: [PATCH 4/8] refactor: removing duplicated check --- contracts/AgentMech.sol | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/contracts/AgentMech.sol b/contracts/AgentMech.sol index 9249a4d..74e3fd8 100644 --- a/contracts/AgentMech.sol +++ b/contracts/AgentMech.sol @@ -88,11 +88,7 @@ contract AgentMech is ERC721Mech { requestIds[1] = requestId; // Previous element of the current next element will be the newly created element mapRequestIds[curNextRequestId][0] = requestId; - - // Check for the previous element of the zero one to exist, and if there is none - assign the newly created one - if (requestIds[0] == 0) { - requestIds[0] = requestId; - } + // Increase the number of undelivered requests numUndeliveredRequests++; From bd9abb2d900c3f18728c4d4d0665a8945baac36c Mon Sep 17 00:00:00 2001 From: Aleksandr Kuperman Date: Mon, 23 Oct 2023 18:46:23 +0100 Subject: [PATCH 5/8] test: adding more tests --- test/AgentMech.js | 57 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/test/AgentMech.js b/test/AgentMech.js index c1351d5..d3f9a7b 100644 --- a/test/AgentMech.js +++ b/test/AgentMech.js @@ -160,6 +160,63 @@ describe("AgentMech", function () { for (let i = 1; i < numRequests - 1; i++) { expect(uRequestIds[numRequests - i - 2]).to.eq(requestIds[i]); } + + // Deliver the middle request + const middle = Math.floor(numRequests / 2); + await agentMech.deliver(requestIds[middle], datas[middle]); + + // Check request Ids + uRequestIds = await agentMech.getUndeliveredRequestIds(); + expect(uRequestIds.length).to.equal(numRequests - 3); + for (let i = 1; i < middle; i++) { + expect(uRequestIds[middle - i]).to.eq(requestIds[i]); + } + for (let i = middle + 1; i < numRequests - 1; i++) { + expect(uRequestIds[numRequests - i - 2]).to.eq(requestIds[i]); + } + }); + + it("Getting undelivered requests info for even and odd requests", async function () { + const agentMech = await AgentMech.deploy(agentRegistry.address, unitId, price); + + const numRequests = 10; + const datas = new Array(); + const requestIds = new Array(); + for (let i = 0; i < numRequests; i++) { + datas[i] = data + "00".repeat(i); + requestIds[i] = await agentMech.getRequestId(deployer.address, datas[i]); + } + + // Stack all requests except for the last one + for (let i = 0; i < numRequests - 1; i++) { + await agentMech.request(datas[i], {value: price}); + } + + // Deliver even requests + for (let i = 0; i < numRequests - 1; i++) { + if (i % 2 != 0) { + await agentMech.deliver(requestIds[i], datas[i]); + } + } + + // Check request Ids + uRequestIds = await agentMech.getUndeliveredRequestIds(); + const half = Math.floor(numRequests / 2); + expect(uRequestIds.length).to.equal(half); + for (let i = 0; i < half; i++) { + expect(uRequestIds[half - i - 1]).to.eq(requestIds[i * 2]); + } + + // Deliver the rest of requests + for (let i = 0; i < numRequests - 1; i++) { + if (i % 2 == 0) { + await agentMech.deliver(requestIds[i], datas[i]); + } + } + + // Check request Ids + uRequestIds = await agentMech.getUndeliveredRequestIds(); + expect(uRequestIds.length).to.equal(0); }); }); From f44f925021e5f2100fe175d96e9d16b887a39c12 Mon Sep 17 00:00:00 2001 From: Aleksandr Kuperman Date: Mon, 23 Oct 2023 18:49:17 +0100 Subject: [PATCH 6/8] chore: linter --- test/AgentMech.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/AgentMech.js b/test/AgentMech.js index d3f9a7b..6dfc105 100644 --- a/test/AgentMech.js +++ b/test/AgentMech.js @@ -200,7 +200,7 @@ describe("AgentMech", function () { } // Check request Ids - uRequestIds = await agentMech.getUndeliveredRequestIds(); + let uRequestIds = await agentMech.getUndeliveredRequestIds(); const half = Math.floor(numRequests / 2); expect(uRequestIds.length).to.equal(half); for (let i = 0; i < half; i++) { From a8da4a46ec146e7e237dbcf7cb444a239f80cb04 Mon Sep 17 00:00:00 2001 From: Aleksandr Kuperman Date: Mon, 23 Oct 2023 21:23:05 +0100 Subject: [PATCH 7/8] refactor and test: size and offset of returned batch of request Ids --- contracts/AgentMech.sol | 34 ++++++++++++++--- test/AgentMech.js | 84 +++++++++++++++++++++++++++++++++-------- 2 files changed, 98 insertions(+), 20 deletions(-) diff --git a/contracts/AgentMech.sol b/contracts/AgentMech.sol index 74e3fd8..f786386 100644 --- a/contracts/AgentMech.sol +++ b/contracts/AgentMech.sol @@ -26,6 +26,11 @@ error NotEnoughPaid(uint256 provided, uint256 expected); /// @param requestId Request Id. error RequestIdNotFound(uint256 requestId); +/// @dev Value overflow. +/// @param provided Overflow value. +/// @param max Maximum possible value. +error Overflow(uint256 provided, uint256 max); + /// @title AgentMech - Smart contract for extending ERC721Mech /// @dev A Mech that is operated by the holder of an ERC721 non-fungible token. contract AgentMech is ERC721Mech { @@ -88,7 +93,7 @@ contract AgentMech is ERC721Mech { requestIds[1] = requestId; // Previous element of the current next element will be the newly created element mapRequestIds[curNextRequestId][0] = requestId; - + // Increase the number of undelivered requests numUndeliveredRequests++; @@ -141,17 +146,36 @@ contract AgentMech is ERC721Mech { } /// @dev Gets the set of undelivered request Ids. + /// @param size Maximum batch size of a returned requests Id set. If the size is zero, the whole set is returned. + /// @param offset The number of skipped requests that are not going to be part of the returned requests Id set. /// @return requestIds Set of undelivered request Ids. - function getUndeliveredRequestIds() external view returns (uint256[] memory requestIds) { + function getUndeliveredRequestIds(uint256 size, uint256 offset) external view returns (uint256[] memory requestIds) { // Get the number of undelivered requests uint256 numRequests = numUndeliveredRequests; - if (numRequests > 0) { - requestIds = new uint256[](numRequests); + // If size is zero, return all the requests + if (size == 0) { + size = numRequests; + } + + // Check for the size + offset overflow + if (size + offset > numRequests) { + revert Overflow(size + offset, numRequests); + } + + if (size > 0) { + requestIds = new uint256[](size); // The first request Id is the next request Id of the zero element in the request Ids map uint256 curRequestId = mapRequestIds[0][1]; - for (uint256 i = 0; i < numRequests; ++i) { + // Traverse requests a specified offset + for (uint256 i = 0; i < offset; ++i) { + // Next request Id of the current element based on the current request Id + curRequestId = mapRequestIds[curRequestId][1]; + } + + // Traverse the rest of requests + for (uint256 i = 0; i < size; ++i) { requestIds[i] = curRequestId; // Next request Id of the current element based on the current request Id curRequestId = mapRequestIds[curRequestId][1]; diff --git a/test/AgentMech.js b/test/AgentMech.js index 6dfc105..8c200e8 100644 --- a/test/AgentMech.js +++ b/test/AgentMech.js @@ -95,14 +95,14 @@ describe("AgentMech", function () { } // Check request Ids - let uRequestIds = await agentMech.getUndeliveredRequestIds(); + let uRequestIds = await agentMech.getUndeliveredRequestIds(0, 0); expect(uRequestIds.length).to.equal(0); // Create a first request await agentMech.request(datas[0], {value: price}); // Check request Ids - uRequestIds = await agentMech.getUndeliveredRequestIds(); + uRequestIds = await agentMech.getUndeliveredRequestIds(0, 0); expect(uRequestIds.length).to.equal(1); expect(uRequestIds[0]).to.equal(requestIds[0]); @@ -110,7 +110,7 @@ describe("AgentMech", function () { await agentMech.deliver(requestIds[0], data); // Check request Ids - uRequestIds = await agentMech.getUndeliveredRequestIds(); + uRequestIds = await agentMech.getUndeliveredRequestIds(0, 0); expect(uRequestIds.length).to.equal(0); // Stack all requests @@ -119,7 +119,7 @@ describe("AgentMech", function () { } // Check request Ids - uRequestIds = await agentMech.getUndeliveredRequestIds(); + uRequestIds = await agentMech.getUndeliveredRequestIds(0, 0); expect(uRequestIds.length).to.equal(numRequests); // Requests are added in the reverse order for (let i = 0; i < numRequests; i++) { @@ -132,7 +132,7 @@ describe("AgentMech", function () { } // Check request Ids - uRequestIds = await agentMech.getUndeliveredRequestIds(); + uRequestIds = await agentMech.getUndeliveredRequestIds(0, 0); expect(uRequestIds.length).to.equal(0); // Add all requests again @@ -144,7 +144,7 @@ describe("AgentMech", function () { await agentMech.deliver(requestIds[0], datas[0]); // Check request Ids - uRequestIds = await agentMech.getUndeliveredRequestIds(); + uRequestIds = await agentMech.getUndeliveredRequestIds(0, 0); expect(uRequestIds.length).to.equal(numRequests - 1); // Requests are added in the reverse order for (let i = 1; i < numRequests; i++) { @@ -155,7 +155,7 @@ describe("AgentMech", function () { await agentMech.deliver(requestIds[numRequests - 1], datas[numRequests - 1]); // Check request Ids - uRequestIds = await agentMech.getUndeliveredRequestIds(); + uRequestIds = await agentMech.getUndeliveredRequestIds(0, 0); expect(uRequestIds.length).to.equal(numRequests - 2); for (let i = 1; i < numRequests - 1; i++) { expect(uRequestIds[numRequests - i - 2]).to.eq(requestIds[i]); @@ -166,7 +166,7 @@ describe("AgentMech", function () { await agentMech.deliver(requestIds[middle], datas[middle]); // Check request Ids - uRequestIds = await agentMech.getUndeliveredRequestIds(); + uRequestIds = await agentMech.getUndeliveredRequestIds(0, 0); expect(uRequestIds.length).to.equal(numRequests - 3); for (let i = 1; i < middle; i++) { expect(uRequestIds[middle - i]).to.eq(requestIds[i]); @@ -179,7 +179,7 @@ describe("AgentMech", function () { it("Getting undelivered requests info for even and odd requests", async function () { const agentMech = await AgentMech.deploy(agentRegistry.address, unitId, price); - const numRequests = 10; + const numRequests = 9; const datas = new Array(); const requestIds = new Array(); for (let i = 0; i < numRequests; i++) { @@ -188,36 +188,90 @@ describe("AgentMech", function () { } // Stack all requests except for the last one - for (let i = 0; i < numRequests - 1; i++) { + for (let i = 0; i < numRequests; i++) { await agentMech.request(datas[i], {value: price}); } // Deliver even requests - for (let i = 0; i < numRequests - 1; i++) { + for (let i = 0; i < numRequests; i++) { if (i % 2 != 0) { await agentMech.deliver(requestIds[i], datas[i]); } } // Check request Ids - let uRequestIds = await agentMech.getUndeliveredRequestIds(); - const half = Math.floor(numRequests / 2); + let uRequestIds = await agentMech.getUndeliveredRequestIds(0, 0); + const half = Math.floor(numRequests / 2) + 1; expect(uRequestIds.length).to.equal(half); for (let i = 0; i < half; i++) { expect(uRequestIds[half - i - 1]).to.eq(requestIds[i * 2]); } // Deliver the rest of requests - for (let i = 0; i < numRequests - 1; i++) { + for (let i = 0; i < numRequests; i++) { if (i % 2 == 0) { await agentMech.deliver(requestIds[i], datas[i]); } } // Check request Ids - uRequestIds = await agentMech.getUndeliveredRequestIds(); + uRequestIds = await agentMech.getUndeliveredRequestIds(0, 0); expect(uRequestIds.length).to.equal(0); }); + + it("Getting undelivered requests info for a specified part of a batch", async function () { + const agentMech = await AgentMech.deploy(agentRegistry.address, unitId, price); + + const numRequests = 10; + const datas = new Array(); + const requestIds = new Array(); + for (let i = 0; i < numRequests; i++) { + datas[i] = data + "00".repeat(i); + requestIds[i] = await agentMech.getRequestId(deployer.address, datas[i]); + } + + // Stack all requests except for the last one + for (let i = 0; i < numRequests; i++) { + await agentMech.request(datas[i], {value: price}); + } + + // Check request Ids for just part of the batch + const half = Math.floor(numRequests / 2); + // Try to get more elements than there are + await expect( + agentMech.getUndeliveredRequestIds(0, half) + ).to.be.revertedWithCustomError(agentMech, "Overflow"); + + // Grab the last half of requests + let uRequestIds = await agentMech.getUndeliveredRequestIds(half, 0); + expect(uRequestIds.length).to.equal(half); + for (let i = 0; i < half; i++) { + expect(uRequestIds[half - i - 1]).to.eq(requestIds[half + i]); + } + // Check for the last element specifically + expect(uRequestIds[0]).to.eq(requestIds[numRequests - 1]); + + // Grab the last half of requests and a bit more + uRequestIds = await agentMech.getUndeliveredRequestIds(half + 2, 0); + expect(uRequestIds.length).to.equal(half + 2); + for (let i = 0; i < half + 2; i++) { + expect(uRequestIds[half + 2 - i - 1]).to.eq(requestIds[half - 2 + i]); + } + + // Grab the first half of requests + uRequestIds = await agentMech.getUndeliveredRequestIds(half, half); + expect(uRequestIds.length).to.equal(half); + for (let i = 0; i < half; i++) { + expect(uRequestIds[numRequests - half - i - 1]).to.eq(requestIds[i]); + } + // Check for the first element specifically + expect(uRequestIds[half - 1]).to.eq(requestIds[0]); + + // Deliver all requests + for (let i = 0; i < numRequests; i++) { + await agentMech.deliver(requestIds[i], datas[i]); + } + }); }); context("Changing parameters", async function () { From 720be7de4b0cc750b6a78b0f37284d79609a0a36 Mon Sep 17 00:00:00 2001 From: Aleksandr Kuperman Date: Mon, 23 Oct 2023 21:23:32 +0100 Subject: [PATCH 8/8] chore: updating abis --- abis/0.8.21/AgentFactory.json | 4 ++-- abis/0.8.21/AgentMech.json | 33 ++++++++++++++++++++++++++++++--- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/abis/0.8.21/AgentFactory.json b/abis/0.8.21/AgentFactory.json index 1980ffb..79d7a20 100644 --- a/abis/0.8.21/AgentFactory.json +++ b/abis/0.8.21/AgentFactory.json @@ -527,8 +527,8 @@ "type": "function" } ], - "bytecode": "0x60a060405234801561000f575f80fd5b50604051612f08380380612f0883398101604081905261002e91610050565b6001600160a01b03166080525f80546001600160a01b0319163317905561007d565b5f60208284031215610060575f80fd5b81516001600160a01b0381168114610076575f80fd5b9392505050565b608051612e666100a25f395f8181609a0152818161043e01526104f40152612e665ff3fe608060405234801562000010575f80fd5b506004361062000090575f3560e01c80638da5cb5b116200005f5780638da5cb5b14620001325780638f9ade5e1462000152578063a6f9dae11462000194578063ffa1ad7414620001ab575f80fd5b80630d1cfcae14620000945780633f4ba83a14620000e65780635c975abb14620000f25780638456cb591462000128575b5f80fd5b620000bc7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b620000f0620001f7565b005b5f54620001179074010000000000000000000000000000000000000000900460ff1681565b6040519015158152602001620000dd565b620000f0620002bf565b5f54620000bc9073ffffffffffffffffffffffffffffffffffffffff1681565b620001696200016336600462000720565b6200039a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620000dd565b620000f0620001a536600462000753565b620005bc565b620001e86040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b604051620000dd919062000776565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146200026e575f546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff90911660248201526044015b60405180910390fd5b5f80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16815560405133917faeb196d352664784d1900b0e7414a8face7d29f4dae8c4b0cf68ed477423bbf491a2565b5f5473ffffffffffffffffffffffffffffffffffffffff16331462000332575f546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440162000265565b5f80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017815560405133917f5ee71a369c8672edded508e624ffc9257fa1ae6886ef32905c18e60196bca39991a2565b5f8054819074010000000000000000000000000000000000000000900460ff1615620003f2576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fa3def92300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152602482018690527f0000000000000000000000000000000000000000000000000000000000000000169063a3def923906044016020604051808303815f875af115801562000485573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620004ab9190620007e1565b6040805173ffffffffffffffffffffffffffffffffffffffff881660208201529081018290529092505f90606001604051602081830303815290604052805190602001209050807f000000000000000000000000000000000000000000000000000000000000000084866040516200052390620006e9565b73ffffffffffffffffffffffffffffffffffffffff9093168352602083019190915260408201526060018190604051809103905ff59050801580156200056b573d5f803e3d5ffd5b50915083838373ffffffffffffffffffffffffffffffffffffffff167f67a2e45041c70013518c5b9b849a6944a6c17ff44d66be1c707020460ecbd1db60405160405180910390a450935093915050565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146200062f575f546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440162000265565b73ffffffffffffffffffffffffffffffffffffffff81166200067d576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405190917f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b91a250565b61263780620007fa83390190565b803573ffffffffffffffffffffffffffffffffffffffff811681146200071b575f80fd5b919050565b5f805f6060848603121562000733575f80fd5b6200073e84620006f7565b95602085013595506040909401359392505050565b5f6020828403121562000764575f80fd5b6200076f82620006f7565b9392505050565b5f6020808352835180828501525f5b81811015620007a35785810183015185820160400152820162000785565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b5f60208284031215620007f2575f80fd5b505191905056fe60806040525f805534801562000013575f80fd5b506040516200263738038062002637833981016040819052620000369162000391565b604080516001600160a01b03851660208201528082018490528151808203830181526060909101909152839083906200006f8162000145565b5050506001600160a01b0383166200009a5760405163d92e233d60e01b815260040160405180910390fd5b6040516331a9108f60e11b8152600481018390525f906001600160a01b03851690636352211e90602401602060405180830381865afa158015620000e0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001069190620003c6565b90506001600160a01b0381166200013857604051630ede975960e01b8152600481018490526024015b60405180910390fd5b50600155506200049a9050565b6200014f620001ad565b51156200019f5760405162461bcd60e51b815260206004820152601360248201527f416c726561647920696e697469616c697a65640000000000000000000000000060448201526064016200012f565b620001aa8162000218565b50565b6060620002136200020d604051606b60f91b6020820152602560fa1b60218201526001600160601b03193060601b166022820152600160f81b60368201525f90603701604051602081830303815290604052805190602001205f1c905090565b620002e1565b905090565b5f620002248262000339565b90505f8151602083015ff090506200028b604051606b60f91b6020820152602560fa1b60218201526001600160601b03193060601b166022820152600160f81b60368201525f90603701604051602081830303815290604052805190602001205f1c905090565b6001600160a01b0316816001600160a01b031614620002dc5760405162461bcd60e51b815260206004820152600c60248201526b15dc9a5d194819985a5b195960a21b60448201526064016200012f565b505050565b6060813b600181116200030357505060408051602081019091525f8152919050565b806200030f81620003fd565b9150506040519150601f19601f602083010116820160405280825280600160208401853c50919050565b6060815160016200034b919062000415565b826040516020016200035f92919062000431565b6040516020818303038152906040529050919050565b80516001600160a01b03811681146200038c575f80fd5b919050565b5f805f60608486031215620003a4575f80fd5b620003af8462000375565b925060208401519150604084015190509250925092565b5f60208284031215620003d7575f80fd5b620003e28262000375565b9392505050565b634e487b7160e01b5f52601160045260245ffd5b5f816200040e576200040e620003e9565b505f190190565b808201808211156200042b576200042b620003e9565b92915050565b606360f81b815260e083901b6001600160e01b03191660018201526880600e6000396000f360b81b60058201525f600e82018190528251815b8181101562000489576020818601810151600f8684010152016200046a565b505f9201600f019182525092915050565b61218f80620004a85f395ff3fe60806040526004361061017a575f3560e01c8063a035b1fe116100d1578063bdf863171161007c578063f23a6e6111610057578063f23a6e61146104c7578063f6171e441461050c578063fc0c546a1461052b575f80fd5b8063bdf8631714610467578063c7dec3fc1461047c578063e00b9118146104a8575f80fd5b8063b0d691fe116100ac578063b0d691fe146103c6578063b94207d31461040d578063bc197c8114610420575f80fd5b8063a035b1fe1461037f578063a4f9edbf14610394578063affed0e0146103b3575f80fd5b80633a871cdd116101315780636e3ec0391161010c5780636e3ec039146102fe5780637af734731461031f57806391b7f5ed14610360575f80fd5b80633a871cdd146102855780635fee6085146102a45780636d70f7ae146102cf575f80fd5b8063157305fe11610161578063157305fe146102255780631626ba7e1461024457806317d70f7c14610263575f80fd5b806223de2914610185578063150b7a02146101ab575f80fd5b3661018157005b5f80fd5b348015610190575f80fd5b506101a961019f3660046118ae565b5050505050505050565b005b3480156101b6575f80fd5b506101ef6101c5366004611958565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020015b60405180910390f35b348015610230575f80fd5b506101a961023f366004611a9a565b61053f565b34801561024f575f80fd5b506101ef61025e366004611a9a565b610766565b34801561026e575f80fd5b50610277610909565b60405190815260200161021c565b348015610290575f80fd5b5061027761029f366004611ade565b61092d565b3480156102af575f80fd5b506102776102be366004611b2d565b60036020525f908152604090205481565b3480156102da575f80fd5b506102ee6102e9366004611b2d565b610969565b604051901515815260200161021c565b348015610309575f80fd5b50610312610a3b565b60405161021c9190611b48565b34801561032a575f80fd5b50610277610339366004611b2d565b73ffffffffffffffffffffffffffffffffffffffff165f9081526003602052604090205490565b34801561036b575f80fd5b506101a961037a366004611b8b565b610b0c565b34801561038a575f80fd5b5061027760015481565b34801561039f575f80fd5b506101a96103ae366004611ba2565b610bfa565b3480156103be575f80fd5b505f54610277565b3480156103d1575f80fd5b50730576a174d229e3cfa37253523e645a78a0c91b575b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161021c565b61027761041b366004611ba2565b610c76565b34801561042b575f80fd5b506101ef61043a366004611c1d565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b348015610472575f80fd5b5061027760025481565b348015610487575f80fd5b5061049b610496366004611cb3565b610dce565b60405161021c9190611d90565b3480156104b3575f80fd5b506102776104c2366004611da2565b610eb8565b3480156104d2575f80fd5b506101ef6104e1366004611dd9565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b348015610517575f80fd5b50610277610526366004611e50565b610f09565b348015610536575f80fd5b506103e8610f2b565b61054833610969565b80610566575033730576a174d229e3cfa37253523e645a78a0c91b57145b6105f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084015b60405180910390fd5b5f828152600460205260408082208151808301928390529160029082845b8154815260200190600101908083116106155750505050509050805f6002811061064157610641611e70565b602002015115801561065557506020810151155b801561068a57505f805260046020527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ed548314155b156106c4576040517ffe239804000000000000000000000000000000000000000000000000000000008152600481018490526024016105ee565b6020818101805183515f908152600490935260408084206001908101929092558451925184528084209290925585835290822082815501819055600280549161070c83611eca565b91905055503373ffffffffffffffffffffffffffffffffffffffff167f0cd979445339c62199996f208428d987b1cea24d18e62b79ec24d94b636e8b708484604051610759929190611efe565b60405180910390a2505050565b5f805f8061078685602081015160408201516060909201515f1a92909190565b9094509250905060ff81165f0361089c57828583016020016107a782610969565b1580156107ca575073ffffffffffffffffffffffffffffffffffffffff82163014155b156107fd57507fffffffff0000000000000000000000000000000000000000000000000000000094506109039350505050565b6040517f1626ba7e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831690631626ba7e90610851908b908590600401611efe565b602060405180830381865afa15801561086c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108909190611f16565b95505050505050610903565b6108ab6102e987838686610f48565b156108dc57507f1626ba7e000000000000000000000000000000000000000000000000000000009250610903915050565b507fffffffff00000000000000000000000000000000000000000000000000000000925050505b92915050565b5f80610913610f64565b8060200190518101906109269190611f55565b9392505050565b5f610936611038565b61094084846110b7565b905061094f6040850185611f81565b90505f0361096057610960846111b7565b61092682611235565b5f805f610974610f64565b8060200190518101906109879190611f55565b915091508373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016109dd91815260200190565b602060405180830381865afa1580156109f8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a1c9190611fe2565b73ffffffffffffffffffffffffffffffffffffffff1614949350505050565b6002546060908015610b08578067ffffffffffffffff811115610a6057610a606119c6565b604051908082528060200260200182016040528015610a89578160200160208202803683370190505b505f80805260046020527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ed549193505b82811015610b055781848281518110610ad457610ad4611e70565b6020908102919091018101919091525f9283526004905260409091206001015490610afe81611ffd565b9050610ab9565b50505b5090565b610b1533610969565b80610b33575033730576a174d229e3cfa37253523e645a78a0c91b57145b610bbf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084016105ee565b60018190556040518181527f66cbca4f3c64fecf1dcb9ce094abcf7f68c3450a1d4e3a8e917dd621edb4ebe09060200160405180910390a150565b610c02610f64565b5115610c6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a65640000000000000000000000000060448201526064016105ee565b610c73816112a9565b50565b5f600154341015610cc0576001546040517fb489782800000000000000000000000000000000000000000000000000000000815234600482015260248101919091526044016105ee565b610cca3383610eb8565b335f908152600360205260408120805492935090610ce783611ffd565b909155505060046020525f81815260408082207f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ed805460018301819055908590558084529183208490557f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec8054909391929103610d62578383555b60028054905f610d7183611ffd565b91905055503373ffffffffffffffffffffffffffffffffffffffff167f4bda649efe6b98b0f9c1d5e859c29e20910f45c66dabfe6fad4a4881f7faf9cc8587604051610dbe929190611efe565b60405180910390a2505050919050565b6060610dd933610969565b80610df7575033730576a174d229e3cfa37253523e645a78a0c91b57145b610e83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084016105ee565b5f610e9d878787878715610e97578761141e565b5a61141e565b9250905080610eae57815160208301fd5b5095945050505050565b5f8282604051602001610ecc929190612034565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209392505050565b6004602052815f5260405f208160028110610f22575f80fd5b01549150829050565b5f80610f35610f64565b8060200190518101906109039190611fe2565b5f805f610f5787878787611521565b91509150610eae81611609565b606061103361102e6040517fd60000000000000000000000000000000000000000000000000000000000000060208201527f940000000000000000000000000000000000000000000000000000000000000060218201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660228201527f010000000000000000000000000000000000000000000000000000000000000060368201525f90603701604051602081830303815290604052805190602001205f1c905090565b6117bb565b905090565b33730576a174d229e3cfa37253523e645a78a0c91b57146110b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e740000000060448201526064016105ee565b565b5f8061110f836040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018290525f90605c01604051602081830303815290604052805190602001209050919050565b90507f1626ba7e0000000000000000000000000000000000000000000000000000000061117d82611144610140880188611f81565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061076692505050565b7fffffffff0000000000000000000000000000000000000000000000000000000016146111ae576001915050610903565b505f9392505050565b5f8054602083013591806111ca83611ffd565b9190505514610c73576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496e76616c6964206e6f6e63650000000000000000000000000000000000000060448201526064016105ee565b8015610c73576040515f9033907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90849084818181858888f193505050503d805f811461129d576040519150601f19603f3d011682016040523d82523d5f602084013e6112a2565b606091505b5050505050565b5f6112b382611810565b90505f8151602083015ff090506113856040517fd60000000000000000000000000000000000000000000000000000000000000060208201527f940000000000000000000000000000000000000000000000000000000000000060218201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660228201527f010000000000000000000000000000000000000000000000000000000000000060368201525f90603701604051602081830303815290604052805190602001205f1c905090565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611419576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5772697465206661696c6564000000000000000000000000000000000000000060448201526064016105ee565b505050565b5f6060600184600181111561143557611435612062565b036114a9578673ffffffffffffffffffffffffffffffffffffffff168386604051611460919061208f565b5f604051808303818686f4925050503d805f8114611499576040519150601f19603f3d011682016040523d82523d5f602084013e61149e565b606091505b509092509050611517565b8673ffffffffffffffffffffffffffffffffffffffff168387876040516114d0919061208f565b5f60405180830381858888f193505050503d805f811461150b576040519150601f19603f3d011682016040523d82523d5f602084013e611510565b606091505b5090925090505b9550959350505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561155657505f90506003611600565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156115a7573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166115fa575f60019250925050611600565b91505f90505b94509492505050565b5f81600481111561161c5761161c612062565b036116245750565b600181600481111561163857611638612062565b0361169f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016105ee565b60028160048111156116b3576116b3612062565b0361171a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016105ee565b600381600481111561172e5761172e612062565b03610c73576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016105ee565b6060813b600181116117dc57505060408051602081019091525f8152919050565b806117e681611eca565b9150506040519150601f19601f602083010116820160405280825280600160208401853c50919050565b60608151600161182091906120aa565b826040516020016118329291906120bd565b6040516020818303038152906040529050919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610c73575f80fd5b5f8083601f840112611879575f80fd5b50813567ffffffffffffffff811115611890575f80fd5b6020830191508360208285010111156118a7575f80fd5b9250929050565b5f805f805f805f8060c0898b0312156118c5575f80fd5b88356118d081611848565b975060208901356118e081611848565b965060408901356118f081611848565b955060608901359450608089013567ffffffffffffffff80821115611913575f80fd5b61191f8c838d01611869565b909650945060a08b0135915080821115611937575f80fd5b506119448b828c01611869565b999c989b5096995094979396929594505050565b5f805f805f6080868803121561196c575f80fd5b853561197781611848565b9450602086013561198781611848565b935060408601359250606086013567ffffffffffffffff8111156119a9575f80fd5b6119b588828901611869565b969995985093965092949392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112611a02575f80fd5b813567ffffffffffffffff80821115611a1d57611a1d6119c6565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715611a6357611a636119c6565b81604052838152866020858801011115611a7b575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f8060408385031215611aab575f80fd5b82359150602083013567ffffffffffffffff811115611ac8575f80fd5b611ad4858286016119f3565b9150509250929050565b5f805f60608486031215611af0575f80fd5b833567ffffffffffffffff811115611b06575f80fd5b84016101608187031215611b18575f80fd5b95602085013595506040909401359392505050565b5f60208284031215611b3d575f80fd5b813561092681611848565b602080825282518282018190525f9190848201906040850190845b81811015611b7f57835183529284019291840191600101611b63565b50909695505050505050565b5f60208284031215611b9b575f80fd5b5035919050565b5f60208284031215611bb2575f80fd5b813567ffffffffffffffff811115611bc8575f80fd5b611bd4848285016119f3565b949350505050565b5f8083601f840112611bec575f80fd5b50813567ffffffffffffffff811115611c03575f80fd5b6020830191508360208260051b85010111156118a7575f80fd5b5f805f805f805f8060a0898b031215611c34575f80fd5b8835611c3f81611848565b97506020890135611c4f81611848565b9650604089013567ffffffffffffffff80821115611c6b575f80fd5b611c778c838d01611bdc565b909850965060608b0135915080821115611c8f575f80fd5b611c9b8c838d01611bdc565b909650945060808b0135915080821115611937575f80fd5b5f805f805f60a08688031215611cc7575f80fd5b8535611cd281611848565b945060208601359350604086013567ffffffffffffffff811115611cf4575f80fd5b611d00888289016119f3565b935050606086013560028110611d14575f80fd5b949793965091946080013592915050565b5f5b83811015611d3f578181015183820152602001611d27565b50505f910152565b5f8151808452611d5e816020860160208601611d25565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6109266020830184611d47565b5f8060408385031215611db3575f80fd5b8235611dbe81611848565b9150602083013567ffffffffffffffff811115611ac8575f80fd5b5f805f805f8060a08789031215611dee575f80fd5b8635611df981611848565b95506020870135611e0981611848565b94506040870135935060608701359250608087013567ffffffffffffffff811115611e32575f80fd5b611e3e89828a01611869565b979a9699509497509295939492505050565b5f8060408385031215611e61575f80fd5b50508035926020909101359150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f81611ed857611ed8611e9d565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b828152604060208201525f611bd46040830184611d47565b5f60208284031215611f26575f80fd5b81517fffffffff0000000000000000000000000000000000000000000000000000000081168114610926575f80fd5b5f8060408385031215611f66575f80fd5b8251611f7181611848565b6020939093015192949293505050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611fb4575f80fd5b83018035915067ffffffffffffffff821115611fce575f80fd5b6020019150368190038213156118a7575f80fd5b5f60208284031215611ff2575f80fd5b815161092681611848565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361202d5761202d611e9d565b5060010190565b73ffffffffffffffffffffffffffffffffffffffff83168152604060208201525f611bd46040830184611d47565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f82516120a0818460208701611d25565b9190910192915050565b8082018082111561090357610903611e9d565b7f630000000000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000008360e01b1660018201527f80600e6000396000f3000000000000000000000000000000000000000000000060058201525f600e8201525f825161214b81600f850160208701611d25565b91909101600f01939250505056fea26469706673582212208ee99f5816e66f69a8926786a9858f1caf0bbd099c82d85d9db66d927e9986f664736f6c63430008150033a26469706673582212208c567fe1bca2e8845ee63761d92e29a21b1c2be026fa2116ead8140c095e0f4164736f6c63430008150033", - "deployedBytecode": "0x608060405234801562000010575f80fd5b506004361062000090575f3560e01c80638da5cb5b116200005f5780638da5cb5b14620001325780638f9ade5e1462000152578063a6f9dae11462000194578063ffa1ad7414620001ab575f80fd5b80630d1cfcae14620000945780633f4ba83a14620000e65780635c975abb14620000f25780638456cb591462000128575b5f80fd5b620000bc7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b620000f0620001f7565b005b5f54620001179074010000000000000000000000000000000000000000900460ff1681565b6040519015158152602001620000dd565b620000f0620002bf565b5f54620000bc9073ffffffffffffffffffffffffffffffffffffffff1681565b620001696200016336600462000720565b6200039a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620000dd565b620000f0620001a536600462000753565b620005bc565b620001e86040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b604051620000dd919062000776565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146200026e575f546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff90911660248201526044015b60405180910390fd5b5f80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16815560405133917faeb196d352664784d1900b0e7414a8face7d29f4dae8c4b0cf68ed477423bbf491a2565b5f5473ffffffffffffffffffffffffffffffffffffffff16331462000332575f546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440162000265565b5f80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017815560405133917f5ee71a369c8672edded508e624ffc9257fa1ae6886ef32905c18e60196bca39991a2565b5f8054819074010000000000000000000000000000000000000000900460ff1615620003f2576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fa3def92300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152602482018690527f0000000000000000000000000000000000000000000000000000000000000000169063a3def923906044016020604051808303815f875af115801562000485573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620004ab9190620007e1565b6040805173ffffffffffffffffffffffffffffffffffffffff881660208201529081018290529092505f90606001604051602081830303815290604052805190602001209050807f000000000000000000000000000000000000000000000000000000000000000084866040516200052390620006e9565b73ffffffffffffffffffffffffffffffffffffffff9093168352602083019190915260408201526060018190604051809103905ff59050801580156200056b573d5f803e3d5ffd5b50915083838373ffffffffffffffffffffffffffffffffffffffff167f67a2e45041c70013518c5b9b849a6944a6c17ff44d66be1c707020460ecbd1db60405160405180910390a450935093915050565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146200062f575f546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440162000265565b73ffffffffffffffffffffffffffffffffffffffff81166200067d576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405190917f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b91a250565b61263780620007fa83390190565b803573ffffffffffffffffffffffffffffffffffffffff811681146200071b575f80fd5b919050565b5f805f6060848603121562000733575f80fd5b6200073e84620006f7565b95602085013595506040909401359392505050565b5f6020828403121562000764575f80fd5b6200076f82620006f7565b9392505050565b5f6020808352835180828501525f5b81811015620007a35785810183015185820160400152820162000785565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b5f60208284031215620007f2575f80fd5b505191905056fe60806040525f805534801562000013575f80fd5b506040516200263738038062002637833981016040819052620000369162000391565b604080516001600160a01b03851660208201528082018490528151808203830181526060909101909152839083906200006f8162000145565b5050506001600160a01b0383166200009a5760405163d92e233d60e01b815260040160405180910390fd5b6040516331a9108f60e11b8152600481018390525f906001600160a01b03851690636352211e90602401602060405180830381865afa158015620000e0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001069190620003c6565b90506001600160a01b0381166200013857604051630ede975960e01b8152600481018490526024015b60405180910390fd5b50600155506200049a9050565b6200014f620001ad565b51156200019f5760405162461bcd60e51b815260206004820152601360248201527f416c726561647920696e697469616c697a65640000000000000000000000000060448201526064016200012f565b620001aa8162000218565b50565b6060620002136200020d604051606b60f91b6020820152602560fa1b60218201526001600160601b03193060601b166022820152600160f81b60368201525f90603701604051602081830303815290604052805190602001205f1c905090565b620002e1565b905090565b5f620002248262000339565b90505f8151602083015ff090506200028b604051606b60f91b6020820152602560fa1b60218201526001600160601b03193060601b166022820152600160f81b60368201525f90603701604051602081830303815290604052805190602001205f1c905090565b6001600160a01b0316816001600160a01b031614620002dc5760405162461bcd60e51b815260206004820152600c60248201526b15dc9a5d194819985a5b195960a21b60448201526064016200012f565b505050565b6060813b600181116200030357505060408051602081019091525f8152919050565b806200030f81620003fd565b9150506040519150601f19601f602083010116820160405280825280600160208401853c50919050565b6060815160016200034b919062000415565b826040516020016200035f92919062000431565b6040516020818303038152906040529050919050565b80516001600160a01b03811681146200038c575f80fd5b919050565b5f805f60608486031215620003a4575f80fd5b620003af8462000375565b925060208401519150604084015190509250925092565b5f60208284031215620003d7575f80fd5b620003e28262000375565b9392505050565b634e487b7160e01b5f52601160045260245ffd5b5f816200040e576200040e620003e9565b505f190190565b808201808211156200042b576200042b620003e9565b92915050565b606360f81b815260e083901b6001600160e01b03191660018201526880600e6000396000f360b81b60058201525f600e82018190528251815b8181101562000489576020818601810151600f8684010152016200046a565b505f9201600f019182525092915050565b61218f80620004a85f395ff3fe60806040526004361061017a575f3560e01c8063a035b1fe116100d1578063bdf863171161007c578063f23a6e6111610057578063f23a6e61146104c7578063f6171e441461050c578063fc0c546a1461052b575f80fd5b8063bdf8631714610467578063c7dec3fc1461047c578063e00b9118146104a8575f80fd5b8063b0d691fe116100ac578063b0d691fe146103c6578063b94207d31461040d578063bc197c8114610420575f80fd5b8063a035b1fe1461037f578063a4f9edbf14610394578063affed0e0146103b3575f80fd5b80633a871cdd116101315780636e3ec0391161010c5780636e3ec039146102fe5780637af734731461031f57806391b7f5ed14610360575f80fd5b80633a871cdd146102855780635fee6085146102a45780636d70f7ae146102cf575f80fd5b8063157305fe11610161578063157305fe146102255780631626ba7e1461024457806317d70f7c14610263575f80fd5b806223de2914610185578063150b7a02146101ab575f80fd5b3661018157005b5f80fd5b348015610190575f80fd5b506101a961019f3660046118ae565b5050505050505050565b005b3480156101b6575f80fd5b506101ef6101c5366004611958565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020015b60405180910390f35b348015610230575f80fd5b506101a961023f366004611a9a565b61053f565b34801561024f575f80fd5b506101ef61025e366004611a9a565b610766565b34801561026e575f80fd5b50610277610909565b60405190815260200161021c565b348015610290575f80fd5b5061027761029f366004611ade565b61092d565b3480156102af575f80fd5b506102776102be366004611b2d565b60036020525f908152604090205481565b3480156102da575f80fd5b506102ee6102e9366004611b2d565b610969565b604051901515815260200161021c565b348015610309575f80fd5b50610312610a3b565b60405161021c9190611b48565b34801561032a575f80fd5b50610277610339366004611b2d565b73ffffffffffffffffffffffffffffffffffffffff165f9081526003602052604090205490565b34801561036b575f80fd5b506101a961037a366004611b8b565b610b0c565b34801561038a575f80fd5b5061027760015481565b34801561039f575f80fd5b506101a96103ae366004611ba2565b610bfa565b3480156103be575f80fd5b505f54610277565b3480156103d1575f80fd5b50730576a174d229e3cfa37253523e645a78a0c91b575b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161021c565b61027761041b366004611ba2565b610c76565b34801561042b575f80fd5b506101ef61043a366004611c1d565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b348015610472575f80fd5b5061027760025481565b348015610487575f80fd5b5061049b610496366004611cb3565b610dce565b60405161021c9190611d90565b3480156104b3575f80fd5b506102776104c2366004611da2565b610eb8565b3480156104d2575f80fd5b506101ef6104e1366004611dd9565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b348015610517575f80fd5b50610277610526366004611e50565b610f09565b348015610536575f80fd5b506103e8610f2b565b61054833610969565b80610566575033730576a174d229e3cfa37253523e645a78a0c91b57145b6105f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084015b60405180910390fd5b5f828152600460205260408082208151808301928390529160029082845b8154815260200190600101908083116106155750505050509050805f6002811061064157610641611e70565b602002015115801561065557506020810151155b801561068a57505f805260046020527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ed548314155b156106c4576040517ffe239804000000000000000000000000000000000000000000000000000000008152600481018490526024016105ee565b6020818101805183515f908152600490935260408084206001908101929092558451925184528084209290925585835290822082815501819055600280549161070c83611eca565b91905055503373ffffffffffffffffffffffffffffffffffffffff167f0cd979445339c62199996f208428d987b1cea24d18e62b79ec24d94b636e8b708484604051610759929190611efe565b60405180910390a2505050565b5f805f8061078685602081015160408201516060909201515f1a92909190565b9094509250905060ff81165f0361089c57828583016020016107a782610969565b1580156107ca575073ffffffffffffffffffffffffffffffffffffffff82163014155b156107fd57507fffffffff0000000000000000000000000000000000000000000000000000000094506109039350505050565b6040517f1626ba7e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831690631626ba7e90610851908b908590600401611efe565b602060405180830381865afa15801561086c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108909190611f16565b95505050505050610903565b6108ab6102e987838686610f48565b156108dc57507f1626ba7e000000000000000000000000000000000000000000000000000000009250610903915050565b507fffffffff00000000000000000000000000000000000000000000000000000000925050505b92915050565b5f80610913610f64565b8060200190518101906109269190611f55565b9392505050565b5f610936611038565b61094084846110b7565b905061094f6040850185611f81565b90505f0361096057610960846111b7565b61092682611235565b5f805f610974610f64565b8060200190518101906109879190611f55565b915091508373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016109dd91815260200190565b602060405180830381865afa1580156109f8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a1c9190611fe2565b73ffffffffffffffffffffffffffffffffffffffff1614949350505050565b6002546060908015610b08578067ffffffffffffffff811115610a6057610a606119c6565b604051908082528060200260200182016040528015610a89578160200160208202803683370190505b505f80805260046020527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ed549193505b82811015610b055781848281518110610ad457610ad4611e70565b6020908102919091018101919091525f9283526004905260409091206001015490610afe81611ffd565b9050610ab9565b50505b5090565b610b1533610969565b80610b33575033730576a174d229e3cfa37253523e645a78a0c91b57145b610bbf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084016105ee565b60018190556040518181527f66cbca4f3c64fecf1dcb9ce094abcf7f68c3450a1d4e3a8e917dd621edb4ebe09060200160405180910390a150565b610c02610f64565b5115610c6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a65640000000000000000000000000060448201526064016105ee565b610c73816112a9565b50565b5f600154341015610cc0576001546040517fb489782800000000000000000000000000000000000000000000000000000000815234600482015260248101919091526044016105ee565b610cca3383610eb8565b335f908152600360205260408120805492935090610ce783611ffd565b909155505060046020525f81815260408082207f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ed805460018301819055908590558084529183208490557f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec8054909391929103610d62578383555b60028054905f610d7183611ffd565b91905055503373ffffffffffffffffffffffffffffffffffffffff167f4bda649efe6b98b0f9c1d5e859c29e20910f45c66dabfe6fad4a4881f7faf9cc8587604051610dbe929190611efe565b60405180910390a2505050919050565b6060610dd933610969565b80610df7575033730576a174d229e3cfa37253523e645a78a0c91b57145b610e83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084016105ee565b5f610e9d878787878715610e97578761141e565b5a61141e565b9250905080610eae57815160208301fd5b5095945050505050565b5f8282604051602001610ecc929190612034565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209392505050565b6004602052815f5260405f208160028110610f22575f80fd5b01549150829050565b5f80610f35610f64565b8060200190518101906109039190611fe2565b5f805f610f5787878787611521565b91509150610eae81611609565b606061103361102e6040517fd60000000000000000000000000000000000000000000000000000000000000060208201527f940000000000000000000000000000000000000000000000000000000000000060218201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660228201527f010000000000000000000000000000000000000000000000000000000000000060368201525f90603701604051602081830303815290604052805190602001205f1c905090565b6117bb565b905090565b33730576a174d229e3cfa37253523e645a78a0c91b57146110b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e740000000060448201526064016105ee565b565b5f8061110f836040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018290525f90605c01604051602081830303815290604052805190602001209050919050565b90507f1626ba7e0000000000000000000000000000000000000000000000000000000061117d82611144610140880188611f81565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061076692505050565b7fffffffff0000000000000000000000000000000000000000000000000000000016146111ae576001915050610903565b505f9392505050565b5f8054602083013591806111ca83611ffd565b9190505514610c73576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496e76616c6964206e6f6e63650000000000000000000000000000000000000060448201526064016105ee565b8015610c73576040515f9033907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90849084818181858888f193505050503d805f811461129d576040519150601f19603f3d011682016040523d82523d5f602084013e6112a2565b606091505b5050505050565b5f6112b382611810565b90505f8151602083015ff090506113856040517fd60000000000000000000000000000000000000000000000000000000000000060208201527f940000000000000000000000000000000000000000000000000000000000000060218201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660228201527f010000000000000000000000000000000000000000000000000000000000000060368201525f90603701604051602081830303815290604052805190602001205f1c905090565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611419576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5772697465206661696c6564000000000000000000000000000000000000000060448201526064016105ee565b505050565b5f6060600184600181111561143557611435612062565b036114a9578673ffffffffffffffffffffffffffffffffffffffff168386604051611460919061208f565b5f604051808303818686f4925050503d805f8114611499576040519150601f19603f3d011682016040523d82523d5f602084013e61149e565b606091505b509092509050611517565b8673ffffffffffffffffffffffffffffffffffffffff168387876040516114d0919061208f565b5f60405180830381858888f193505050503d805f811461150b576040519150601f19603f3d011682016040523d82523d5f602084013e611510565b606091505b5090925090505b9550959350505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561155657505f90506003611600565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156115a7573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166115fa575f60019250925050611600565b91505f90505b94509492505050565b5f81600481111561161c5761161c612062565b036116245750565b600181600481111561163857611638612062565b0361169f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016105ee565b60028160048111156116b3576116b3612062565b0361171a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016105ee565b600381600481111561172e5761172e612062565b03610c73576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016105ee565b6060813b600181116117dc57505060408051602081019091525f8152919050565b806117e681611eca565b9150506040519150601f19601f602083010116820160405280825280600160208401853c50919050565b60608151600161182091906120aa565b826040516020016118329291906120bd565b6040516020818303038152906040529050919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610c73575f80fd5b5f8083601f840112611879575f80fd5b50813567ffffffffffffffff811115611890575f80fd5b6020830191508360208285010111156118a7575f80fd5b9250929050565b5f805f805f805f8060c0898b0312156118c5575f80fd5b88356118d081611848565b975060208901356118e081611848565b965060408901356118f081611848565b955060608901359450608089013567ffffffffffffffff80821115611913575f80fd5b61191f8c838d01611869565b909650945060a08b0135915080821115611937575f80fd5b506119448b828c01611869565b999c989b5096995094979396929594505050565b5f805f805f6080868803121561196c575f80fd5b853561197781611848565b9450602086013561198781611848565b935060408601359250606086013567ffffffffffffffff8111156119a9575f80fd5b6119b588828901611869565b969995985093965092949392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112611a02575f80fd5b813567ffffffffffffffff80821115611a1d57611a1d6119c6565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715611a6357611a636119c6565b81604052838152866020858801011115611a7b575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f8060408385031215611aab575f80fd5b82359150602083013567ffffffffffffffff811115611ac8575f80fd5b611ad4858286016119f3565b9150509250929050565b5f805f60608486031215611af0575f80fd5b833567ffffffffffffffff811115611b06575f80fd5b84016101608187031215611b18575f80fd5b95602085013595506040909401359392505050565b5f60208284031215611b3d575f80fd5b813561092681611848565b602080825282518282018190525f9190848201906040850190845b81811015611b7f57835183529284019291840191600101611b63565b50909695505050505050565b5f60208284031215611b9b575f80fd5b5035919050565b5f60208284031215611bb2575f80fd5b813567ffffffffffffffff811115611bc8575f80fd5b611bd4848285016119f3565b949350505050565b5f8083601f840112611bec575f80fd5b50813567ffffffffffffffff811115611c03575f80fd5b6020830191508360208260051b85010111156118a7575f80fd5b5f805f805f805f8060a0898b031215611c34575f80fd5b8835611c3f81611848565b97506020890135611c4f81611848565b9650604089013567ffffffffffffffff80821115611c6b575f80fd5b611c778c838d01611bdc565b909850965060608b0135915080821115611c8f575f80fd5b611c9b8c838d01611bdc565b909650945060808b0135915080821115611937575f80fd5b5f805f805f60a08688031215611cc7575f80fd5b8535611cd281611848565b945060208601359350604086013567ffffffffffffffff811115611cf4575f80fd5b611d00888289016119f3565b935050606086013560028110611d14575f80fd5b949793965091946080013592915050565b5f5b83811015611d3f578181015183820152602001611d27565b50505f910152565b5f8151808452611d5e816020860160208601611d25565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6109266020830184611d47565b5f8060408385031215611db3575f80fd5b8235611dbe81611848565b9150602083013567ffffffffffffffff811115611ac8575f80fd5b5f805f805f8060a08789031215611dee575f80fd5b8635611df981611848565b95506020870135611e0981611848565b94506040870135935060608701359250608087013567ffffffffffffffff811115611e32575f80fd5b611e3e89828a01611869565b979a9699509497509295939492505050565b5f8060408385031215611e61575f80fd5b50508035926020909101359150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f81611ed857611ed8611e9d565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b828152604060208201525f611bd46040830184611d47565b5f60208284031215611f26575f80fd5b81517fffffffff0000000000000000000000000000000000000000000000000000000081168114610926575f80fd5b5f8060408385031215611f66575f80fd5b8251611f7181611848565b6020939093015192949293505050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611fb4575f80fd5b83018035915067ffffffffffffffff821115611fce575f80fd5b6020019150368190038213156118a7575f80fd5b5f60208284031215611ff2575f80fd5b815161092681611848565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361202d5761202d611e9d565b5060010190565b73ffffffffffffffffffffffffffffffffffffffff83168152604060208201525f611bd46040830184611d47565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f82516120a0818460208701611d25565b9190910192915050565b8082018082111561090357610903611e9d565b7f630000000000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000008360e01b1660018201527f80600e6000396000f3000000000000000000000000000000000000000000000060058201525f600e8201525f825161214b81600f850160208701611d25565b91909101600f01939250505056fea26469706673582212208ee99f5816e66f69a8926786a9858f1caf0bbd099c82d85d9db66d927e9986f664736f6c63430008150033a26469706673582212208c567fe1bca2e8845ee63761d92e29a21b1c2be026fa2116ead8140c095e0f4164736f6c63430008150033", + "bytecode": "0x60a060405234801561000f575f80fd5b50604051612f9d380380612f9d83398101604081905261002e91610050565b6001600160a01b03166080525f80546001600160a01b0319163317905561007d565b5f60208284031215610060575f80fd5b81516001600160a01b0381168114610076575f80fd5b9392505050565b608051612efb6100a25f395f8181609a0152818161043e01526104f40152612efb5ff3fe608060405234801562000010575f80fd5b506004361062000090575f3560e01c80638da5cb5b116200005f5780638da5cb5b14620001325780638f9ade5e1462000152578063a6f9dae11462000194578063ffa1ad7414620001ab575f80fd5b80630d1cfcae14620000945780633f4ba83a14620000e65780635c975abb14620000f25780638456cb591462000128575b5f80fd5b620000bc7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b620000f0620001f7565b005b5f54620001179074010000000000000000000000000000000000000000900460ff1681565b6040519015158152602001620000dd565b620000f0620002bf565b5f54620000bc9073ffffffffffffffffffffffffffffffffffffffff1681565b620001696200016336600462000720565b6200039a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620000dd565b620000f0620001a536600462000753565b620005bc565b620001e86040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b604051620000dd919062000776565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146200026e575f546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff90911660248201526044015b60405180910390fd5b5f80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16815560405133917faeb196d352664784d1900b0e7414a8face7d29f4dae8c4b0cf68ed477423bbf491a2565b5f5473ffffffffffffffffffffffffffffffffffffffff16331462000332575f546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440162000265565b5f80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017815560405133917f5ee71a369c8672edded508e624ffc9257fa1ae6886ef32905c18e60196bca39991a2565b5f8054819074010000000000000000000000000000000000000000900460ff1615620003f2576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fa3def92300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152602482018690527f0000000000000000000000000000000000000000000000000000000000000000169063a3def923906044016020604051808303815f875af115801562000485573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620004ab9190620007e1565b6040805173ffffffffffffffffffffffffffffffffffffffff881660208201529081018290529092505f90606001604051602081830303815290604052805190602001209050807f000000000000000000000000000000000000000000000000000000000000000084866040516200052390620006e9565b73ffffffffffffffffffffffffffffffffffffffff9093168352602083019190915260408201526060018190604051809103905ff59050801580156200056b573d5f803e3d5ffd5b50915083838373ffffffffffffffffffffffffffffffffffffffff167f67a2e45041c70013518c5b9b849a6944a6c17ff44d66be1c707020460ecbd1db60405160405180910390a450935093915050565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146200062f575f546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440162000265565b73ffffffffffffffffffffffffffffffffffffffff81166200067d576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405190917f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b91a250565b6126cc80620007fa83390190565b803573ffffffffffffffffffffffffffffffffffffffff811681146200071b575f80fd5b919050565b5f805f6060848603121562000733575f80fd5b6200073e84620006f7565b95602085013595506040909401359392505050565b5f6020828403121562000764575f80fd5b6200076f82620006f7565b9392505050565b5f6020808352835180828501525f5b81811015620007a35785810183015185820160400152820162000785565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b5f60208284031215620007f2575f80fd5b505191905056fe60806040525f805534801562000013575f80fd5b50604051620026cc380380620026cc833981016040819052620000369162000391565b604080516001600160a01b03851660208201528082018490528151808203830181526060909101909152839083906200006f8162000145565b5050506001600160a01b0383166200009a5760405163d92e233d60e01b815260040160405180910390fd5b6040516331a9108f60e11b8152600481018390525f906001600160a01b03851690636352211e90602401602060405180830381865afa158015620000e0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001069190620003c6565b90506001600160a01b0381166200013857604051630ede975960e01b8152600481018490526024015b60405180910390fd5b50600155506200049a9050565b6200014f620001ad565b51156200019f5760405162461bcd60e51b815260206004820152601360248201527f416c726561647920696e697469616c697a65640000000000000000000000000060448201526064016200012f565b620001aa8162000218565b50565b6060620002136200020d604051606b60f91b6020820152602560fa1b60218201526001600160601b03193060601b166022820152600160f81b60368201525f90603701604051602081830303815290604052805190602001205f1c905090565b620002e1565b905090565b5f620002248262000339565b90505f8151602083015ff090506200028b604051606b60f91b6020820152602560fa1b60218201526001600160601b03193060601b166022820152600160f81b60368201525f90603701604051602081830303815290604052805190602001205f1c905090565b6001600160a01b0316816001600160a01b031614620002dc5760405162461bcd60e51b815260206004820152600c60248201526b15dc9a5d194819985a5b195960a21b60448201526064016200012f565b505050565b6060813b600181116200030357505060408051602081019091525f8152919050565b806200030f81620003fd565b9150506040519150601f19601f602083010116820160405280825280600160208401853c50919050565b6060815160016200034b919062000415565b826040516020016200035f92919062000431565b6040516020818303038152906040529050919050565b80516001600160a01b03811681146200038c575f80fd5b919050565b5f805f60608486031215620003a4575f80fd5b620003af8462000375565b925060208401519150604084015190509250925092565b5f60208284031215620003d7575f80fd5b620003e28262000375565b9392505050565b634e487b7160e01b5f52601160045260245ffd5b5f816200040e576200040e620003e9565b505f190190565b808201808211156200042b576200042b620003e9565b92915050565b606360f81b815260e083901b6001600160e01b03191660018201526880600e6000396000f360b81b60058201525f600e82018190528251815b8181101562000489576020818601810151600f8684010152016200046a565b505f9201600f019182525092915050565b61222480620004a85f395ff3fe60806040526004361061017a575f3560e01c8063a035b1fe116100d1578063bdf863171161007c578063f23a6e6111610057578063f23a6e61146104d2578063f6171e4414610517578063fc0c546a14610536575f80fd5b8063bdf8631714610472578063c7dec3fc14610487578063e00b9118146104b3575f80fd5b8063b0d691fe116100ac578063b0d691fe146103d1578063b94207d314610418578063bc197c811461042b575f80fd5b8063a035b1fe1461038a578063a4f9edbf1461039f578063affed0e0146103be575f80fd5b80633a871cdd116101315780636d70f7ae1161010c5780636d70f7ae146102fb5780637af734731461032a57806391b7f5ed1461036b575f80fd5b80633a871cdd1461028557806358ce0909146102a45780635fee6085146102d0575f80fd5b8063157305fe11610161578063157305fe146102255780631626ba7e1461024457806317d70f7c14610263575f80fd5b806223de2914610185578063150b7a02146101ab575f80fd5b3661018157005b5f80fd5b348015610190575f80fd5b506101a961019f366004611943565b5050505050505050565b005b3480156101b6575f80fd5b506101ef6101c53660046119ed565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020015b60405180910390f35b348015610230575f80fd5b506101a961023f366004611b2f565b61054a565b34801561024f575f80fd5b506101ef61025e366004611b2f565b610771565b34801561026e575f80fd5b50610277610914565b60405190815260200161021c565b348015610290575f80fd5b5061027761029f366004611b73565b610938565b3480156102af575f80fd5b506102c36102be366004611bc2565b610974565b60405161021c9190611be2565b3480156102db575f80fd5b506102776102ea366004611c25565b60036020525f908152604090205481565b348015610306575f80fd5b5061031a610315366004611c25565b610ada565b604051901515815260200161021c565b348015610335575f80fd5b50610277610344366004611c25565b73ffffffffffffffffffffffffffffffffffffffff165f9081526003602052604090205490565b348015610376575f80fd5b506101a9610385366004611c40565b610bac565b348015610395575f80fd5b5061027760015481565b3480156103aa575f80fd5b506101a96103b9366004611c57565b610c9a565b3480156103c9575f80fd5b505f54610277565b3480156103dc575f80fd5b50730576a174d229e3cfa37253523e645a78a0c91b575b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161021c565b610277610426366004611c57565b610d16565b348015610436575f80fd5b506101ef610445366004611cd2565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b34801561047d575f80fd5b5061027760025481565b348015610492575f80fd5b506104a66104a1366004611d68565b610e63565b60405161021c9190611e45565b3480156104be575f80fd5b506102776104cd366004611e57565b610f4d565b3480156104dd575f80fd5b506101ef6104ec366004611e8e565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b348015610522575f80fd5b50610277610531366004611bc2565b610f9e565b348015610541575f80fd5b506103f3610fc0565b61055333610ada565b80610571575033730576a174d229e3cfa37253523e645a78a0c91b57145b610602576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084015b60405180910390fd5b5f828152600460205260408082208151808301928390529160029082845b8154815260200190600101908083116106205750505050509050805f6002811061064c5761064c611f05565b602002015115801561066057506020810151155b801561069557505f805260046020527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ed548314155b156106cf576040517ffe239804000000000000000000000000000000000000000000000000000000008152600481018490526024016105f9565b6020818101805183515f908152600490935260408084206001908101929092558451925184528084209290925585835290822082815501819055600280549161071783611f5f565b91905055503373ffffffffffffffffffffffffffffffffffffffff167f0cd979445339c62199996f208428d987b1cea24d18e62b79ec24d94b636e8b708484604051610764929190611f93565b60405180910390a2505050565b5f805f8061079185602081015160408201516060909201515f1a92909190565b9094509250905060ff81165f036108a757828583016020016107b282610ada565b1580156107d5575073ffffffffffffffffffffffffffffffffffffffff82163014155b1561080857507fffffffff00000000000000000000000000000000000000000000000000000000945061090e9350505050565b6040517f1626ba7e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831690631626ba7e9061085c908b908590600401611f93565b602060405180830381865afa158015610877573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061089b9190611fab565b9550505050505061090e565b6108b661031587838686610fdd565b156108e757507f1626ba7e00000000000000000000000000000000000000000000000000000000925061090e915050565b507fffffffff00000000000000000000000000000000000000000000000000000000925050505b92915050565b5f8061091e610ff9565b8060200190518101906109319190611fea565b9392505050565b5f6109416110cd565b61094b848461114c565b905061095a6040850185612016565b90505f0361096b5761096b8461124c565b610931826112ca565b6002546060905f849003610986578093505b806109918486612077565b11156109de576109a18385612077565b6040517f7ae596850000000000000000000000000000000000000000000000000000000081526004810191909152602481018290526044016105f9565b8315610ad3578367ffffffffffffffff8111156109fd576109fd611a5b565b604051908082528060200260200182016040528015610a26578160200160208202803683370190505b505f80805260046020527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ed549193505b84811015610a81575f828152600460205260409020600101549150610a7a8161208a565b9050610a56565b505f5b85811015610ad05781848281518110610a9f57610a9f611f05565b6020908102919091018101919091525f9283526004905260409091206001015490610ac98161208a565b9050610a84565b50505b5092915050565b5f805f610ae5610ff9565b806020019051810190610af89190611fea565b915091508373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401610b4e91815260200190565b602060405180830381865afa158015610b69573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8d91906120c1565b73ffffffffffffffffffffffffffffffffffffffff1614949350505050565b610bb533610ada565b80610bd3575033730576a174d229e3cfa37253523e645a78a0c91b57145b610c5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084016105f9565b60018190556040518181527f66cbca4f3c64fecf1dcb9ce094abcf7f68c3450a1d4e3a8e917dd621edb4ebe09060200160405180910390a150565b610ca2610ff9565b5115610d0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a65640000000000000000000000000060448201526064016105f9565b610d138161133e565b50565b5f600154341015610d60576001546040517fb489782800000000000000000000000000000000000000000000000000000000815234600482015260248101919091526044016105f9565b610d6a3383610f4d565b335f908152600360205260408120805492935090610d878361208a565b909155505060046020525f81815260408082207f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ed80546001830181905590859055808452918320849055600280547f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec94929392909190610e068361208a565b91905055503373ffffffffffffffffffffffffffffffffffffffff167f4bda649efe6b98b0f9c1d5e859c29e20910f45c66dabfe6fad4a4881f7faf9cc8587604051610e53929190611f93565b60405180910390a2505050919050565b6060610e6e33610ada565b80610e8c575033730576a174d229e3cfa37253523e645a78a0c91b57145b610f18576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084016105f9565b5f610f32878787878715610f2c57876114b3565b5a6114b3565b9250905080610f4357815160208301fd5b5095945050505050565b5f8282604051602001610f619291906120dc565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209392505050565b6004602052815f5260405f208160028110610fb7575f80fd5b01549150829050565b5f80610fca610ff9565b80602001905181019061090e91906120c1565b5f805f610fec878787876115b6565b91509150610f438161169e565b60606110c86110c36040517fd60000000000000000000000000000000000000000000000000000000000000060208201527f940000000000000000000000000000000000000000000000000000000000000060218201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660228201527f010000000000000000000000000000000000000000000000000000000000000060368201525f90603701604051602081830303815290604052805190602001205f1c905090565b611850565b905090565b33730576a174d229e3cfa37253523e645a78a0c91b571461114a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e740000000060448201526064016105f9565b565b5f806111a4836040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018290525f90605c01604051602081830303815290604052805190602001209050919050565b90507f1626ba7e00000000000000000000000000000000000000000000000000000000611212826111d9610140880188612016565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061077192505050565b7fffffffff00000000000000000000000000000000000000000000000000000000161461124357600191505061090e565b505f9392505050565b5f80546020830135918061125f8361208a565b9190505514610d13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496e76616c6964206e6f6e63650000000000000000000000000000000000000060448201526064016105f9565b8015610d13576040515f9033907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90849084818181858888f193505050503d805f8114611332576040519150601f19603f3d011682016040523d82523d5f602084013e611337565b606091505b5050505050565b5f611348826118a5565b90505f8151602083015ff0905061141a6040517fd60000000000000000000000000000000000000000000000000000000000000060208201527f940000000000000000000000000000000000000000000000000000000000000060218201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660228201527f010000000000000000000000000000000000000000000000000000000000000060368201525f90603701604051602081830303815290604052805190602001205f1c905090565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146114ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5772697465206661696c6564000000000000000000000000000000000000000060448201526064016105f9565b505050565b5f606060018460018111156114ca576114ca61210a565b0361153e578673ffffffffffffffffffffffffffffffffffffffff1683866040516114f59190612137565b5f604051808303818686f4925050503d805f811461152e576040519150601f19603f3d011682016040523d82523d5f602084013e611533565b606091505b5090925090506115ac565b8673ffffffffffffffffffffffffffffffffffffffff168387876040516115659190612137565b5f60405180830381858888f193505050503d805f81146115a0576040519150601f19603f3d011682016040523d82523d5f602084013e6115a5565b606091505b5090925090505b9550959350505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156115eb57505f90506003611695565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561163c573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811661168f575f60019250925050611695565b91505f90505b94509492505050565b5f8160048111156116b1576116b161210a565b036116b95750565b60018160048111156116cd576116cd61210a565b03611734576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016105f9565b60028160048111156117485761174861210a565b036117af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016105f9565b60038160048111156117c3576117c361210a565b03610d13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016105f9565b6060813b6001811161187157505060408051602081019091525f8152919050565b8061187b81611f5f565b9150506040519150601f19601f602083010116820160405280825280600160208401853c50919050565b6060815160016118b59190612077565b826040516020016118c7929190612152565b6040516020818303038152906040529050919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610d13575f80fd5b5f8083601f84011261190e575f80fd5b50813567ffffffffffffffff811115611925575f80fd5b60208301915083602082850101111561193c575f80fd5b9250929050565b5f805f805f805f8060c0898b03121561195a575f80fd5b8835611965816118dd565b97506020890135611975816118dd565b96506040890135611985816118dd565b955060608901359450608089013567ffffffffffffffff808211156119a8575f80fd5b6119b48c838d016118fe565b909650945060a08b01359150808211156119cc575f80fd5b506119d98b828c016118fe565b999c989b5096995094979396929594505050565b5f805f805f60808688031215611a01575f80fd5b8535611a0c816118dd565b94506020860135611a1c816118dd565b935060408601359250606086013567ffffffffffffffff811115611a3e575f80fd5b611a4a888289016118fe565b969995985093965092949392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112611a97575f80fd5b813567ffffffffffffffff80821115611ab257611ab2611a5b565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715611af857611af8611a5b565b81604052838152866020858801011115611b10575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f8060408385031215611b40575f80fd5b82359150602083013567ffffffffffffffff811115611b5d575f80fd5b611b6985828601611a88565b9150509250929050565b5f805f60608486031215611b85575f80fd5b833567ffffffffffffffff811115611b9b575f80fd5b84016101608187031215611bad575f80fd5b95602085013595506040909401359392505050565b5f8060408385031215611bd3575f80fd5b50508035926020909101359150565b602080825282518282018190525f9190848201906040850190845b81811015611c1957835183529284019291840191600101611bfd565b50909695505050505050565b5f60208284031215611c35575f80fd5b8135610931816118dd565b5f60208284031215611c50575f80fd5b5035919050565b5f60208284031215611c67575f80fd5b813567ffffffffffffffff811115611c7d575f80fd5b611c8984828501611a88565b949350505050565b5f8083601f840112611ca1575f80fd5b50813567ffffffffffffffff811115611cb8575f80fd5b6020830191508360208260051b850101111561193c575f80fd5b5f805f805f805f8060a0898b031215611ce9575f80fd5b8835611cf4816118dd565b97506020890135611d04816118dd565b9650604089013567ffffffffffffffff80821115611d20575f80fd5b611d2c8c838d01611c91565b909850965060608b0135915080821115611d44575f80fd5b611d508c838d01611c91565b909650945060808b01359150808211156119cc575f80fd5b5f805f805f60a08688031215611d7c575f80fd5b8535611d87816118dd565b945060208601359350604086013567ffffffffffffffff811115611da9575f80fd5b611db588828901611a88565b935050606086013560028110611dc9575f80fd5b949793965091946080013592915050565b5f5b83811015611df4578181015183820152602001611ddc565b50505f910152565b5f8151808452611e13816020860160208601611dda565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6109316020830184611dfc565b5f8060408385031215611e68575f80fd5b8235611e73816118dd565b9150602083013567ffffffffffffffff811115611b5d575f80fd5b5f805f805f8060a08789031215611ea3575f80fd5b8635611eae816118dd565b95506020870135611ebe816118dd565b94506040870135935060608701359250608087013567ffffffffffffffff811115611ee7575f80fd5b611ef389828a016118fe565b979a9699509497509295939492505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f81611f6d57611f6d611f32565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b828152604060208201525f611c896040830184611dfc565b5f60208284031215611fbb575f80fd5b81517fffffffff0000000000000000000000000000000000000000000000000000000081168114610931575f80fd5b5f8060408385031215611ffb575f80fd5b8251612006816118dd565b6020939093015192949293505050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612049575f80fd5b83018035915067ffffffffffffffff821115612063575f80fd5b60200191503681900382131561193c575f80fd5b8082018082111561090e5761090e611f32565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036120ba576120ba611f32565b5060010190565b5f602082840312156120d1575f80fd5b8151610931816118dd565b73ffffffffffffffffffffffffffffffffffffffff83168152604060208201525f611c896040830184611dfc565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f8251612148818460208701611dda565b9190910192915050565b7f630000000000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000008360e01b1660018201527f80600e6000396000f3000000000000000000000000000000000000000000000060058201525f600e8201525f82516121e081600f850160208701611dda565b91909101600f01939250505056fea2646970667358221220c1913351e275e1fecd00c79cd676ed135b575df5d3a88ccc57419dc3081980a264736f6c63430008150033a26469706673582212202385972bb9d2bb05d79731a86e43632913078ff3cadc03cad2c77fe78f9ecc0064736f6c63430008150033", + "deployedBytecode": "0x608060405234801562000010575f80fd5b506004361062000090575f3560e01c80638da5cb5b116200005f5780638da5cb5b14620001325780638f9ade5e1462000152578063a6f9dae11462000194578063ffa1ad7414620001ab575f80fd5b80630d1cfcae14620000945780633f4ba83a14620000e65780635c975abb14620000f25780638456cb591462000128575b5f80fd5b620000bc7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b620000f0620001f7565b005b5f54620001179074010000000000000000000000000000000000000000900460ff1681565b6040519015158152602001620000dd565b620000f0620002bf565b5f54620000bc9073ffffffffffffffffffffffffffffffffffffffff1681565b620001696200016336600462000720565b6200039a565b6040805192835273ffffffffffffffffffffffffffffffffffffffff909116602083015201620000dd565b620000f0620001a536600462000753565b620005bc565b620001e86040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b604051620000dd919062000776565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146200026e575f546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff90911660248201526044015b60405180910390fd5b5f80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16815560405133917faeb196d352664784d1900b0e7414a8face7d29f4dae8c4b0cf68ed477423bbf491a2565b5f5473ffffffffffffffffffffffffffffffffffffffff16331462000332575f546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440162000265565b5f80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017815560405133917f5ee71a369c8672edded508e624ffc9257fa1ae6886ef32905c18e60196bca39991a2565b5f8054819074010000000000000000000000000000000000000000900460ff1615620003f2576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fa3def92300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152602482018690527f0000000000000000000000000000000000000000000000000000000000000000169063a3def923906044016020604051808303815f875af115801562000485573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620004ab9190620007e1565b6040805173ffffffffffffffffffffffffffffffffffffffff881660208201529081018290529092505f90606001604051602081830303815290604052805190602001209050807f000000000000000000000000000000000000000000000000000000000000000084866040516200052390620006e9565b73ffffffffffffffffffffffffffffffffffffffff9093168352602083019190915260408201526060018190604051809103905ff59050801580156200056b573d5f803e3d5ffd5b50915083838373ffffffffffffffffffffffffffffffffffffffff167f67a2e45041c70013518c5b9b849a6944a6c17ff44d66be1c707020460ecbd1db60405160405180910390a450935093915050565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146200062f575f546040517fa43d6ada00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440162000265565b73ffffffffffffffffffffffffffffffffffffffff81166200067d576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405190917f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b91a250565b6126cc80620007fa83390190565b803573ffffffffffffffffffffffffffffffffffffffff811681146200071b575f80fd5b919050565b5f805f6060848603121562000733575f80fd5b6200073e84620006f7565b95602085013595506040909401359392505050565b5f6020828403121562000764575f80fd5b6200076f82620006f7565b9392505050565b5f6020808352835180828501525f5b81811015620007a35785810183015185820160400152820162000785565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b5f60208284031215620007f2575f80fd5b505191905056fe60806040525f805534801562000013575f80fd5b50604051620026cc380380620026cc833981016040819052620000369162000391565b604080516001600160a01b03851660208201528082018490528151808203830181526060909101909152839083906200006f8162000145565b5050506001600160a01b0383166200009a5760405163d92e233d60e01b815260040160405180910390fd5b6040516331a9108f60e11b8152600481018390525f906001600160a01b03851690636352211e90602401602060405180830381865afa158015620000e0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001069190620003c6565b90506001600160a01b0381166200013857604051630ede975960e01b8152600481018490526024015b60405180910390fd5b50600155506200049a9050565b6200014f620001ad565b51156200019f5760405162461bcd60e51b815260206004820152601360248201527f416c726561647920696e697469616c697a65640000000000000000000000000060448201526064016200012f565b620001aa8162000218565b50565b6060620002136200020d604051606b60f91b6020820152602560fa1b60218201526001600160601b03193060601b166022820152600160f81b60368201525f90603701604051602081830303815290604052805190602001205f1c905090565b620002e1565b905090565b5f620002248262000339565b90505f8151602083015ff090506200028b604051606b60f91b6020820152602560fa1b60218201526001600160601b03193060601b166022820152600160f81b60368201525f90603701604051602081830303815290604052805190602001205f1c905090565b6001600160a01b0316816001600160a01b031614620002dc5760405162461bcd60e51b815260206004820152600c60248201526b15dc9a5d194819985a5b195960a21b60448201526064016200012f565b505050565b6060813b600181116200030357505060408051602081019091525f8152919050565b806200030f81620003fd565b9150506040519150601f19601f602083010116820160405280825280600160208401853c50919050565b6060815160016200034b919062000415565b826040516020016200035f92919062000431565b6040516020818303038152906040529050919050565b80516001600160a01b03811681146200038c575f80fd5b919050565b5f805f60608486031215620003a4575f80fd5b620003af8462000375565b925060208401519150604084015190509250925092565b5f60208284031215620003d7575f80fd5b620003e28262000375565b9392505050565b634e487b7160e01b5f52601160045260245ffd5b5f816200040e576200040e620003e9565b505f190190565b808201808211156200042b576200042b620003e9565b92915050565b606360f81b815260e083901b6001600160e01b03191660018201526880600e6000396000f360b81b60058201525f600e82018190528251815b8181101562000489576020818601810151600f8684010152016200046a565b505f9201600f019182525092915050565b61222480620004a85f395ff3fe60806040526004361061017a575f3560e01c8063a035b1fe116100d1578063bdf863171161007c578063f23a6e6111610057578063f23a6e61146104d2578063f6171e4414610517578063fc0c546a14610536575f80fd5b8063bdf8631714610472578063c7dec3fc14610487578063e00b9118146104b3575f80fd5b8063b0d691fe116100ac578063b0d691fe146103d1578063b94207d314610418578063bc197c811461042b575f80fd5b8063a035b1fe1461038a578063a4f9edbf1461039f578063affed0e0146103be575f80fd5b80633a871cdd116101315780636d70f7ae1161010c5780636d70f7ae146102fb5780637af734731461032a57806391b7f5ed1461036b575f80fd5b80633a871cdd1461028557806358ce0909146102a45780635fee6085146102d0575f80fd5b8063157305fe11610161578063157305fe146102255780631626ba7e1461024457806317d70f7c14610263575f80fd5b806223de2914610185578063150b7a02146101ab575f80fd5b3661018157005b5f80fd5b348015610190575f80fd5b506101a961019f366004611943565b5050505050505050565b005b3480156101b6575f80fd5b506101ef6101c53660046119ed565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020015b60405180910390f35b348015610230575f80fd5b506101a961023f366004611b2f565b61054a565b34801561024f575f80fd5b506101ef61025e366004611b2f565b610771565b34801561026e575f80fd5b50610277610914565b60405190815260200161021c565b348015610290575f80fd5b5061027761029f366004611b73565b610938565b3480156102af575f80fd5b506102c36102be366004611bc2565b610974565b60405161021c9190611be2565b3480156102db575f80fd5b506102776102ea366004611c25565b60036020525f908152604090205481565b348015610306575f80fd5b5061031a610315366004611c25565b610ada565b604051901515815260200161021c565b348015610335575f80fd5b50610277610344366004611c25565b73ffffffffffffffffffffffffffffffffffffffff165f9081526003602052604090205490565b348015610376575f80fd5b506101a9610385366004611c40565b610bac565b348015610395575f80fd5b5061027760015481565b3480156103aa575f80fd5b506101a96103b9366004611c57565b610c9a565b3480156103c9575f80fd5b505f54610277565b3480156103dc575f80fd5b50730576a174d229e3cfa37253523e645a78a0c91b575b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161021c565b610277610426366004611c57565b610d16565b348015610436575f80fd5b506101ef610445366004611cd2565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b34801561047d575f80fd5b5061027760025481565b348015610492575f80fd5b506104a66104a1366004611d68565b610e63565b60405161021c9190611e45565b3480156104be575f80fd5b506102776104cd366004611e57565b610f4d565b3480156104dd575f80fd5b506101ef6104ec366004611e8e565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b348015610522575f80fd5b50610277610531366004611bc2565b610f9e565b348015610541575f80fd5b506103f3610fc0565b61055333610ada565b80610571575033730576a174d229e3cfa37253523e645a78a0c91b57145b610602576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084015b60405180910390fd5b5f828152600460205260408082208151808301928390529160029082845b8154815260200190600101908083116106205750505050509050805f6002811061064c5761064c611f05565b602002015115801561066057506020810151155b801561069557505f805260046020527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ed548314155b156106cf576040517ffe239804000000000000000000000000000000000000000000000000000000008152600481018490526024016105f9565b6020818101805183515f908152600490935260408084206001908101929092558451925184528084209290925585835290822082815501819055600280549161071783611f5f565b91905055503373ffffffffffffffffffffffffffffffffffffffff167f0cd979445339c62199996f208428d987b1cea24d18e62b79ec24d94b636e8b708484604051610764929190611f93565b60405180910390a2505050565b5f805f8061079185602081015160408201516060909201515f1a92909190565b9094509250905060ff81165f036108a757828583016020016107b282610ada565b1580156107d5575073ffffffffffffffffffffffffffffffffffffffff82163014155b1561080857507fffffffff00000000000000000000000000000000000000000000000000000000945061090e9350505050565b6040517f1626ba7e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831690631626ba7e9061085c908b908590600401611f93565b602060405180830381865afa158015610877573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061089b9190611fab565b9550505050505061090e565b6108b661031587838686610fdd565b156108e757507f1626ba7e00000000000000000000000000000000000000000000000000000000925061090e915050565b507fffffffff00000000000000000000000000000000000000000000000000000000925050505b92915050565b5f8061091e610ff9565b8060200190518101906109319190611fea565b9392505050565b5f6109416110cd565b61094b848461114c565b905061095a6040850185612016565b90505f0361096b5761096b8461124c565b610931826112ca565b6002546060905f849003610986578093505b806109918486612077565b11156109de576109a18385612077565b6040517f7ae596850000000000000000000000000000000000000000000000000000000081526004810191909152602481018290526044016105f9565b8315610ad3578367ffffffffffffffff8111156109fd576109fd611a5b565b604051908082528060200260200182016040528015610a26578160200160208202803683370190505b505f80805260046020527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ed549193505b84811015610a81575f828152600460205260409020600101549150610a7a8161208a565b9050610a56565b505f5b85811015610ad05781848281518110610a9f57610a9f611f05565b6020908102919091018101919091525f9283526004905260409091206001015490610ac98161208a565b9050610a84565b50505b5092915050565b5f805f610ae5610ff9565b806020019051810190610af89190611fea565b915091508373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401610b4e91815260200190565b602060405180830381865afa158015610b69573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8d91906120c1565b73ffffffffffffffffffffffffffffffffffffffff1614949350505050565b610bb533610ada565b80610bd3575033730576a174d229e3cfa37253523e645a78a0c91b57145b610c5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084016105f9565b60018190556040518181527f66cbca4f3c64fecf1dcb9ce094abcf7f68c3450a1d4e3a8e917dd621edb4ebe09060200160405180910390a150565b610ca2610ff9565b5115610d0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a65640000000000000000000000000060448201526064016105f9565b610d138161133e565b50565b5f600154341015610d60576001546040517fb489782800000000000000000000000000000000000000000000000000000000815234600482015260248101919091526044016105f9565b610d6a3383610f4d565b335f908152600360205260408120805492935090610d878361208a565b909155505060046020525f81815260408082207f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ed80546001830181905590859055808452918320849055600280547f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec94929392909190610e068361208a565b91905055503373ffffffffffffffffffffffffffffffffffffffff167f4bda649efe6b98b0f9c1d5e859c29e20910f45c66dabfe6fad4a4881f7faf9cc8587604051610e53929190611f93565b60405180910390a2505050919050565b6060610e6e33610ada565b80610e8c575033730576a174d229e3cfa37253523e645a78a0c91b57145b610f18576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084016105f9565b5f610f32878787878715610f2c57876114b3565b5a6114b3565b9250905080610f4357815160208301fd5b5095945050505050565b5f8282604051602001610f619291906120dc565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209392505050565b6004602052815f5260405f208160028110610fb7575f80fd5b01549150829050565b5f80610fca610ff9565b80602001905181019061090e91906120c1565b5f805f610fec878787876115b6565b91509150610f438161169e565b60606110c86110c36040517fd60000000000000000000000000000000000000000000000000000000000000060208201527f940000000000000000000000000000000000000000000000000000000000000060218201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660228201527f010000000000000000000000000000000000000000000000000000000000000060368201525f90603701604051602081830303815290604052805190602001205f1c905090565b611850565b905090565b33730576a174d229e3cfa37253523e645a78a0c91b571461114a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e740000000060448201526064016105f9565b565b5f806111a4836040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018290525f90605c01604051602081830303815290604052805190602001209050919050565b90507f1626ba7e00000000000000000000000000000000000000000000000000000000611212826111d9610140880188612016565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061077192505050565b7fffffffff00000000000000000000000000000000000000000000000000000000161461124357600191505061090e565b505f9392505050565b5f80546020830135918061125f8361208a565b9190505514610d13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496e76616c6964206e6f6e63650000000000000000000000000000000000000060448201526064016105f9565b8015610d13576040515f9033907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90849084818181858888f193505050503d805f8114611332576040519150601f19603f3d011682016040523d82523d5f602084013e611337565b606091505b5050505050565b5f611348826118a5565b90505f8151602083015ff0905061141a6040517fd60000000000000000000000000000000000000000000000000000000000000060208201527f940000000000000000000000000000000000000000000000000000000000000060218201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660228201527f010000000000000000000000000000000000000000000000000000000000000060368201525f90603701604051602081830303815290604052805190602001205f1c905090565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146114ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5772697465206661696c6564000000000000000000000000000000000000000060448201526064016105f9565b505050565b5f606060018460018111156114ca576114ca61210a565b0361153e578673ffffffffffffffffffffffffffffffffffffffff1683866040516114f59190612137565b5f604051808303818686f4925050503d805f811461152e576040519150601f19603f3d011682016040523d82523d5f602084013e611533565b606091505b5090925090506115ac565b8673ffffffffffffffffffffffffffffffffffffffff168387876040516115659190612137565b5f60405180830381858888f193505050503d805f81146115a0576040519150601f19603f3d011682016040523d82523d5f602084013e6115a5565b606091505b5090925090505b9550959350505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156115eb57505f90506003611695565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561163c573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811661168f575f60019250925050611695565b91505f90505b94509492505050565b5f8160048111156116b1576116b161210a565b036116b95750565b60018160048111156116cd576116cd61210a565b03611734576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016105f9565b60028160048111156117485761174861210a565b036117af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016105f9565b60038160048111156117c3576117c361210a565b03610d13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016105f9565b6060813b6001811161187157505060408051602081019091525f8152919050565b8061187b81611f5f565b9150506040519150601f19601f602083010116820160405280825280600160208401853c50919050565b6060815160016118b59190612077565b826040516020016118c7929190612152565b6040516020818303038152906040529050919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610d13575f80fd5b5f8083601f84011261190e575f80fd5b50813567ffffffffffffffff811115611925575f80fd5b60208301915083602082850101111561193c575f80fd5b9250929050565b5f805f805f805f8060c0898b03121561195a575f80fd5b8835611965816118dd565b97506020890135611975816118dd565b96506040890135611985816118dd565b955060608901359450608089013567ffffffffffffffff808211156119a8575f80fd5b6119b48c838d016118fe565b909650945060a08b01359150808211156119cc575f80fd5b506119d98b828c016118fe565b999c989b5096995094979396929594505050565b5f805f805f60808688031215611a01575f80fd5b8535611a0c816118dd565b94506020860135611a1c816118dd565b935060408601359250606086013567ffffffffffffffff811115611a3e575f80fd5b611a4a888289016118fe565b969995985093965092949392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112611a97575f80fd5b813567ffffffffffffffff80821115611ab257611ab2611a5b565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715611af857611af8611a5b565b81604052838152866020858801011115611b10575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f8060408385031215611b40575f80fd5b82359150602083013567ffffffffffffffff811115611b5d575f80fd5b611b6985828601611a88565b9150509250929050565b5f805f60608486031215611b85575f80fd5b833567ffffffffffffffff811115611b9b575f80fd5b84016101608187031215611bad575f80fd5b95602085013595506040909401359392505050565b5f8060408385031215611bd3575f80fd5b50508035926020909101359150565b602080825282518282018190525f9190848201906040850190845b81811015611c1957835183529284019291840191600101611bfd565b50909695505050505050565b5f60208284031215611c35575f80fd5b8135610931816118dd565b5f60208284031215611c50575f80fd5b5035919050565b5f60208284031215611c67575f80fd5b813567ffffffffffffffff811115611c7d575f80fd5b611c8984828501611a88565b949350505050565b5f8083601f840112611ca1575f80fd5b50813567ffffffffffffffff811115611cb8575f80fd5b6020830191508360208260051b850101111561193c575f80fd5b5f805f805f805f8060a0898b031215611ce9575f80fd5b8835611cf4816118dd565b97506020890135611d04816118dd565b9650604089013567ffffffffffffffff80821115611d20575f80fd5b611d2c8c838d01611c91565b909850965060608b0135915080821115611d44575f80fd5b611d508c838d01611c91565b909650945060808b01359150808211156119cc575f80fd5b5f805f805f60a08688031215611d7c575f80fd5b8535611d87816118dd565b945060208601359350604086013567ffffffffffffffff811115611da9575f80fd5b611db588828901611a88565b935050606086013560028110611dc9575f80fd5b949793965091946080013592915050565b5f5b83811015611df4578181015183820152602001611ddc565b50505f910152565b5f8151808452611e13816020860160208601611dda565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6109316020830184611dfc565b5f8060408385031215611e68575f80fd5b8235611e73816118dd565b9150602083013567ffffffffffffffff811115611b5d575f80fd5b5f805f805f8060a08789031215611ea3575f80fd5b8635611eae816118dd565b95506020870135611ebe816118dd565b94506040870135935060608701359250608087013567ffffffffffffffff811115611ee7575f80fd5b611ef389828a016118fe565b979a9699509497509295939492505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f81611f6d57611f6d611f32565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b828152604060208201525f611c896040830184611dfc565b5f60208284031215611fbb575f80fd5b81517fffffffff0000000000000000000000000000000000000000000000000000000081168114610931575f80fd5b5f8060408385031215611ffb575f80fd5b8251612006816118dd565b6020939093015192949293505050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612049575f80fd5b83018035915067ffffffffffffffff821115612063575f80fd5b60200191503681900382131561193c575f80fd5b8082018082111561090e5761090e611f32565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036120ba576120ba611f32565b5060010190565b5f602082840312156120d1575f80fd5b8151610931816118dd565b73ffffffffffffffffffffffffffffffffffffffff83168152604060208201525f611c896040830184611dfc565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f8251612148818460208701611dda565b9190910192915050565b7f630000000000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000008360e01b1660018201527f80600e6000396000f3000000000000000000000000000000000000000000000060058201525f600e8201525f82516121e081600f850160208701611dda565b91909101600f01939250505056fea2646970667358221220c1913351e275e1fecd00c79cd676ed135b575df5d3a88ccc57419dc3081980a264736f6c63430008150033a26469706673582212202385972bb9d2bb05d79731a86e43632913078ff3cadc03cad2c77fe78f9ecc0064736f6c63430008150033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/abis/0.8.21/AgentMech.json b/abis/0.8.21/AgentMech.json index 725c934..8255092 100644 --- a/abis/0.8.21/AgentMech.json +++ b/abis/0.8.21/AgentMech.json @@ -51,6 +51,22 @@ "name": "NotEnoughPaid", "type": "error" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "provided", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "max", + "type": "uint256" + } + ], + "name": "Overflow", + "type": "error" + }, { "inputs": [ { @@ -244,7 +260,18 @@ "type": "function" }, { - "inputs": [], + "inputs": [ + { + "internalType": "uint256", + "name": "size", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "offset", + "type": "uint256" + } + ], "name": "getUndeliveredRequestIds", "outputs": [ { @@ -693,8 +720,8 @@ "type": "receive" } ], - "bytecode": "0x60806040525f805534801562000013575f80fd5b506040516200263738038062002637833981016040819052620000369162000391565b604080516001600160a01b03851660208201528082018490528151808203830181526060909101909152839083906200006f8162000145565b5050506001600160a01b0383166200009a5760405163d92e233d60e01b815260040160405180910390fd5b6040516331a9108f60e11b8152600481018390525f906001600160a01b03851690636352211e90602401602060405180830381865afa158015620000e0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001069190620003c6565b90506001600160a01b0381166200013857604051630ede975960e01b8152600481018490526024015b60405180910390fd5b50600155506200049a9050565b6200014f620001ad565b51156200019f5760405162461bcd60e51b815260206004820152601360248201527f416c726561647920696e697469616c697a65640000000000000000000000000060448201526064016200012f565b620001aa8162000218565b50565b6060620002136200020d604051606b60f91b6020820152602560fa1b60218201526001600160601b03193060601b166022820152600160f81b60368201525f90603701604051602081830303815290604052805190602001205f1c905090565b620002e1565b905090565b5f620002248262000339565b90505f8151602083015ff090506200028b604051606b60f91b6020820152602560fa1b60218201526001600160601b03193060601b166022820152600160f81b60368201525f90603701604051602081830303815290604052805190602001205f1c905090565b6001600160a01b0316816001600160a01b031614620002dc5760405162461bcd60e51b815260206004820152600c60248201526b15dc9a5d194819985a5b195960a21b60448201526064016200012f565b505050565b6060813b600181116200030357505060408051602081019091525f8152919050565b806200030f81620003fd565b9150506040519150601f19601f602083010116820160405280825280600160208401853c50919050565b6060815160016200034b919062000415565b826040516020016200035f92919062000431565b6040516020818303038152906040529050919050565b80516001600160a01b03811681146200038c575f80fd5b919050565b5f805f60608486031215620003a4575f80fd5b620003af8462000375565b925060208401519150604084015190509250925092565b5f60208284031215620003d7575f80fd5b620003e28262000375565b9392505050565b634e487b7160e01b5f52601160045260245ffd5b5f816200040e576200040e620003e9565b505f190190565b808201808211156200042b576200042b620003e9565b92915050565b606360f81b815260e083901b6001600160e01b03191660018201526880600e6000396000f360b81b60058201525f600e82018190528251815b8181101562000489576020818601810151600f8684010152016200046a565b505f9201600f019182525092915050565b61218f80620004a85f395ff3fe60806040526004361061017a575f3560e01c8063a035b1fe116100d1578063bdf863171161007c578063f23a6e6111610057578063f23a6e61146104c7578063f6171e441461050c578063fc0c546a1461052b575f80fd5b8063bdf8631714610467578063c7dec3fc1461047c578063e00b9118146104a8575f80fd5b8063b0d691fe116100ac578063b0d691fe146103c6578063b94207d31461040d578063bc197c8114610420575f80fd5b8063a035b1fe1461037f578063a4f9edbf14610394578063affed0e0146103b3575f80fd5b80633a871cdd116101315780636e3ec0391161010c5780636e3ec039146102fe5780637af734731461031f57806391b7f5ed14610360575f80fd5b80633a871cdd146102855780635fee6085146102a45780636d70f7ae146102cf575f80fd5b8063157305fe11610161578063157305fe146102255780631626ba7e1461024457806317d70f7c14610263575f80fd5b806223de2914610185578063150b7a02146101ab575f80fd5b3661018157005b5f80fd5b348015610190575f80fd5b506101a961019f3660046118ae565b5050505050505050565b005b3480156101b6575f80fd5b506101ef6101c5366004611958565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020015b60405180910390f35b348015610230575f80fd5b506101a961023f366004611a9a565b61053f565b34801561024f575f80fd5b506101ef61025e366004611a9a565b610766565b34801561026e575f80fd5b50610277610909565b60405190815260200161021c565b348015610290575f80fd5b5061027761029f366004611ade565b61092d565b3480156102af575f80fd5b506102776102be366004611b2d565b60036020525f908152604090205481565b3480156102da575f80fd5b506102ee6102e9366004611b2d565b610969565b604051901515815260200161021c565b348015610309575f80fd5b50610312610a3b565b60405161021c9190611b48565b34801561032a575f80fd5b50610277610339366004611b2d565b73ffffffffffffffffffffffffffffffffffffffff165f9081526003602052604090205490565b34801561036b575f80fd5b506101a961037a366004611b8b565b610b0c565b34801561038a575f80fd5b5061027760015481565b34801561039f575f80fd5b506101a96103ae366004611ba2565b610bfa565b3480156103be575f80fd5b505f54610277565b3480156103d1575f80fd5b50730576a174d229e3cfa37253523e645a78a0c91b575b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161021c565b61027761041b366004611ba2565b610c76565b34801561042b575f80fd5b506101ef61043a366004611c1d565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b348015610472575f80fd5b5061027760025481565b348015610487575f80fd5b5061049b610496366004611cb3565b610dce565b60405161021c9190611d90565b3480156104b3575f80fd5b506102776104c2366004611da2565b610eb8565b3480156104d2575f80fd5b506101ef6104e1366004611dd9565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b348015610517575f80fd5b50610277610526366004611e50565b610f09565b348015610536575f80fd5b506103e8610f2b565b61054833610969565b80610566575033730576a174d229e3cfa37253523e645a78a0c91b57145b6105f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084015b60405180910390fd5b5f828152600460205260408082208151808301928390529160029082845b8154815260200190600101908083116106155750505050509050805f6002811061064157610641611e70565b602002015115801561065557506020810151155b801561068a57505f805260046020527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ed548314155b156106c4576040517ffe239804000000000000000000000000000000000000000000000000000000008152600481018490526024016105ee565b6020818101805183515f908152600490935260408084206001908101929092558451925184528084209290925585835290822082815501819055600280549161070c83611eca565b91905055503373ffffffffffffffffffffffffffffffffffffffff167f0cd979445339c62199996f208428d987b1cea24d18e62b79ec24d94b636e8b708484604051610759929190611efe565b60405180910390a2505050565b5f805f8061078685602081015160408201516060909201515f1a92909190565b9094509250905060ff81165f0361089c57828583016020016107a782610969565b1580156107ca575073ffffffffffffffffffffffffffffffffffffffff82163014155b156107fd57507fffffffff0000000000000000000000000000000000000000000000000000000094506109039350505050565b6040517f1626ba7e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831690631626ba7e90610851908b908590600401611efe565b602060405180830381865afa15801561086c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108909190611f16565b95505050505050610903565b6108ab6102e987838686610f48565b156108dc57507f1626ba7e000000000000000000000000000000000000000000000000000000009250610903915050565b507fffffffff00000000000000000000000000000000000000000000000000000000925050505b92915050565b5f80610913610f64565b8060200190518101906109269190611f55565b9392505050565b5f610936611038565b61094084846110b7565b905061094f6040850185611f81565b90505f0361096057610960846111b7565b61092682611235565b5f805f610974610f64565b8060200190518101906109879190611f55565b915091508373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016109dd91815260200190565b602060405180830381865afa1580156109f8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a1c9190611fe2565b73ffffffffffffffffffffffffffffffffffffffff1614949350505050565b6002546060908015610b08578067ffffffffffffffff811115610a6057610a606119c6565b604051908082528060200260200182016040528015610a89578160200160208202803683370190505b505f80805260046020527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ed549193505b82811015610b055781848281518110610ad457610ad4611e70565b6020908102919091018101919091525f9283526004905260409091206001015490610afe81611ffd565b9050610ab9565b50505b5090565b610b1533610969565b80610b33575033730576a174d229e3cfa37253523e645a78a0c91b57145b610bbf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084016105ee565b60018190556040518181527f66cbca4f3c64fecf1dcb9ce094abcf7f68c3450a1d4e3a8e917dd621edb4ebe09060200160405180910390a150565b610c02610f64565b5115610c6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a65640000000000000000000000000060448201526064016105ee565b610c73816112a9565b50565b5f600154341015610cc0576001546040517fb489782800000000000000000000000000000000000000000000000000000000815234600482015260248101919091526044016105ee565b610cca3383610eb8565b335f908152600360205260408120805492935090610ce783611ffd565b909155505060046020525f81815260408082207f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ed805460018301819055908590558084529183208490557f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec8054909391929103610d62578383555b60028054905f610d7183611ffd565b91905055503373ffffffffffffffffffffffffffffffffffffffff167f4bda649efe6b98b0f9c1d5e859c29e20910f45c66dabfe6fad4a4881f7faf9cc8587604051610dbe929190611efe565b60405180910390a2505050919050565b6060610dd933610969565b80610df7575033730576a174d229e3cfa37253523e645a78a0c91b57145b610e83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084016105ee565b5f610e9d878787878715610e97578761141e565b5a61141e565b9250905080610eae57815160208301fd5b5095945050505050565b5f8282604051602001610ecc929190612034565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209392505050565b6004602052815f5260405f208160028110610f22575f80fd5b01549150829050565b5f80610f35610f64565b8060200190518101906109039190611fe2565b5f805f610f5787878787611521565b91509150610eae81611609565b606061103361102e6040517fd60000000000000000000000000000000000000000000000000000000000000060208201527f940000000000000000000000000000000000000000000000000000000000000060218201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660228201527f010000000000000000000000000000000000000000000000000000000000000060368201525f90603701604051602081830303815290604052805190602001205f1c905090565b6117bb565b905090565b33730576a174d229e3cfa37253523e645a78a0c91b57146110b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e740000000060448201526064016105ee565b565b5f8061110f836040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018290525f90605c01604051602081830303815290604052805190602001209050919050565b90507f1626ba7e0000000000000000000000000000000000000000000000000000000061117d82611144610140880188611f81565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061076692505050565b7fffffffff0000000000000000000000000000000000000000000000000000000016146111ae576001915050610903565b505f9392505050565b5f8054602083013591806111ca83611ffd565b9190505514610c73576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496e76616c6964206e6f6e63650000000000000000000000000000000000000060448201526064016105ee565b8015610c73576040515f9033907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90849084818181858888f193505050503d805f811461129d576040519150601f19603f3d011682016040523d82523d5f602084013e6112a2565b606091505b5050505050565b5f6112b382611810565b90505f8151602083015ff090506113856040517fd60000000000000000000000000000000000000000000000000000000000000060208201527f940000000000000000000000000000000000000000000000000000000000000060218201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660228201527f010000000000000000000000000000000000000000000000000000000000000060368201525f90603701604051602081830303815290604052805190602001205f1c905090565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611419576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5772697465206661696c6564000000000000000000000000000000000000000060448201526064016105ee565b505050565b5f6060600184600181111561143557611435612062565b036114a9578673ffffffffffffffffffffffffffffffffffffffff168386604051611460919061208f565b5f604051808303818686f4925050503d805f8114611499576040519150601f19603f3d011682016040523d82523d5f602084013e61149e565b606091505b509092509050611517565b8673ffffffffffffffffffffffffffffffffffffffff168387876040516114d0919061208f565b5f60405180830381858888f193505050503d805f811461150b576040519150601f19603f3d011682016040523d82523d5f602084013e611510565b606091505b5090925090505b9550959350505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561155657505f90506003611600565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156115a7573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166115fa575f60019250925050611600565b91505f90505b94509492505050565b5f81600481111561161c5761161c612062565b036116245750565b600181600481111561163857611638612062565b0361169f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016105ee565b60028160048111156116b3576116b3612062565b0361171a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016105ee565b600381600481111561172e5761172e612062565b03610c73576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016105ee565b6060813b600181116117dc57505060408051602081019091525f8152919050565b806117e681611eca565b9150506040519150601f19601f602083010116820160405280825280600160208401853c50919050565b60608151600161182091906120aa565b826040516020016118329291906120bd565b6040516020818303038152906040529050919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610c73575f80fd5b5f8083601f840112611879575f80fd5b50813567ffffffffffffffff811115611890575f80fd5b6020830191508360208285010111156118a7575f80fd5b9250929050565b5f805f805f805f8060c0898b0312156118c5575f80fd5b88356118d081611848565b975060208901356118e081611848565b965060408901356118f081611848565b955060608901359450608089013567ffffffffffffffff80821115611913575f80fd5b61191f8c838d01611869565b909650945060a08b0135915080821115611937575f80fd5b506119448b828c01611869565b999c989b5096995094979396929594505050565b5f805f805f6080868803121561196c575f80fd5b853561197781611848565b9450602086013561198781611848565b935060408601359250606086013567ffffffffffffffff8111156119a9575f80fd5b6119b588828901611869565b969995985093965092949392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112611a02575f80fd5b813567ffffffffffffffff80821115611a1d57611a1d6119c6565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715611a6357611a636119c6565b81604052838152866020858801011115611a7b575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f8060408385031215611aab575f80fd5b82359150602083013567ffffffffffffffff811115611ac8575f80fd5b611ad4858286016119f3565b9150509250929050565b5f805f60608486031215611af0575f80fd5b833567ffffffffffffffff811115611b06575f80fd5b84016101608187031215611b18575f80fd5b95602085013595506040909401359392505050565b5f60208284031215611b3d575f80fd5b813561092681611848565b602080825282518282018190525f9190848201906040850190845b81811015611b7f57835183529284019291840191600101611b63565b50909695505050505050565b5f60208284031215611b9b575f80fd5b5035919050565b5f60208284031215611bb2575f80fd5b813567ffffffffffffffff811115611bc8575f80fd5b611bd4848285016119f3565b949350505050565b5f8083601f840112611bec575f80fd5b50813567ffffffffffffffff811115611c03575f80fd5b6020830191508360208260051b85010111156118a7575f80fd5b5f805f805f805f8060a0898b031215611c34575f80fd5b8835611c3f81611848565b97506020890135611c4f81611848565b9650604089013567ffffffffffffffff80821115611c6b575f80fd5b611c778c838d01611bdc565b909850965060608b0135915080821115611c8f575f80fd5b611c9b8c838d01611bdc565b909650945060808b0135915080821115611937575f80fd5b5f805f805f60a08688031215611cc7575f80fd5b8535611cd281611848565b945060208601359350604086013567ffffffffffffffff811115611cf4575f80fd5b611d00888289016119f3565b935050606086013560028110611d14575f80fd5b949793965091946080013592915050565b5f5b83811015611d3f578181015183820152602001611d27565b50505f910152565b5f8151808452611d5e816020860160208601611d25565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6109266020830184611d47565b5f8060408385031215611db3575f80fd5b8235611dbe81611848565b9150602083013567ffffffffffffffff811115611ac8575f80fd5b5f805f805f8060a08789031215611dee575f80fd5b8635611df981611848565b95506020870135611e0981611848565b94506040870135935060608701359250608087013567ffffffffffffffff811115611e32575f80fd5b611e3e89828a01611869565b979a9699509497509295939492505050565b5f8060408385031215611e61575f80fd5b50508035926020909101359150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f81611ed857611ed8611e9d565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b828152604060208201525f611bd46040830184611d47565b5f60208284031215611f26575f80fd5b81517fffffffff0000000000000000000000000000000000000000000000000000000081168114610926575f80fd5b5f8060408385031215611f66575f80fd5b8251611f7181611848565b6020939093015192949293505050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611fb4575f80fd5b83018035915067ffffffffffffffff821115611fce575f80fd5b6020019150368190038213156118a7575f80fd5b5f60208284031215611ff2575f80fd5b815161092681611848565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361202d5761202d611e9d565b5060010190565b73ffffffffffffffffffffffffffffffffffffffff83168152604060208201525f611bd46040830184611d47565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f82516120a0818460208701611d25565b9190910192915050565b8082018082111561090357610903611e9d565b7f630000000000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000008360e01b1660018201527f80600e6000396000f3000000000000000000000000000000000000000000000060058201525f600e8201525f825161214b81600f850160208701611d25565b91909101600f01939250505056fea26469706673582212208ee99f5816e66f69a8926786a9858f1caf0bbd099c82d85d9db66d927e9986f664736f6c63430008150033", - "deployedBytecode": "0x60806040526004361061017a575f3560e01c8063a035b1fe116100d1578063bdf863171161007c578063f23a6e6111610057578063f23a6e61146104c7578063f6171e441461050c578063fc0c546a1461052b575f80fd5b8063bdf8631714610467578063c7dec3fc1461047c578063e00b9118146104a8575f80fd5b8063b0d691fe116100ac578063b0d691fe146103c6578063b94207d31461040d578063bc197c8114610420575f80fd5b8063a035b1fe1461037f578063a4f9edbf14610394578063affed0e0146103b3575f80fd5b80633a871cdd116101315780636e3ec0391161010c5780636e3ec039146102fe5780637af734731461031f57806391b7f5ed14610360575f80fd5b80633a871cdd146102855780635fee6085146102a45780636d70f7ae146102cf575f80fd5b8063157305fe11610161578063157305fe146102255780631626ba7e1461024457806317d70f7c14610263575f80fd5b806223de2914610185578063150b7a02146101ab575f80fd5b3661018157005b5f80fd5b348015610190575f80fd5b506101a961019f3660046118ae565b5050505050505050565b005b3480156101b6575f80fd5b506101ef6101c5366004611958565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020015b60405180910390f35b348015610230575f80fd5b506101a961023f366004611a9a565b61053f565b34801561024f575f80fd5b506101ef61025e366004611a9a565b610766565b34801561026e575f80fd5b50610277610909565b60405190815260200161021c565b348015610290575f80fd5b5061027761029f366004611ade565b61092d565b3480156102af575f80fd5b506102776102be366004611b2d565b60036020525f908152604090205481565b3480156102da575f80fd5b506102ee6102e9366004611b2d565b610969565b604051901515815260200161021c565b348015610309575f80fd5b50610312610a3b565b60405161021c9190611b48565b34801561032a575f80fd5b50610277610339366004611b2d565b73ffffffffffffffffffffffffffffffffffffffff165f9081526003602052604090205490565b34801561036b575f80fd5b506101a961037a366004611b8b565b610b0c565b34801561038a575f80fd5b5061027760015481565b34801561039f575f80fd5b506101a96103ae366004611ba2565b610bfa565b3480156103be575f80fd5b505f54610277565b3480156103d1575f80fd5b50730576a174d229e3cfa37253523e645a78a0c91b575b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161021c565b61027761041b366004611ba2565b610c76565b34801561042b575f80fd5b506101ef61043a366004611c1d565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b348015610472575f80fd5b5061027760025481565b348015610487575f80fd5b5061049b610496366004611cb3565b610dce565b60405161021c9190611d90565b3480156104b3575f80fd5b506102776104c2366004611da2565b610eb8565b3480156104d2575f80fd5b506101ef6104e1366004611dd9565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b348015610517575f80fd5b50610277610526366004611e50565b610f09565b348015610536575f80fd5b506103e8610f2b565b61054833610969565b80610566575033730576a174d229e3cfa37253523e645a78a0c91b57145b6105f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084015b60405180910390fd5b5f828152600460205260408082208151808301928390529160029082845b8154815260200190600101908083116106155750505050509050805f6002811061064157610641611e70565b602002015115801561065557506020810151155b801561068a57505f805260046020527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ed548314155b156106c4576040517ffe239804000000000000000000000000000000000000000000000000000000008152600481018490526024016105ee565b6020818101805183515f908152600490935260408084206001908101929092558451925184528084209290925585835290822082815501819055600280549161070c83611eca565b91905055503373ffffffffffffffffffffffffffffffffffffffff167f0cd979445339c62199996f208428d987b1cea24d18e62b79ec24d94b636e8b708484604051610759929190611efe565b60405180910390a2505050565b5f805f8061078685602081015160408201516060909201515f1a92909190565b9094509250905060ff81165f0361089c57828583016020016107a782610969565b1580156107ca575073ffffffffffffffffffffffffffffffffffffffff82163014155b156107fd57507fffffffff0000000000000000000000000000000000000000000000000000000094506109039350505050565b6040517f1626ba7e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831690631626ba7e90610851908b908590600401611efe565b602060405180830381865afa15801561086c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108909190611f16565b95505050505050610903565b6108ab6102e987838686610f48565b156108dc57507f1626ba7e000000000000000000000000000000000000000000000000000000009250610903915050565b507fffffffff00000000000000000000000000000000000000000000000000000000925050505b92915050565b5f80610913610f64565b8060200190518101906109269190611f55565b9392505050565b5f610936611038565b61094084846110b7565b905061094f6040850185611f81565b90505f0361096057610960846111b7565b61092682611235565b5f805f610974610f64565b8060200190518101906109879190611f55565b915091508373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016109dd91815260200190565b602060405180830381865afa1580156109f8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a1c9190611fe2565b73ffffffffffffffffffffffffffffffffffffffff1614949350505050565b6002546060908015610b08578067ffffffffffffffff811115610a6057610a606119c6565b604051908082528060200260200182016040528015610a89578160200160208202803683370190505b505f80805260046020527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ed549193505b82811015610b055781848281518110610ad457610ad4611e70565b6020908102919091018101919091525f9283526004905260409091206001015490610afe81611ffd565b9050610ab9565b50505b5090565b610b1533610969565b80610b33575033730576a174d229e3cfa37253523e645a78a0c91b57145b610bbf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084016105ee565b60018190556040518181527f66cbca4f3c64fecf1dcb9ce094abcf7f68c3450a1d4e3a8e917dd621edb4ebe09060200160405180910390a150565b610c02610f64565b5115610c6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a65640000000000000000000000000060448201526064016105ee565b610c73816112a9565b50565b5f600154341015610cc0576001546040517fb489782800000000000000000000000000000000000000000000000000000000815234600482015260248101919091526044016105ee565b610cca3383610eb8565b335f908152600360205260408120805492935090610ce783611ffd565b909155505060046020525f81815260408082207f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ed805460018301819055908590558084529183208490557f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec8054909391929103610d62578383555b60028054905f610d7183611ffd565b91905055503373ffffffffffffffffffffffffffffffffffffffff167f4bda649efe6b98b0f9c1d5e859c29e20910f45c66dabfe6fad4a4881f7faf9cc8587604051610dbe929190611efe565b60405180910390a2505050919050565b6060610dd933610969565b80610df7575033730576a174d229e3cfa37253523e645a78a0c91b57145b610e83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084016105ee565b5f610e9d878787878715610e97578761141e565b5a61141e565b9250905080610eae57815160208301fd5b5095945050505050565b5f8282604051602001610ecc929190612034565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209392505050565b6004602052815f5260405f208160028110610f22575f80fd5b01549150829050565b5f80610f35610f64565b8060200190518101906109039190611fe2565b5f805f610f5787878787611521565b91509150610eae81611609565b606061103361102e6040517fd60000000000000000000000000000000000000000000000000000000000000060208201527f940000000000000000000000000000000000000000000000000000000000000060218201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660228201527f010000000000000000000000000000000000000000000000000000000000000060368201525f90603701604051602081830303815290604052805190602001205f1c905090565b6117bb565b905090565b33730576a174d229e3cfa37253523e645a78a0c91b57146110b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e740000000060448201526064016105ee565b565b5f8061110f836040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018290525f90605c01604051602081830303815290604052805190602001209050919050565b90507f1626ba7e0000000000000000000000000000000000000000000000000000000061117d82611144610140880188611f81565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061076692505050565b7fffffffff0000000000000000000000000000000000000000000000000000000016146111ae576001915050610903565b505f9392505050565b5f8054602083013591806111ca83611ffd565b9190505514610c73576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496e76616c6964206e6f6e63650000000000000000000000000000000000000060448201526064016105ee565b8015610c73576040515f9033907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90849084818181858888f193505050503d805f811461129d576040519150601f19603f3d011682016040523d82523d5f602084013e6112a2565b606091505b5050505050565b5f6112b382611810565b90505f8151602083015ff090506113856040517fd60000000000000000000000000000000000000000000000000000000000000060208201527f940000000000000000000000000000000000000000000000000000000000000060218201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660228201527f010000000000000000000000000000000000000000000000000000000000000060368201525f90603701604051602081830303815290604052805190602001205f1c905090565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611419576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5772697465206661696c6564000000000000000000000000000000000000000060448201526064016105ee565b505050565b5f6060600184600181111561143557611435612062565b036114a9578673ffffffffffffffffffffffffffffffffffffffff168386604051611460919061208f565b5f604051808303818686f4925050503d805f8114611499576040519150601f19603f3d011682016040523d82523d5f602084013e61149e565b606091505b509092509050611517565b8673ffffffffffffffffffffffffffffffffffffffff168387876040516114d0919061208f565b5f60405180830381858888f193505050503d805f811461150b576040519150601f19603f3d011682016040523d82523d5f602084013e611510565b606091505b5090925090505b9550959350505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561155657505f90506003611600565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156115a7573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166115fa575f60019250925050611600565b91505f90505b94509492505050565b5f81600481111561161c5761161c612062565b036116245750565b600181600481111561163857611638612062565b0361169f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016105ee565b60028160048111156116b3576116b3612062565b0361171a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016105ee565b600381600481111561172e5761172e612062565b03610c73576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016105ee565b6060813b600181116117dc57505060408051602081019091525f8152919050565b806117e681611eca565b9150506040519150601f19601f602083010116820160405280825280600160208401853c50919050565b60608151600161182091906120aa565b826040516020016118329291906120bd565b6040516020818303038152906040529050919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610c73575f80fd5b5f8083601f840112611879575f80fd5b50813567ffffffffffffffff811115611890575f80fd5b6020830191508360208285010111156118a7575f80fd5b9250929050565b5f805f805f805f8060c0898b0312156118c5575f80fd5b88356118d081611848565b975060208901356118e081611848565b965060408901356118f081611848565b955060608901359450608089013567ffffffffffffffff80821115611913575f80fd5b61191f8c838d01611869565b909650945060a08b0135915080821115611937575f80fd5b506119448b828c01611869565b999c989b5096995094979396929594505050565b5f805f805f6080868803121561196c575f80fd5b853561197781611848565b9450602086013561198781611848565b935060408601359250606086013567ffffffffffffffff8111156119a9575f80fd5b6119b588828901611869565b969995985093965092949392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112611a02575f80fd5b813567ffffffffffffffff80821115611a1d57611a1d6119c6565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715611a6357611a636119c6565b81604052838152866020858801011115611a7b575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f8060408385031215611aab575f80fd5b82359150602083013567ffffffffffffffff811115611ac8575f80fd5b611ad4858286016119f3565b9150509250929050565b5f805f60608486031215611af0575f80fd5b833567ffffffffffffffff811115611b06575f80fd5b84016101608187031215611b18575f80fd5b95602085013595506040909401359392505050565b5f60208284031215611b3d575f80fd5b813561092681611848565b602080825282518282018190525f9190848201906040850190845b81811015611b7f57835183529284019291840191600101611b63565b50909695505050505050565b5f60208284031215611b9b575f80fd5b5035919050565b5f60208284031215611bb2575f80fd5b813567ffffffffffffffff811115611bc8575f80fd5b611bd4848285016119f3565b949350505050565b5f8083601f840112611bec575f80fd5b50813567ffffffffffffffff811115611c03575f80fd5b6020830191508360208260051b85010111156118a7575f80fd5b5f805f805f805f8060a0898b031215611c34575f80fd5b8835611c3f81611848565b97506020890135611c4f81611848565b9650604089013567ffffffffffffffff80821115611c6b575f80fd5b611c778c838d01611bdc565b909850965060608b0135915080821115611c8f575f80fd5b611c9b8c838d01611bdc565b909650945060808b0135915080821115611937575f80fd5b5f805f805f60a08688031215611cc7575f80fd5b8535611cd281611848565b945060208601359350604086013567ffffffffffffffff811115611cf4575f80fd5b611d00888289016119f3565b935050606086013560028110611d14575f80fd5b949793965091946080013592915050565b5f5b83811015611d3f578181015183820152602001611d27565b50505f910152565b5f8151808452611d5e816020860160208601611d25565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6109266020830184611d47565b5f8060408385031215611db3575f80fd5b8235611dbe81611848565b9150602083013567ffffffffffffffff811115611ac8575f80fd5b5f805f805f8060a08789031215611dee575f80fd5b8635611df981611848565b95506020870135611e0981611848565b94506040870135935060608701359250608087013567ffffffffffffffff811115611e32575f80fd5b611e3e89828a01611869565b979a9699509497509295939492505050565b5f8060408385031215611e61575f80fd5b50508035926020909101359150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f81611ed857611ed8611e9d565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b828152604060208201525f611bd46040830184611d47565b5f60208284031215611f26575f80fd5b81517fffffffff0000000000000000000000000000000000000000000000000000000081168114610926575f80fd5b5f8060408385031215611f66575f80fd5b8251611f7181611848565b6020939093015192949293505050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611fb4575f80fd5b83018035915067ffffffffffffffff821115611fce575f80fd5b6020019150368190038213156118a7575f80fd5b5f60208284031215611ff2575f80fd5b815161092681611848565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361202d5761202d611e9d565b5060010190565b73ffffffffffffffffffffffffffffffffffffffff83168152604060208201525f611bd46040830184611d47565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f82516120a0818460208701611d25565b9190910192915050565b8082018082111561090357610903611e9d565b7f630000000000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000008360e01b1660018201527f80600e6000396000f3000000000000000000000000000000000000000000000060058201525f600e8201525f825161214b81600f850160208701611d25565b91909101600f01939250505056fea26469706673582212208ee99f5816e66f69a8926786a9858f1caf0bbd099c82d85d9db66d927e9986f664736f6c63430008150033", + "bytecode": "0x60806040525f805534801562000013575f80fd5b50604051620026cc380380620026cc833981016040819052620000369162000391565b604080516001600160a01b03851660208201528082018490528151808203830181526060909101909152839083906200006f8162000145565b5050506001600160a01b0383166200009a5760405163d92e233d60e01b815260040160405180910390fd5b6040516331a9108f60e11b8152600481018390525f906001600160a01b03851690636352211e90602401602060405180830381865afa158015620000e0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001069190620003c6565b90506001600160a01b0381166200013857604051630ede975960e01b8152600481018490526024015b60405180910390fd5b50600155506200049a9050565b6200014f620001ad565b51156200019f5760405162461bcd60e51b815260206004820152601360248201527f416c726561647920696e697469616c697a65640000000000000000000000000060448201526064016200012f565b620001aa8162000218565b50565b6060620002136200020d604051606b60f91b6020820152602560fa1b60218201526001600160601b03193060601b166022820152600160f81b60368201525f90603701604051602081830303815290604052805190602001205f1c905090565b620002e1565b905090565b5f620002248262000339565b90505f8151602083015ff090506200028b604051606b60f91b6020820152602560fa1b60218201526001600160601b03193060601b166022820152600160f81b60368201525f90603701604051602081830303815290604052805190602001205f1c905090565b6001600160a01b0316816001600160a01b031614620002dc5760405162461bcd60e51b815260206004820152600c60248201526b15dc9a5d194819985a5b195960a21b60448201526064016200012f565b505050565b6060813b600181116200030357505060408051602081019091525f8152919050565b806200030f81620003fd565b9150506040519150601f19601f602083010116820160405280825280600160208401853c50919050565b6060815160016200034b919062000415565b826040516020016200035f92919062000431565b6040516020818303038152906040529050919050565b80516001600160a01b03811681146200038c575f80fd5b919050565b5f805f60608486031215620003a4575f80fd5b620003af8462000375565b925060208401519150604084015190509250925092565b5f60208284031215620003d7575f80fd5b620003e28262000375565b9392505050565b634e487b7160e01b5f52601160045260245ffd5b5f816200040e576200040e620003e9565b505f190190565b808201808211156200042b576200042b620003e9565b92915050565b606360f81b815260e083901b6001600160e01b03191660018201526880600e6000396000f360b81b60058201525f600e82018190528251815b8181101562000489576020818601810151600f8684010152016200046a565b505f9201600f019182525092915050565b61222480620004a85f395ff3fe60806040526004361061017a575f3560e01c8063a035b1fe116100d1578063bdf863171161007c578063f23a6e6111610057578063f23a6e61146104d2578063f6171e4414610517578063fc0c546a14610536575f80fd5b8063bdf8631714610472578063c7dec3fc14610487578063e00b9118146104b3575f80fd5b8063b0d691fe116100ac578063b0d691fe146103d1578063b94207d314610418578063bc197c811461042b575f80fd5b8063a035b1fe1461038a578063a4f9edbf1461039f578063affed0e0146103be575f80fd5b80633a871cdd116101315780636d70f7ae1161010c5780636d70f7ae146102fb5780637af734731461032a57806391b7f5ed1461036b575f80fd5b80633a871cdd1461028557806358ce0909146102a45780635fee6085146102d0575f80fd5b8063157305fe11610161578063157305fe146102255780631626ba7e1461024457806317d70f7c14610263575f80fd5b806223de2914610185578063150b7a02146101ab575f80fd5b3661018157005b5f80fd5b348015610190575f80fd5b506101a961019f366004611943565b5050505050505050565b005b3480156101b6575f80fd5b506101ef6101c53660046119ed565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020015b60405180910390f35b348015610230575f80fd5b506101a961023f366004611b2f565b61054a565b34801561024f575f80fd5b506101ef61025e366004611b2f565b610771565b34801561026e575f80fd5b50610277610914565b60405190815260200161021c565b348015610290575f80fd5b5061027761029f366004611b73565b610938565b3480156102af575f80fd5b506102c36102be366004611bc2565b610974565b60405161021c9190611be2565b3480156102db575f80fd5b506102776102ea366004611c25565b60036020525f908152604090205481565b348015610306575f80fd5b5061031a610315366004611c25565b610ada565b604051901515815260200161021c565b348015610335575f80fd5b50610277610344366004611c25565b73ffffffffffffffffffffffffffffffffffffffff165f9081526003602052604090205490565b348015610376575f80fd5b506101a9610385366004611c40565b610bac565b348015610395575f80fd5b5061027760015481565b3480156103aa575f80fd5b506101a96103b9366004611c57565b610c9a565b3480156103c9575f80fd5b505f54610277565b3480156103dc575f80fd5b50730576a174d229e3cfa37253523e645a78a0c91b575b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161021c565b610277610426366004611c57565b610d16565b348015610436575f80fd5b506101ef610445366004611cd2565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b34801561047d575f80fd5b5061027760025481565b348015610492575f80fd5b506104a66104a1366004611d68565b610e63565b60405161021c9190611e45565b3480156104be575f80fd5b506102776104cd366004611e57565b610f4d565b3480156104dd575f80fd5b506101ef6104ec366004611e8e565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b348015610522575f80fd5b50610277610531366004611bc2565b610f9e565b348015610541575f80fd5b506103f3610fc0565b61055333610ada565b80610571575033730576a174d229e3cfa37253523e645a78a0c91b57145b610602576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084015b60405180910390fd5b5f828152600460205260408082208151808301928390529160029082845b8154815260200190600101908083116106205750505050509050805f6002811061064c5761064c611f05565b602002015115801561066057506020810151155b801561069557505f805260046020527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ed548314155b156106cf576040517ffe239804000000000000000000000000000000000000000000000000000000008152600481018490526024016105f9565b6020818101805183515f908152600490935260408084206001908101929092558451925184528084209290925585835290822082815501819055600280549161071783611f5f565b91905055503373ffffffffffffffffffffffffffffffffffffffff167f0cd979445339c62199996f208428d987b1cea24d18e62b79ec24d94b636e8b708484604051610764929190611f93565b60405180910390a2505050565b5f805f8061079185602081015160408201516060909201515f1a92909190565b9094509250905060ff81165f036108a757828583016020016107b282610ada565b1580156107d5575073ffffffffffffffffffffffffffffffffffffffff82163014155b1561080857507fffffffff00000000000000000000000000000000000000000000000000000000945061090e9350505050565b6040517f1626ba7e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831690631626ba7e9061085c908b908590600401611f93565b602060405180830381865afa158015610877573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061089b9190611fab565b9550505050505061090e565b6108b661031587838686610fdd565b156108e757507f1626ba7e00000000000000000000000000000000000000000000000000000000925061090e915050565b507fffffffff00000000000000000000000000000000000000000000000000000000925050505b92915050565b5f8061091e610ff9565b8060200190518101906109319190611fea565b9392505050565b5f6109416110cd565b61094b848461114c565b905061095a6040850185612016565b90505f0361096b5761096b8461124c565b610931826112ca565b6002546060905f849003610986578093505b806109918486612077565b11156109de576109a18385612077565b6040517f7ae596850000000000000000000000000000000000000000000000000000000081526004810191909152602481018290526044016105f9565b8315610ad3578367ffffffffffffffff8111156109fd576109fd611a5b565b604051908082528060200260200182016040528015610a26578160200160208202803683370190505b505f80805260046020527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ed549193505b84811015610a81575f828152600460205260409020600101549150610a7a8161208a565b9050610a56565b505f5b85811015610ad05781848281518110610a9f57610a9f611f05565b6020908102919091018101919091525f9283526004905260409091206001015490610ac98161208a565b9050610a84565b50505b5092915050565b5f805f610ae5610ff9565b806020019051810190610af89190611fea565b915091508373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401610b4e91815260200190565b602060405180830381865afa158015610b69573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8d91906120c1565b73ffffffffffffffffffffffffffffffffffffffff1614949350505050565b610bb533610ada565b80610bd3575033730576a174d229e3cfa37253523e645a78a0c91b57145b610c5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084016105f9565b60018190556040518181527f66cbca4f3c64fecf1dcb9ce094abcf7f68c3450a1d4e3a8e917dd621edb4ebe09060200160405180910390a150565b610ca2610ff9565b5115610d0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a65640000000000000000000000000060448201526064016105f9565b610d138161133e565b50565b5f600154341015610d60576001546040517fb489782800000000000000000000000000000000000000000000000000000000815234600482015260248101919091526044016105f9565b610d6a3383610f4d565b335f908152600360205260408120805492935090610d878361208a565b909155505060046020525f81815260408082207f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ed80546001830181905590859055808452918320849055600280547f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec94929392909190610e068361208a565b91905055503373ffffffffffffffffffffffffffffffffffffffff167f4bda649efe6b98b0f9c1d5e859c29e20910f45c66dabfe6fad4a4881f7faf9cc8587604051610e53929190611f93565b60405180910390a2505050919050565b6060610e6e33610ada565b80610e8c575033730576a174d229e3cfa37253523e645a78a0c91b57145b610f18576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084016105f9565b5f610f32878787878715610f2c57876114b3565b5a6114b3565b9250905080610f4357815160208301fd5b5095945050505050565b5f8282604051602001610f619291906120dc565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209392505050565b6004602052815f5260405f208160028110610fb7575f80fd5b01549150829050565b5f80610fca610ff9565b80602001905181019061090e91906120c1565b5f805f610fec878787876115b6565b91509150610f438161169e565b60606110c86110c36040517fd60000000000000000000000000000000000000000000000000000000000000060208201527f940000000000000000000000000000000000000000000000000000000000000060218201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660228201527f010000000000000000000000000000000000000000000000000000000000000060368201525f90603701604051602081830303815290604052805190602001205f1c905090565b611850565b905090565b33730576a174d229e3cfa37253523e645a78a0c91b571461114a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e740000000060448201526064016105f9565b565b5f806111a4836040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018290525f90605c01604051602081830303815290604052805190602001209050919050565b90507f1626ba7e00000000000000000000000000000000000000000000000000000000611212826111d9610140880188612016565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061077192505050565b7fffffffff00000000000000000000000000000000000000000000000000000000161461124357600191505061090e565b505f9392505050565b5f80546020830135918061125f8361208a565b9190505514610d13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496e76616c6964206e6f6e63650000000000000000000000000000000000000060448201526064016105f9565b8015610d13576040515f9033907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90849084818181858888f193505050503d805f8114611332576040519150601f19603f3d011682016040523d82523d5f602084013e611337565b606091505b5050505050565b5f611348826118a5565b90505f8151602083015ff0905061141a6040517fd60000000000000000000000000000000000000000000000000000000000000060208201527f940000000000000000000000000000000000000000000000000000000000000060218201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660228201527f010000000000000000000000000000000000000000000000000000000000000060368201525f90603701604051602081830303815290604052805190602001205f1c905090565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146114ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5772697465206661696c6564000000000000000000000000000000000000000060448201526064016105f9565b505050565b5f606060018460018111156114ca576114ca61210a565b0361153e578673ffffffffffffffffffffffffffffffffffffffff1683866040516114f59190612137565b5f604051808303818686f4925050503d805f811461152e576040519150601f19603f3d011682016040523d82523d5f602084013e611533565b606091505b5090925090506115ac565b8673ffffffffffffffffffffffffffffffffffffffff168387876040516115659190612137565b5f60405180830381858888f193505050503d805f81146115a0576040519150601f19603f3d011682016040523d82523d5f602084013e6115a5565b606091505b5090925090505b9550959350505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156115eb57505f90506003611695565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561163c573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811661168f575f60019250925050611695565b91505f90505b94509492505050565b5f8160048111156116b1576116b161210a565b036116b95750565b60018160048111156116cd576116cd61210a565b03611734576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016105f9565b60028160048111156117485761174861210a565b036117af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016105f9565b60038160048111156117c3576117c361210a565b03610d13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016105f9565b6060813b6001811161187157505060408051602081019091525f8152919050565b8061187b81611f5f565b9150506040519150601f19601f602083010116820160405280825280600160208401853c50919050565b6060815160016118b59190612077565b826040516020016118c7929190612152565b6040516020818303038152906040529050919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610d13575f80fd5b5f8083601f84011261190e575f80fd5b50813567ffffffffffffffff811115611925575f80fd5b60208301915083602082850101111561193c575f80fd5b9250929050565b5f805f805f805f8060c0898b03121561195a575f80fd5b8835611965816118dd565b97506020890135611975816118dd565b96506040890135611985816118dd565b955060608901359450608089013567ffffffffffffffff808211156119a8575f80fd5b6119b48c838d016118fe565b909650945060a08b01359150808211156119cc575f80fd5b506119d98b828c016118fe565b999c989b5096995094979396929594505050565b5f805f805f60808688031215611a01575f80fd5b8535611a0c816118dd565b94506020860135611a1c816118dd565b935060408601359250606086013567ffffffffffffffff811115611a3e575f80fd5b611a4a888289016118fe565b969995985093965092949392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112611a97575f80fd5b813567ffffffffffffffff80821115611ab257611ab2611a5b565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715611af857611af8611a5b565b81604052838152866020858801011115611b10575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f8060408385031215611b40575f80fd5b82359150602083013567ffffffffffffffff811115611b5d575f80fd5b611b6985828601611a88565b9150509250929050565b5f805f60608486031215611b85575f80fd5b833567ffffffffffffffff811115611b9b575f80fd5b84016101608187031215611bad575f80fd5b95602085013595506040909401359392505050565b5f8060408385031215611bd3575f80fd5b50508035926020909101359150565b602080825282518282018190525f9190848201906040850190845b81811015611c1957835183529284019291840191600101611bfd565b50909695505050505050565b5f60208284031215611c35575f80fd5b8135610931816118dd565b5f60208284031215611c50575f80fd5b5035919050565b5f60208284031215611c67575f80fd5b813567ffffffffffffffff811115611c7d575f80fd5b611c8984828501611a88565b949350505050565b5f8083601f840112611ca1575f80fd5b50813567ffffffffffffffff811115611cb8575f80fd5b6020830191508360208260051b850101111561193c575f80fd5b5f805f805f805f8060a0898b031215611ce9575f80fd5b8835611cf4816118dd565b97506020890135611d04816118dd565b9650604089013567ffffffffffffffff80821115611d20575f80fd5b611d2c8c838d01611c91565b909850965060608b0135915080821115611d44575f80fd5b611d508c838d01611c91565b909650945060808b01359150808211156119cc575f80fd5b5f805f805f60a08688031215611d7c575f80fd5b8535611d87816118dd565b945060208601359350604086013567ffffffffffffffff811115611da9575f80fd5b611db588828901611a88565b935050606086013560028110611dc9575f80fd5b949793965091946080013592915050565b5f5b83811015611df4578181015183820152602001611ddc565b50505f910152565b5f8151808452611e13816020860160208601611dda565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6109316020830184611dfc565b5f8060408385031215611e68575f80fd5b8235611e73816118dd565b9150602083013567ffffffffffffffff811115611b5d575f80fd5b5f805f805f8060a08789031215611ea3575f80fd5b8635611eae816118dd565b95506020870135611ebe816118dd565b94506040870135935060608701359250608087013567ffffffffffffffff811115611ee7575f80fd5b611ef389828a016118fe565b979a9699509497509295939492505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f81611f6d57611f6d611f32565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b828152604060208201525f611c896040830184611dfc565b5f60208284031215611fbb575f80fd5b81517fffffffff0000000000000000000000000000000000000000000000000000000081168114610931575f80fd5b5f8060408385031215611ffb575f80fd5b8251612006816118dd565b6020939093015192949293505050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612049575f80fd5b83018035915067ffffffffffffffff821115612063575f80fd5b60200191503681900382131561193c575f80fd5b8082018082111561090e5761090e611f32565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036120ba576120ba611f32565b5060010190565b5f602082840312156120d1575f80fd5b8151610931816118dd565b73ffffffffffffffffffffffffffffffffffffffff83168152604060208201525f611c896040830184611dfc565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f8251612148818460208701611dda565b9190910192915050565b7f630000000000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000008360e01b1660018201527f80600e6000396000f3000000000000000000000000000000000000000000000060058201525f600e8201525f82516121e081600f850160208701611dda565b91909101600f01939250505056fea2646970667358221220c1913351e275e1fecd00c79cd676ed135b575df5d3a88ccc57419dc3081980a264736f6c63430008150033", + "deployedBytecode": "0x60806040526004361061017a575f3560e01c8063a035b1fe116100d1578063bdf863171161007c578063f23a6e6111610057578063f23a6e61146104d2578063f6171e4414610517578063fc0c546a14610536575f80fd5b8063bdf8631714610472578063c7dec3fc14610487578063e00b9118146104b3575f80fd5b8063b0d691fe116100ac578063b0d691fe146103d1578063b94207d314610418578063bc197c811461042b575f80fd5b8063a035b1fe1461038a578063a4f9edbf1461039f578063affed0e0146103be575f80fd5b80633a871cdd116101315780636d70f7ae1161010c5780636d70f7ae146102fb5780637af734731461032a57806391b7f5ed1461036b575f80fd5b80633a871cdd1461028557806358ce0909146102a45780635fee6085146102d0575f80fd5b8063157305fe11610161578063157305fe146102255780631626ba7e1461024457806317d70f7c14610263575f80fd5b806223de2914610185578063150b7a02146101ab575f80fd5b3661018157005b5f80fd5b348015610190575f80fd5b506101a961019f366004611943565b5050505050505050565b005b3480156101b6575f80fd5b506101ef6101c53660046119ed565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020015b60405180910390f35b348015610230575f80fd5b506101a961023f366004611b2f565b61054a565b34801561024f575f80fd5b506101ef61025e366004611b2f565b610771565b34801561026e575f80fd5b50610277610914565b60405190815260200161021c565b348015610290575f80fd5b5061027761029f366004611b73565b610938565b3480156102af575f80fd5b506102c36102be366004611bc2565b610974565b60405161021c9190611be2565b3480156102db575f80fd5b506102776102ea366004611c25565b60036020525f908152604090205481565b348015610306575f80fd5b5061031a610315366004611c25565b610ada565b604051901515815260200161021c565b348015610335575f80fd5b50610277610344366004611c25565b73ffffffffffffffffffffffffffffffffffffffff165f9081526003602052604090205490565b348015610376575f80fd5b506101a9610385366004611c40565b610bac565b348015610395575f80fd5b5061027760015481565b3480156103aa575f80fd5b506101a96103b9366004611c57565b610c9a565b3480156103c9575f80fd5b505f54610277565b3480156103dc575f80fd5b50730576a174d229e3cfa37253523e645a78a0c91b575b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161021c565b610277610426366004611c57565b610d16565b348015610436575f80fd5b506101ef610445366004611cd2565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b34801561047d575f80fd5b5061027760025481565b348015610492575f80fd5b506104a66104a1366004611d68565b610e63565b60405161021c9190611e45565b3480156104be575f80fd5b506102776104cd366004611e57565b610f4d565b3480156104dd575f80fd5b506101ef6104ec366004611e8e565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b348015610522575f80fd5b50610277610531366004611bc2565b610f9e565b348015610541575f80fd5b506103f3610fc0565b61055333610ada565b80610571575033730576a174d229e3cfa37253523e645a78a0c91b57145b610602576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084015b60405180910390fd5b5f828152600460205260408082208151808301928390529160029082845b8154815260200190600101908083116106205750505050509050805f6002811061064c5761064c611f05565b602002015115801561066057506020810151155b801561069557505f805260046020527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ed548314155b156106cf576040517ffe239804000000000000000000000000000000000000000000000000000000008152600481018490526024016105f9565b6020818101805183515f908152600490935260408084206001908101929092558451925184528084209290925585835290822082815501819055600280549161071783611f5f565b91905055503373ffffffffffffffffffffffffffffffffffffffff167f0cd979445339c62199996f208428d987b1cea24d18e62b79ec24d94b636e8b708484604051610764929190611f93565b60405180910390a2505050565b5f805f8061079185602081015160408201516060909201515f1a92909190565b9094509250905060ff81165f036108a757828583016020016107b282610ada565b1580156107d5575073ffffffffffffffffffffffffffffffffffffffff82163014155b1561080857507fffffffff00000000000000000000000000000000000000000000000000000000945061090e9350505050565b6040517f1626ba7e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831690631626ba7e9061085c908b908590600401611f93565b602060405180830381865afa158015610877573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061089b9190611fab565b9550505050505061090e565b6108b661031587838686610fdd565b156108e757507f1626ba7e00000000000000000000000000000000000000000000000000000000925061090e915050565b507fffffffff00000000000000000000000000000000000000000000000000000000925050505b92915050565b5f8061091e610ff9565b8060200190518101906109319190611fea565b9392505050565b5f6109416110cd565b61094b848461114c565b905061095a6040850185612016565b90505f0361096b5761096b8461124c565b610931826112ca565b6002546060905f849003610986578093505b806109918486612077565b11156109de576109a18385612077565b6040517f7ae596850000000000000000000000000000000000000000000000000000000081526004810191909152602481018290526044016105f9565b8315610ad3578367ffffffffffffffff8111156109fd576109fd611a5b565b604051908082528060200260200182016040528015610a26578160200160208202803683370190505b505f80805260046020527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ed549193505b84811015610a81575f828152600460205260409020600101549150610a7a8161208a565b9050610a56565b505f5b85811015610ad05781848281518110610a9f57610a9f611f05565b6020908102919091018101919091525f9283526004905260409091206001015490610ac98161208a565b9050610a84565b50505b5092915050565b5f805f610ae5610ff9565b806020019051810190610af89190611fea565b915091508373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401610b4e91815260200190565b602060405180830381865afa158015610b69573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8d91906120c1565b73ffffffffffffffffffffffffffffffffffffffff1614949350505050565b610bb533610ada565b80610bd3575033730576a174d229e3cfa37253523e645a78a0c91b57145b610c5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084016105f9565b60018190556040518181527f66cbca4f3c64fecf1dcb9ce094abcf7f68c3450a1d4e3a8e917dd621edb4ebe09060200160405180910390a150565b610ca2610ff9565b5115610d0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f416c726561647920696e697469616c697a65640000000000000000000000000060448201526064016105f9565b610d138161133e565b50565b5f600154341015610d60576001546040517fb489782800000000000000000000000000000000000000000000000000000000815234600482015260248101919091526044016105f9565b610d6a3383610f4d565b335f908152600360205260408120805492935090610d878361208a565b909155505060046020525f81815260408082207f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ed80546001830181905590859055808452918320849055600280547f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec94929392909190610e068361208a565b91905055503373ffffffffffffffffffffffffffffffffffffffff167f4bda649efe6b98b0f9c1d5e859c29e20910f45c66dabfe6fad4a4881f7faf9cc8587604051610e53929190611f93565b60405180910390a2505050919050565b6060610e6e33610ada565b80610e8c575033730576a174d229e3cfa37253523e645a78a0c91b57145b610f18576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f4f6e6c792063616c6c61626c6520627920746865206d656368206f706572617460448201527f6f72206f722074686520656e74727920706f696e7420636f6e7472616374000060648201526084016105f9565b5f610f32878787878715610f2c57876114b3565b5a6114b3565b9250905080610f4357815160208301fd5b5095945050505050565b5f8282604051602001610f619291906120dc565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209392505050565b6004602052815f5260405f208160028110610fb7575f80fd5b01549150829050565b5f80610fca610ff9565b80602001905181019061090e91906120c1565b5f805f610fec878787876115b6565b91509150610f438161169e565b60606110c86110c36040517fd60000000000000000000000000000000000000000000000000000000000000060208201527f940000000000000000000000000000000000000000000000000000000000000060218201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660228201527f010000000000000000000000000000000000000000000000000000000000000060368201525f90603701604051602081830303815290604052805190602001205f1c905090565b611850565b905090565b33730576a174d229e3cfa37253523e645a78a0c91b571461114a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e740000000060448201526064016105f9565b565b5f806111a4836040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c81018290525f90605c01604051602081830303815290604052805190602001209050919050565b90507f1626ba7e00000000000000000000000000000000000000000000000000000000611212826111d9610140880188612016565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061077192505050565b7fffffffff00000000000000000000000000000000000000000000000000000000161461124357600191505061090e565b505f9392505050565b5f80546020830135918061125f8361208a565b9190505514610d13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496e76616c6964206e6f6e63650000000000000000000000000000000000000060448201526064016105f9565b8015610d13576040515f9033907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90849084818181858888f193505050503d805f8114611332576040519150601f19603f3d011682016040523d82523d5f602084013e611337565b606091505b5050505050565b5f611348826118a5565b90505f8151602083015ff0905061141a6040517fd60000000000000000000000000000000000000000000000000000000000000060208201527f940000000000000000000000000000000000000000000000000000000000000060218201527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b1660228201527f010000000000000000000000000000000000000000000000000000000000000060368201525f90603701604051602081830303815290604052805190602001205f1c905090565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146114ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5772697465206661696c6564000000000000000000000000000000000000000060448201526064016105f9565b505050565b5f606060018460018111156114ca576114ca61210a565b0361153e578673ffffffffffffffffffffffffffffffffffffffff1683866040516114f59190612137565b5f604051808303818686f4925050503d805f811461152e576040519150601f19603f3d011682016040523d82523d5f602084013e611533565b606091505b5090925090506115ac565b8673ffffffffffffffffffffffffffffffffffffffff168387876040516115659190612137565b5f60405180830381858888f193505050503d805f81146115a0576040519150601f19603f3d011682016040523d82523d5f602084013e6115a5565b606091505b5090925090505b9550959350505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156115eb57505f90506003611695565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561163c573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811661168f575f60019250925050611695565b91505f90505b94509492505050565b5f8160048111156116b1576116b161210a565b036116b95750565b60018160048111156116cd576116cd61210a565b03611734576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016105f9565b60028160048111156117485761174861210a565b036117af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016105f9565b60038160048111156117c3576117c361210a565b03610d13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016105f9565b6060813b6001811161187157505060408051602081019091525f8152919050565b8061187b81611f5f565b9150506040519150601f19601f602083010116820160405280825280600160208401853c50919050565b6060815160016118b59190612077565b826040516020016118c7929190612152565b6040516020818303038152906040529050919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610d13575f80fd5b5f8083601f84011261190e575f80fd5b50813567ffffffffffffffff811115611925575f80fd5b60208301915083602082850101111561193c575f80fd5b9250929050565b5f805f805f805f8060c0898b03121561195a575f80fd5b8835611965816118dd565b97506020890135611975816118dd565b96506040890135611985816118dd565b955060608901359450608089013567ffffffffffffffff808211156119a8575f80fd5b6119b48c838d016118fe565b909650945060a08b01359150808211156119cc575f80fd5b506119d98b828c016118fe565b999c989b5096995094979396929594505050565b5f805f805f60808688031215611a01575f80fd5b8535611a0c816118dd565b94506020860135611a1c816118dd565b935060408601359250606086013567ffffffffffffffff811115611a3e575f80fd5b611a4a888289016118fe565b969995985093965092949392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112611a97575f80fd5b813567ffffffffffffffff80821115611ab257611ab2611a5b565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715611af857611af8611a5b565b81604052838152866020858801011115611b10575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f8060408385031215611b40575f80fd5b82359150602083013567ffffffffffffffff811115611b5d575f80fd5b611b6985828601611a88565b9150509250929050565b5f805f60608486031215611b85575f80fd5b833567ffffffffffffffff811115611b9b575f80fd5b84016101608187031215611bad575f80fd5b95602085013595506040909401359392505050565b5f8060408385031215611bd3575f80fd5b50508035926020909101359150565b602080825282518282018190525f9190848201906040850190845b81811015611c1957835183529284019291840191600101611bfd565b50909695505050505050565b5f60208284031215611c35575f80fd5b8135610931816118dd565b5f60208284031215611c50575f80fd5b5035919050565b5f60208284031215611c67575f80fd5b813567ffffffffffffffff811115611c7d575f80fd5b611c8984828501611a88565b949350505050565b5f8083601f840112611ca1575f80fd5b50813567ffffffffffffffff811115611cb8575f80fd5b6020830191508360208260051b850101111561193c575f80fd5b5f805f805f805f8060a0898b031215611ce9575f80fd5b8835611cf4816118dd565b97506020890135611d04816118dd565b9650604089013567ffffffffffffffff80821115611d20575f80fd5b611d2c8c838d01611c91565b909850965060608b0135915080821115611d44575f80fd5b611d508c838d01611c91565b909650945060808b01359150808211156119cc575f80fd5b5f805f805f60a08688031215611d7c575f80fd5b8535611d87816118dd565b945060208601359350604086013567ffffffffffffffff811115611da9575f80fd5b611db588828901611a88565b935050606086013560028110611dc9575f80fd5b949793965091946080013592915050565b5f5b83811015611df4578181015183820152602001611ddc565b50505f910152565b5f8151808452611e13816020860160208601611dda565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6109316020830184611dfc565b5f8060408385031215611e68575f80fd5b8235611e73816118dd565b9150602083013567ffffffffffffffff811115611b5d575f80fd5b5f805f805f8060a08789031215611ea3575f80fd5b8635611eae816118dd565b95506020870135611ebe816118dd565b94506040870135935060608701359250608087013567ffffffffffffffff811115611ee7575f80fd5b611ef389828a016118fe565b979a9699509497509295939492505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f81611f6d57611f6d611f32565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b828152604060208201525f611c896040830184611dfc565b5f60208284031215611fbb575f80fd5b81517fffffffff0000000000000000000000000000000000000000000000000000000081168114610931575f80fd5b5f8060408385031215611ffb575f80fd5b8251612006816118dd565b6020939093015192949293505050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612049575f80fd5b83018035915067ffffffffffffffff821115612063575f80fd5b60200191503681900382131561193c575f80fd5b8082018082111561090e5761090e611f32565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036120ba576120ba611f32565b5060010190565b5f602082840312156120d1575f80fd5b8151610931816118dd565b73ffffffffffffffffffffffffffffffffffffffff83168152604060208201525f611c896040830184611dfc565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f8251612148818460208701611dda565b9190910192915050565b7f630000000000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000008360e01b1660018201527f80600e6000396000f3000000000000000000000000000000000000000000000060058201525f600e8201525f82516121e081600f850160208701611dda565b91909101600f01939250505056fea2646970667358221220c1913351e275e1fecd00c79cd676ed135b575df5d3a88ccc57419dc3081980a264736f6c63430008150033", "linkReferences": {}, "deployedLinkReferences": {} }