commit f9cd542e7416a1c77e58fff5a2e1273df1c4d949
parent 75c16b7198964fdb4f8be28cbcc6ff72ae8fa2f1
Author: lash <dev@holbrook.no>
Date: Sun, 19 Feb 2023 09:44:25 +0000
Add sweep function
Diffstat:
7 files changed, 50 insertions(+), 6 deletions(-)
diff --git a/python/CHANGELOG b/python/CHANGELOG
@@ -1,3 +1,5 @@
+- 0.3.7
+ * Add sweep contract method to fully empty one account into another
- 0.3.6
* Reinstate owner as minter by default
- 0.3.0
diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin
@@ -1 +1 @@
-6101006040523480156200001257600080fd5b506040516200614a3803806200614a833981810160405281019062000038919062000863565b6801000000000000000083600f0b126200005157600080fd5b6200005b62000578565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508660069081620000ad919062000b84565b508560079081620000bf919062000b84565b508460ff16608081815250504260038190555060035460a08181525050603c83620000eb919062000c9a565b60c08181525050620001126001620002a96401000000000262002e0f176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200016c84620002d06401000000000262002e35176401000000009004565b600f0b60e081600f0b81525050620001a86000600260009054906101000a9004600f0b6000600162000324640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000ce5565b6000677fffffffffffffff821115620002c157600080fd5b6040829060020a029050919050565b60008082600f0b13620002e257600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af6200030f84620003a8640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b6200032e62000578565b6200033862000578565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b13620003ba57600080fd5b60008083600f0b9050680100000000000000008112620003f6576040819060008212600003808260020a82851804189250505090506040820191505b640100000000811262000425576020819060008212600003808260020a82851804189250505090506020820191505b62010000811262000452576010819060008212600003808260020a82851804189250505090506010820191505b61010081126200047e576008819060008212600003808260020a82851804189250505090506008820191505b60108112620004a9576004819060008212600003808260020a82851804189250505090506004820191505b60048112620004d4576002819060008212600003808260020a82851804189250505090506002820191505b60028112620004e4576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b60008113156200056b578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a828518041892505050905062000511565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200061d82620005d2565b810181811067ffffffffffffffff821117156200063f576200063e620005e3565b5b80604052505050565b600062000654620005b4565b905062000662828262000612565b919050565b600067ffffffffffffffff821115620006855762000684620005e3565b5b6200069082620005d2565b9050602081019050919050565b60005b83811015620006bd578082015181840152602081019050620006a0565b60008484015250505050565b6000620006e0620006da8462000667565b62000648565b905082815260208101848484011115620006ff57620006fe620005cd565b5b6200070c8482856200069d565b509392505050565b600082601f8301126200072c576200072b620005c8565b5b81516200073e848260208601620006c9565b91505092915050565b600060ff82169050919050565b6200075f8162000747565b81146200076b57600080fd5b50565b6000815190506200077f8162000754565b92915050565b600081600f0b9050919050565b6200079d8162000785565b8114620007a957600080fd5b50565b600081519050620007bd8162000792565b92915050565b6000819050919050565b620007d881620007c3565b8114620007e457600080fd5b50565b600081519050620007f881620007cd565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200082b82620007fe565b9050919050565b6200083d816200081e565b81146200084957600080fd5b50565b6000815190506200085d8162000832565b92915050565b60008060008060008060c08789031215620008835762000882620005be565b5b600087015167ffffffffffffffff811115620008a457620008a3620005c3565b5b620008b289828a0162000714565b965050602087015167ffffffffffffffff811115620008d657620008d5620005c3565b5b620008e489828a0162000714565b9550506040620008f789828a016200076e565b94505060606200090a89828a01620007ac565b93505060806200091d89828a01620007e7565b92505060a06200093089828a016200084c565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200099057607f821691505b602082108103620009a657620009a562000948565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000a137fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620009d1565b62000a1f8683620009d1565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000a6262000a5c62000a5684620007c3565b62000a37565b620007c3565b9050919050565b6000819050919050565b62000a7e8362000a41565b62000a9662000a8d8262000a69565b848454620009e1565b825550505050565b600090565b62000aad62000a9e565b62000aba81848462000a73565b505050565b5b8181101562000ae25762000ad660008262000aa3565b60018101905062000ac0565b5050565b601f82111562000b315762000afb81620009ac565b62000b0684620009c1565b8101602085101562000b16578190505b62000b2e62000b2585620009c1565b83018262000abf565b50505b505050565b60008160020a8304905092915050565b600062000b596000198460080262000b36565b1980831691505092915050565b600062000b74838362000b46565b9150826002028217905092915050565b62000b8f826200093d565b67ffffffffffffffff81111562000bab5762000baa620005e3565b5b62000bb7825462000977565b62000bc482828562000ae6565b600060209050601f83116001811462000bfc576000841562000be7578287015190505b62000bf3858262000b66565b86555062000c63565b601f19841662000c0c86620009ac565b60005b8281101562000c365784890151825560018201915060208501945060208101905062000c0f565b8683101562000c56578489015162000c52601f89168262000b46565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000ca782620007c3565b915062000cb483620007c3565b925082820262000cc481620007c3565b9150828204841483151762000cde5762000cdd62000c6b565b5b5092915050565b60805160a05160c05160e0516153e562000d656000396000818161115b0152818161148f015281816123b70152612961015260008181611a7a0152818161237a015281816128b901528181612afd0152612ce5015260008181611aa601528181612b2901528181612d060152612d4b015260006114ed01526153e56000f3fe608060405234801561001057600080fd5b50600436106103a0576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e116101fb578063a457c2d71161012c578063d7a52fa9116100ca578063e69571af11610099578063e69571af14610ba9578063e809529514610bd9578063eda4e6d614610bf7578063f2fde38b14610c15576103a0565b8063d7a52fa914610b0f578063d89135cd14610b2b578063da2824a814610b49578063e54063a614610b79576103a0565b8063b470aade11610106578063b470aade14610a85578063c0ab707714610aa3578063d340ef8a14610ad3578063d5abeb0114610af1576103a0565b8063a457c2d714610a07578063a9059cbb14610a37578063b1cb0db314610a67576103a0565b806379ba5097116101995780638da5cb5b116101735780638da5cb5b146109915780638f0b2d5d146109af5780638f1df6bc146109cb57806395d89b41146109e9576103a0565b806379ba50971461092557806384dde4af1461094357806386fe212d14610961576103a0565b8063731f237c116101d5578063731f237c1461089b57806373f42561146108b95780637445e33a146108d757806374bedb9514610907576103a0565b80636a2d094e1461081f5780636f8b44b01461084f57806370a082311461086b576103a0565b806331333487116102d557806347a505171161027357806358b2833b1161024d57806358b2833b146107835780635ae06f7e146107a15780635f408c04146107d15780636787a9be146107ef576103a0565b806347a50517146106f35780634abfbba21461072357806351b4541c14610753576103a0565b806339509351116102af578063395093511461064557806340452d911461067557806342966c68146106a7578063449a52f8146106c3576103a0565b806331333487146105d9578063313ce5671461060957806331a5995d14610627576103a0565b80631989c6a81161034257806323a859441161031c57806323a859441461051957806323b872dd146105495780632a7aec09146105795780632c1758c1146105a9576103a0565b80631989c6a8146104ad578063213d1e1e146104cb578063229ba197146104fb576103a0565b806309f28f3c1161037e57806309f28f3c1461042357806311c566151461044157806318160ddd1461047157806318cbbcfc1461048f576103a0565b806301ffc9a7146103a557806306fdde03146103d5578063095ea7b3146103f3575b600080fd5b6103bf60048036038101906103ba9190614799565b610c45565b6040516103cc91906147e1565b60405180910390f35b6103dd610deb565b6040516103ea919061488c565b60405180910390f35b61040d60048036038101906104089190614942565b610e79565b60405161041a91906147e1565b60405180910390f35b61042b6110b5565b604051610438919061499e565b60405180910390f35b61045b600480360381019061045691906149e5565b6110c8565b6040516104689190614a34565b60405180910390f35b610479611118565b6040516104869190614a34565b60405180910390f35b61049761112f565b6040516104a49190614a34565b60405180910390f35b6104b5611134565b6040516104c29190614a34565b60405180910390f35b6104e560048036038101906104e09190614bf0565b611140565b6040516104f29190614a34565b60405180910390f35b610503611159565b604051610510919061499e565b60405180910390f35b610533600480360381019061052e9190614bf0565b61117d565b60405161054091906147e1565b60405180910390f35b610563600480360381019061055e9190614c1d565b6111e5565b60405161057091906147e1565b60405180910390f35b610593600480360381019061058e9190614bf0565b611403565b6040516105a0919061499e565b60405180910390f35b6105c360048036038101906105be9190614c70565b61143b565b6040516105d091906147e1565b60405180910390f35b6105f360048036038101906105ee9190614c9d565b61146e565b6040516106009190614a34565b60405180910390f35b6106116114eb565b60405161061e9190614a34565b60405180910390f35b61062f61150f565b60405161063c9190614a34565b60405180910390f35b61065f600480360381019061065a9190614942565b611515565b60405161066c91906147e1565b60405180910390f35b61068f600480360381019061068a9190614c70565b6116ab565b60405161069e93929190614d0a565b60405180910390f35b6106c160048036038101906106bc9190614c70565b61171a565b005b6106dd60048036038101906106d89190614942565b611856565b6040516106ea91906147e1565b60405180910390f35b61070d60048036038101906107089190614d41565b611a2d565b60405161071a9190614a34565b60405180910390f35b61073d60048036038101906107389190614c70565b611a76565b60405161074a9190614a34565b60405180910390f35b61076d60048036038101906107689190614c70565b611ad6565b60405161077a9190614a34565b60405180910390f35b61078b611af7565b6040516107989190614a34565b60405180910390f35b6107bb60048036038101906107b69190614d41565b611afd565b6040516107c891906147e1565b60405180910390f35b6107d9611c07565b6040516107e69190614d8a565b60405180910390f35b61080960048036038101906108049190614c70565b611cd4565b6040516108169190614a34565b60405180910390f35b61083960048036038101906108349190614c70565b611d15565b6040516108469190614a34565b60405180910390f35b61086960048036038101906108649190614c70565b611d36565b005b61088560048036038101906108809190614d41565b611dfe565b6040516108929190614a34565b60405180910390f35b6108a3611e68565b6040516108b09190614a34565b60405180910390f35b6108c1611e79565b6040516108ce9190614a34565b60405180910390f35b6108f160048036038101906108ec9190614bf0565b611e7f565b6040516108fe9190614a34565b60405180910390f35b61090f611ead565b60405161091c9190614a34565b60405180910390f35b61092d611eb3565b60405161093a91906147e1565b60405180910390f35b61094b61205a565b6040516109589190614db4565b60405180910390f35b61097b60048036038101906109769190614c70565b612080565b6040516109889190614a34565b60405180910390f35b610999612167565b6040516109a69190614db4565b60405180910390f35b6109c960048036038101906109c49190614d41565b61218d565b005b6109d3612242565b6040516109e091906147e1565b60405180910390f35b6109f1612503565b6040516109fe919061488c565b60405180910390f35b610a216004803603810190610a1c9190614942565b612591565b604051610a2e91906147e1565b60405180910390f35b610a516004803603810190610a4c9190614942565b6127b0565b604051610a5e91906147e1565b60405180910390f35b610a6f6128b1565b604051610a7c9190614a34565b60405180910390f35b610a8d6128b7565b604051610a9a9190614a34565b60405180910390f35b610abd6004803603810190610ab89190614c70565b6128db565b604051610aca9190614a34565b60405180910390f35b610adb612a62565b604051610ae89190614a34565b60405180910390f35b610af9612a68565b604051610b069190614a34565b60405180910390f35b610b296004803603810190610b249190614c70565b612a6e565b005b610b33612b6d565b604051610b409190614a34565b60405180910390f35b610b636004803603810190610b5e9190614d41565b612b77565b604051610b7091906147e1565b60405180910390f35b610b936004803603810190610b8e9190614bf0565b612c4b565b604051610ba09190614a34565b60405180910390f35b610bc36004803603810190610bbe9190614dcf565b612c5f565b604051610bd09190614ea5565b60405180910390f35b610be1612cdf565b604051610bee9190614eeb565b60405180910390f35b610bff612d49565b604051610c0c9190614a34565b60405180910390f35b610c2f6004803603810190610c2a9190614d41565b612d6d565b604051610c3c91906147e1565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c995760019050610de6565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ceb5760019050610de6565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d3d5760019050610de6565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d8f5760019050610de6565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610de15760019050610de6565b600090505b919050565b60068054610df890614f35565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2490614f35565b8015610e715780601f10610e4657610100808354040283529160200191610e71565b820191906000526020600020905b815481529060010190602001808311610e5457829003601f168201915b505050505081565b6000806000610e86611c07565b905060028160ff1603610e9e576000925050506110af565b60008160ff161115610ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edc90614fb2565b60405180910390fd5b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610fae5760008414610fad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa49061501e565b60405180910390fd5b5b610fb6612242565b50610fc084611cd4565b915081600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925866040516110a09190614a34565b60405180910390a36001925050505b92915050565b600260009054906101000a9004600f0b81565b6000806110ef6110d785612e0f565b6110ea6110e46001612e0f565b86612e77565b612ede565b90506110fa81612f5d565b67ffffffffffffffff168461110f919061506d565b91505092915050565b6000600b5460085461112a919061506d565b905090565b600f81565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080826000015163ffffffff16111561119a57600090506111e0565b6000826020015168ffffffffffffffffff1611156111bb57600090506111e0565b6000826040015167ffffffffffffffff1611156111db57600090506111e0565b600190505b919050565b6000806000806111f3611c07565b905060028160ff160361120c57600093505050506113fc565b60008160ff161115611253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124a90614fb2565b60405180910390fd5b61125b612242565b5061126585611cd4565b925082600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156112f057600080fd5b82600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461137c919061506d565b9250508190555061138e878785612f92565b91508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516113ed9190614a34565b60405180910390a38193505050505b9392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b036114325761142f6001612e0f565b90505b80915050919050565b6000600f821061144a57600080fd5b6000820361145f57600f601254149050611469565b8160125483161490505b919050565b60008060008061147d86612e0f565b925061148885612e0f565b91506114b47f000000000000000000000000000000000000000000000000000000000000000083612ede565b90506114bf81612fb7565b90506114cb8382612ede565b90506114d681612f5d565b67ffffffffffffffff16935050505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60125481565b600080611520612242565b5061152a83611cd4565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115b891906150a1565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516116989190614a34565b60405180910390a3600191505092915050565b600081815481106116bb57600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b6000611724611c07565b60ff161461173157600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661178757600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111156117d357600080fd5b60006117de82611cd4565b90506117ea3382613044565b5081600b60008282546117fd91906150a1565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58360405161184a9190614a34565b60405180910390a25050565b6000806000611863611c07565b60ff161461187057600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806119155750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611954576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194b90615121565b60405180910390fd5b61195c612242565b5060006011541115611985576011548360085461197991906150a1565b111561198457600080fd5b5b826008600082825461199791906150a1565b925050819055506119a783611cd4565b90506119b3848261314b565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051611a119190614a34565b60405180910390a3611a2161320f565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082611aa49190615141565b7f0000000000000000000000000000000000000000000000000000000000000000611acf91906150a1565b9050919050565b6000603c8242611ae6919061506d565b611af091906151b2565b9050919050565b60035481565b6000611b0c600160ff1661143b565b15611b1657600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611b9d57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b611ba657600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000601060009054906101000a900460ff1615611c275760019050611cd1565b6000600f5403611c3a5760009050611cd1565b600f544210611ccc57611c67603c600354611c5591906151b2565b600f54611c62919061506d565b6128db565b506001601060006101000a81548160ff0219169083151502179055507ff80dbaea4785589e52984ca36a31de106adc77759539a5c7d92883bf49692fe942604051611cb29190614a34565b60405180910390a1611cc2612242565b5060029050611cd1565b600090505b90565b600080611cf8611ce384612e0f565b600260009054906101000a9004600f0b6133d3565b9050611d0381612f5d565b67ffffffffffffffff16915050919050565b6000603c8242611d25919061506d565b611d2f91906151b2565b9050919050565b611d43600860ff1661143b565b15611d4d57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611da757600080fd5b611daf611118565b8111611dba57600080fd5b6011547f9722adea12ab7ef86fc45b88f0e0b567639e8dddaae60261e08c03d747fbbfe682604051611dec9190614a34565b60405180910390a28060118190555050565b6000806000806000611e17611e1287611a2d565b612e0f565b9350611e24600354611ad6565b9150611e3f84600260009054906101000a9004600f0b612ede565b9250611e5d611e4d84612f5d565b67ffffffffffffffff168361146e565b945050505050919050565b6000611e7460006128db565b905090565b600b5481565b6000806000611e8d84611140565b9150611e9884611403565b9050611ea482826110c8565b92505050919050565b600a5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f1057600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601082106120c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bc9061522f565b60405180910390fd5b600060125483161461210c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121039061529b565b60405180910390fd5b81601260008282541792505081905550600f6012541415157f6b7e2e653f93b645d4ed7292d6429f96637084363e477c8aaea1a43ed13c284e6012546040516121559190614a34565b60405180910390a26012549050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61219a600260ff1661143b565b156121a457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146121fe57600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061224c6146f6565b6122546146f6565b61225c6146f6565b600080600080600061226c611e68565b5061227561345f565b97506122808861117d565b1561229657600098505050505050505050612500565b6000600954815481106122ac576122ab6152bb565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050955061235988612c4b565b945060018561236891906150a1565b905061237386611403565b9350603c857f00000000000000000000000000000000000000000000000000000000000000006123a39190615141565b6123ad91906151b2565b91506123e96123e47f00000000000000000000000000000000000000000000000000000000000000006123df85612e0f565b612ede565b612fb7565b92506123ff6000846123f9611118565b84612c5f565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050506124bb876135f5565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d675816040516124eb9190614a34565b60405180910390a16001985050505050505050505b90565b6007805461251090614f35565b80601f016020809104026020016040519081016040528092919081815260200182805461253c90614f35565b80156125895780601f1061255e57610100808354040283529160200191612589565b820191906000526020600020905b81548152906001019060200180831161256c57829003601f168201915b505050505081565b60008061259d83611cd4565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561262857600080fd5b612630612242565b5080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126bd919061506d565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161279d9190614a34565b60405180910390a3600191505092915050565b6000806000806127be611c07565b905060028160ff16036127d757600093505050506128ab565b60008160ff16111561281e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281590614fb2565b60405180910390fd5b612826612242565b5061283085611cd4565b925061283d338785612f92565b91508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8760405161289c9190614a34565b60405180910390a38193505050505b92915050565b600f5481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806000601060009054906101000a900460ff1615612905576000945050505050612a5d565b612910600354611ad6565b925060008303612927576000945050505050612a5d565b600260009054906101000a9004600f0b905060008611801561294857508286105b15612951578592505b61295a83612e0f565b91506129867f000000000000000000000000000000000000000000000000000000000000000083612ede565b935061299184612fb7565b93506129ac600260009054906101000a9004600f0b85612ede565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c836129f49190615141565b600354612a0191906150a1565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b604051612a4d919061499e565b60405180910390a4829450505050505b919050565b60095481565b60115481565b6000612a7d600460ff1661143b565b15612a8757600080fd5b601060009054906101000a900460ff1615612aa157600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612afb57600080fd5b7f000000000000000000000000000000000000000000000000000000000000000082612b279190615141565b7f0000000000000000000000000000000000000000000000000000000000000000612b5291906150a1565b9050600f548111612b6257600080fd5b80600f819055505050565b6000600b54905090565b6000612b86600160ff1661143b565b15612b9057600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612bea57600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000816000015163ffffffff169050919050565b612c676146f6565b612c6f6146f6565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042612d30919061506d565b612d3a91906151b2565b612d4491906150a1565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612dc957600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000677fffffffffffffff821115612e2657600080fd5b6040829060020a029050919050565b60008082600f0b13612e4657600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af612e6284613714565b600f0b02908060020a82049150509050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612ecb57506f7fffffffffffffffffffffffffffffff600f0b8113155b612ed457600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612f4a57506f7fffffffffffffffffffffffffffffff600f0b8113155b612f5357600080fd5b8091505092915050565b60008082600f0b1215612f6f57600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b600080612f9f8584613044565b50612faa848461314b565b5060019150509392505050565b60006840000000000000000082600f0b12612fd157600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215613005576000905061303f565b61303c6080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a8285180418925050506138da565b90505b919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036130a05760009350505050613145565b6130a986611a2d565b9250848310156130ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130e590615336565b60405180910390fd5b84836130fa919061506d565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036131a75760009350505050613209565b6131b086611a2d565b925084836131be91906150a1565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60006132196146f6565b6000613223611118565b905060006001600080549050613239919061506d565b8154811061324a576132496152bb565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff16815250508160006001600080549050613325919061506d565b81548110613336576133356152bb565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b036133e457600080fd5b600082600f0b604085600f0b9060020a028161340357613402615183565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561344c57506f7fffffffffffffffffffffffffffffff600f0b8113155b61345557600080fd5b8091505092915050565b6134676146f6565b61346f6146f6565b6134776146f6565b6000806009548154811061348e5761348d6152bb565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015613599573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135bd9190615382565b6fffffffffffffffffffffffffffffffff1690506135da83612c4b565b81116135eb578193505050506135f2565b8293505050505b90565b600080600061360384611e7f565b61360b611118565b613615919061506d565b9150600a5461362383611cd4565b61362d919061506d565b905061365b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168261314b565b50836000015163ffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d3846040516136cf9190614a34565b60405180910390a36001600960008282546136ea91906150a1565b9250508190555080600a600082825461370391906150a1565b925050819055508192505050919050565b60008082600f0b1361372557600080fd5b60008083600f0b9050680100000000000000008112613760576040819060008212600003808260020a82851804189250505090506040820191505b640100000000811261378e576020819060008212600003808260020a82851804189250505090506020820191505b6201000081126137ba576010819060008212600003808260020a82851804189250505090506010820191505b61010081126137e5576008819060008212600003808260020a82851804189250505090506008820191505b6010811261380f576004819060008212600003808260020a82851804189250505090506004820191505b60048112613839576002819060008212600003808260020a82851804189250505090506002820191505b60028112613848576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b60008113156138cd578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050613875565b5081945050505050919050565b60006840000000000000000082600f0b126138f457600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b121561392857600090506146f1565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b131561397657608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b13156139af5760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b13156139e85760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b1315613a2157608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b1315613a5a5760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315613a93576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b1315613acc57608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b1315613b05576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b1315613b3d57608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b1315613b755760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315613bad576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b1315613be55760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b1315613c1d576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b1315613c5557608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b1315613c8d5760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b1315613cc557608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b1315613cfc5760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b1315613d33576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b1315613d6a57608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315613da1576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b1315613dd857608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b1315613e0f5760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b1315613e46576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b1315613e7d5760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315613eb3576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b1315613ee957608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b1315613f1f5760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b1315613f5557608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b1315613f8b5760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b1315613fc1576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b1315613ff757608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b131561402d576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b131561406257608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b13156140975760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b13156140cc576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b13156141015760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b1315614136576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b131561416b57608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b13156141a05760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b13156141d557608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b13156142095760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b131561423d576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b131561427157608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b13156142a5576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b13156142d957608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b131561430d5760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b1315614341576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b13156143755760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b13156143a8576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b13156143db57608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b131561440e5760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b131561444157608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156144745760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b13156144a7576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b13156144da57608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b131561450d576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b131561453f57608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b13156145715760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b13156145a3576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b13156145d55760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b1315614607576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b131561463957608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b131561466b5760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b131561469d57608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b8111156146ec57600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61477681614741565b811461478157600080fd5b50565b6000813590506147938161476d565b92915050565b6000602082840312156147af576147ae61473c565b5b60006147bd84828501614784565b91505092915050565b60008115159050919050565b6147db816147c6565b82525050565b60006020820190506147f660008301846147d2565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561483657808201518184015260208101905061481b565b60008484015250505050565b6000601f19601f8301169050919050565b600061485e826147fc565b6148688185614807565b9350614878818560208601614818565b61488181614842565b840191505092915050565b600060208201905081810360008301526148a68184614853565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006148d9826148ae565b9050919050565b6148e9816148ce565b81146148f457600080fd5b50565b600081359050614906816148e0565b92915050565b6000819050919050565b61491f8161490c565b811461492a57600080fd5b50565b60008135905061493c81614916565b92915050565b600080604083850312156149595761495861473c565b5b6000614967858286016148f7565b92505060206149788582860161492d565b9150509250929050565b600081600f0b9050919050565b61499881614982565b82525050565b60006020820190506149b3600083018461498f565b92915050565b6149c281614982565b81146149cd57600080fd5b50565b6000813590506149df816149b9565b92915050565b600080604083850312156149fc576149fb61473c565b5b6000614a0a8582860161492d565b9250506020614a1b858286016149d0565b9150509250929050565b614a2e8161490c565b82525050565b6000602082019050614a496000830184614a25565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614a8c82614842565b810181811067ffffffffffffffff82111715614aab57614aaa614a54565b5b80604052505050565b6000614abe614732565b9050614aca8282614a83565b919050565b600063ffffffff82169050919050565b614ae881614acf565b8114614af357600080fd5b50565b600081359050614b0581614adf565b92915050565b600068ffffffffffffffffff82169050919050565b614b2981614b0b565b8114614b3457600080fd5b50565b600081359050614b4681614b20565b92915050565b600067ffffffffffffffff82169050919050565b614b6981614b4c565b8114614b7457600080fd5b50565b600081359050614b8681614b60565b92915050565b600060608284031215614ba257614ba1614a4f565b5b614bac6060614ab4565b90506000614bbc84828501614af6565b6000830152506020614bd084828501614b37565b6020830152506040614be484828501614b77565b60408301525092915050565b600060608284031215614c0657614c0561473c565b5b6000614c1484828501614b8c565b91505092915050565b600080600060608486031215614c3657614c3561473c565b5b6000614c44868287016148f7565b9350506020614c55868287016148f7565b9250506040614c668682870161492d565b9150509250925092565b600060208284031215614c8657614c8561473c565b5b6000614c948482850161492d565b91505092915050565b60008060408385031215614cb457614cb361473c565b5b6000614cc28582860161492d565b9250506020614cd38582860161492d565b9150509250929050565b614ce681614acf565b82525050565b614cf581614b0b565b82525050565b614d0481614b4c565b82525050565b6000606082019050614d1f6000830186614cdd565b614d2c6020830185614cec565b614d396040830184614cfb565b949350505050565b600060208284031215614d5757614d5661473c565b5b6000614d65848285016148f7565b91505092915050565b600060ff82169050919050565b614d8481614d6e565b82525050565b6000602082019050614d9f6000830184614d7b565b92915050565b614dae816148ce565b82525050565b6000602082019050614dc96000830184614da5565b92915050565b60008060008060808587031215614de957614de861473c565b5b6000614df78782880161492d565b9450506020614e08878288016149d0565b9350506040614e198782880161492d565b9250506060614e2a8782880161492d565b91505092959194509250565b614e3f81614acf565b82525050565b614e4e81614b0b565b82525050565b614e5d81614b4c565b82525050565b606082016000820151614e796000850182614e36565b506020820151614e8c6020850182614e45565b506040820151614e9f6040850182614e54565b50505050565b6000606082019050614eba6000830184614e63565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b614ee581614ec0565b82525050565b6000602082019050614f006000830184614edc565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614f4d57607f821691505b602082108103614f6057614f5f614f06565b5b50919050565b7f4558504952454400000000000000000000000000000000000000000000000000600082015250565b6000614f9c600783614807565b9150614fa782614f66565b602082019050919050565b60006020820190508181036000830152614fcb81614f8f565b9050919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b6000615008600a83614807565b915061501382614fd2565b602082019050919050565b6000602082019050818103600083015261503781614ffb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006150788261490c565b91506150838361490c565b925082820390508181111561509b5761509a61503e565b5b92915050565b60006150ac8261490c565b91506150b78361490c565b92508282019050808211156150cf576150ce61503e565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b600061510b600a83614807565b9150615116826150d5565b602082019050919050565b6000602082019050818103600083015261513a816150fe565b9050919050565b600061514c8261490c565b91506151578361490c565b92508282026151658161490c565b9150828204841483151761517c5761517b61503e565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006151bd8261490c565b91506151c88361490c565b9250826151d8576151d7615183565b5b828204905092915050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b6000615219601183614807565b9150615224826151e3565b602082019050919050565b600060208201905081810360008301526152488161520c565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b6000615285601283614807565b91506152908261524f565b602082019050919050565b600060208201905081810360008301526152b481615278565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000615320600d83614807565b915061532b826152ea565b602082019050919050565b6000602082019050818103600083015261534f81615313565b9050919050565b61535f81614ec0565b811461536a57600080fd5b50565b60008151905061537c81615356565b92915050565b6000602082840312156153985761539761473c565b5b60006153a68482850161536d565b9150509291505056fea2646970667358221220bdad8b7651c658121a07388a22a62150eafd0f38a872cf057ef212005a607df764736f6c63430008110033
-\ No newline at end of file
+6101006040523480156200001257600080fd5b506040516200626e3803806200626e833981810160405281019062000038919062000863565b6801000000000000000083600f0b126200005157600080fd5b6200005b62000578565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508660069081620000ad919062000b84565b508560079081620000bf919062000b84565b508460ff16608081815250504260038190555060035460a08181525050603c83620000eb919062000c9a565b60c08181525050620001126001620002a96401000000000262002f33176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200016c84620002d06401000000000262002f59176401000000009004565b600f0b60e081600f0b81525050620001a86000600260009054906101000a9004600f0b6000600162000324640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000ce5565b6000677fffffffffffffff821115620002c157600080fd5b6040829060020a029050919050565b60008082600f0b13620002e257600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af6200030f84620003a8640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b6200032e62000578565b6200033862000578565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b13620003ba57600080fd5b60008083600f0b9050680100000000000000008112620003f6576040819060008212600003808260020a82851804189250505090506040820191505b640100000000811262000425576020819060008212600003808260020a82851804189250505090506020820191505b62010000811262000452576010819060008212600003808260020a82851804189250505090506010820191505b61010081126200047e576008819060008212600003808260020a82851804189250505090506008820191505b60108112620004a9576004819060008212600003808260020a82851804189250505090506004820191505b60048112620004d4576002819060008212600003808260020a82851804189250505090506002820191505b60028112620004e4576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b60008113156200056b578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a828518041892505050905062000511565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200061d82620005d2565b810181811067ffffffffffffffff821117156200063f576200063e620005e3565b5b80604052505050565b600062000654620005b4565b905062000662828262000612565b919050565b600067ffffffffffffffff821115620006855762000684620005e3565b5b6200069082620005d2565b9050602081019050919050565b60005b83811015620006bd578082015181840152602081019050620006a0565b60008484015250505050565b6000620006e0620006da8462000667565b62000648565b905082815260208101848484011115620006ff57620006fe620005cd565b5b6200070c8482856200069d565b509392505050565b600082601f8301126200072c576200072b620005c8565b5b81516200073e848260208601620006c9565b91505092915050565b600060ff82169050919050565b6200075f8162000747565b81146200076b57600080fd5b50565b6000815190506200077f8162000754565b92915050565b600081600f0b9050919050565b6200079d8162000785565b8114620007a957600080fd5b50565b600081519050620007bd8162000792565b92915050565b6000819050919050565b620007d881620007c3565b8114620007e457600080fd5b50565b600081519050620007f881620007cd565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200082b82620007fe565b9050919050565b6200083d816200081e565b81146200084957600080fd5b50565b6000815190506200085d8162000832565b92915050565b60008060008060008060c08789031215620008835762000882620005be565b5b600087015167ffffffffffffffff811115620008a457620008a3620005c3565b5b620008b289828a0162000714565b965050602087015167ffffffffffffffff811115620008d657620008d5620005c3565b5b620008e489828a0162000714565b9550506040620008f789828a016200076e565b94505060606200090a89828a01620007ac565b93505060806200091d89828a01620007e7565b92505060a06200093089828a016200084c565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200099057607f821691505b602082108103620009a657620009a562000948565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000a137fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620009d1565b62000a1f8683620009d1565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000a6262000a5c62000a5684620007c3565b62000a37565b620007c3565b9050919050565b6000819050919050565b62000a7e8362000a41565b62000a9662000a8d8262000a69565b848454620009e1565b825550505050565b600090565b62000aad62000a9e565b62000aba81848462000a73565b505050565b5b8181101562000ae25762000ad660008262000aa3565b60018101905062000ac0565b5050565b601f82111562000b315762000afb81620009ac565b62000b0684620009c1565b8101602085101562000b16578190505b62000b2e62000b2585620009c1565b83018262000abf565b50505b505050565b60008160020a8304905092915050565b600062000b596000198460080262000b36565b1980831691505092915050565b600062000b74838362000b46565b9150826002028217905092915050565b62000b8f826200093d565b67ffffffffffffffff81111562000bab5762000baa620005e3565b5b62000bb7825462000977565b62000bc482828562000ae6565b600060209050601f83116001811462000bfc576000841562000be7578287015190505b62000bf3858262000b66565b86555062000c63565b601f19841662000c0c86620009ac565b60005b8281101562000c365784890151825560018201915060208501945060208101905062000c0f565b8683101562000c56578489015162000c52601f89168262000b46565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000ca782620007c3565b915062000cb483620007c3565b925082820262000cc481620007c3565b9150828204841483151762000cde5762000cdd62000c6b565b5b5092915050565b60805160a05160c05160e05161550962000d656000396000818161127f015281816115b3015281816124db0152612a85015260008181611b9e0152818161249e015281816129dd01528181612c210152612e09015260008181611bca01528181612c4d01528181612e2a0152612e6f0152600061161101526155096000f3fe608060405234801561001057600080fd5b50600436106103ab576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e116101fb578063a457c2d71161012c578063d7a52fa9116100ca578063e69571af11610099578063e69571af14610be4578063e809529514610c14578063eda4e6d614610c32578063f2fde38b14610c50576103ab565b8063d7a52fa914610b4a578063d89135cd14610b66578063da2824a814610b84578063e54063a614610bb4576103ab565b8063b470aade11610106578063b470aade14610ac0578063c0ab707714610ade578063d340ef8a14610b0e578063d5abeb0114610b2c576103ab565b8063a457c2d714610a42578063a9059cbb14610a72578063b1cb0db314610aa2576103ab565b806379ba5097116101995780638da5cb5b116101735780638da5cb5b146109cc5780638f0b2d5d146109ea5780638f1df6bc14610a0657806395d89b4114610a24576103ab565b806379ba50971461096057806384dde4af1461097e57806386fe212d1461099c576103ab565b8063731f237c116101d5578063731f237c146108d657806373f42561146108f45780637445e33a1461091257806374bedb9514610942576103ab565b80636a2d094e1461085a5780636f8b44b01461088a57806370a08231146108a6576103ab565b80632c1758c1116102e0578063449a52f81161027e57806358b2833b1161024d57806358b2833b146107be5780635ae06f7e146107dc5780635f408c041461080c5780636787a9be1461082a576103ab565b8063449a52f8146106fe57806347a505171461072e5780634abfbba21461075e57806351b4541c1461078e576103ab565b806331a5995d116102ba57806331a5995d14610662578063395093511461068057806340452d91146106b057806342966c68146106e2576103ab565b80632c1758c1146105e45780633133348714610614578063313ce56714610644576103ab565b806318cbbcfc1161034d578063229ba19711610327578063229ba1971461053657806323a859441461055457806323b872dd146105845780632a7aec09146105b4576103ab565b806318cbbcfc146104ca5780631989c6a8146104e8578063213d1e1e14610506576103ab565b8063095ea7b311610389578063095ea7b31461042e57806309f28f3c1461045e57806311c566151461047c57806318160ddd146104ac576103ab565b806301681a62146103b057806301ffc9a7146103e057806306fdde0314610410575b600080fd5b6103ca60048036038101906103c591906148c3565b610c80565b6040516103d79190614909565b60405180910390f35b6103fa60048036038101906103f5919061497c565b610d69565b60405161040791906149c4565b60405180910390f35b610418610f0f565b6040516104259190614a6f565b60405180910390f35b61044860048036038101906104439190614abd565b610f9d565b60405161045591906149c4565b60405180910390f35b6104666111d9565b6040516104739190614b19565b60405180910390f35b61049660048036038101906104919190614b60565b6111ec565b6040516104a39190614909565b60405180910390f35b6104b461123c565b6040516104c19190614909565b60405180910390f35b6104d2611253565b6040516104df9190614909565b60405180910390f35b6104f0611258565b6040516104fd9190614909565b60405180910390f35b610520600480360381019061051b9190614d41565b611264565b60405161052d9190614909565b60405180910390f35b61053e61127d565b60405161054b9190614b19565b60405180910390f35b61056e60048036038101906105699190614d41565b6112a1565b60405161057b91906149c4565b60405180910390f35b61059e60048036038101906105999190614d6e565b611309565b6040516105ab91906149c4565b60405180910390f35b6105ce60048036038101906105c99190614d41565b611527565b6040516105db9190614b19565b60405180910390f35b6105fe60048036038101906105f99190614dc1565b61155f565b60405161060b91906149c4565b60405180910390f35b61062e60048036038101906106299190614dee565b611592565b60405161063b9190614909565b60405180910390f35b61064c61160f565b6040516106599190614909565b60405180910390f35b61066a611633565b6040516106779190614909565b60405180910390f35b61069a60048036038101906106959190614abd565b611639565b6040516106a791906149c4565b60405180910390f35b6106ca60048036038101906106c59190614dc1565b6117cf565b6040516106d993929190614e5b565b60405180910390f35b6106fc60048036038101906106f79190614dc1565b61183e565b005b61071860048036038101906107139190614abd565b61197a565b60405161072591906149c4565b60405180910390f35b610748600480360381019061074391906148c3565b611b51565b6040516107559190614909565b60405180910390f35b61077860048036038101906107739190614dc1565b611b9a565b6040516107859190614909565b60405180910390f35b6107a860048036038101906107a39190614dc1565b611bfa565b6040516107b59190614909565b60405180910390f35b6107c6611c1b565b6040516107d39190614909565b60405180910390f35b6107f660048036038101906107f191906148c3565b611c21565b60405161080391906149c4565b60405180910390f35b610814611d2b565b6040516108219190614eae565b60405180910390f35b610844600480360381019061083f9190614dc1565b611df8565b6040516108519190614909565b60405180910390f35b610874600480360381019061086f9190614dc1565b611e39565b6040516108819190614909565b60405180910390f35b6108a4600480360381019061089f9190614dc1565b611e5a565b005b6108c060048036038101906108bb91906148c3565b611f22565b6040516108cd9190614909565b60405180910390f35b6108de611f8c565b6040516108eb9190614909565b60405180910390f35b6108fc611f9d565b6040516109099190614909565b60405180910390f35b61092c60048036038101906109279190614d41565b611fa3565b6040516109399190614909565b60405180910390f35b61094a611fd1565b6040516109579190614909565b60405180910390f35b610968611fd7565b60405161097591906149c4565b60405180910390f35b61098661217e565b6040516109939190614ed8565b60405180910390f35b6109b660048036038101906109b19190614dc1565b6121a4565b6040516109c39190614909565b60405180910390f35b6109d461228b565b6040516109e19190614ed8565b60405180910390f35b610a0460048036038101906109ff91906148c3565b6122b1565b005b610a0e612366565b604051610a1b91906149c4565b60405180910390f35b610a2c612627565b604051610a399190614a6f565b60405180910390f35b610a5c6004803603810190610a579190614abd565b6126b5565b604051610a6991906149c4565b60405180910390f35b610a8c6004803603810190610a879190614abd565b6128d4565b604051610a9991906149c4565b60405180910390f35b610aaa6129d5565b604051610ab79190614909565b60405180910390f35b610ac86129db565b604051610ad59190614909565b60405180910390f35b610af86004803603810190610af39190614dc1565b6129ff565b604051610b059190614909565b60405180910390f35b610b16612b86565b604051610b239190614909565b60405180910390f35b610b34612b8c565b604051610b419190614909565b60405180910390f35b610b646004803603810190610b5f9190614dc1565b612b92565b005b610b6e612c91565b604051610b7b9190614909565b60405180910390f35b610b9e6004803603810190610b9991906148c3565b612c9b565b604051610bab91906149c4565b60405180910390f35b610bce6004803603810190610bc99190614d41565b612d6f565b604051610bdb9190614909565b60405180910390f35b610bfe6004803603810190610bf99190614ef3565b612d83565b604051610c0b9190614fc9565b60405180910390f35b610c1c612e03565b604051610c29919061500f565b60405180910390f35b610c3a612e6d565b604051610c479190614909565b60405180910390f35b610c6a6004803603810190610c6591906148c3565b612e91565b604051610c7791906149c4565b60405180910390f35b600080600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610d599190615059565b9250508190555080915050919050565b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610dbd5760019050610f0a565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610e0f5760019050610f0a565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610e615760019050610f0a565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610eb35760019050610f0a565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610f055760019050610f0a565b600090505b919050565b60068054610f1c906150bc565b80601f0160208091040260200160405190810160405280929190818152602001828054610f48906150bc565b8015610f955780601f10610f6a57610100808354040283529160200191610f95565b820191906000526020600020905b815481529060010190602001808311610f7857829003601f168201915b505050505081565b6000806000610faa611d2b565b905060028160ff1603610fc2576000925050506111d3565b60008160ff161115611009576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100090615139565b60405180910390fd5b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110d257600084146110d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c8906151a5565b60405180910390fd5b5b6110da612366565b506110e484611df8565b915081600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925866040516111c49190614909565b60405180910390a36001925050505b92915050565b600260009054906101000a9004600f0b81565b6000806112136111fb85612f33565b61120e6112086001612f33565b86612f9b565b613002565b905061121e81613081565b67ffffffffffffffff168461123391906151c5565b91505092915050565b6000600b5460085461124e91906151c5565b905090565b600f81565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080826000015163ffffffff1611156112be5760009050611304565b6000826020015168ffffffffffffffffff1611156112df5760009050611304565b6000826040015167ffffffffffffffff1611156112ff5760009050611304565b600190505b919050565b600080600080611317611d2b565b905060028160ff16036113305760009350505050611520565b60008160ff161115611377576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136e90615139565b60405180910390fd5b61137f612366565b5061138985611df8565b925082600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561141457600080fd5b82600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114a091906151c5565b925050819055506114b28787856130b6565b91508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516115119190614909565b60405180910390a38193505050505b9392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b03611556576115536001612f33565b90505b80915050919050565b6000600f821061156e57600080fd5b6000820361158357600f60125414905061158d565b8160125483161490505b919050565b6000806000806115a186612f33565b92506115ac85612f33565b91506115d87f000000000000000000000000000000000000000000000000000000000000000083613002565b90506115e3816130db565b90506115ef8382613002565b90506115fa81613081565b67ffffffffffffffff16935050505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60125481565b600080611644612366565b5061164e83611df8565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116dc9190615059565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516117bc9190614909565b60405180910390a3600191505092915050565b600081815481106117df57600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b6000611848611d2b565b60ff161461185557600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166118ab57600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111156118f757600080fd5b600061190282611df8565b905061190e3382613168565b5081600b60008282546119219190615059565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58360405161196e9190614909565b60405180910390a25050565b6000806000611987611d2b565b60ff161461199457600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611a395750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611a78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6f90615245565b60405180910390fd5b611a80612366565b5060006011541115611aa95760115483600854611a9d9190615059565b1115611aa857600080fd5b5b8260086000828254611abb9190615059565b92505081905550611acb83611df8565b9050611ad7848261326f565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051611b359190614909565b60405180910390a3611b45613333565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082611bc89190615265565b7f0000000000000000000000000000000000000000000000000000000000000000611bf39190615059565b9050919050565b6000603c8242611c0a91906151c5565b611c1491906152d6565b9050919050565b60035481565b6000611c30600160ff1661155f565b15611c3a57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611cc157503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b611cca57600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000601060009054906101000a900460ff1615611d4b5760019050611df5565b6000600f5403611d5e5760009050611df5565b600f544210611df057611d8b603c600354611d7991906152d6565b600f54611d8691906151c5565b6129ff565b506001601060006101000a81548160ff0219169083151502179055507ff80dbaea4785589e52984ca36a31de106adc77759539a5c7d92883bf49692fe942604051611dd69190614909565b60405180910390a1611de6612366565b5060029050611df5565b600090505b90565b600080611e1c611e0784612f33565b600260009054906101000a9004600f0b6134f7565b9050611e2781613081565b67ffffffffffffffff16915050919050565b6000603c8242611e4991906151c5565b611e5391906152d6565b9050919050565b611e67600860ff1661155f565b15611e7157600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ecb57600080fd5b611ed361123c565b8111611ede57600080fd5b6011547f9722adea12ab7ef86fc45b88f0e0b567639e8dddaae60261e08c03d747fbbfe682604051611f109190614909565b60405180910390a28060118190555050565b6000806000806000611f3b611f3687611b51565b612f33565b9350611f48600354611bfa565b9150611f6384600260009054906101000a9004600f0b613002565b9250611f81611f7184613081565b67ffffffffffffffff1683611592565b945050505050919050565b6000611f9860006129ff565b905090565b600b5481565b6000806000611fb184611264565b9150611fbc84611527565b9050611fc882826111ec565b92505050919050565b600a5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461203457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601082106121e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e090615353565b60405180910390fd5b6000601254831614612230576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612227906153bf565b60405180910390fd5b81601260008282541792505081905550600f6012541415157f6b7e2e653f93b645d4ed7292d6429f96637084363e477c8aaea1a43ed13c284e6012546040516122799190614909565b60405180910390a26012549050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6122be600260ff1661155f565b156122c857600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461232257600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061237061481a565b61237861481a565b61238061481a565b6000806000806000612390611f8c565b50612399613583565b97506123a4886112a1565b156123ba57600098505050505050505050612624565b6000600954815481106123d0576123cf6153df565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050955061247d88612d6f565b945060018561248c9190615059565b905061249786611527565b9350603c857f00000000000000000000000000000000000000000000000000000000000000006124c79190615265565b6124d191906152d6565b915061250d6125087f000000000000000000000000000000000000000000000000000000000000000061250385612f33565b613002565b6130db565b925061252360008461251d61123c565b84612d83565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050506125df87613719565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d6758160405161260f9190614909565b60405180910390a16001985050505050505050505b90565b60078054612634906150bc565b80601f0160208091040260200160405190810160405280929190818152602001828054612660906150bc565b80156126ad5780601f10612682576101008083540402835291602001916126ad565b820191906000526020600020905b81548152906001019060200180831161269057829003601f168201915b505050505081565b6000806126c183611df8565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561274c57600080fd5b612754612366565b5080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127e191906151c5565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516128c19190614909565b60405180910390a3600191505092915050565b6000806000806128e2611d2b565b905060028160ff16036128fb57600093505050506129cf565b60008160ff161115612942576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293990615139565b60405180910390fd5b61294a612366565b5061295485611df8565b92506129613387856130b6565b91508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516129c09190614909565b60405180910390a38193505050505b92915050565b600f5481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806000601060009054906101000a900460ff1615612a29576000945050505050612b81565b612a34600354611bfa565b925060008303612a4b576000945050505050612b81565b600260009054906101000a9004600f0b9050600086118015612a6c57508286105b15612a75578592505b612a7e83612f33565b9150612aaa7f000000000000000000000000000000000000000000000000000000000000000083613002565b9350612ab5846130db565b9350612ad0600260009054906101000a9004600f0b85613002565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c83612b189190615265565b600354612b259190615059565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b604051612b719190614b19565b60405180910390a4829450505050505b919050565b60095481565b60115481565b6000612ba1600460ff1661155f565b15612bab57600080fd5b601060009054906101000a900460ff1615612bc557600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612c1f57600080fd5b7f000000000000000000000000000000000000000000000000000000000000000082612c4b9190615265565b7f0000000000000000000000000000000000000000000000000000000000000000612c769190615059565b9050600f548111612c8657600080fd5b80600f819055505050565b6000600b54905090565b6000612caa600160ff1661155f565b15612cb457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612d0e57600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000816000015163ffffffff169050919050565b612d8b61481a565b612d9361481a565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042612e5491906151c5565b612e5e91906152d6565b612e689190615059565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612eed57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000677fffffffffffffff821115612f4a57600080fd5b6040829060020a029050919050565b60008082600f0b13612f6a57600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af612f8684613838565b600f0b02908060020a82049150509050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612fef57506f7fffffffffffffffffffffffffffffff600f0b8113155b612ff857600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561306e57506f7fffffffffffffffffffffffffffffff600f0b8113155b61307757600080fd5b8091505092915050565b60008082600f0b121561309357600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b6000806130c38584613168565b506130ce848461326f565b5060019150509392505050565b60006840000000000000000082600f0b126130f557600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156131295760009050613163565b6131606080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a8285180418925050506139fe565b90505b919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036131c45760009350505050613269565b6131cd86611b51565b925084831015613212576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132099061545a565b60405180910390fd5b848361321e91906151c5565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036132cb576000935050505061332d565b6132d486611b51565b925084836132e29190615059565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600061333d61481a565b600061334761123c565b90506000600160008054905061335d91906151c5565b8154811061336e5761336d6153df565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff1681525050816000600160008054905061344991906151c5565b8154811061345a576134596153df565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b0361350857600080fd5b600082600f0b604085600f0b9060020a0281613527576135266152a7565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561357057506f7fffffffffffffffffffffffffffffff600f0b8113155b61357957600080fd5b8091505092915050565b61358b61481a565b61359361481a565b61359b61481a565b600080600954815481106135b2576135b16153df565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa1580156136bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136e191906154a6565b6fffffffffffffffffffffffffffffffff1690506136fe83612d6f565b811161370f57819350505050613716565b8293505050505b90565b600080600061372784611fa3565b61372f61123c565b61373991906151c5565b9150600a5461374783611df8565b61375191906151c5565b905061377f600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168261326f565b50836000015163ffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d3846040516137f39190614909565b60405180910390a360016009600082825461380e9190615059565b9250508190555080600a60008282546138279190615059565b925050819055508192505050919050565b60008082600f0b1361384957600080fd5b60008083600f0b9050680100000000000000008112613884576040819060008212600003808260020a82851804189250505090506040820191505b64010000000081126138b2576020819060008212600003808260020a82851804189250505090506020820191505b6201000081126138de576010819060008212600003808260020a82851804189250505090506010820191505b6101008112613909576008819060008212600003808260020a82851804189250505090506008820191505b60108112613933576004819060008212600003808260020a82851804189250505090506004820191505b6004811261395d576002819060008212600003808260020a82851804189250505090506002820191505b6002811261396c576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b60008113156139f1578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050613999565b5081945050505050919050565b60006840000000000000000082600f0b12613a1857600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215613a4c5760009050614815565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b1315613a9a57608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b1315613ad35760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b1315613b0c5760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b1315613b4557608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b1315613b7e5760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315613bb7576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b1315613bf057608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b1315613c29576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b1315613c6157608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b1315613c995760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315613cd1576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b1315613d095760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b1315613d41576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b1315613d7957608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b1315613db15760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b1315613de957608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b1315613e205760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b1315613e57576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b1315613e8e57608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315613ec5576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b1315613efc57608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b1315613f335760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b1315613f6a576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b1315613fa15760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315613fd7576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b131561400d57608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b13156140435760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b131561407957608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b13156140af5760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b13156140e5576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b131561411b57608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b1315614151576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b131561418657608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b13156141bb5760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b13156141f0576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b13156142255760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b131561425a576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b131561428f57608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b13156142c45760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b13156142f957608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b131561432d5760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b1315614361576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b131561439557608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b13156143c9576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b13156143fd57608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b13156144315760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b1315614465576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b13156144995760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b13156144cc576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b13156144ff57608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b13156145325760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b131561456557608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156145985760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b13156145cb576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b13156145fe57608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b1315614631576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b131561466357608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b13156146955760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b13156146c7576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b13156146f95760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b131561472b576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b131561475d57608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b131561478f5760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b13156147c157608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b81111561481057600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061489082614865565b9050919050565b6148a081614885565b81146148ab57600080fd5b50565b6000813590506148bd81614897565b92915050565b6000602082840312156148d9576148d8614860565b5b60006148e7848285016148ae565b91505092915050565b6000819050919050565b614903816148f0565b82525050565b600060208201905061491e60008301846148fa565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61495981614924565b811461496457600080fd5b50565b60008135905061497681614950565b92915050565b60006020828403121561499257614991614860565b5b60006149a084828501614967565b91505092915050565b60008115159050919050565b6149be816149a9565b82525050565b60006020820190506149d960008301846149b5565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614a195780820151818401526020810190506149fe565b60008484015250505050565b6000601f19601f8301169050919050565b6000614a41826149df565b614a4b81856149ea565b9350614a5b8185602086016149fb565b614a6481614a25565b840191505092915050565b60006020820190508181036000830152614a898184614a36565b905092915050565b614a9a816148f0565b8114614aa557600080fd5b50565b600081359050614ab781614a91565b92915050565b60008060408385031215614ad457614ad3614860565b5b6000614ae2858286016148ae565b9250506020614af385828601614aa8565b9150509250929050565b600081600f0b9050919050565b614b1381614afd565b82525050565b6000602082019050614b2e6000830184614b0a565b92915050565b614b3d81614afd565b8114614b4857600080fd5b50565b600081359050614b5a81614b34565b92915050565b60008060408385031215614b7757614b76614860565b5b6000614b8585828601614aa8565b9250506020614b9685828601614b4b565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614bdd82614a25565b810181811067ffffffffffffffff82111715614bfc57614bfb614ba5565b5b80604052505050565b6000614c0f614856565b9050614c1b8282614bd4565b919050565b600063ffffffff82169050919050565b614c3981614c20565b8114614c4457600080fd5b50565b600081359050614c5681614c30565b92915050565b600068ffffffffffffffffff82169050919050565b614c7a81614c5c565b8114614c8557600080fd5b50565b600081359050614c9781614c71565b92915050565b600067ffffffffffffffff82169050919050565b614cba81614c9d565b8114614cc557600080fd5b50565b600081359050614cd781614cb1565b92915050565b600060608284031215614cf357614cf2614ba0565b5b614cfd6060614c05565b90506000614d0d84828501614c47565b6000830152506020614d2184828501614c88565b6020830152506040614d3584828501614cc8565b60408301525092915050565b600060608284031215614d5757614d56614860565b5b6000614d6584828501614cdd565b91505092915050565b600080600060608486031215614d8757614d86614860565b5b6000614d95868287016148ae565b9350506020614da6868287016148ae565b9250506040614db786828701614aa8565b9150509250925092565b600060208284031215614dd757614dd6614860565b5b6000614de584828501614aa8565b91505092915050565b60008060408385031215614e0557614e04614860565b5b6000614e1385828601614aa8565b9250506020614e2485828601614aa8565b9150509250929050565b614e3781614c20565b82525050565b614e4681614c5c565b82525050565b614e5581614c9d565b82525050565b6000606082019050614e706000830186614e2e565b614e7d6020830185614e3d565b614e8a6040830184614e4c565b949350505050565b600060ff82169050919050565b614ea881614e92565b82525050565b6000602082019050614ec36000830184614e9f565b92915050565b614ed281614885565b82525050565b6000602082019050614eed6000830184614ec9565b92915050565b60008060008060808587031215614f0d57614f0c614860565b5b6000614f1b87828801614aa8565b9450506020614f2c87828801614b4b565b9350506040614f3d87828801614aa8565b9250506060614f4e87828801614aa8565b91505092959194509250565b614f6381614c20565b82525050565b614f7281614c5c565b82525050565b614f8181614c9d565b82525050565b606082016000820151614f9d6000850182614f5a565b506020820151614fb06020850182614f69565b506040820151614fc36040850182614f78565b50505050565b6000606082019050614fde6000830184614f87565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b61500981614fe4565b82525050565b60006020820190506150246000830184615000565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000615064826148f0565b915061506f836148f0565b92508282019050808211156150875761508661502a565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806150d457607f821691505b6020821081036150e7576150e661508d565b5b50919050565b7f4558504952454400000000000000000000000000000000000000000000000000600082015250565b60006151236007836149ea565b915061512e826150ed565b602082019050919050565b6000602082019050818103600083015261515281615116565b9050919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b600061518f600a836149ea565b915061519a82615159565b602082019050919050565b600060208201905081810360008301526151be81615182565b9050919050565b60006151d0826148f0565b91506151db836148f0565b92508282039050818111156151f3576151f261502a565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b600061522f600a836149ea565b915061523a826151f9565b602082019050919050565b6000602082019050818103600083015261525e81615222565b9050919050565b6000615270826148f0565b915061527b836148f0565b9250828202615289816148f0565b915082820484148315176152a05761529f61502a565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006152e1826148f0565b91506152ec836148f0565b9250826152fc576152fb6152a7565b5b828204905092915050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b600061533d6011836149ea565b915061534882615307565b602082019050919050565b6000602082019050818103600083015261536c81615330565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b60006153a96012836149ea565b91506153b482615373565b602082019050919050565b600060208201905081810360008301526153d88161539c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000615444600d836149ea565b915061544f8261540e565b602082019050919050565b6000602082019050818103600083015261547381615437565b9050919050565b61548381614fe4565b811461548e57600080fd5b50565b6000815190506154a08161547a565b92915050565b6000602082840312156154bc576154bb614860565b5b60006154ca84828501615491565b9150509291505056fea2646970667358221220e513c18e024f61f7df896fc073669e7f70fe7cc019a4c2107ebd579df21546ae64736f6c63430008110033
+\ No newline at end of file
diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json
@@ -1 +1 @@
-[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_taxLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_oldCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newCap","type":"uint256"}],"name":"Cap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int128","name":"_foo","type":"int128"},{"indexed":true,"internalType":"uint256","name":"_bar","type":"uint256"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"int128","name":"_oldAmount","type":"int128"},{"indexed":false,"internalType":"int128","name":"_newAmount","type":"int128"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"Expired","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"_final","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_sealState","type":"uint256"}],"name":"SealStateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyExpiry","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"deleteWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"int128","name":"_demurrageAmount","type":"int128"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"seal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_expirePeriod","type":"uint256"}],"name":"setExpirePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cap","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"int128","name":"_demurrageModifier","type":"int128"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
+[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_taxLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_oldCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newCap","type":"uint256"}],"name":"Cap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int128","name":"_foo","type":"int128"},{"indexed":true,"internalType":"uint256","name":"_bar","type":"uint256"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"int128","name":"_oldAmount","type":"int128"},{"indexed":false,"internalType":"int128","name":"_newAmount","type":"int128"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"Expired","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"_final","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_sealState","type":"uint256"}],"name":"SealStateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyExpiry","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"deleteWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"int128","name":"_demurrageAmount","type":"int128"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"seal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_expirePeriod","type":"uint256"}],"name":"setExpirePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cap","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"sweep","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"int128","name":"_demurrageModifier","type":"int128"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
diff --git a/python/erc20_demurrage_token/token.py b/python/erc20_demurrage_token/token.py
@@ -443,6 +443,19 @@ class DemurrageToken(ERC20, SealedContract, ExpiryContract):
return tx
+ def sweep(self, contract_address, sender_address, recipient_address, tx_format=TxFormat.JSONRPC):
+ enc = ABIContractEncoder()
+ enc.method('sweep')
+ enc.typ(ABIContractType.ADDRESS)
+ enc.address(recipient_address)
+ data = enc.get()
+ tx = self.template(sender_address, contract_address, use_nonce=True)
+ tx = self.set_code(tx, data)
+ tx = self.finalize(tx, tx_format)
+ return tx
+
+
+
def apply_demurrage(self, contract_address, sender_address, limit=0, tx_format=TxFormat.JSONRPC):
if limit == 0:
return self.transact_noarg('applyDemurrage', contract_address, sender_address)
@@ -474,8 +487,6 @@ class DemurrageToken(ERC20, SealedContract, ExpiryContract):
return tx
-
-
def tax_level(self, contract_address, sender_address=ZERO_ADDRESS):
return self.call_noarg('taxLevel', contract_address, sender_address=sender_address)
diff --git a/python/setup.cfg b/python/setup.cfg
@@ -1,6 +1,6 @@
[metadata]
name = erc20-demurrage-token
-version = 0.3.6
+version = 0.3.7
description = ERC20 token with redistributed continual demurrage
author = Louis Holbrook
author_email = dev@holbrook.no
diff --git a/python/tests/test_amounts.py b/python/tests/test_amounts.py
@@ -122,5 +122,26 @@ class TestAmounts(TestDemurrageDefault):
self.assert_within_lower(balance, case[1], 10000)
+ def test_sweep(self):
+ nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc)
+ c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle)
+ (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[0], 2000)
+ r = self.rpc.do(o)
+
+ (tx_hash, o) = c.sweep(self.address, self.accounts[0], self.accounts[1])
+ self.rpc.do(o)
+ o = receipt(tx_hash)
+ r = self.rpc.do(o)
+ self.assertEqual(r['status'], 1)
+
+ o = c.balance_of(self.address, self.accounts[0], sender_address=self.accounts[0])
+ r = self.rpc.do(o)
+ self.assertEqual(c.parse_balance(r), 0)
+
+ o = c.balance_of(self.address, self.accounts[1], sender_address=self.accounts[0])
+ r = self.rpc.do(o)
+ self.assert_within(c.parse_balance(r), 2000, 1)
+
+
if __name__ == '__main__':
unittest.main()
diff --git a/solidity/DemurrageTokenSingleNocap.sol b/solidity/DemurrageTokenSingleNocap.sol
@@ -292,6 +292,16 @@ contract DemurrageTokenSingleNocap {
return true;
}
+ // Send full balance of one account to another
+ function sweep(address _account) public returns (uint256) {
+ uint256 v;
+
+ v = account[msg.sender];
+ account[msg.sender] = 0;
+ account[_account] += v;
+ return v;
+ }
+
// Creates new tokens out of thin air, and allocates them to the given address
// Triggers tax
function mintTo(address _beneficiary, uint256 _amount) external returns (bool) {