erc20-demurrage-token

ERC20 token with redistributed continual demurrage
Log | Files | Refs | README

commit 23de062ab92d89872db82861482368bb9b4adf29
parent c25e018cd16f6ec13c47874cacae910ff11b6f21
Author: lash <dev@holbrook.no>
Date:   Fri, 10 Feb 2023 12:22:50 +0000

Add expiry implementation, after expire sink gets all

Diffstat:
Mpython/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin | 4++--
Mpython/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json | 2+-
Mpython/erc20_demurrage_token/token.py | 6+++++-
Mpython/erc20_demurrage_token/unittest/base.py | 2+-
Msolidity/DemurrageTokenSingleNocap.sol | 91+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
5 files changed, 96 insertions(+), 9 deletions(-)

diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin @@ -1 +1 @@ -60c06040523480156200001157600080fd5b50604051620057ad380380620057ad833981810160405281019062000037919062000909565b6801000000000000000083600f0b126200005057600080fd5b6200005a6200061e565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550866006908162000126919062000c2a565b50856007908162000138919062000c2a565b508460ff166008819055504260038190555060035460808181525050603c8362000163919062000d40565b60a081815250506200018a60016200034f640100000000026200257e176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550620001e4846200037664010000000002620025a4176401000000009004565b600d60006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200024e6000600260009054906101000a9004600f0b60006001620003ca640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000d8b565b6000677fffffffffffffff8211156200036757600080fd5b6040829060020a029050919050565b60008082600f0b136200038857600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af620003b5846200044e640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b620003d46200061e565b620003de6200061e565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b136200046057600080fd5b60008083600f0b90506801000000000000000081126200049c576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112620004cb576020819060008212600003808260020a82851804189250505090506020820191505b620100008112620004f8576010819060008212600003808260020a82851804189250505090506010820191505b610100811262000524576008819060008212600003808260020a82851804189250505090506008820191505b601081126200054f576004819060008212600003808260020a82851804189250505090506004820191505b600481126200057a576002819060008212600003808260020a82851804189250505090506002820191505b600281126200058a576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131562000611578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050620005b7565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620006c38262000678565b810181811067ffffffffffffffff82111715620006e557620006e462000689565b5b80604052505050565b6000620006fa6200065a565b9050620007088282620006b8565b919050565b600067ffffffffffffffff8211156200072b576200072a62000689565b5b620007368262000678565b9050602081019050919050565b60005b838110156200076357808201518184015260208101905062000746565b60008484015250505050565b60006200078662000780846200070d565b620006ee565b905082815260208101848484011115620007a557620007a462000673565b5b620007b284828562000743565b509392505050565b600082601f830112620007d257620007d16200066e565b5b8151620007e48482602086016200076f565b91505092915050565b600060ff82169050919050565b6200080581620007ed565b81146200081157600080fd5b50565b6000815190506200082581620007fa565b92915050565b600081600f0b9050919050565b62000843816200082b565b81146200084f57600080fd5b50565b600081519050620008638162000838565b92915050565b6000819050919050565b6200087e8162000869565b81146200088a57600080fd5b50565b6000815190506200089e8162000873565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008d182620008a4565b9050919050565b620008e381620008c4565b8114620008ef57600080fd5b50565b6000815190506200090381620008d8565b92915050565b60008060008060008060c0878903121562000929576200092862000664565b5b600087015167ffffffffffffffff8111156200094a576200094962000669565b5b6200095889828a01620007ba565b965050602087015167ffffffffffffffff8111156200097c576200097b62000669565b5b6200098a89828a01620007ba565b95505060406200099d89828a0162000814565b9450506060620009b089828a0162000852565b9350506080620009c389828a016200088d565b92505060a0620009d689828a01620008f2565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a3657607f821691505b60208210810362000a4c5762000a4b620009ee565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000ab97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000a77565b62000ac5868362000a77565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000b0862000b0262000afc8462000869565b62000add565b62000869565b9050919050565b6000819050919050565b62000b248362000ae7565b62000b3c62000b338262000b0f565b84845462000a87565b825550505050565b600090565b62000b5362000b44565b62000b6081848462000b19565b505050565b5b8181101562000b885762000b7c60008262000b49565b60018101905062000b66565b5050565b601f82111562000bd75762000ba18162000a52565b62000bac8462000a67565b8101602085101562000bbc578190505b62000bd462000bcb8562000a67565b83018262000b65565b50505b505050565b60008160020a8304905092915050565b600062000bff6000198460080262000bdc565b1980831691505092915050565b600062000c1a838362000bec565b9150826002028217905092915050565b62000c3582620009e3565b67ffffffffffffffff81111562000c515762000c5062000689565b5b62000c5d825462000a1d565b62000c6a82828562000b8c565b600060209050601f83116001811462000ca2576000841562000c8d578287015190505b62000c99858262000c0c565b86555062000d09565b601f19841662000cb28662000a52565b60005b8281101562000cdc5784890151825560018201915060208501945060208101905062000cb5565b8683101562000cfc578489015162000cf8601f89168262000bec565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000d4d8262000869565b915062000d5a8362000869565b925082820262000d6a8162000869565b9150828204841483151762000d845762000d8362000d11565b5b5092915050565b60805160a0516149d962000dd46000396000818161175a01528181611cba0152818161223401526124540152600081816117860152818161247501526124ba01526149d96000f3fe608060405234801561001057600080fd5b50600436106102bd576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e11610184578063983b2d56116100eb578063d89135cd116100a4578063d89135cd1461094a578063e54063a614610968578063e69571af14610998578063e8095295146109c8578063eda4e6d6146109e6578063f2fde38b14610a04576102bd565b8063983b2d561461084e578063a457c2d71461087e578063a9059cbb146108ae578063b470aade146108de578063c0ab7077146108fc578063d340ef8a1461092c576102bd565b806379ba50971161013d57806379ba50971461079c57806384dde4af146107ba5780638da5cb5b146107d85780638f0b2d5d146107f65780638f1df6bc1461081257806395d89b4114610830576102bd565b80636a2d094e146106b257806370a08231146106e2578063731f237c1461071257806373f42561146107305780637445e33a1461074e57806374bedb951461077e576102bd565b80633092afd511610228578063449a52f8116101e1578063449a52f8146105a457806347a50517146105d45780634abfbba21461060457806351b4541c1461063457806358b2833b146106645780636787a9be14610682576102bd565b80633092afd5146104a857806331333487146104d8578063313ce56714610508578063395093511461052657806340452d911461055657806342966c6814610588576102bd565b80631989c6a81161027a5780631989c6a8146103ac578063213d1e1e146103ca578063229ba197146103fa57806323a859441461041857806323b872dd146104485780632a7aec0914610478576102bd565b806301ffc9a7146102c257806306fdde03146102f2578063095ea7b31461031057806309f28f3c1461034057806311c566151461035e57806318160ddd1461038e575b600080fd5b6102dc60048036038101906102d79190613f08565b610a34565b6040516102e99190613f50565b60405180910390f35b6102fa610bda565b6040516103079190613ffb565b60405180910390f35b61032a600480360381019061032591906140b1565b610c68565b6040516103379190613f50565b60405180910390f35b610348610e39565b604051610355919061410d565b60405180910390f35b61037860048036038101906103739190614154565b610e4c565b60405161038591906141a3565b60405180910390f35b610396610e9c565b6040516103a391906141a3565b60405180910390f35b6103b4610eb3565b6040516103c191906141a3565b60405180910390f35b6103e460048036038101906103df919061435f565b610ebf565b6040516103f191906141a3565b60405180910390f35b610402610ed8565b60405161040f919061410d565b60405180910390f35b610432600480360381019061042d919061435f565b610eeb565b60405161043f9190613f50565b60405180910390f35b610462600480360381019061045d919061438c565b610f53565b60405161046f9190613f50565b60405180910390f35b610492600480360381019061048d919061435f565b611106565b60405161049f919061410d565b60405180910390f35b6104c260048036038101906104bd91906143df565b61113e565b6040516104cf9190613f50565b60405180910390f35b6104f260048036038101906104ed919061440c565b611231565b6040516104ff91906141a3565b60405180910390f35b61051061129d565b60405161051d91906141a3565b60405180910390f35b610540600480360381019061053b91906140b1565b6112a3565b60405161054d9190613f50565b60405180910390f35b610570600480360381019061056b919061444c565b611439565b60405161057f939291906144a6565b60405180910390f35b6105a2600480360381019061059d919061444c565b6114a8565b005b6105be60048036038101906105b991906140b1565b6115cd565b6040516105cb9190613f50565b60405180910390f35b6105ee60048036038101906105e991906143df565b61170d565b6040516105fb91906141a3565b60405180910390f35b61061e6004803603810190610619919061444c565b611756565b60405161062b91906141a3565b60405180910390f35b61064e6004803603810190610649919061444c565b6117b6565b60405161065b91906141a3565b60405180910390f35b61066c6117d7565b60405161067991906141a3565b60405180910390f35b61069c6004803603810190610697919061444c565b6117dd565b6040516106a991906141a3565b60405180910390f35b6106cc60048036038101906106c7919061444c565b61181e565b6040516106d991906141a3565b60405180910390f35b6106fc60048036038101906106f791906143df565b61183f565b60405161070991906141a3565b60405180910390f35b61071a6118a6565b60405161072791906141a3565b60405180910390f35b6107386118b7565b60405161074591906141a3565b60405180910390f35b6107686004803603810190610763919061435f565b6118bd565b60405161077591906141a3565b60405180910390f35b6107866118eb565b60405161079391906141a3565b60405180910390f35b6107a46118f1565b6040516107b19190613f50565b60405180910390f35b6107c2611a98565b6040516107cf91906144ec565b60405180910390f35b6107e0611abe565b6040516107ed91906144ec565b60405180910390f35b610810600480360381019061080b91906143df565b611ae4565b005b61081a611b82565b6040516108279190613f50565b60405180910390f35b610838611e32565b6040516108459190613ffb565b60405180910390f35b610868600480360381019061086391906143df565b611ec0565b6040516108759190613f50565b60405180910390f35b610898600480360381019061089391906140b1565b611f7d565b6040516108a59190613f50565b60405180910390f35b6108c860048036038101906108c391906140b1565b61219c565b6040516108d59190613f50565b60405180910390f35b6108e6612232565b6040516108f391906141a3565b60405180910390f35b6109166004803603810190610911919061444c565b612256565b60405161092391906141a3565b60405180910390f35b6109346123aa565b60405161094191906141a3565b60405180910390f35b6109526123b0565b60405161095f91906141a3565b60405180910390f35b610982600480360381019061097d919061435f565b6123ba565b60405161098f91906141a3565b60405180910390f35b6109b260048036038101906109ad9190614507565b6123ce565b6040516109bf91906145dd565b60405180910390f35b6109d061244e565b6040516109dd9190614623565b60405180910390f35b6109ee6124b8565b6040516109fb91906141a3565b60405180910390f35b610a1e6004803603810190610a1991906143df565b6124dc565b604051610a2b9190613f50565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a885760019050610bd5565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ada5760019050610bd5565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b2c5760019050610bd5565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b7e5760019050610bd5565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610bd05760019050610bd5565b600090505b919050565b60068054610be79061466d565b80601f0160208091040260200160405190810160405280929190818152602001828054610c139061466d565b8015610c605780601f10610c3557610100808354040283529160200191610c60565b820191906000526020600020905b815481529060010190602001808311610c4357829003601f168201915b505050505081565b6000806000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610d345760008314610d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2a906146ea565b60405180910390fd5b5b610d3c611b82565b50610d46836117dd565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610e2691906141a3565b60405180910390a3600191505092915050565b600260009054906101000a9004600f0b81565b600080610e73610e5b8561257e565b610e6e610e68600161257e565b866125e6565b61264d565b9050610e7e816126cc565b67ffffffffffffffff1684610e939190614739565b91505092915050565b6000600c54600954610eae9190614739565b905090565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b600d60009054906101000a9004600f0b81565b600080826000015163ffffffff161115610f085760009050610f4e565b6000826020015168ffffffffffffffffff161115610f295760009050610f4e565b6000826040015167ffffffffffffffff161115610f495760009050610f4e565b600190505b919050565b6000806000610f60611b82565b50610f6a846117dd565b915081600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610ff557600080fd5b81600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110819190614739565b92505081905550611093868684612701565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516110f291906141a3565b60405180910390a380925050509392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b0361113557611132600161257e565b90505b80915050919050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806111c757503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b6111d057600080fd5b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806000806112408661257e565b925061124b8561257e565b9150611266600d60009054906101000a9004600f0b8361264d565b905061127181612726565b905061127d838261264d565b9050611288816126cc565b67ffffffffffffffff16935050505092915050565b60085481565b6000806112ae611b82565b506112b8836117dd565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611346919061476d565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161142691906141a3565b60405180910390a3600191505092915050565b6000818154811061144957600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166114fe57600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481111561154a57600080fd5b6000611555826117dd565b905061156133826127b3565b5081600c6000828254611574919061476d565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5836040516115c191906141a3565b60405180910390a25050565b600080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661165c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611653906147ed565b60405180910390fd5b611664611b82565b5061166e836117dd565b90508260096000828254611682919061476d565b9250508190555061169384826128ba565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516116f191906141a3565b60405180910390a361170161297e565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082611784919061480d565b7f00000000000000000000000000000000000000000000000000000000000000006117af919061476d565b9050919050565b6000603c82426117c69190614739565b6117d0919061487e565b9050919050565b60035481565b6000806118016117ec8461257e565b600260009054906101000a9004600f0b612b42565b905061180c816126cc565b67ffffffffffffffff16915050919050565b6000603c824261182e9190614739565b611838919061487e565b9050919050565b6000806000806118566118518661170d565b61257e565b92506118636003546117b6565b905061187e83600260009054906101000a9004600f0b61264d565b915061189c61188c836126cc565b67ffffffffffffffff1682611231565b9350505050919050565b60006118b26000612256565b905090565b600c5481565b60008060006118cb84610ebf565b91506118d684611106565b90506118e28282610e4c565b92505050919050565b600b5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461194e57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b3e57600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611b8c613e65565b611b94613e65565b611b9c613e65565b6000806000806000611bac6118a6565b50611bb5612bce565b9750611bc088610eeb565b15611bd657600098505050505050505050611e2f565b6000600a5481548110611bec57611beb6148af565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509550611c99886123ba565b9450600185611ca8919061476d565b9050611cb386611106565b9350603c857f0000000000000000000000000000000000000000000000000000000000000000611ce3919061480d565b611ced919061487e565b9150611d18611d13600d60009054906101000a9004600f0b611d0e8561257e565b61264d565b612726565b9250611d2e600084611d28610e9c565b846123ce565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050611dea87612d64565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d67581604051611e1a91906141a3565b60405180910390a16001985050505050505050505b90565b60078054611e3f9061466d565b80601f0160208091040260200160405190810160405280929190818152602001828054611e6b9061466d565b8015611eb85780601f10611e8d57610100808354040283529160200191611eb8565b820191906000526020600020905b815481529060010190602001808311611e9b57829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f1c57600080fd5b6001600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080611f89836117dd565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561201457600080fd5b61201c611b82565b5080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120a99190614739565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161218991906141a3565b60405180910390a3600191505092915050565b60008060006121a9611b82565b506121b3846117dd565b91506121c0338684612701565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8660405161221f91906141a3565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008060008060006122696003546117b6565b9250600083036122805760009450505050506123a5565b600260009054906101000a9004600f0b90506000861180156122a157508286105b156122aa578592505b6122b38361257e565b91506122ce600d60009054906101000a9004600f0b8361264d565b93506122d984612726565b93506122f4600260009054906101000a9004600f0b8561264d565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c8361233c919061480d565b600354612349919061476d565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b604051612395919061410d565b60405180910390a4829450505050505b919050565b600a5481565b6000600c54905090565b6000816000015163ffffffff169050919050565b6123d6613e65565b6123de613e65565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000004261249f9190614739565b6124a9919061487e565b6124b3919061476d565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461253857600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000677fffffffffffffff82111561259557600080fd5b6040829060020a029050919050565b60008082600f0b136125b557600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af6125d184612e83565b600f0b02908060020a82049150509050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561263a57506f7fffffffffffffffffffffffffffffff600f0b8113155b61264357600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b81121580156126b957506f7fffffffffffffffffffffffffffffff600f0b8113155b6126c257600080fd5b8091505092915050565b60008082600f0b12156126de57600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b60008061270e85846127b3565b5061271984846128ba565b5060019150509392505050565b60006840000000000000000082600f0b1261274057600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b121561277457600090506127ae565b6127ab6080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a828518041892505050613049565b90505b919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000850361280f57600093505050506128b4565b6128188661170d565b92508483101561285d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128549061492a565b60405180910390fd5b84836128699190614739565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036129165760009350505050612978565b61291f8661170d565b9250848361292d919061476d565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000612988613e65565b6000612992610e9c565b9050600060016000805490506129a89190614739565b815481106129b9576129b86148af565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff16815250508160006001600080549050612a949190614739565b81548110612aa557612aa46148af565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b03612b5357600080fd5b600082600f0b604085600f0b9060020a0281612b7257612b7161484f565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612bbb57506f7fffffffffffffffffffffffffffffff600f0b8113155b612bc457600080fd5b8091505092915050565b612bd6613e65565b612bde613e65565b612be6613e65565b600080600a5481548110612bfd57612bfc6148af565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015612d08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d2c9190614976565b6fffffffffffffffffffffffffffffffff169050612d49836123ba565b8111612d5a57819350505050612d61565b8293505050505b90565b6000806000612d72846118bd565b612d7a610e9c565b612d849190614739565b9150600b54612d92836117dd565b612d9c9190614739565b9050612dca601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826128ba565b50836000015163ffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d384604051612e3e91906141a3565b60405180910390a36001600a6000828254612e59919061476d565b9250508190555080600b6000828254612e72919061476d565b925050819055508192505050919050565b60008082600f0b13612e9457600080fd5b60008083600f0b9050680100000000000000008112612ecf576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112612efd576020819060008212600003808260020a82851804189250505090506020820191505b620100008112612f29576010819060008212600003808260020a82851804189250505090506010820191505b6101008112612f54576008819060008212600003808260020a82851804189250505090506008820191505b60108112612f7e576004819060008212600003808260020a82851804189250505090506004820191505b60048112612fa8576002819060008212600003808260020a82851804189250505090506002820191505b60028112612fb7576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131561303c578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050612fe4565b5081945050505050919050565b60006840000000000000000082600f0b1261306357600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156130975760009050613e60565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b13156130e557608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b131561311e5760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b13156131575760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b131561319057608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b13156131c95760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315613202576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b131561323b57608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b1315613274576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b13156132ac57608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b13156132e45760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b131561331c576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b13156133545760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b131561338c576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b13156133c457608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b13156133fc5760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b131561343457608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b131561346b5760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b13156134a2576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b13156134d957608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315613510576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b131561354757608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b131561357e5760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b13156135b5576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b13156135ec5760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315613622576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b131561365857608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b131561368e5760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b13156136c457608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b13156136fa5760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b1315613730576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b131561376657608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b131561379c576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b13156137d157608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b13156138065760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b131561383b576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b13156138705760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b13156138a5576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b13156138da57608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b131561390f5760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b131561394457608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b13156139785760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b13156139ac576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b13156139e057608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b1315613a14576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b1315613a4857608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b1315613a7c5760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b1315613ab0576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b1315613ae45760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b1315613b17576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b1315613b4a57608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b1315613b7d5760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b1315613bb057608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b1315613be35760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b1315613c16576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b1315613c4957608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b1315613c7c576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b1315613cae57608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b1315613ce05760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b1315613d12576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b1315613d445760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b1315613d76576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b1315613da857608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b1315613dda5760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b1315613e0c57608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b811115613e5b57600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613ee581613eb0565b8114613ef057600080fd5b50565b600081359050613f0281613edc565b92915050565b600060208284031215613f1e57613f1d613eab565b5b6000613f2c84828501613ef3565b91505092915050565b60008115159050919050565b613f4a81613f35565b82525050565b6000602082019050613f656000830184613f41565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613fa5578082015181840152602081019050613f8a565b60008484015250505050565b6000601f19601f8301169050919050565b6000613fcd82613f6b565b613fd78185613f76565b9350613fe7818560208601613f87565b613ff081613fb1565b840191505092915050565b600060208201905081810360008301526140158184613fc2565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006140488261401d565b9050919050565b6140588161403d565b811461406357600080fd5b50565b6000813590506140758161404f565b92915050565b6000819050919050565b61408e8161407b565b811461409957600080fd5b50565b6000813590506140ab81614085565b92915050565b600080604083850312156140c8576140c7613eab565b5b60006140d685828601614066565b92505060206140e78582860161409c565b9150509250929050565b600081600f0b9050919050565b614107816140f1565b82525050565b600060208201905061412260008301846140fe565b92915050565b614131816140f1565b811461413c57600080fd5b50565b60008135905061414e81614128565b92915050565b6000806040838503121561416b5761416a613eab565b5b60006141798582860161409c565b925050602061418a8582860161413f565b9150509250929050565b61419d8161407b565b82525050565b60006020820190506141b86000830184614194565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6141fb82613fb1565b810181811067ffffffffffffffff8211171561421a576142196141c3565b5b80604052505050565b600061422d613ea1565b905061423982826141f2565b919050565b600063ffffffff82169050919050565b6142578161423e565b811461426257600080fd5b50565b6000813590506142748161424e565b92915050565b600068ffffffffffffffffff82169050919050565b6142988161427a565b81146142a357600080fd5b50565b6000813590506142b58161428f565b92915050565b600067ffffffffffffffff82169050919050565b6142d8816142bb565b81146142e357600080fd5b50565b6000813590506142f5816142cf565b92915050565b600060608284031215614311576143106141be565b5b61431b6060614223565b9050600061432b84828501614265565b600083015250602061433f848285016142a6565b6020830152506040614353848285016142e6565b60408301525092915050565b60006060828403121561437557614374613eab565b5b6000614383848285016142fb565b91505092915050565b6000806000606084860312156143a5576143a4613eab565b5b60006143b386828701614066565b93505060206143c486828701614066565b92505060406143d58682870161409c565b9150509250925092565b6000602082840312156143f5576143f4613eab565b5b600061440384828501614066565b91505092915050565b6000806040838503121561442357614422613eab565b5b60006144318582860161409c565b92505060206144428582860161409c565b9150509250929050565b60006020828403121561446257614461613eab565b5b60006144708482850161409c565b91505092915050565b6144828161423e565b82525050565b6144918161427a565b82525050565b6144a0816142bb565b82525050565b60006060820190506144bb6000830186614479565b6144c86020830185614488565b6144d56040830184614497565b949350505050565b6144e68161403d565b82525050565b600060208201905061450160008301846144dd565b92915050565b6000806000806080858703121561452157614520613eab565b5b600061452f8782880161409c565b94505060206145408782880161413f565b93505060406145518782880161409c565b92505060606145628782880161409c565b91505092959194509250565b6145778161423e565b82525050565b6145868161427a565b82525050565b614595816142bb565b82525050565b6060820160008201516145b1600085018261456e565b5060208201516145c4602085018261457d565b5060408201516145d7604085018261458c565b50505050565b60006060820190506145f2600083018461459b565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b61461d816145f8565b82525050565b60006020820190506146386000830184614614565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061468557607f821691505b6020821081036146985761469761463e565b5b50919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b60006146d4600a83613f76565b91506146df8261469e565b602082019050919050565b60006020820190508181036000830152614703816146c7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006147448261407b565b915061474f8361407b565b92508282039050818111156147675761476661470a565b5b92915050565b60006147788261407b565b91506147838361407b565b925082820190508082111561479b5761479a61470a565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b60006147d7600a83613f76565b91506147e2826147a1565b602082019050919050565b60006020820190508181036000830152614806816147ca565b9050919050565b60006148188261407b565b91506148238361407b565b92508282026148318161407b565b915082820484148315176148485761484761470a565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006148898261407b565b91506148948361407b565b9250826148a4576148a361484f565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000614914600d83613f76565b915061491f826148de565b602082019050919050565b6000602082019050818103600083015261494381614907565b9050919050565b614953816145f8565b811461495e57600080fd5b50565b6000815190506149708161494a565b92915050565b60006020828403121561498c5761498b613eab565b5b600061499a84828501614961565b9150509291505056fea26469706673582212202f9fd5ae905e4e9dbc4084dd07c38e2c49d286e79910182ef402212c49c2eb2864736f6c63430008110033 -\ No newline at end of file +60c06040523480156200001157600080fd5b5060405162005ed238038062005ed2833981810160405281019062000037919062000909565b6801000000000000000083600f0b126200005057600080fd5b6200005a6200061e565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550866006908162000126919062000c2a565b50856007908162000138919062000c2a565b508460ff166008819055504260038190555060035460808181525050603c8362000163919062000d40565b60a081815250506200018a60016200034f6401000000000262002b94176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550620001e484620003766401000000000262002bba176401000000009004565b600d60006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200024e6000600260009054906101000a9004600f0b60006001620003ca640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000d8b565b6000677fffffffffffffff8211156200036757600080fd5b6040829060020a029050919050565b60008082600f0b136200038857600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af620003b5846200044e640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b620003d46200061e565b620003de6200061e565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b136200046057600080fd5b60008083600f0b90506801000000000000000081126200049c576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112620004cb576020819060008212600003808260020a82851804189250505090506020820191505b620100008112620004f8576010819060008212600003808260020a82851804189250505090506010820191505b610100811262000524576008819060008212600003808260020a82851804189250505090506008820191505b601081126200054f576004819060008212600003808260020a82851804189250505090506004820191505b600481126200057a576002819060008212600003808260020a82851804189250505090506002820191505b600281126200058a576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131562000611578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050620005b7565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620006c38262000678565b810181811067ffffffffffffffff82111715620006e557620006e462000689565b5b80604052505050565b6000620006fa6200065a565b9050620007088282620006b8565b919050565b600067ffffffffffffffff8211156200072b576200072a62000689565b5b620007368262000678565b9050602081019050919050565b60005b838110156200076357808201518184015260208101905062000746565b60008484015250505050565b60006200078662000780846200070d565b620006ee565b905082815260208101848484011115620007a557620007a462000673565b5b620007b284828562000743565b509392505050565b600082601f830112620007d257620007d16200066e565b5b8151620007e48482602086016200076f565b91505092915050565b600060ff82169050919050565b6200080581620007ed565b81146200081157600080fd5b50565b6000815190506200082581620007fa565b92915050565b600081600f0b9050919050565b62000843816200082b565b81146200084f57600080fd5b50565b600081519050620008638162000838565b92915050565b6000819050919050565b6200087e8162000869565b81146200088a57600080fd5b50565b6000815190506200089e8162000873565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008d182620008a4565b9050919050565b620008e381620008c4565b8114620008ef57600080fd5b50565b6000815190506200090381620008d8565b92915050565b60008060008060008060c0878903121562000929576200092862000664565b5b600087015167ffffffffffffffff8111156200094a576200094962000669565b5b6200095889828a01620007ba565b965050602087015167ffffffffffffffff8111156200097c576200097b62000669565b5b6200098a89828a01620007ba565b95505060406200099d89828a0162000814565b9450506060620009b089828a0162000852565b9350506080620009c389828a016200088d565b92505060a0620009d689828a01620008f2565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a3657607f821691505b60208210810362000a4c5762000a4b620009ee565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000ab97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000a77565b62000ac5868362000a77565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000b0862000b0262000afc8462000869565b62000add565b62000869565b9050919050565b6000819050919050565b62000b248362000ae7565b62000b3c62000b338262000b0f565b84845462000a87565b825550505050565b600090565b62000b5362000b44565b62000b6081848462000b19565b505050565b5b8181101562000b885762000b7c60008262000b49565b60018101905062000b66565b5050565b601f82111562000bd75762000ba18162000a52565b62000bac8462000a67565b8101602085101562000bbc578190505b62000bd462000bcb8562000a67565b83018262000b65565b50505b505050565b60008160020a8304905092915050565b600062000bff6000198460080262000bdc565b1980831691505092915050565b600062000c1a838362000bec565b9150826002028217905092915050565b62000c3582620009e3565b67ffffffffffffffff81111562000c515762000c5062000689565b5b62000c5d825462000a1d565b62000c6a82828562000b8c565b600060209050601f83116001811462000ca2576000841562000c8d578287015190505b62000c99858262000c0c565b86555062000d09565b601f19841662000cb28662000a52565b60005b8281101562000cdc5784890151825560018201915060208501945060208101905062000cb5565b8683101562000cfc578489015162000cf8601f89168262000bec565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000d4d8262000869565b915062000d5a8362000869565b925082820262000d6a8162000869565b9150828204841483151762000d845762000d8362000d11565b5b5092915050565b60805160a0516150fe62000dd4600039600081816119ab01528181612158015281816126ef01526129d50152600081816119d7015281816129f60152612a3b01526150fe6000f3fe608060405234801561001057600080fd5b5060043610610395576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e116101f0578063a457c2d711610121578063d89135cd116100bf578063e809529511610099578063e809529514610ba8578063eda4e6d614610bc6578063f2fde38b14610be4578063f629620b14610c1457610395565b8063d89135cd14610b2a578063e54063a614610b48578063e69571af14610b7857610395565b8063b470aade116100fb578063b470aade14610a8e578063bb8a357414610aac578063c0ab707714610adc578063d340ef8a14610b0c57610395565b8063a457c2d714610a10578063a9059cbb14610a40578063b1cb0db314610a7057610395565b806384dde4af1161018e5780638f0b2d5d116101685780638f0b2d5d146109885780638f1df6bc146109a457806395d89b41146109c2578063983b2d56146109e057610395565b806384dde4af1461091c57806386fe212d1461093a5780638da5cb5b1461096a57610395565b806373f42561116101ca57806373f42561146108925780637445e33a146108b057806374bedb95146108e057806379ba5097146108fe57610395565b80636a2d094e1461081457806370a0823114610844578063731f237c1461087457610395565b80633092afd5116102ca578063449a52f81161026857806351b4541c1161024257806351b4541c1461077857806358b2833b146107a85780635f408c04146107c65780636787a9be146107e457610395565b8063449a52f8146106e857806347a50517146107185780634abfbba21461074857610395565b806331a5995d116102a457806331a5995d1461064c578063395093511461066a57806340452d911461069a57806342966c68146106cc57610395565b80633092afd5146105ce57806331333487146105fe578063313ce5671461062e57610395565b80631989c6a81161033757806323a859441161031157806323a859441461050e57806323b872dd1461053e5780632a7aec091461056e5780632c1758c11461059e57610395565b80631989c6a8146104a2578063213d1e1e146104c0578063229ba197146104f057610395565b806309f28f3c1161037357806309f28f3c1461041857806311c566151461043657806318160ddd1461046657806318cbbcfc1461048457610395565b806301ffc9a71461039a57806306fdde03146103ca578063095ea7b3146103e8575b600080fd5b6103b460048036038101906103af919061451e565b610c30565b6040516103c19190614566565b60405180910390f35b6103d2610dd6565b6040516103df9190614611565b60405180910390f35b61040260048036038101906103fd91906146c7565b610e64565b60405161040f9190614566565b60405180910390f35b610420611035565b60405161042d9190614723565b60405180910390f35b610450600480360381019061044b919061476a565b611048565b60405161045d91906147b9565b60405180910390f35b61046e611098565b60405161047b91906147b9565b60405180910390f35b61048c6110af565b60405161049991906147b9565b60405180910390f35b6104aa6110b4565b6040516104b791906147b9565b60405180910390f35b6104da60048036038101906104d59190614975565b6110c0565b6040516104e791906147b9565b60405180910390f35b6104f86110d9565b6040516105059190614723565b60405180910390f35b61052860048036038101906105239190614975565b6110ec565b6040516105359190614566565b60405180910390f35b610558600480360381019061055391906149a2565b611154565b6040516105659190614566565b60405180910390f35b61058860048036038101906105839190614975565b611307565b6040516105959190614723565b60405180910390f35b6105b860048036038101906105b391906149f5565b61133f565b6040516105c59190614566565b60405180910390f35b6105e860048036038101906105e39190614a22565b611372565b6040516105f59190614566565b60405180910390f35b61061860048036038101906106139190614a4f565b61147c565b60405161062591906147b9565b60405180910390f35b6106366114e8565b60405161064391906147b9565b60405180910390f35b6106546114ee565b60405161066191906147b9565b60405180910390f35b610684600480360381019061067f91906146c7565b6114f4565b6040516106919190614566565b60405180910390f35b6106b460048036038101906106af91906149f5565b61168a565b6040516106c393929190614abc565b60405180910390f35b6106e660048036038101906106e191906149f5565b6116f9565b005b61070260048036038101906106fd91906146c7565b61181e565b60405161070f9190614566565b60405180910390f35b610732600480360381019061072d9190614a22565b61195e565b60405161073f91906147b9565b60405180910390f35b610762600480360381019061075d91906149f5565b6119a7565b60405161076f91906147b9565b60405180910390f35b610792600480360381019061078d91906149f5565b611a07565b60405161079f91906147b9565b60405180910390f35b6107b0611a28565b6040516107bd91906147b9565b60405180910390f35b6107ce611a2e565b6040516107db9190614566565b60405180910390f35b6107fe60048036038101906107f991906149f5565b611b40565b60405161080b91906147b9565b60405180910390f35b61082e600480360381019061082991906149f5565b611b81565b60405161083b91906147b9565b60405180910390f35b61085e60048036038101906108599190614a22565b611ba2565b60405161086b91906147b9565b60405180910390f35b61087c611c4e565b6040516108899190614566565b60405180910390f35b61089a611c5f565b6040516108a791906147b9565b60405180910390f35b6108ca60048036038101906108c59190614975565b611c65565b6040516108d791906147b9565b60405180910390f35b6108e8611c93565b6040516108f591906147b9565b60405180910390f35b610906611c99565b6040516109139190614566565b60405180910390f35b610924611e40565b6040516109319190614b02565b60405180910390f35b610954600480360381019061094f91906149f5565b611e66565b60405161096191906147b9565b60405180910390f35b610972611f45565b60405161097f9190614b02565b60405180910390f35b6109a2600480360381019061099d9190614a22565b611f6b565b005b6109ac612020565b6040516109b99190614566565b60405180910390f35b6109ca6122d0565b6040516109d79190614611565b60405180910390f35b6109fa60048036038101906109f59190614a22565b61235e565b604051610a079190614566565b60405180910390f35b610a2a6004803603810190610a2591906146c7565b612432565b604051610a379190614566565b60405180910390f35b610a5a6004803603810190610a5591906146c7565b612651565b604051610a679190614566565b60405180910390f35b610a786126e7565b604051610a8591906147b9565b60405180910390f35b610a966126ed565b604051610aa391906147b9565b60405180910390f35b610ac66004803603810190610ac19190614a22565b612711565b604051610ad39190614b39565b60405180910390f35b610af66004803603810190610af191906149f5565b6127c4565b604051610b039190614566565b60405180910390f35b610b1461292b565b604051610b2191906147b9565b60405180910390f35b610b32612931565b604051610b3f91906147b9565b60405180910390f35b610b626004803603810190610b5d9190614975565b61293b565b604051610b6f91906147b9565b60405180910390f35b610b926004803603810190610b8d9190614b54565b61294f565b604051610b9f9190614c2a565b60405180910390f35b610bb06129cf565b604051610bbd9190614c70565b60405180910390f35b610bce612a39565b604051610bdb91906147b9565b60405180910390f35b610bfe6004803603810190610bf99190614a22565b612a5d565b604051610c0b9190614566565b60405180910390f35b610c2e6004803603810190610c2991906149f5565b612aff565b005b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c845760019050610dd1565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610cd65760019050610dd1565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d285760019050610dd1565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d7a5760019050610dd1565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610dcc5760019050610dd1565b600090505b919050565b60068054610de390614cba565b80601f0160208091040260200160405190810160405280929190818152602001828054610e0f90614cba565b8015610e5c5780601f10610e3157610100808354040283529160200191610e5c565b820191906000526020600020905b815481529060010190602001808311610e3f57829003601f168201915b505050505081565b6000806000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610f305760008314610f2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2690614d37565b60405180910390fd5b5b610f38612020565b50610f4283611b40565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161102291906147b9565b60405180910390a3600191505092915050565b600260009054906101000a9004600f0b81565b60008061106f61105785612b94565b61106a6110646001612b94565b86612bfc565b612c63565b905061107a81612ce2565b67ffffffffffffffff168461108f9190614d86565b91505092915050565b6000600c546009546110aa9190614d86565b905090565b600f81565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b600d60009054906101000a9004600f0b81565b600080826000015163ffffffff161115611109576000905061114f565b6000826020015168ffffffffffffffffff16111561112a576000905061114f565b6000826040015167ffffffffffffffff16111561114a576000905061114f565b600190505b919050565b6000806000611161612020565b5061116b84611b40565b915081600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156111f657600080fd5b81600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112829190614d86565b92505081905550611294868684612d17565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516112f391906147b9565b60405180910390a380925050509392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b03611336576113336001612b94565b90505b80915050919050565b6000600f821061134e57600080fd5b6000820361136357600f60135414905061136d565b8160135483161490505b919050565b6000611381600160ff1661133f565b1561138b57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061141257503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b61141b57600080fd5b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60008060008061148b86612b94565b925061149685612b94565b91506114b1600d60009054906101000a9004600f0b83612c63565b90506114bc81612d3c565b90506114c88382612c63565b90506114d381612ce2565b67ffffffffffffffff16935050505092915050565b60085481565b60135481565b6000806114ff612020565b5061150983611b40565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115979190614dba565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161167791906147b9565b60405180910390a3600191505092915050565b6000818154811061169a57600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661174f57600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481111561179b57600080fd5b60006117a682611b40565b90506117b23382612dc9565b5081600c60008282546117c59190614dba565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58360405161181291906147b9565b60405180910390a25050565b600080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166118ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a490614e3a565b60405180910390fd5b6118b5612020565b506118bf83611b40565b905082600960008282546118d39190614dba565b925050819055506118e48482612ed0565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560405161194291906147b9565b60405180910390a3611952612f94565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826119d59190614e5a565b7f0000000000000000000000000000000000000000000000000000000000000000611a009190614dba565b9050919050565b6000603c8242611a179190614d86565b611a219190614ecb565b9050919050565b60035481565b6000601260009054906101000a900460ff1615611a4e5760019050611b3d565b600060115403611a615760009050611b3d565b6011544210611b2a57611a72611098565b60016000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001601260006101000a81548160ff0219169083151502179055507ff80dbaea4785589e52984ca36a31de106adc77759539a5c7d92883bf49692fe942604051611b2191906147b9565b60405180910390a15b601260009054906101000a900460ff1690505b90565b600080611b64611b4f84612b94565b600260009054906101000a9004600f0b613158565b9050611b6f81612ce2565b67ffffffffffffffff16915050919050565b6000603c8242611b919190614d86565b611b9b9190614ecb565b9050919050565b6000806000806000611bb386612711565b905060018160ff1603611bcd576000945050505050611c49565b60028160ff1603611beb57611be0611098565b945050505050611c49565b611bfc611bf78761195e565b612b94565b9350611c09600354611a07565b9150611c2484600260009054906101000a9004600f0b612c63565b9250611c42611c3284612ce2565b67ffffffffffffffff168361147c565b9450505050505b919050565b6000611c5a60006127c4565b905090565b600c5481565b6000806000611c73846110c0565b9150611c7e84611307565b9050611c8a8282611048565b92505050919050565b600b5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611cf657600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060088210611eab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea290614f48565b60405180910390fd5b6000601354831614611ef2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee990614fb4565b60405180910390fd5b816013600082825417925050819055507fdd5e7cad9599c1dcaa8d5adcd88f157fc5fada62511c0d3edb1bfd3b778acc41601354604051611f3391906147b9565b60405180910390a16013549050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611f78600260ff1661133f565b15611f8257600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fdc57600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061202a61447b565b61203261447b565b61203a61447b565b600080600080600061204a611c4e565b506120536131e4565b975061205e886110ec565b15612074576000985050505050505050506122cd565b6000600a548154811061208a57612089614fd4565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505095506121378861293b565b94506001856121469190614dba565b905061215186611307565b9350603c857f00000000000000000000000000000000000000000000000000000000000000006121819190614e5a565b61218b9190614ecb565b91506121b66121b1600d60009054906101000a9004600f0b6121ac85612b94565b612c63565b612d3c565b92506121cc6000846121c6611098565b8461294f565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050506122888761337a565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d675816040516122b891906147b9565b60405180910390a16001985050505050505050505b90565b600780546122dd90614cba565b80601f016020809104026020016040519081016040528092919081815260200182805461230990614cba565b80156123565780601f1061232b57610100808354040283529160200191612356565b820191906000526020600020905b81548152906001019060200180831161233957829003601f168201915b505050505081565b600061236d600160ff1661133f565b1561237757600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146123d157600080fd5b6001600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60008061243e83611b40565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156124c957600080fd5b6124d1612020565b5080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461255e9190614d86565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161263e91906147b9565b60405180910390a3600191505092915050565b600080600061265e612020565b5061266884611b40565b9150612675338684612d17565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516126d491906147b9565b60405180910390a3809250505092915050565b60115481565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080601260009054906101000a900460ff16156127325760019050612751565b600060115411801561274657506011544210155b1561275057600190505b5b60008160ff161180156127b15750601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b156127bb57600290505b80915050919050565b60008060008060006127d4611a2e565b156127de57600080fd5b6127e9600354611a07565b925060008303612800576000945050505050612926565b600260009054906101000a9004600f0b905060008611801561282157508286105b1561282a578592505b61283383612b94565b915061284e600d60009054906101000a9004600f0b83612c63565b935061285984612d3c565b9350612874600260009054906101000a9004600f0b85612c63565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c836128bc9190614e5a565b6003546128c99190614dba565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b6040516129159190614723565b60405180910390a460009450505050505b919050565b600a5481565b6000600c54905090565b6000816000015163ffffffff169050919050565b61295761447b565b61295f61447b565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042612a209190614d86565b612a2a9190614ecb565b612a349190614dba565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612ab957600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b612b0c600460ff1661133f565b15612b1657600080fd5b601260009054906101000a900460ff1615612b3057600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612b8a57600080fd5b8060118190555050565b6000677fffffffffffffff821115612bab57600080fd5b6040829060020a029050919050565b60008082600f0b13612bcb57600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af612be784613499565b600f0b02908060020a82049150509050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612c5057506f7fffffffffffffffffffffffffffffff600f0b8113155b612c5957600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612ccf57506f7fffffffffffffffffffffffffffffff600f0b8113155b612cd857600080fd5b8091505092915050565b60008082600f0b1215612cf457600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b600080612d248584612dc9565b50612d2f8484612ed0565b5060019150509392505050565b60006840000000000000000082600f0b12612d5657600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215612d8a5760009050612dc4565b612dc16080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a82851804189250505061365f565b90505b919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503612e255760009350505050612eca565b612e2e8661195e565b925084831015612e73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6a9061504f565b60405180910390fd5b8483612e7f9190614d86565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503612f2c5760009350505050612f8e565b612f358661195e565b92508483612f439190614dba565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000612f9e61447b565b6000612fa8611098565b905060006001600080549050612fbe9190614d86565b81548110612fcf57612fce614fd4565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff168152505081600060016000805490506130aa9190614d86565b815481106130bb576130ba614fd4565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b0361316957600080fd5b600082600f0b604085600f0b9060020a028161318857613187614e9c565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b81121580156131d157506f7fffffffffffffffffffffffffffffff600f0b8113155b6131da57600080fd5b8091505092915050565b6131ec61447b565b6131f461447b565b6131fc61447b565b600080600a548154811061321357613212614fd4565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa15801561331e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613342919061509b565b6fffffffffffffffffffffffffffffffff16905061335f8361293b565b811161337057819350505050613377565b8293505050505b90565b600080600061338884611c65565b613390611098565b61339a9190614d86565b9150600b546133a883611b40565b6133b29190614d86565b90506133e0601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612ed0565b50836000015163ffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d38460405161345491906147b9565b60405180910390a36001600a600082825461346f9190614dba565b9250508190555080600b60008282546134889190614dba565b925050819055508192505050919050565b60008082600f0b136134aa57600080fd5b60008083600f0b90506801000000000000000081126134e5576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112613513576020819060008212600003808260020a82851804189250505090506020820191505b62010000811261353f576010819060008212600003808260020a82851804189250505090506010820191505b610100811261356a576008819060008212600003808260020a82851804189250505090506008820191505b60108112613594576004819060008212600003808260020a82851804189250505090506004820191505b600481126135be576002819060008212600003808260020a82851804189250505090506002820191505b600281126135cd576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b6000811315613652578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a82851804189250505090506135fa565b5081945050505050919050565b60006840000000000000000082600f0b1261367957600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156136ad5760009050614476565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b13156136fb57608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b13156137345760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b131561376d5760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b13156137a657608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b13156137df5760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315613818576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b131561385157608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b131561388a576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b13156138c257608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b13156138fa5760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315613932576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b131561396a5760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b13156139a2576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b13156139da57608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b1315613a125760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b1315613a4a57608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b1315613a815760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b1315613ab8576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b1315613aef57608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315613b26576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b1315613b5d57608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b1315613b945760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b1315613bcb576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b1315613c025760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315613c38576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b1315613c6e57608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b1315613ca45760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b1315613cda57608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b1315613d105760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b1315613d46576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b1315613d7c57608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b1315613db2576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b1315613de757608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b1315613e1c5760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b1315613e51576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b1315613e865760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b1315613ebb576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b1315613ef057608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b1315613f255760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b1315613f5a57608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b1315613f8e5760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b1315613fc2576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b1315613ff657608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b131561402a576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b131561405e57608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b13156140925760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b13156140c6576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b13156140fa5760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b131561412d576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b131561416057608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b13156141935760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b13156141c657608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156141f95760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b131561422c576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b131561425f57608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b1315614292576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b13156142c457608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b13156142f65760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b1315614328576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b131561435a5760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b131561438c576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b13156143be57608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b13156143f05760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b131561442257608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b81111561447157600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6144fb816144c6565b811461450657600080fd5b50565b600081359050614518816144f2565b92915050565b600060208284031215614534576145336144c1565b5b600061454284828501614509565b91505092915050565b60008115159050919050565b6145608161454b565b82525050565b600060208201905061457b6000830184614557565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156145bb5780820151818401526020810190506145a0565b60008484015250505050565b6000601f19601f8301169050919050565b60006145e382614581565b6145ed818561458c565b93506145fd81856020860161459d565b614606816145c7565b840191505092915050565b6000602082019050818103600083015261462b81846145d8565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061465e82614633565b9050919050565b61466e81614653565b811461467957600080fd5b50565b60008135905061468b81614665565b92915050565b6000819050919050565b6146a481614691565b81146146af57600080fd5b50565b6000813590506146c18161469b565b92915050565b600080604083850312156146de576146dd6144c1565b5b60006146ec8582860161467c565b92505060206146fd858286016146b2565b9150509250929050565b600081600f0b9050919050565b61471d81614707565b82525050565b60006020820190506147386000830184614714565b92915050565b61474781614707565b811461475257600080fd5b50565b6000813590506147648161473e565b92915050565b60008060408385031215614781576147806144c1565b5b600061478f858286016146b2565b92505060206147a085828601614755565b9150509250929050565b6147b381614691565b82525050565b60006020820190506147ce60008301846147aa565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614811826145c7565b810181811067ffffffffffffffff821117156148305761482f6147d9565b5b80604052505050565b60006148436144b7565b905061484f8282614808565b919050565b600063ffffffff82169050919050565b61486d81614854565b811461487857600080fd5b50565b60008135905061488a81614864565b92915050565b600068ffffffffffffffffff82169050919050565b6148ae81614890565b81146148b957600080fd5b50565b6000813590506148cb816148a5565b92915050565b600067ffffffffffffffff82169050919050565b6148ee816148d1565b81146148f957600080fd5b50565b60008135905061490b816148e5565b92915050565b600060608284031215614927576149266147d4565b5b6149316060614839565b905060006149418482850161487b565b6000830152506020614955848285016148bc565b6020830152506040614969848285016148fc565b60408301525092915050565b60006060828403121561498b5761498a6144c1565b5b600061499984828501614911565b91505092915050565b6000806000606084860312156149bb576149ba6144c1565b5b60006149c98682870161467c565b93505060206149da8682870161467c565b92505060406149eb868287016146b2565b9150509250925092565b600060208284031215614a0b57614a0a6144c1565b5b6000614a19848285016146b2565b91505092915050565b600060208284031215614a3857614a376144c1565b5b6000614a468482850161467c565b91505092915050565b60008060408385031215614a6657614a656144c1565b5b6000614a74858286016146b2565b9250506020614a85858286016146b2565b9150509250929050565b614a9881614854565b82525050565b614aa781614890565b82525050565b614ab6816148d1565b82525050565b6000606082019050614ad16000830186614a8f565b614ade6020830185614a9e565b614aeb6040830184614aad565b949350505050565b614afc81614653565b82525050565b6000602082019050614b176000830184614af3565b92915050565b600060ff82169050919050565b614b3381614b1d565b82525050565b6000602082019050614b4e6000830184614b2a565b92915050565b60008060008060808587031215614b6e57614b6d6144c1565b5b6000614b7c878288016146b2565b9450506020614b8d87828801614755565b9350506040614b9e878288016146b2565b9250506060614baf878288016146b2565b91505092959194509250565b614bc481614854565b82525050565b614bd381614890565b82525050565b614be2816148d1565b82525050565b606082016000820151614bfe6000850182614bbb565b506020820151614c116020850182614bca565b506040820151614c246040850182614bd9565b50505050565b6000606082019050614c3f6000830184614be8565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b614c6a81614c45565b82525050565b6000602082019050614c856000830184614c61565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614cd257607f821691505b602082108103614ce557614ce4614c8b565b5b50919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b6000614d21600a8361458c565b9150614d2c82614ceb565b602082019050919050565b60006020820190508181036000830152614d5081614d14565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614d9182614691565b9150614d9c83614691565b9250828203905081811115614db457614db3614d57565b5b92915050565b6000614dc582614691565b9150614dd083614691565b9250828201905080821115614de857614de7614d57565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b6000614e24600a8361458c565b9150614e2f82614dee565b602082019050919050565b60006020820190508181036000830152614e5381614e17565b9050919050565b6000614e6582614691565b9150614e7083614691565b9250828202614e7e81614691565b91508282048414831517614e9557614e94614d57565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614ed682614691565b9150614ee183614691565b925082614ef157614ef0614e9c565b5b828204905092915050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b6000614f3260118361458c565b9150614f3d82614efc565b602082019050919050565b60006020820190508181036000830152614f6181614f25565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b6000614f9e60128361458c565b9150614fa982614f68565b602082019050919050565b60006020820190508181036000830152614fcd81614f91565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000615039600d8361458c565b915061504482615003565b602082019050919050565b600060208201905081810360008301526150688161502c565b9050919050565b61507881614c45565b811461508357600080fd5b50565b6000815190506150958161506f565b92915050565b6000602082840312156150b1576150b06144c1565b5b60006150bf84828501615086565b9150509291505056fea2646970667358221220deb9ffdd6f8295131fcadbe267d10dc29511296956a3a18e1f86da744d4481d464736f6c63430008110033 +\ 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":"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":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":"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":"addMinter","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":[{"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":[],"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":[{"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 DemurrageTokenSingleCap.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 DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"lastPeriod","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":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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 DemurrageTokenSingleCap.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 DemurrageTokenSingleCap.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 DemurrageTokenSingleCap.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 DemurrageTokenSingleCap.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":"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":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":"addMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyExpiry","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"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 DemurrageTokenSingleCap.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 DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isExpiredAccount","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","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":[{"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":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","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":"_expires","type":"uint256"}],"name":"setExpires","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 DemurrageTokenSingleCap.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 DemurrageTokenSingleCap.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 DemurrageTokenSingleCap.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 DemurrageTokenSingleCap.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 @@ -25,6 +25,8 @@ from dexif import from_fixed # local imports from erc20_demurrage_token.data import data_dir +from erc20_demurrage_token.seal import SealedContract +from erc20_demurrage_token.expiry import ExpiryContract logg = logging.getLogger(__name__) @@ -71,7 +73,7 @@ class DemurrageTokenSettings: ) -class DemurrageToken(ERC20): +class DemurrageToken(ERC20, SealedContract, ExpiryContract): __abi = {} __bytecode = {} @@ -459,6 +461,8 @@ class DemurrageToken(ERC20): 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/erc20_demurrage_token/unittest/base.py b/python/erc20_demurrage_token/unittest/base.py @@ -92,7 +92,7 @@ class TestDemurrage(EthTesterCase): period = getattr(self, 'period') except AttributeError as e: pass - self.deployer = TestTokenDeploy(self.rpc, period=period) + self.deployer = TestTokenDeploy(self.rpc, period=period, sink_address=self.accounts[9]) self.default_supply = self.deployer.default_supply self.default_supply_cap = self.deployer.default_supply_cap self.start_block = None diff --git a/solidity/DemurrageTokenSingleNocap.sol b/solidity/DemurrageTokenSingleNocap.sol @@ -80,6 +80,10 @@ contract DemurrageTokenSingleCap { // Address to send unallocated redistribution tokens address public sinkAddress; + // timestamp when token contract expires + uint256 public expires; + bool expired; + // Implements ERC20 event Transfer(address indexed _from, address indexed _to, uint256 _value); @@ -108,6 +112,19 @@ contract DemurrageTokenSingleCap { // EIP173 event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); // EIP173 + event SealStateChange(uint256 _sealState); + + event Expired(uint256 _timestamp); + + // property sealing + uint256 public sealState; + uint8 constant MINTER_STATE = 1; + uint8 constant SINK_STATE = 2; + uint8 constant EXPIRY_STATE = 4; + uint8 constant CAP_STATE = 8; + uint256 constant public maxSealState = 15; + + constructor(string memory _name, string memory _symbol, uint8 _decimals, int128 _taxLevel, uint256 _periodMinutes, address _defaultSinkAddress) { require(_taxLevel < (1 << 64)); redistributionItem memory initialRedistribution; @@ -137,15 +154,69 @@ contract DemurrageTokenSingleCap { sinkAddress = _defaultSinkAddress; } + function seal(uint256 _state) public returns(uint256) { + require(_state < 8, 'ERR_INVALID_STATE'); + require(_state & sealState == 0, 'ERR_ALREADY_LOCKED'); + sealState |= _state; + emit SealStateChange(sealState); + return uint256(sealState); + } + + function isSealed(uint256 _state) public returns(bool) { + require(_state < maxSealState); + if (_state == 0) { + return sealState == maxSealState; + } + return _state & sealState == _state; + } + + function setExpires(uint256 _expires) public { + require(!isSealed(EXPIRY_STATE)); + require(!expired); + require(msg.sender == owner); + expires = _expires; + } + // Change sink address for redistribution function setSinkAddress(address _sinkAddress) public { + require(!isSealed(SINK_STATE)); require(msg.sender == owner); sinkAddress = _sinkAddress; } + function applyExpiry() public returns(bool) { + if (expired) { + return true; + } + if (expires == 0) { + return false; + } + if (block.timestamp >= expires) { + account[sinkAddress] = totalSupply(); + expired = true; + emit Expired(block.timestamp); + } + return expired; + } + + function isExpiredAccount(address _account) public view returns(uint8) { + uint8 expiry_state; + + if (expired) { + expiry_state = 1; + } else if (expires > 0 && block.timestamp >= expires) { + expiry_state = 1; + } + if (expiry_state > 0 && _account == sinkAddress) { + expiry_state = 2; + } + return expiry_state; + } + // Given address will be allowed to call the mintTo() function function addMinter(address _minter) public returns (bool) { + require(!isSealed(MINTER_STATE)); require(msg.sender == owner); minter[_minter] = true; return true; @@ -153,6 +224,7 @@ contract DemurrageTokenSingleCap { // Given address will no longer be allowed to call the mintTo() function function removeMinter(address _minter) public returns (bool) { + require(!isSealed(MINTER_STATE)); require(msg.sender == owner || _minter == msg.sender); minter[_minter] = false; return true; @@ -163,6 +235,14 @@ contract DemurrageTokenSingleCap { int128 baseBalance; int128 currentDemurragedAmount; uint256 periodCount; + uint8 expiryState; + + expiryState = isExpiredAccount(_account); + if (expiryState == 1) { + return 0; + } else if (expiryState == 2) { + return totalSupply(); + } baseBalance = ABDKMath64x64.fromUInt(baseBalanceOf(_account)); @@ -369,19 +449,22 @@ contract DemurrageTokenSingleCap { } // Calculate and cache the demurrage value corresponding to the (period of the) time of the method call - function applyDemurrage() public returns (uint256) { + function applyDemurrage() public returns (bool) { return applyDemurrageLimited(0); } - function applyDemurrageLimited(uint256 _rounds) public returns (uint256) { + // returns true if expired + function applyDemurrageLimited(uint256 _rounds) public returns (bool) { int128 v; uint256 periodCount; int128 periodPoint; int128 lastDemurrageAmount; + require(!applyExpiry()); + periodCount = getMinutesDelta(demurrageTimestamp); if (periodCount == 0) { - return 0; + return false; } lastDemurrageAmount = demurrageAmount; @@ -398,7 +481,7 @@ contract DemurrageTokenSingleCap { demurrageTimestamp = demurrageTimestamp + (periodCount * 60); emit Decayed(demurrageTimestamp, periodCount, lastDemurrageAmount, demurrageAmount); - return periodCount; + return false; } // Return timestamp of start of period threshold