craft-nft

A standalone NFT implementation for real-world arts and crafts assets
Log | Files | Refs | README

commit 84477a2584b968b495f6e54ab6bcd8ec521a5118
parent ce225f90fb2d091d0f5febd2b887d4e8cb5ec22b
Author: lash <dev@holbrook.no>
Date:   Wed,  1 Mar 2023 12:18:57 +0000

Change supply calculation to include minted tokens only

Diffstat:
Mjs/contract/CraftNFT.bin | 4++--
Mjs/contract/CraftNFT.json | 2+-
Mpython/craft_nft/data/CraftNFT.bin | 4++--
Mpython/craft_nft/data/CraftNFT.json | 2+-
Mpython/craft_nft/nft.py | 9+++++----
Mpython/craft_nft/unittest/base.py | 16++++++++++++++++
Mpython/tests/test_supply.py | 35++++++++++++++++++++++++++++++++---
Msolidity/CraftNFT.sol | 49++++++++++++++++++++++++++++++++++++++-----------
8 files changed, 97 insertions(+), 24 deletions(-)

diff --git a/js/contract/CraftNFT.bin b/js/contract/CraftNFT.bin @@ -1 +1 @@ -60806040523480156200001157600080fd5b50604051620068eb380380620068eb833981810160405281019062000037919062000b3f565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b8190555082600890816200008f919062000e2a565b508160099081620000a1919062000e2a565b50620000f5602060126040518060400160405280600681526020017f73686132353600000000000000000000000000000000000000000000000000008152506200017c640100000000026401000000009004565b62000110601262000453640100000000026401000000009004565b602067ffffffffffffffff8111156200012e576200012d620009a0565b5b6040519080825280601f01601f191660200182016040528015620001615781602001600182028036833780820191505090505b506010908162000172919062000f81565b5050505062001403565b6060819050601081511115620001c9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001c090620010c9565b60405180910390fd5b620001d36200090b565b6000600790505b60008160ff161062000237576000600882620001f7919062001127565b60ff1660ff9060020a029050600086821667ffffffffffffffff16111562000220575062000237565b81806200022d906200116d565b92505050620001da565b6001816200024691906200119b565b826020019060ff16908160ff16815250506008816007620002689190620011d7565b62000274919062001127565b60ff168567ffffffffffffffff169060020a02780100000000000000000000000000000000000000000000000002826080019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250508251826040019060ff16908160ff168152505082620003029062001266565b82606001906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff19168152505085826000019060ff16908160ff168152505081600e60008767ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060808201518160000160136101000a81548167ffffffffffffffff0219169083780100000000000000000000000000000000000000000000000090040217905550905050505050505050565b6000600e6000838152602001908152602001600020905060008160000160009054906101000a900460ff1660ff16116200048c57600080fd5b81600f819055508060000160009054906101000a900460ff1660ff1667ffffffffffffffff811115620004c457620004c3620009a0565b5b6040519080825280601f01601f191660200182016040528015620004f75781602001600182028036833780820191505090505b506010908162000508919062000f81565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c620005436200055e640100000000026401000000009004565b60405162000552919062001328565b60405180910390a15050565b60606200060c60108054620005739062000c13565b80601f0160208091040260200160405190810160405280929190818152602001828054620005a19062000c13565b8015620005f25780601f10620005c657610100808354040283529160200191620005f2565b820191906000526020600020905b815481529060010190602001808311620005d457829003601f168201915b505050505062000611640100000000026401000000009004565b905090565b606060006060600e6000600f54815260200190815260200160002091508160000160019054906101000a900460ff1660ff168260000160009054906101000a900460ff1660ff1685516200066691906200134c565b6200067291906200134c565b67ffffffffffffffff8111156200068e576200068d620009a0565b5b6040519080825280601f01601f191660200182016040528015620006c15781602001600182028036833780820191505090505b50905060005b8260000160019054906101000a900460ff1660ff16811015620007a1578260000160139054906101000a9004780100000000000000000000000000000000000000000000000002816008811062000723576200072262001387565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000028282815181106200075c576200075b62001387565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806200079890620013b6565b915050620006c7565b8260000160009054906101000a900460ff167f010000000000000000000000000000000000000000000000000000000000000002828281518110620007eb57620007ea62001387565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806200082790620013b6565b91505060005b8551811015620008ff578581815181106200084d576200084c62001387565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002838284620008a691906200134c565b81518110620008ba57620008b962001387565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080620008f690620013b6565b9150506200082d565b50819350505050919050565b6040518060a00160405280600060ff168152602001600060ff168152602001600060ff16815260200160006fffffffffffffffffffffffffffffffff19168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff191681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620009da826200098f565b810181811067ffffffffffffffff82111715620009fc57620009fb620009a0565b5b80604052505050565b600062000a1162000971565b905062000a1f8282620009cf565b919050565b600067ffffffffffffffff82111562000a425762000a41620009a0565b5b62000a4d826200098f565b9050602081019050919050565b60005b8381101562000a7a57808201518184015260208101905062000a5d565b60008484015250505050565b600062000a9d62000a978462000a24565b62000a05565b90508281526020810184848401111562000abc5762000abb6200098a565b5b62000ac984828562000a5a565b509392505050565b600082601f83011262000ae95762000ae862000985565b5b815162000afb84826020860162000a86565b91505092915050565b6000819050919050565b62000b198162000b04565b811462000b2557600080fd5b50565b60008151905062000b398162000b0e565b92915050565b60008060006060848603121562000b5b5762000b5a6200097b565b5b600084015167ffffffffffffffff81111562000b7c5762000b7b62000980565b5b62000b8a8682870162000ad1565b935050602084015167ffffffffffffffff81111562000bae5762000bad62000980565b5b62000bbc8682870162000ad1565b925050604062000bcf8682870162000b28565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000c2c57607f821691505b60208210810362000c425762000c4162000be4565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000caf7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000c6d565b62000cbb868362000c6d565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000d0862000d0262000cfc8462000cd3565b62000cdd565b62000cd3565b9050919050565b6000819050919050565b62000d248362000ce7565b62000d3c62000d338262000d0f565b84845462000c7d565b825550505050565b600090565b62000d5362000d44565b62000d6081848462000d19565b505050565b5b8181101562000d885762000d7c60008262000d49565b60018101905062000d66565b5050565b601f82111562000dd75762000da18162000c48565b62000dac8462000c5d565b8101602085101562000dbc578190505b62000dd462000dcb8562000c5d565b83018262000d65565b50505b505050565b60008160020a8304905092915050565b600062000dff6000198460080262000ddc565b1980831691505092915050565b600062000e1a838362000dec565b9150826002028217905092915050565b62000e358262000bd9565b67ffffffffffffffff81111562000e515762000e50620009a0565b5b62000e5d825462000c13565b62000e6a82828562000d8c565b600060209050601f83116001811462000ea2576000841562000e8d578287015190505b62000e99858262000e0c565b86555062000f09565b601f19841662000eb28662000c48565b60005b8281101562000edc5784890151825560018201915060208501945060208101905062000eb5565b8683101562000efc578489015162000ef8601f89168262000dec565b8355505b6001600288020188555050505b505050505050565b600081519050919050565b60008190508160005260206000209050919050565b601f82111562000f7c5762000f468162000f1c565b62000f518462000c5d565b8101602085101562000f61578190505b62000f7962000f708562000c5d565b83018262000d65565b50505b505050565b62000f8c8262000f11565b67ffffffffffffffff81111562000fa85762000fa7620009a0565b5b62000fb4825462000c13565b62000fc182828562000f31565b600060209050601f83116001811462000ff9576000841562000fe4578287015190505b62000ff0858262000e0c565b86555062001060565b601f198416620010098662000f1c565b60005b8281101562001033578489015182556001820191506020850194506020810190506200100c565b868310156200105357848901516200104f601f89168262000dec565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4552525f5052454649585f544f4f5f4c4f4e4700000000000000000000000000600082015250565b6000620010b160138362001068565b9150620010be8262001079565b602082019050919050565b60006020820190508181036000830152620010e481620010a2565b9050919050565b600060ff82169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200113482620010eb565b91506200114183620010eb565b92508282026200115181620010eb565b9150808214620011665762001165620010f8565b5b5092915050565b60006200117a82620010eb565b91506000820362001190576200118f620010f8565b5b600182039050919050565b6000620011a882620010eb565b9150620011b583620010eb565b9250828201905060ff811115620011d157620011d0620010f8565b5b92915050565b6000620011e482620010eb565b9150620011f183620010eb565b9250828203905060ff8111156200120d576200120c620010f8565b5b92915050565b6000819050602082019050919050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b60006200125d825162001223565b80915050919050565b6000620012738262000f11565b826200127f8462001213565b90506200128c816200124f565b92506010821015620012cf57620012ca7fffffffffffffffffffffffffffffffff000000000000000000000000000000008360100360080262000c6d565b831692505b5050919050565b600082825260208201905092915050565b6000620012f48262000f11565b620013008185620012d6565b93506200131281856020860162000a5a565b6200131d816200098f565b840191505092915050565b60006020820190508181036000830152620013448184620012e7565b905092915050565b6000620013598262000cd3565b9150620013668362000cd3565b9250828201905080821115620013815762001380620010f8565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000620013c38262000cd3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620013f857620013f7620010f8565b5b600182019050919050565b6154d880620014136000396000f3fe60806040526004361061024d576000357c0100000000000000000000000000000000000000000000000000000000900480638da5cb5b1161014b578063c5bec6fc116100c8578063e8a7f4c51161008c578063e8a7f4c514610905578063e985e9c514610942578063f117e1731461097f578063f2fde38b146109bc578063f9613ab2146109f95761024d565b8063c5bec6fc146107fc578063c87b56dd14610839578063ccc094c214610876578063d824ee4f1461089f578063da2824a8146108dc5761024d565b8063adf288df1161010f578063adf288df1461070c578063b1a6afd314610749578063b238d60314610774578063b5fdeb23146107b5578063b88d4fde146107e05761024d565b80638da5cb5b1461062757806395d89b41146106525780639a7c5e9f1461067d578063a22cb465146106a6578063ad0dec2f146106cf5761024d565b806349f2553a116101d95780635ae06f7e1161019d5780635ae06f7e1461050a5780636352211e146105335780636b9cb86a1461057057806370a08231146105ad57806386e90b59146105ea5761024d565b806349f2553a146103ff5780634d03546a146104285780634f64b2be146104655780635344299a146104a2578063559f5dc9146104cb5761024d565b806323b872dd1161022057806323b872dd1461032257806324e0febc1461033e5780632b29ba231461037b57806340c84b0e146103b857806342842e0e146103e35761024d565b806301ffc9a71461025257806306fdde031461028f578063081812fc146102ba57806318160ddd146102f7575b600080fd5b34801561025e57600080fd5b5061027960048036038101906102749190614199565b610a36565b60405161028691906141e1565b60405180910390f35b34801561029b57600080fd5b506102a4610b8a565b6040516102b1919061428c565b60405180910390f35b3480156102c657600080fd5b506102e160048036038101906102dc91906142e4565b610c18565b6040516102ee9190614352565b60405180910390f35b34801561030357600080fd5b5061030c610c55565b604051610319919061437c565b60405180910390f35b61033c600480360381019061033791906143c3565b610c5f565b005b34801561034a57600080fd5b506103656004803603810190610360919061444c565b610cca565b6040516103729190614488565b60405180910390f35b34801561038757600080fd5b506103a2600480360381019061039d91906144a3565b610ce2565b6040516103af91906141e1565b60405180910390f35b3480156103c457600080fd5b506103cd610d8e565b6040516103da9190614525565b60405180910390f35b6103fd60048036038101906103f891906143c3565b610e1c565b005b34801561040b57600080fd5b506104266004803603810190610421919061467c565b610e87565b005b34801561043457600080fd5b5061044f600480360381019061044a9190614703565b61119f565b60405161045c91906141e1565b60405180910390f35b34801561047157600080fd5b5061048c600480360381019061048791906142e4565b61147d565b6040516104999190614488565b60405180910390f35b3480156104ae57600080fd5b506104c960048036038101906104c491906147e4565b6114a1565b005b3480156104d757600080fd5b506104f260048036038101906104ed919061482d565b61152d565b6040516105019392919061487c565b60405180910390f35b34801561051657600080fd5b50610531600480360381019061052c91906144a3565b6115a1565b005b34801561053f57600080fd5b5061055a600480360381019061055591906142e4565b6116c0565b6040516105679190614352565b60405180910390f35b34801561057c57600080fd5b50610597600480360381019061059291906147e4565b6116fc565b6040516105a4919061428c565b60405180910390f35b3480156105b957600080fd5b506105d460048036038101906105cf91906144a3565b611915565b6040516105e1919061437c565b60405180910390f35b3480156105f657600080fd5b50610611600480360381019061060c91906147e4565b61195e565b60405161061e919061428c565b60405180910390f35b34801561063357600080fd5b5061063c611c09565b6040516106499190614352565b60405180910390f35b34801561065e57600080fd5b50610667611c2d565b604051610674919061428c565b60405180910390f35b34801561068957600080fd5b506106a4600480360381019061069f91906142e4565b611cbb565b005b3480156106b257600080fd5b506106cd60048036038101906106c891906148df565b611dac565b005b3480156106db57600080fd5b506106f660048036038101906106f191906147e4565b61204e565b6040516107039190614525565b60405180910390f35b34801561071857600080fd5b50610733600480360381019061072e919061491f565b612325565b6040516107409190614488565b60405180910390f35b34801561075557600080fd5b5061075e612597565b60405161076b9190614488565b60405180910390f35b34801561078057600080fd5b5061079b600480360381019061079691906142e4565b61259d565b6040516107ac9594939291906149f1565b60405180910390f35b3480156107c157600080fd5b506107ca61263c565b6040516107d79190614525565b60405180910390f35b6107fa60048036038101906107f59190614a44565b6126d6565b005b34801561080857600080fd5b50610823600480360381019061081e91906147e4565b6127b1565b6040516108309190614525565b60405180910390f35b34801561084557600080fd5b50610860600480360381019061085b91906142e4565b612b6a565b60405161086d919061428c565b60405180910390f35b34801561088257600080fd5b5061089d60048036038101906108989190614b33565b612cbd565b005b3480156108ab57600080fd5b506108c660048036038101906108c19190614bdc565b612f7f565b6040516108d39190614488565b60405180910390f35b3480156108e857600080fd5b5061090360048036038101906108fe91906144a3565b6131f2565b005b34801561091157600080fd5b5061092c600480360381019061092791906147e4565b6132da565b6040516109399190614525565b60405180910390f35b34801561094e57600080fd5b5061096960048036038101906109649190614c2f565b613693565b60405161097691906141e1565b60405180910390f35b34801561098b57600080fd5b506109a660048036038101906109a19190614c6f565b61372b565b6040516109b39190614488565b60405180910390f35b3480156109c857600080fd5b506109e360048036038101906109de91906144a3565b6138ba565b6040516109f091906141e1565b60405180910390f35b348015610a0557600080fd5b50610a206004803603810190610a1b919061444c565b61395e565b604051610a2d9190614488565b60405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a8a5760019050610b85565b635b5e139f7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610adc5760019050610b85565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b2e5760019050610b85565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b805760019050610b85565b600090505b919050565b60088054610b9790614d05565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc390614d05565b8015610c105780601f10610be557610100808354040283529160200191610c10565b820191906000526020600020905b815481529060010190602001808311610bf357829003601f168201915b505050505081565b60006006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a54905090565b610c6a838383613a0a565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60056020528060005260406000206000915090505481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680610d87575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b600c8054610d9b90614d05565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc790614d05565b8015610e145780601f10610de957610100808354040283529160200191610e14565b820191906000526020600020905b815481529060010190602001808311610df757829003601f168201915b505050505081565b610e27838383613a0a565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ee457600080fd5b82915081519050602f7f01000000000000000000000000000000000000000000000000000000000000000282600183610f1d9190614d65565b81518110610f2e57610f2d614d99565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610fae578080610faa90614dc8565b9150505b8067ffffffffffffffff811115610fc857610fc7614551565b5b6040519080825280601f01601f191660200182016040528015610ffa5781602001600182028036833780820191505090505b50600c90816110099190614fc2565b5060005b82518110156110fa5782818151811061102957611028614d99565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002600c82815461108190614d05565b81106110905761108f614d99565b5b8154600116156110af5790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f01000000000000000000000000000000000000000000000000000000000000008404021790555080806110f290614dc8565b91505061100d565b508151811461119a577f2f00000000000000000000000000000000000000000000000000000000000000600c8351815461113390614d05565b811061114257611141614d99565b5b8154600116156111615790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055505b505050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806112455750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61124e57600080fd5b611256614094565b6004600086815260200190815260200160002080549050915060008211156112d3576000600460008781526020019081526020016000206000815481106112a05761129f614d99565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff16116112d257600080fd5b5b83816000019065ffffffffffff16908165ffffffffffff168152505060046000868152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001600c6101000a81548160ff0219169083151502179055505050600385908060018154018082558091505060019003906000526020600020016000909190919091505560008465ffffffffffff16036113f8576001600a60008282546113ec9190615094565b9250508190555061141a565b8365ffffffffffff16600a60008282546114129190615094565b925050819055505b8365ffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb85ba54b9f6f8241b7e1499e3cfc186ac0b1c8b7100f599bf6ca6844f896c342876040516114699190614488565b60405180910390a360019250505092915050565b6003818154811061148d57600080fd5b906000526020600020016000915090505481565b6000600e6000600f54815260200190815260200160002090508060000160009054906101000a900460ff1660ff168251146114db57600080fd5b81601090816114ea9190614fc2565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c61151461263c565b6040516115219190614525565b60405180910390a15050565b6004602052816000526040600020818154811061154957600080fd5b90600052602060002001600091509150508060000160009054906101000a900465ffffffffffff16908060000160069054906101000a900465ffffffffffff169080600001600c9054906101000a900460ff16905083565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611626575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165c90615114565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080600560008460010281526020019081526020016000205490506060819060020a026c010000000000000000000000009004915050919050565b6060806060600061170c856132da565b9150600c805461171b90614d05565b9050905080825161172c9190615094565b67ffffffffffffffff81111561174557611744614551565b5b6040519080825280601f01601f1916602001820160405280156117775781602001600182028036833780820191505090505b50925060005b8181101561183c57600c81815461179390614d05565b81106117a2576117a1614d99565b5b8154600116156117c15790600052602060002090602091828204019190065b9054901a7f0100000000000000000000000000000000000000000000000000000000000000028482815181106117fa576117f9614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061183490614dc8565b91505061177d565b5060005b82518110156119095782818151811061185c5761185b614d99565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028483815181106118b9576118b8614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081806118f390614dc8565b925050808061190190614dc8565b915050611840565b50829350505050919050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b606060006060806000611970866127b1565b9150600e6000600f54815260200190815260200160002093508360000160029054906101000a900460ff1660ff16905060018251826119af9190615094565b6119b99190615094565b67ffffffffffffffff8111156119d2576119d1614551565b5b6040519080825280601f01601f191660200182016040528015611a045781602001600182028036833780820191505090505b50925060005b81811015611abe578460000160039054906101000a9004700100000000000000000000000000000000028160108110611a4657611a45614d99565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002848281518110611a7c57611a7b614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611ab690614dc8565b915050611a0a565b50603a7f010000000000000000000000000000000000000000000000000000000000000002838281518110611af657611af5614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611b3090614dc8565b91505060005b8251811015611bfc57828181518110611b5257611b51614d99565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002848284611ba99190615094565b81518110611bba57611bb9614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611bf490614dc8565b915050611b36565b5082945050505050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60098054611c3a90614d05565b80601f0160208091040260200160405190810160405280929190818152602001828054611c6690614d05565b8015611cb35780601f10611c8857610100808354040283529160200191611cb3565b820191906000526020600020905b815481529060010190602001808311611c9657829003601f168201915b505050505081565b6000600e6000838152602001908152602001600020905060008160000160009054906101000a900460ff1660ff1611611cf357600080fd5b81600f819055508060000160009054906101000a900460ff1660ff1667ffffffffffffffff811115611d2857611d27614551565b5b6040519080825280601f01601f191660200182016040528015611d5a5781602001600182028036833780820191505090505b5060109081611d699190614fc2565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c611d9361263c565b604051611da09190614525565b60405180910390a15050565b8015611ecd57600073ffffffffffffffffffffffffffffffffffffffff16600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e4a57600080fd5b81600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611fe5565b600073ffffffffffffffffffffffffffffffffffffffff16600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611f6557600080fd5b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161204291906141e1565b60405180910390a35050565b606060006060600e6000600f54815260200190815260200160002091508160000160019054906101000a900460ff1660ff168260000160009054906101000a900460ff1660ff1685516120a19190615094565b6120ab9190615094565b67ffffffffffffffff8111156120c4576120c3614551565b5b6040519080825280601f01601f1916602001820160405280156120f65781602001600182028036833780820191505090505b50905060005b8260000160019054906101000a900460ff1660ff168110156121cc578260000160139054906101000a9004780100000000000000000000000000000000000000000000000002816008811061215457612153614d99565b5b1a7f01000000000000000000000000000000000000000000000000000000000000000282828151811061218a57612189614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806121c490614dc8565b9150506120fc565b8260000160009054906101000a900460ff167f01000000000000000000000000000000000000000000000000000000000000000282828151811061221357612212614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061224d90614dc8565b91505060005b85518110156123195785818151811061226f5761226e614d99565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028382846122c69190615094565b815181106122d7576122d6614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061231190614dc8565b915050612253565b50819350505050919050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806123cb5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6123d457600080fd5b60016004600085815260200190815260200160002080549050146123f757600080fd5b60006004600085815260200190815260200160002060008154811061241f5761241e614d99565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff161461245157600080fd5b600060010260056000858152602001908152602001600020541461247457600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1690507fc000000000000000000000000000000000000000000000000000000000000000811790508060010260056000858152602001908152602001600020819055506001600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461251d9190615094565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560019004604051612585919061437c565b60405180910390a38291505092915050565b600b5481565b600e6020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900460ff16908060000160029054906101000a900460ff16908060000160039054906101000a900470010000000000000000000000000000000002908060000160139054906101000a9004780100000000000000000000000000000000000000000000000002905085565b60606126d16010805461264e90614d05565b80601f016020809104026020016040519081016040528092919081815260200182805461267a90614d05565b80156126c75780601f1061269c576101008083540402835291602001916126c7565b820191906000526020600020905b8154815290600101906020018083116126aa57829003601f168201915b505050505061204e565b905090565b6126e1848484613a0a565b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f75c9e114f073c346aac7d1d7e9a3c3c14edabcdd27de07d1d9e425f45d318c5e8461279690615159565b6040516127a39190614488565b60405180910390a450505050565b606080600080600285516127c591906151c0565b67ffffffffffffffff8111156127de576127dd614551565b5b6040519080825280601f01601f1916602001820160405280156128105781602001600182028036833780820191505090505b5092506000905060005b6020811015612b5e57600460f087838151811061283a57612839614d99565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff161015612939576030836128d09190615202565b7f01000000000000000000000000000000000000000000000000000000000000000284838151811061290557612904614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506129ab565b6057836129469190615202565b7f01000000000000000000000000000000000000000000000000000000000000000284838151811061297b5761297a614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f8682815181106129c0576129bf614d99565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff161015612abe57603083612a499190615202565b7f01000000000000000000000000000000000000000000000000000000000000000284600184612a799190615094565b81518110612a8a57612a89614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612b3c565b605783612acb9190615202565b7f01000000000000000000000000000000000000000000000000000000000000000284600184612afb9190615094565b81518110612b0c57612b0b614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600282612b499190615094565b91508080612b5690614dc8565b91505061281a565b50829350505050919050565b6060600060608360010291506000600460008481526020019081526020016000208054905003612ba057612b9d8261395e565b91505b6000600460008481526020019081526020016000208054905011612bc357600080fd5b602067ffffffffffffffff811115612bde57612bdd614551565b5b6040519080825280601f01601f191660200182016040528015612c105781602001600182028036833780820191505090505b50905060005b6020811015612caa57828160208110612c3257612c31614d99565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002828281518110612c6857612c67614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080612ca290614dc8565b915050612c16565b50612cb4816116fc565b92505050919050565b6060819050601081511115612d07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cfe90615283565b60405180910390fd5b612d0f6140c7565b6000600790505b60008160ff1610612d6b576000600882612d3091906152a3565b60ff1660ff9060020a029050600086821667ffffffffffffffff161115612d575750612d6b565b8180612d62906152e0565b92505050612d16565b600181612d789190615202565b826020019060ff16908160ff16815250506008816007612d989190615309565b612da291906152a3565b60ff168567ffffffffffffffff169060020a02780100000000000000000000000000000000000000000000000002826080019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250508251826040019060ff16908160ff168152505082612e2e90615353565b82606001906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff19168152505085826000019060ff16908160ff168152505081600e60008767ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060808201518160000160136101000a81548167ffffffffffffffff0219169083780100000000000000000000000000000000000000000000000090040217905550905050505050505050565b600080600460008581526020019081526020016000208361ffff1681548110612fab57612faa614d99565b5b90600052602060002001905080600001600c9054906101000a900460ff1615613009576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300090615406565b60405180910390fd5b60008361ffff1614801561303b575060008160000160009054906101000a900465ffffffffffff1665ffffffffffff16145b1561309a5760018160000160068282829054906101000a900465ffffffffffff166130669190615426565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055506130928585612325565b9150506131eb565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061313d5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61317c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161317390615114565b60405180910390fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168160000160069054906101000a900465ffffffffffff1665ffffffffffff16106131c457600080fd5b6131e78585858460000160069054906101000a900465ffffffffffff1685613d21565b9150505b9392505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613280576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161327790615114565b60405180910390fd5b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b606080600080600285516132ee91906151c0565b67ffffffffffffffff81111561330757613306614551565b5b6040519080825280601f01601f1916602001820160405280156133395781602001600182028036833780820191505090505b5092506000905060005b602081101561368757600460f087838151811061336357613362614d99565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff161015613462576030836133f99190615202565b7f01000000000000000000000000000000000000000000000000000000000000000284838151811061342e5761342d614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506134d4565b60578361346f9190615202565b7f0100000000000000000000000000000000000000000000000000000000000000028483815181106134a4576134a3614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f8682815181106134e9576134e8614d99565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff1610156135e7576030836135729190615202565b7f010000000000000000000000000000000000000000000000000000000000000002846001846135a29190615094565b815181106135b3576135b2614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613665565b6057836135f49190615202565b7f010000000000000000000000000000000000000000000000000000000000000002846001846136249190615094565b8151811061363557613634614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b6002826136729190615094565b9150808061367f90614dc8565b915050613343565b50829350505050919050565b60008173ffffffffffffffffffffffffffffffffffffffff16600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600080600460008681526020019081526020016000208461ffff168154811061375757613756614d99565b5b90600052602060002001905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806138065750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b613845576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161383c90615114565b60405180910390fd5b60008160000160009054906101000a900465ffffffffffff1665ffffffffffff161161387057600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168365ffffffffffff16106138a257600080fd5b6138af8686868685613d21565b915050949350505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461391557600080fd5b816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b6000806005600084815260200190815260200160002054905061398081613f9f565b61398957600080fd5b61399281613fd1565b156139a05782915050613a05565b7effffffffffffffff00000000000000000000000000000000000000000000006001028116905060b881908060020a820491505090507fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000600102831681179050809150505b919050565b60003073ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401613a61919061437c565b602060405180830381865afa158015613a7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613aa29190615475565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613adc57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614613c10573373ffffffffffffffffffffffffffffffffffffffff166006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480613c0657503373ffffffffffffffffffffffffffffffffffffffff16600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b613c0f57600080fd5b5b60006006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550613c6d8284614003565b6001600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613cbd9190614d65565b925050819055506001600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613d149190615094565b9250508190555050505050565b6000806000807fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008860019004169250603067ffffffffffffffff8861ffff161667ffffffffffffffff169060020a0267ffffffffffffffff16831792508565ffffffffffff16831792508260010290506000600102600560008381526020019081526020016000205414613db457600080fd5b84600001600c9054906101000a900460ff16613e16578460000160069054906101000a900465ffffffffffff1665ffffffffffff168665ffffffffffff1614613e1557600185600001600c6101000a81548160ff0219169083151502179055505b5b67ffffffffffffffff886001900416915060b8829060020a0291507f8000000000000000000000000000000000000000000000000000000000000000821791508873ffffffffffffffffffffffffffffffffffffffff168217915060018560000160068282829054906101000a900465ffffffffffff16613e979190615426565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055508160010260056000838152602001908152602001600020819055506001600d60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613f249190615094565b925050819055508873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051613f88919061437c565b60405180910390a380935050505095945050505050565b6000807f8000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000807f4000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b60008083600102905060056000828152602001908152602001600020546001900491506000820361403357600080fd5b7fffffffffffffffffffffffff0000000000000000000000000000000000000000821691508273ffffffffffffffffffffffffffffffffffffffff168217915081600102600560008381526020019081526020016000208190555050505050565b6040518060600160405280600065ffffffffffff168152602001600065ffffffffffff1681526020016000151581525090565b6040518060a00160405280600060ff168152602001600060ff168152602001600060ff16815260200160006fffffffffffffffffffffffffffffffff19168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff191681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61417681614141565b811461418157600080fd5b50565b6000813590506141938161416d565b92915050565b6000602082840312156141af576141ae614137565b5b60006141bd84828501614184565b91505092915050565b60008115159050919050565b6141db816141c6565b82525050565b60006020820190506141f660008301846141d2565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561423657808201518184015260208101905061421b565b60008484015250505050565b6000601f19601f8301169050919050565b600061425e826141fc565b6142688185614207565b9350614278818560208601614218565b61428181614242565b840191505092915050565b600060208201905081810360008301526142a68184614253565b905092915050565b6000819050919050565b6142c1816142ae565b81146142cc57600080fd5b50565b6000813590506142de816142b8565b92915050565b6000602082840312156142fa576142f9614137565b5b6000614308848285016142cf565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061433c82614311565b9050919050565b61434c81614331565b82525050565b60006020820190506143676000830184614343565b92915050565b614376816142ae565b82525050565b6000602082019050614391600083018461436d565b92915050565b6143a081614331565b81146143ab57600080fd5b50565b6000813590506143bd81614397565b92915050565b6000806000606084860312156143dc576143db614137565b5b60006143ea868287016143ae565b93505060206143fb868287016143ae565b925050604061440c868287016142cf565b9150509250925092565b6000819050919050565b61442981614416565b811461443457600080fd5b50565b60008135905061444681614420565b92915050565b60006020828403121561446257614461614137565b5b600061447084828501614437565b91505092915050565b61448281614416565b82525050565b600060208201905061449d6000830184614479565b92915050565b6000602082840312156144b9576144b8614137565b5b60006144c7848285016143ae565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60006144f7826144d0565b61450181856144db565b9350614511818560208601614218565b61451a81614242565b840191505092915050565b6000602082019050818103600083015261453f81846144ec565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61458982614242565b810181811067ffffffffffffffff821117156145a8576145a7614551565b5b80604052505050565b60006145bb61412d565b90506145c78282614580565b919050565b600067ffffffffffffffff8211156145e7576145e6614551565b5b6145f082614242565b9050602081019050919050565b82818337600083830152505050565b600061461f61461a846145cc565b6145b1565b90508281526020810184848401111561463b5761463a61454c565b5b6146468482856145fd565b509392505050565b600082601f83011261466357614662614547565b5b813561467384826020860161460c565b91505092915050565b60006020828403121561469257614691614137565b5b600082013567ffffffffffffffff8111156146b0576146af61413c565b5b6146bc8482850161464e565b91505092915050565b600065ffffffffffff82169050919050565b6146e0816146c5565b81146146eb57600080fd5b50565b6000813590506146fd816146d7565b92915050565b6000806040838503121561471a57614719614137565b5b600061472885828601614437565b9250506020614739858286016146ee565b9150509250929050565b600067ffffffffffffffff82111561475e5761475d614551565b5b61476782614242565b9050602081019050919050565b600061478761478284614743565b6145b1565b9050828152602081018484840111156147a3576147a261454c565b5b6147ae8482856145fd565b509392505050565b600082601f8301126147cb576147ca614547565b5b81356147db848260208601614774565b91505092915050565b6000602082840312156147fa576147f9614137565b5b600082013567ffffffffffffffff8111156148185761481761413c565b5b614824848285016147b6565b91505092915050565b6000806040838503121561484457614843614137565b5b600061485285828601614437565b9250506020614863858286016142cf565b9150509250929050565b614876816146c5565b82525050565b6000606082019050614891600083018661486d565b61489e602083018561486d565b6148ab60408301846141d2565b949350505050565b6148bc816141c6565b81146148c757600080fd5b50565b6000813590506148d9816148b3565b92915050565b600080604083850312156148f6576148f5614137565b5b6000614904858286016143ae565b9250506020614915858286016148ca565b9150509250929050565b6000806040838503121561493657614935614137565b5b6000614944858286016143ae565b925050602061495585828601614437565b9150509250929050565b600060ff82169050919050565b6149758161495f565b82525050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b6149b08161497b565b82525050565b60007fffffffffffffffff00000000000000000000000000000000000000000000000082169050919050565b6149eb816149b6565b82525050565b600060a082019050614a06600083018861496c565b614a13602083018761496c565b614a20604083018661496c565b614a2d60608301856149a7565b614a3a60808301846149e2565b9695505050505050565b60008060008060808587031215614a5e57614a5d614137565b5b6000614a6c878288016143ae565b9450506020614a7d878288016143ae565b9350506040614a8e878288016142cf565b925050606085013567ffffffffffffffff811115614aaf57614aae61413c565b5b614abb878288016147b6565b91505092959194509250565b614ad08161495f565b8114614adb57600080fd5b50565b600081359050614aed81614ac7565b92915050565b600067ffffffffffffffff82169050919050565b614b1081614af3565b8114614b1b57600080fd5b50565b600081359050614b2d81614b07565b92915050565b600080600060608486031215614b4c57614b4b614137565b5b6000614b5a86828701614ade565b9350506020614b6b86828701614b1e565b925050604084013567ffffffffffffffff811115614b8c57614b8b61413c565b5b614b988682870161464e565b9150509250925092565b600061ffff82169050919050565b614bb981614ba2565b8114614bc457600080fd5b50565b600081359050614bd681614bb0565b92915050565b600080600060608486031215614bf557614bf4614137565b5b6000614c03868287016143ae565b9350506020614c1486828701614437565b9250506040614c2586828701614bc7565b9150509250925092565b60008060408385031215614c4657614c45614137565b5b6000614c54858286016143ae565b9250506020614c65858286016143ae565b9150509250929050565b60008060008060808587031215614c8957614c88614137565b5b6000614c97878288016143ae565b9450506020614ca887828801614437565b9350506040614cb987828801614bc7565b9250506060614cca878288016146ee565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614d1d57607f821691505b602082108103614d3057614d2f614cd6565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614d70826142ae565b9150614d7b836142ae565b9250828203905081811115614d9357614d92614d36565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614dd3826142ae565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614e0557614e04614d36565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302614e757fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614e35565b614e7f8683614e35565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614ebc614eb7614eb2846142ae565b614e97565b6142ae565b9050919050565b6000819050919050565b614ed683614ea1565b614eea614ee282614ec3565b848454614e45565b825550505050565b600090565b614eff614ef2565b614f0a818484614ecd565b505050565b5b81811015614f2e57614f23600082614ef7565b600181019050614f10565b5050565b601f821115614f7357614f4481614e10565b614f4d84614e25565b81016020851015614f5c578190505b614f70614f6885614e25565b830182614f0f565b50505b505050565b60008160020a8304905092915050565b6000614f9960001984600802614f78565b1980831691505092915050565b6000614fb28383614f88565b9150826002028217905092915050565b614fcb826144d0565b67ffffffffffffffff811115614fe457614fe3614551565b5b614fee8254614d05565b614ff9828285614f32565b600060209050601f83116001811461502c576000841561501a578287015190505b6150248582614fa6565b86555061508c565b601f19841661503a86614e10565b60005b828110156150625784890151825560018201915060208501945060208101905061503d565b8683101561507f578489015161507b601f891682614f88565b8355505b6001600288020188555050505b505050505050565b600061509f826142ae565b91506150aa836142ae565b92508282019050808211156150c2576150c1614d36565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b60006150fe600a83614207565b9150615109826150c8565b602082019050919050565b6000602082019050818103600083015261512d816150f1565b9050919050565b6000819050602082019050919050565b60006151508251614416565b80915050919050565b6000615164826144d0565b8261516e84615134565b905061517981615144565b925060208210156151b9576151b47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802614e35565b831692505b5050919050565b60006151cb826142ae565b91506151d6836142ae565b92508282026151e4816142ae565b915082820484148315176151fb576151fa614d36565b5b5092915050565b600061520d8261495f565b91506152188361495f565b9250828201905060ff81111561523157615230614d36565b5b92915050565b7f4552525f5052454649585f544f4f5f4c4f4e4700000000000000000000000000600082015250565b600061526d601383614207565b915061527882615237565b602082019050919050565b6000602082019050818103600083015261529c81615260565b9050919050565b60006152ae8261495f565b91506152b98361495f565b92508282026152c78161495f565b91508082146152d9576152d8614d36565b5b5092915050565b60006152eb8261495f565b9150600082036152fe576152fd614d36565b5b600182039050919050565b60006153148261495f565b915061531f8361495f565b9250828203905060ff81111561533857615337614d36565b5b92915050565b600061534a825161497b565b80915050919050565b600061535e826144d0565b8261536884615134565b90506153738161533e565b925060108210156153b3576153ae7fffffffffffffffffffffffffffffffff0000000000000000000000000000000083601003600802614e35565b831692505b5050919050565b7f4552525f53504152534500000000000000000000000000000000000000000000600082015250565b60006153f0600a83614207565b91506153fb826153ba565b602082019050919050565b6000602082019050818103600083015261541f816153e3565b9050919050565b6000615431826146c5565b915061543c836146c5565b9250828201905065ffffffffffff81111561545a57615459614d36565b5b92915050565b60008151905061546f81614397565b92915050565b60006020828403121561548b5761548a614137565b5b600061549984828501615460565b9150509291505056fea264697066735822122050c11a77622eb8ef9b3cb964041ec68b1bc52e4e275ec465debf91838b61bb5064736f6c63430008120033 -\ No newline at end of file +60806040523480156200001157600080fd5b5060405162006c7d38038062006c7d833981810160405281019062000037919062000b97565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600c8190555083600a90816200008f919062000e98565b5082600b9081620000a1919062000e98565b50620000f5602060126040518060400160405280600681526020017f736861323536000000000000000000000000000000000000000000000000000081525062000197640100000000026401000000009004565b6200011060126200046e640100000000026401000000009004565b602067ffffffffffffffff8111156200012e576200012d620009bb565b5b6040519080825280601f01601f191660200182016040528015620001615781602001600182028036833780820191505090505b506013908162000172919062000fef565b5080600660006101000a81548160ff0219169083151502179055505050505062001471565b6060819050601081511115620001e4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001db9062001137565b60405180910390fd5b620001ee62000926565b6000600790505b60008160ff16106200025257600060088262000212919062001195565b60ff1660ff9060020a029050600086821667ffffffffffffffff1611156200023b575062000252565b81806200024890620011db565b92505050620001f5565b60018162000261919062001209565b826020019060ff16908160ff1681525050600881600762000283919062001245565b6200028f919062001195565b60ff168567ffffffffffffffff169060020a02780100000000000000000000000000000000000000000000000002826080019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250508251826040019060ff16908160ff1681525050826200031d90620012d4565b82606001906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff19168152505085826000019060ff16908160ff168152505081601160008767ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060808201518160000160136101000a81548167ffffffffffffffff0219169083780100000000000000000000000000000000000000000000000090040217905550905050505050505050565b600060116000838152602001908152602001600020905060008160000160009054906101000a900460ff1660ff1611620004a757600080fd5b816012819055508060000160009054906101000a900460ff1660ff1667ffffffffffffffff811115620004df57620004de620009bb565b5b6040519080825280601f01601f191660200182016040528015620005125781602001600182028036833780820191505090505b506013908162000523919062000fef565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c6200055e62000579640100000000026401000000009004565b6040516200056d919062001396565b60405180910390a15050565b606062000627601380546200058e9062000c81565b80601f0160208091040260200160405190810160405280929190818152602001828054620005bc9062000c81565b80156200060d5780601f10620005e1576101008083540402835291602001916200060d565b820191906000526020600020905b815481529060010190602001808311620005ef57829003601f168201915b50505050506200062c640100000000026401000000009004565b905090565b60606000606060116000601254815260200190815260200160002091508160000160019054906101000a900460ff1660ff168260000160009054906101000a900460ff1660ff168551620006819190620013ba565b6200068d9190620013ba565b67ffffffffffffffff811115620006a957620006a8620009bb565b5b6040519080825280601f01601f191660200182016040528015620006dc5781602001600182028036833780820191505090505b50905060005b8260000160019054906101000a900460ff1660ff16811015620007bc578260000160139054906101000a900478010000000000000000000000000000000000000000000000000281600881106200073e576200073d620013f5565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002828281518110620007775762000776620013f5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080620007b39062001424565b915050620006e2565b8260000160009054906101000a900460ff167f010000000000000000000000000000000000000000000000000000000000000002828281518110620008065762000805620013f5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080620008429062001424565b91505060005b85518110156200091a57858181518110620008685762000867620013f5565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002838284620008c19190620013ba565b81518110620008d557620008d4620013f5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080620009119062001424565b91505062000848565b50819350505050919050565b6040518060a00160405280600060ff168152602001600060ff168152602001600060ff16815260200160006fffffffffffffffffffffffffffffffff19168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff191681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620009f582620009aa565b810181811067ffffffffffffffff8211171562000a175762000a16620009bb565b5b80604052505050565b600062000a2c6200098c565b905062000a3a8282620009ea565b919050565b600067ffffffffffffffff82111562000a5d5762000a5c620009bb565b5b62000a6882620009aa565b9050602081019050919050565b60005b8381101562000a9557808201518184015260208101905062000a78565b60008484015250505050565b600062000ab862000ab28462000a3f565b62000a20565b90508281526020810184848401111562000ad75762000ad6620009a5565b5b62000ae484828562000a75565b509392505050565b600082601f83011262000b045762000b03620009a0565b5b815162000b1684826020860162000aa1565b91505092915050565b6000819050919050565b62000b348162000b1f565b811462000b4057600080fd5b50565b60008151905062000b548162000b29565b92915050565b60008115159050919050565b62000b718162000b5a565b811462000b7d57600080fd5b50565b60008151905062000b918162000b66565b92915050565b6000806000806080858703121562000bb45762000bb362000996565b5b600085015167ffffffffffffffff81111562000bd55762000bd46200099b565b5b62000be38782880162000aec565b945050602085015167ffffffffffffffff81111562000c075762000c066200099b565b5b62000c158782880162000aec565b935050604062000c288782880162000b43565b925050606062000c3b8782880162000b80565b91505092959194509250565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000c9a57607f821691505b60208210810362000cb05762000caf62000c52565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000d1d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000cdb565b62000d29868362000cdb565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000d7662000d7062000d6a8462000d41565b62000d4b565b62000d41565b9050919050565b6000819050919050565b62000d928362000d55565b62000daa62000da18262000d7d565b84845462000ceb565b825550505050565b600090565b62000dc162000db2565b62000dce81848462000d87565b505050565b5b8181101562000df65762000dea60008262000db7565b60018101905062000dd4565b5050565b601f82111562000e455762000e0f8162000cb6565b62000e1a8462000ccb565b8101602085101562000e2a578190505b62000e4262000e398562000ccb565b83018262000dd3565b50505b505050565b60008160020a8304905092915050565b600062000e6d6000198460080262000e4a565b1980831691505092915050565b600062000e88838362000e5a565b9150826002028217905092915050565b62000ea38262000c47565b67ffffffffffffffff81111562000ebf5762000ebe620009bb565b5b62000ecb825462000c81565b62000ed882828562000dfa565b600060209050601f83116001811462000f10576000841562000efb578287015190505b62000f07858262000e7a565b86555062000f77565b601f19841662000f208662000cb6565b60005b8281101562000f4a5784890151825560018201915060208501945060208101905062000f23565b8683101562000f6a578489015162000f66601f89168262000e5a565b8355505b6001600288020188555050505b505050505050565b600081519050919050565b60008190508160005260206000209050919050565b601f82111562000fea5762000fb48162000f8a565b62000fbf8462000ccb565b8101602085101562000fcf578190505b62000fe762000fde8562000ccb565b83018262000dd3565b50505b505050565b62000ffa8262000f7f565b67ffffffffffffffff811115620010165762001015620009bb565b5b62001022825462000c81565b6200102f82828562000f9f565b600060209050601f83116001811462001067576000841562001052578287015190505b6200105e858262000e7a565b865550620010ce565b601f198416620010778662000f8a565b60005b82811015620010a1578489015182556001820191506020850194506020810190506200107a565b86831015620010c15784890151620010bd601f89168262000e5a565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4552525f5052454649585f544f4f5f4c4f4e4700000000000000000000000000600082015250565b60006200111f601383620010d6565b91506200112c82620010e7565b602082019050919050565b60006020820190508181036000830152620011528162001110565b9050919050565b600060ff82169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620011a28262001159565b9150620011af8362001159565b9250828202620011bf8162001159565b9150808214620011d457620011d362001166565b5b5092915050565b6000620011e88262001159565b915060008203620011fe57620011fd62001166565b5b600182039050919050565b6000620012168262001159565b9150620012238362001159565b9250828201905060ff8111156200123f576200123e62001166565b5b92915050565b6000620012528262001159565b91506200125f8362001159565b9250828203905060ff8111156200127b576200127a62001166565b5b92915050565b6000819050602082019050919050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b6000620012cb825162001291565b80915050919050565b6000620012e18262000f7f565b82620012ed8462001281565b9050620012fa81620012bd565b925060108210156200133d57620013387fffffffffffffffffffffffffffffffff000000000000000000000000000000008360100360080262000cdb565b831692505b5050919050565b600082825260208201905092915050565b6000620013628262000f7f565b6200136e818562001344565b93506200138081856020860162000a75565b6200138b81620009aa565b840191505092915050565b60006020820190508181036000830152620013b2818462001355565b905092915050565b6000620013c78262000d41565b9150620013d48362000d41565b9250828201905080821115620013ef57620013ee62001166565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000620014318262000d41565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362001466576200146562001166565b5b600182019050919050565b6157fc80620014816000396000f3fe608060405260043610610263576000357c01000000000000000000000000000000000000000000000000000000009004806386e90b5911610156578063b88d4fde116100d3578063da2824a811610097578063da2824a81461096c578063e8a7f4c514610995578063e985e9c5146109d2578063f117e17314610a0f578063f2fde38b14610a4c578063f9613ab214610a8957610263565b8063b88d4fde14610870578063c5bec6fc1461088c578063c87b56dd146108c9578063ccc094c214610906578063d824ee4f1461092f57610263565b8063ad0dec2f1161011a578063ad0dec2f1461075f578063adf288df1461079c578063b1a6afd3146107d9578063b238d60314610804578063b5fdeb231461084557610263565b806386e90b591461067a5780638da5cb5b146106b757806395d89b41146106e25780639a7c5e9f1461070d578063a22cb4651461073657610263565b806349f2553a116101e4578063559f5dc9116101a8578063559f5dc91461055b5780635ae06f7e1461059a5780636352211e146105c35780636b9cb86a1461060057806370a082311461063d57610263565b806349f2553a146104525780634d03546a1461047b5780634f64b2be146104b85780634f6ccce7146104f55780635344299a1461053257610263565b806324e0febc1161022b57806324e0febc146103545780632b29ba23146103915780632f745c59146103ce57806340c84b0e1461040b57806342842e0e1461043657610263565b806301ffc9a71461026857806306fdde03146102a5578063081812fc146102d057806318160ddd1461030d57806323b872dd14610338575b600080fd5b34801561027457600080fd5b5061028f600480360381019061028a919061447d565b610ac6565b60405161029c91906144c5565b60405180910390f35b3480156102b157600080fd5b506102ba610c1a565b6040516102c79190614570565b60405180910390f35b3480156102dc57600080fd5b506102f760048036038101906102f291906145c8565b610ca8565b6040516103049190614636565b60405180910390f35b34801561031957600080fd5b50610322610ce5565b60405161032f9190614660565b60405180910390f35b610352600480360381019061034d91906146a7565b610cf2565b005b34801561036057600080fd5b5061037b60048036038101906103769190614730565b610d5d565b604051610388919061476c565b60405180910390f35b34801561039d57600080fd5b506103b860048036038101906103b39190614787565b610d75565b6040516103c591906144c5565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f091906147b4565b610e21565b6040516104029190614660565b60405180910390f35b34801561041757600080fd5b50610420610e46565b60405161042d9190614849565b60405180910390f35b610450600480360381019061044b91906146a7565b610ed4565b005b34801561045e57600080fd5b50610479600480360381019061047491906149a0565b610f3f565b005b34801561048757600080fd5b506104a2600480360381019061049d9190614a27565b611257565b6040516104af91906144c5565b60405180910390f35b3480156104c457600080fd5b506104df60048036038101906104da91906145c8565b6114e4565b6040516104ec919061476c565b60405180910390f35b34801561050157600080fd5b5061051c600480360381019061051791906145c8565b611508565b6040516105299190614660565b60405180910390f35b34801561053e57600080fd5b5061055960048036038101906105549190614b08565b61152c565b005b34801561056757600080fd5b50610582600480360381019061057d9190614b51565b6115b8565b60405161059193929190614ba0565b60405180910390f35b3480156105a657600080fd5b506105c160048036038101906105bc9190614787565b61162c565b005b3480156105cf57600080fd5b506105ea60048036038101906105e591906145c8565b61174b565b6040516105f79190614636565b60405180910390f35b34801561060c57600080fd5b5061062760048036038101906106229190614b08565b611787565b6040516106349190614570565b60405180910390f35b34801561064957600080fd5b50610664600480360381019061065f9190614787565b6119a0565b6040516106719190614660565b60405180910390f35b34801561068657600080fd5b506106a1600480360381019061069c9190614b08565b6119e9565b6040516106ae9190614570565b60405180910390f35b3480156106c357600080fd5b506106cc611c94565b6040516106d99190614636565b60405180910390f35b3480156106ee57600080fd5b506106f7611cb8565b6040516107049190614570565b60405180910390f35b34801561071957600080fd5b50610734600480360381019061072f91906145c8565b611d46565b005b34801561074257600080fd5b5061075d60048036038101906107589190614c03565b611e37565b005b34801561076b57600080fd5b5061078660048036038101906107819190614b08565b6120d9565b6040516107939190614849565b60405180910390f35b3480156107a857600080fd5b506107c360048036038101906107be9190614c43565b6123b0565b6040516107d0919061476c565b60405180910390f35b3480156107e557600080fd5b506107ee61271c565b6040516107fb919061476c565b60405180910390f35b34801561081057600080fd5b5061082b600480360381019061082691906145c8565b612722565b60405161083c959493929190614d15565b60405180910390f35b34801561085157600080fd5b5061085a6127c1565b6040516108679190614849565b60405180910390f35b61088a60048036038101906108859190614d68565b61285b565b005b34801561089857600080fd5b506108b360048036038101906108ae9190614b08565b612936565b6040516108c09190614849565b60405180910390f35b3480156108d557600080fd5b506108f060048036038101906108eb91906145c8565b612cef565b6040516108fd9190614570565b60405180910390f35b34801561091257600080fd5b5061092d60048036038101906109289190614e57565b612e42565b005b34801561093b57600080fd5b5061095660048036038101906109519190614f00565b613104565b604051610963919061476c565b60405180910390f35b34801561097857600080fd5b50610993600480360381019061098e9190614787565b613377565b005b3480156109a157600080fd5b506109bc60048036038101906109b79190614b08565b61345f565b6040516109c99190614849565b60405180910390f35b3480156109de57600080fd5b506109f960048036038101906109f49190614f53565b613818565b604051610a0691906144c5565b60405180910390f35b348015610a1b57600080fd5b50610a366004803603810190610a319190614f93565b6138b0565b604051610a43919061476c565b60405180910390f35b348015610a5857600080fd5b50610a736004803603810190610a6e9190614787565b613a3f565b604051610a8091906144c5565b60405180910390f35b348015610a9557600080fd5b50610ab06004803603810190610aab9190614730565b613ae3565b604051610abd919061476c565b60405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b1a5760019050610c15565b635b5e139f7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b6c5760019050610c15565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610bbe5760019050610c15565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c105760019050610c15565b600090505b919050565b600a8054610c2790615029565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5390615029565b8015610ca05780601f10610c7557610100808354040283529160200191610ca0565b820191906000526020600020905b815481529060010190602001808311610c8357829003601f168201915b505050505081565b60006008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600780549050905090565b610cfd838383613b8f565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60056020528060005260406000206000915090505481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680610e1a575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b600e602052816000526040600020602052806000526040600020600091509150505481565b600d8054610e5390615029565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7f90615029565b8015610ecc5780601f10610ea157610100808354040283529160200191610ecc565b820191906000526020600020905b815481529060010190602001808311610eaf57829003601f168201915b505050505081565b610edf838383613b8f565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f9c57600080fd5b82915081519050602f7f01000000000000000000000000000000000000000000000000000000000000000282600183610fd59190615089565b81518110610fe657610fe56150bd565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611066578080611062906150ec565b9150505b8067ffffffffffffffff8111156110805761107f614875565b5b6040519080825280601f01601f1916602001820160405280156110b25781602001600182028036833780820191505090505b50600d90816110c191906152e6565b5060005b82518110156111b2578281815181106110e1576110e06150bd565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002600d82815461113990615029565b8110611148576111476150bd565b5b8154600116156111675790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f01000000000000000000000000000000000000000000000000000000000000008404021790555080806111aa906150ec565b9150506110c5565b5081518114611252577f2f00000000000000000000000000000000000000000000000000000000000000600d835181546111eb90615029565b81106111fa576111f96150bd565b5b8154600116156112195790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055505b505050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806112fd5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61130657600080fd5b61130e614378565b60046000868152602001908152602001600020805490509150600082111561138b57600060046000878152602001908152602001600020600081548110611358576113576150bd565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff161161138a57600080fd5b5b83816000019065ffffffffffff16908165ffffffffffff168152505060046000868152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001600c6101000a81548160ff021916908315150217905550505060038590806001815401808255809150506001900390600052602060002001600090919091909150558365ffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb85ba54b9f6f8241b7e1499e3cfc186ac0b1c8b7100f599bf6ca6844f896c342876040516114d0919061476c565b60405180910390a360019250505092915050565b600381815481106114f457600080fd5b906000526020600020016000915090505481565b6007818154811061151857600080fd5b906000526020600020016000915090505481565b600060116000601254815260200190815260200160002090508060000160009054906101000a900460ff1660ff1682511461156657600080fd5b816013908161157591906152e6565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c61159f6127c1565b6040516115ac9190614849565b60405180910390a15050565b600460205281600052604060002081815481106115d457600080fd5b90600052602060002001600091509150508060000160009054906101000a900465ffffffffffff16908060000160069054906101000a900465ffffffffffff169080600001600c9054906101000a900460ff16905083565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806116b1575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6116f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e790615404565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080600560008460010281526020019081526020016000205490506060819060020a026c010000000000000000000000009004915050919050565b606080606060006117978561345f565b9150600d80546117a690615029565b905090508082516117b79190615424565b67ffffffffffffffff8111156117d0576117cf614875565b5b6040519080825280601f01601f1916602001820160405280156118025781602001600182028036833780820191505090505b50925060005b818110156118c757600d81815461181e90615029565b811061182d5761182c6150bd565b5b81546001161561184c5790600052602060002090602091828204019190065b9054901a7f010000000000000000000000000000000000000000000000000000000000000002848281518110611885576118846150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806118bf906150ec565b915050611808565b5060005b8251811015611994578281815181106118e7576118e66150bd565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002848381518110611944576119436150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350818061197e906150ec565b925050808061198c906150ec565b9150506118cb565b50829350505050919050565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600060608060006119fb86612936565b915060116000601254815260200190815260200160002093508360000160029054906101000a900460ff1660ff1690506001825182611a3a9190615424565b611a449190615424565b67ffffffffffffffff811115611a5d57611a5c614875565b5b6040519080825280601f01601f191660200182016040528015611a8f5781602001600182028036833780820191505090505b50925060005b81811015611b49578460000160039054906101000a9004700100000000000000000000000000000000028160108110611ad157611ad06150bd565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002848281518110611b0757611b066150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611b41906150ec565b915050611a95565b50603a7f010000000000000000000000000000000000000000000000000000000000000002838281518110611b8157611b806150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611bbb906150ec565b91505060005b8251811015611c8757828181518110611bdd57611bdc6150bd565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002848284611c349190615424565b81518110611c4557611c446150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611c7f906150ec565b915050611bc1565b5082945050505050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b8054611cc590615029565b80601f0160208091040260200160405190810160405280929190818152602001828054611cf190615029565b8015611d3e5780601f10611d1357610100808354040283529160200191611d3e565b820191906000526020600020905b815481529060010190602001808311611d2157829003601f168201915b505050505081565b600060116000838152602001908152602001600020905060008160000160009054906101000a900460ff1660ff1611611d7e57600080fd5b816012819055508060000160009054906101000a900460ff1660ff1667ffffffffffffffff811115611db357611db2614875565b5b6040519080825280601f01601f191660200182016040528015611de55781602001600182028036833780820191505090505b5060139081611df491906152e6565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c611e1e6127c1565b604051611e2b9190614849565b60405180910390a15050565b8015611f5857600073ffffffffffffffffffffffffffffffffffffffff16600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ed557600080fd5b81600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612070565b600073ffffffffffffffffffffffffffffffffffffffff16600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611ff057600080fd5b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120cd91906144c5565b60405180910390a35050565b60606000606060116000601254815260200190815260200160002091508160000160019054906101000a900460ff1660ff168260000160009054906101000a900460ff1660ff16855161212c9190615424565b6121369190615424565b67ffffffffffffffff81111561214f5761214e614875565b5b6040519080825280601f01601f1916602001820160405280156121815781602001600182028036833780820191505090505b50905060005b8260000160019054906101000a900460ff1660ff16811015612257578260000160139054906101000a900478010000000000000000000000000000000000000000000000000281600881106121df576121de6150bd565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002828281518110612215576122146150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061224f906150ec565b915050612187565b8260000160009054906101000a900460ff167f01000000000000000000000000000000000000000000000000000000000000000282828151811061229e5761229d6150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806122d8906150ec565b91505060005b85518110156123a4578581815181106122fa576122f96150bd565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028382846123519190615424565b81518110612362576123616150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061239c906150ec565b9150506122de565b50819350505050919050565b60008060008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806124595750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61246257600080fd5b600160046000878152602001908152602001600020805490501461248557600080fd5b6000600460008781526020019081526020016000206000815481106124ad576124ac6150bd565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff16146124df57600080fd5b600060010260056000878152602001908152602001600020541461250257600080fd5b8573ffffffffffffffffffffffffffffffffffffffff1692507fc0000000000000000000000000000000000000000000000000000000000000008317925082600102600560008781526020019081526020016000208190555084600190049150600660009054906101000a900460ff161561262757601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080600f60008481526020019081526020016000208190555081600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055505b6001601060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126779190615424565b925050819055506007856001900490806001815401808255809150506001900390600052602060002001600090919091909150558573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8846040516127089190614660565b60405180910390a384935050505092915050565b600c5481565b60116020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900460ff16908060000160029054906101000a900460ff16908060000160039054906101000a900470010000000000000000000000000000000002908060000160139054906101000a9004780100000000000000000000000000000000000000000000000002905085565b6060612856601380546127d390615029565b80601f01602080910402602001604051908101604052809291908181526020018280546127ff90615029565b801561284c5780601f106128215761010080835404028352916020019161284c565b820191906000526020600020905b81548152906001019060200180831161282f57829003601f168201915b50505050506120d9565b905090565b612866848484613b8f565b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f75c9e114f073c346aac7d1d7e9a3c3c14edabcdd27de07d1d9e425f45d318c5e8461291b9061547d565b604051612928919061476c565b60405180910390a450505050565b6060806000806002855161294a91906154e4565b67ffffffffffffffff81111561296357612962614875565b5b6040519080825280601f01601f1916602001820160405280156129955781602001600182028036833780820191505090505b5092506000905060005b6020811015612ce357600460f08783815181106129bf576129be6150bd565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff161015612abe57603083612a559190615526565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110612a8a57612a896150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612b30565b605783612acb9190615526565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110612b0057612aff6150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f868281518110612b4557612b446150bd565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff161015612c4357603083612bce9190615526565b7f01000000000000000000000000000000000000000000000000000000000000000284600184612bfe9190615424565b81518110612c0f57612c0e6150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612cc1565b605783612c509190615526565b7f01000000000000000000000000000000000000000000000000000000000000000284600184612c809190615424565b81518110612c9157612c906150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600282612cce9190615424565b91508080612cdb906150ec565b91505061299f565b50829350505050919050565b6060600060608360010291506000600460008481526020019081526020016000208054905003612d2557612d2282613ae3565b91505b6000600460008481526020019081526020016000208054905011612d4857600080fd5b602067ffffffffffffffff811115612d6357612d62614875565b5b6040519080825280601f01601f191660200182016040528015612d955781602001600182028036833780820191505090505b50905060005b6020811015612e2f57828160208110612db757612db66150bd565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002828281518110612ded57612dec6150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080612e27906150ec565b915050612d9b565b50612e3981611787565b92505050919050565b6060819050601081511115612e8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e83906155a7565b60405180910390fd5b612e946143ab565b6000600790505b60008160ff1610612ef0576000600882612eb591906155c7565b60ff1660ff9060020a029050600086821667ffffffffffffffff161115612edc5750612ef0565b8180612ee790615604565b92505050612e9b565b600181612efd9190615526565b826020019060ff16908160ff16815250506008816007612f1d919061562d565b612f2791906155c7565b60ff168567ffffffffffffffff169060020a02780100000000000000000000000000000000000000000000000002826080019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250508251826040019060ff16908160ff168152505082612fb390615677565b82606001906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff19168152505085826000019060ff16908160ff168152505081601160008767ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060808201518160000160136101000a81548167ffffffffffffffff0219169083780100000000000000000000000000000000000000000000000090040217905550905050505050505050565b600080600460008581526020019081526020016000208361ffff16815481106131305761312f6150bd565b5b90600052602060002001905080600001600c9054906101000a900460ff161561318e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131859061572a565b60405180910390fd5b60008361ffff161480156131c0575060008160000160009054906101000a900465ffffffffffff1665ffffffffffff16145b1561321f5760018160000160068282829054906101000a900465ffffffffffff166131eb919061574a565b92506101000a81548165ffffffffffff021916908365ffffffffffff16021790555061321785856123b0565b915050613370565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806132c25750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b613301576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132f890615404565b60405180910390fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168160000160069054906101000a900465ffffffffffff1665ffffffffffff161061334957600080fd5b61336c8585858460000160069054906101000a900465ffffffffffff1685613f14565b9150505b9392505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133fc90615404565b60405180910390fd5b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6060806000806002855161347391906154e4565b67ffffffffffffffff81111561348c5761348b614875565b5b6040519080825280601f01601f1916602001820160405280156134be5781602001600182028036833780820191505090505b5092506000905060005b602081101561380c57600460f08783815181106134e8576134e76150bd565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff1610156135e75760308361357e9190615526565b7f0100000000000000000000000000000000000000000000000000000000000000028483815181106135b3576135b26150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613659565b6057836135f49190615526565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110613629576136286150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f86828151811061366e5761366d6150bd565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff16101561376c576030836136f79190615526565b7f010000000000000000000000000000000000000000000000000000000000000002846001846137279190615424565b81518110613738576137376150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506137ea565b6057836137799190615526565b7f010000000000000000000000000000000000000000000000000000000000000002846001846137a99190615424565b815181106137ba576137b96150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b6002826137f79190615424565b91508080613804906150ec565b9150506134c8565b50829350505050919050565b60008173ffffffffffffffffffffffffffffffffffffffff16600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600080600460008681526020019081526020016000208461ffff16815481106138dc576138db6150bd565b5b90600052602060002001905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061398b5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6139ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139c190615404565b60405180910390fd5b60008160000160009054906101000a900465ffffffffffff1665ffffffffffff16116139f557600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168365ffffffffffff1610613a2757600080fd5b613a348686868685613f14565b915050949350505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613a9a57600080fd5b816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b60008060056000848152602001908152602001600020549050613b0581614283565b613b0e57600080fd5b613b17816142b5565b15613b255782915050613b8a565b7effffffffffffffff00000000000000000000000000000000000000000000006001028116905060b881908060020a820491505090507fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000600102831681179050809150505b919050565b6000803073ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401613be79190614660565b602060405180830381865afa158015613c04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c289190615799565b91508473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613c6257600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614613d96573373ffffffffffffffffffffffffffffffffffffffff166008600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480613d8c57503373ffffffffffffffffffffffffffffffffffffffff16600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b613d9557600080fd5b5b60006008600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550613df383856142e7565b600f60008481526020019081526020016000205490506000600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055506001601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613eaf9190615089565b925050819055506001601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613f069190615424565b925050819055505050505050565b60008060008060007fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008960019004169350603067ffffffffffffffff8961ffff161667ffffffffffffffff169060020a0267ffffffffffffffff16841793508665ffffffffffff16841793508360010291506000600102600560008481526020019081526020016000205414613fa957600080fd5b85600001600c9054906101000a900460ff1661400b578560000160069054906101000a900465ffffffffffff1665ffffffffffff168765ffffffffffff161461400a57600186600001600c6101000a81548160ff0219169083151502179055505b5b67ffffffffffffffff896001900416925060b8839060020a0292507f8000000000000000000000000000000000000000000000000000000000000000831792508973ffffffffffffffffffffffffffffffffffffffff168317925060018660000160068282829054906101000a900465ffffffffffff1661408c919061574a565b92506101000a81548165ffffffffffff021916908365ffffffffffff160217905550826001026005600084815260200190815260200160002081905550600660009054906101000a900460ff161561418e57601060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080600f60008681526020019081526020016000208190555083600e60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055505b6001601060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546141de9190615424565b9250508190555060078490806001815401808255809150506001900390600052602060002001600090919091909150558973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88660405161426b9190614660565b60405180910390a38194505050505095945050505050565b6000807f8000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000807f4000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b60008083600102905060056000828152602001908152602001600020546001900491506000820361431757600080fd5b7fffffffffffffffffffffffff0000000000000000000000000000000000000000821691508273ffffffffffffffffffffffffffffffffffffffff168217915081600102600560008381526020019081526020016000208190555050505050565b6040518060600160405280600065ffffffffffff168152602001600065ffffffffffff1681526020016000151581525090565b6040518060a00160405280600060ff168152602001600060ff168152602001600060ff16815260200160006fffffffffffffffffffffffffffffffff19168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff191681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61445a81614425565b811461446557600080fd5b50565b60008135905061447781614451565b92915050565b6000602082840312156144935761449261441b565b5b60006144a184828501614468565b91505092915050565b60008115159050919050565b6144bf816144aa565b82525050565b60006020820190506144da60008301846144b6565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561451a5780820151818401526020810190506144ff565b60008484015250505050565b6000601f19601f8301169050919050565b6000614542826144e0565b61454c81856144eb565b935061455c8185602086016144fc565b61456581614526565b840191505092915050565b6000602082019050818103600083015261458a8184614537565b905092915050565b6000819050919050565b6145a581614592565b81146145b057600080fd5b50565b6000813590506145c28161459c565b92915050565b6000602082840312156145de576145dd61441b565b5b60006145ec848285016145b3565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614620826145f5565b9050919050565b61463081614615565b82525050565b600060208201905061464b6000830184614627565b92915050565b61465a81614592565b82525050565b60006020820190506146756000830184614651565b92915050565b61468481614615565b811461468f57600080fd5b50565b6000813590506146a18161467b565b92915050565b6000806000606084860312156146c0576146bf61441b565b5b60006146ce86828701614692565b93505060206146df86828701614692565b92505060406146f0868287016145b3565b9150509250925092565b6000819050919050565b61470d816146fa565b811461471857600080fd5b50565b60008135905061472a81614704565b92915050565b6000602082840312156147465761474561441b565b5b60006147548482850161471b565b91505092915050565b614766816146fa565b82525050565b6000602082019050614781600083018461475d565b92915050565b60006020828403121561479d5761479c61441b565b5b60006147ab84828501614692565b91505092915050565b600080604083850312156147cb576147ca61441b565b5b60006147d985828601614692565b92505060206147ea858286016145b3565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b600061481b826147f4565b61482581856147ff565b93506148358185602086016144fc565b61483e81614526565b840191505092915050565b600060208201905081810360008301526148638184614810565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6148ad82614526565b810181811067ffffffffffffffff821117156148cc576148cb614875565b5b80604052505050565b60006148df614411565b90506148eb82826148a4565b919050565b600067ffffffffffffffff82111561490b5761490a614875565b5b61491482614526565b9050602081019050919050565b82818337600083830152505050565b600061494361493e846148f0565b6148d5565b90508281526020810184848401111561495f5761495e614870565b5b61496a848285614921565b509392505050565b600082601f8301126149875761498661486b565b5b8135614997848260208601614930565b91505092915050565b6000602082840312156149b6576149b561441b565b5b600082013567ffffffffffffffff8111156149d4576149d3614420565b5b6149e084828501614972565b91505092915050565b600065ffffffffffff82169050919050565b614a04816149e9565b8114614a0f57600080fd5b50565b600081359050614a21816149fb565b92915050565b60008060408385031215614a3e57614a3d61441b565b5b6000614a4c8582860161471b565b9250506020614a5d85828601614a12565b9150509250929050565b600067ffffffffffffffff821115614a8257614a81614875565b5b614a8b82614526565b9050602081019050919050565b6000614aab614aa684614a67565b6148d5565b905082815260208101848484011115614ac757614ac6614870565b5b614ad2848285614921565b509392505050565b600082601f830112614aef57614aee61486b565b5b8135614aff848260208601614a98565b91505092915050565b600060208284031215614b1e57614b1d61441b565b5b600082013567ffffffffffffffff811115614b3c57614b3b614420565b5b614b4884828501614ada565b91505092915050565b60008060408385031215614b6857614b6761441b565b5b6000614b768582860161471b565b9250506020614b87858286016145b3565b9150509250929050565b614b9a816149e9565b82525050565b6000606082019050614bb56000830186614b91565b614bc26020830185614b91565b614bcf60408301846144b6565b949350505050565b614be0816144aa565b8114614beb57600080fd5b50565b600081359050614bfd81614bd7565b92915050565b60008060408385031215614c1a57614c1961441b565b5b6000614c2885828601614692565b9250506020614c3985828601614bee565b9150509250929050565b60008060408385031215614c5a57614c5961441b565b5b6000614c6885828601614692565b9250506020614c798582860161471b565b9150509250929050565b600060ff82169050919050565b614c9981614c83565b82525050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b614cd481614c9f565b82525050565b60007fffffffffffffffff00000000000000000000000000000000000000000000000082169050919050565b614d0f81614cda565b82525050565b600060a082019050614d2a6000830188614c90565b614d376020830187614c90565b614d446040830186614c90565b614d516060830185614ccb565b614d5e6080830184614d06565b9695505050505050565b60008060008060808587031215614d8257614d8161441b565b5b6000614d9087828801614692565b9450506020614da187828801614692565b9350506040614db2878288016145b3565b925050606085013567ffffffffffffffff811115614dd357614dd2614420565b5b614ddf87828801614ada565b91505092959194509250565b614df481614c83565b8114614dff57600080fd5b50565b600081359050614e1181614deb565b92915050565b600067ffffffffffffffff82169050919050565b614e3481614e17565b8114614e3f57600080fd5b50565b600081359050614e5181614e2b565b92915050565b600080600060608486031215614e7057614e6f61441b565b5b6000614e7e86828701614e02565b9350506020614e8f86828701614e42565b925050604084013567ffffffffffffffff811115614eb057614eaf614420565b5b614ebc86828701614972565b9150509250925092565b600061ffff82169050919050565b614edd81614ec6565b8114614ee857600080fd5b50565b600081359050614efa81614ed4565b92915050565b600080600060608486031215614f1957614f1861441b565b5b6000614f2786828701614692565b9350506020614f388682870161471b565b9250506040614f4986828701614eeb565b9150509250925092565b60008060408385031215614f6a57614f6961441b565b5b6000614f7885828601614692565b9250506020614f8985828601614692565b9150509250929050565b60008060008060808587031215614fad57614fac61441b565b5b6000614fbb87828801614692565b9450506020614fcc8782880161471b565b9350506040614fdd87828801614eeb565b9250506060614fee87828801614a12565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061504157607f821691505b60208210810361505457615053614ffa565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061509482614592565b915061509f83614592565b92508282039050818111156150b7576150b661505a565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006150f782614592565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036151295761512861505a565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b6000600883026151997fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82615159565b6151a38683615159565b95508019841693508086168417925050509392505050565b6000819050919050565b60006151e06151db6151d684614592565b6151bb565b614592565b9050919050565b6000819050919050565b6151fa836151c5565b61520e615206826151e7565b848454615169565b825550505050565b600090565b615223615216565b61522e8184846151f1565b505050565b5b818110156152525761524760008261521b565b600181019050615234565b5050565b601f8211156152975761526881615134565b61527184615149565b81016020851015615280578190505b61529461528c85615149565b830182615233565b50505b505050565b60008160020a8304905092915050565b60006152bd6000198460080261529c565b1980831691505092915050565b60006152d683836152ac565b9150826002028217905092915050565b6152ef826147f4565b67ffffffffffffffff81111561530857615307614875565b5b6153128254615029565b61531d828285615256565b600060209050601f831160018114615350576000841561533e578287015190505b61534885826152ca565b8655506153b0565b601f19841661535e86615134565b60005b8281101561538657848901518255600182019150602085019450602081019050615361565b868310156153a3578489015161539f601f8916826152ac565b8355505b6001600288020188555050505b505050505050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b60006153ee600a836144eb565b91506153f9826153b8565b602082019050919050565b6000602082019050818103600083015261541d816153e1565b9050919050565b600061542f82614592565b915061543a83614592565b92508282019050808211156154525761545161505a565b5b92915050565b6000819050602082019050919050565b600061547482516146fa565b80915050919050565b6000615488826147f4565b8261549284615458565b905061549d81615468565b925060208210156154dd576154d87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802615159565b831692505b5050919050565b60006154ef82614592565b91506154fa83614592565b925082820261550881614592565b9150828204841483151761551f5761551e61505a565b5b5092915050565b600061553182614c83565b915061553c83614c83565b9250828201905060ff8111156155555761555461505a565b5b92915050565b7f4552525f5052454649585f544f4f5f4c4f4e4700000000000000000000000000600082015250565b60006155916013836144eb565b915061559c8261555b565b602082019050919050565b600060208201905081810360008301526155c081615584565b9050919050565b60006155d282614c83565b91506155dd83614c83565b92508282026155eb81614c83565b91508082146155fd576155fc61505a565b5b5092915050565b600061560f82614c83565b9150600082036156225761562161505a565b5b600182039050919050565b600061563882614c83565b915061564383614c83565b9250828203905060ff81111561565c5761565b61505a565b5b92915050565b600061566e8251614c9f565b80915050919050565b6000615682826147f4565b8261568c84615458565b905061569781615662565b925060108210156156d7576156d27fffffffffffffffffffffffffffffffff0000000000000000000000000000000083601003600802615159565b831692505b5050919050565b7f4552525f53504152534500000000000000000000000000000000000000000000600082015250565b6000615714600a836144eb565b915061571f826156de565b602082019050919050565b6000602082019050818103600083015261574381615707565b9050919050565b6000615755826149e9565b9150615760836149e9565b9250828201905065ffffffffffff81111561577e5761577d61505a565b5b92915050565b6000815190506157938161467b565b92915050565b6000602082840312156157af576157ae61441b565b5b60006157bd84828501615784565b9150509291505056fea26469706673582212209c705c9e1194892f8963a676a7c89711310c7e29ec8d2831c88dc1d43a6ee06c64736f6c63430008120033 +\ No newline at end of file diff --git a/js/contract/CraftNFT.json b/js/contract/CraftNFT.json @@ -1 +1 @@ -[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"bytes32","name":"_declaration","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"uint48","name":"_count","type":"uint48"},{"indexed":false,"internalType":"bytes32","name":"_tokenId","type":"bytes32"}],"name":"Allocate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","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":false,"internalType":"bytes","name":"_multiHash","type":"bytes"}],"name":"Msg","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"TransferWithData","type":"event"},{"inputs":[{"internalType":"uint8","name":"_length","type":"uint8"},{"internalType":"uint64","name":"_codecId","type":"uint64"},{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"addCodec","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"addWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"content","type":"bytes32"},{"internalType":"uint48","name":"count","type":"uint48"}],"name":"allocate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURL","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"declaration","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"deleteWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_truncatedId","type":"bytes32"}],"name":"getDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"getDigestHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getMsg","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"isWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"},{"internalType":"uint48","name":"_index","type":"uint48"}],"name":"mintExactFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"}],"name":"mintFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"}],"name":"mintTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"mintedToken","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"multiCodecs","outputs":[{"internalType":"uint8","name":"l","type":"uint8"},{"internalType":"uint8","name":"codecRLength","type":"uint8"},{"internalType":"uint8","name":"prefixRLength","type":"uint8"},{"internalType":"bytes16","name":"prefix","type":"bytes16"},{"internalType":"bytes8","name":"codec","type":"bytes8"}],"stateMutability":"view","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":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseString","type":"string"}],"name":"setBaseURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_digest","type":"bytes"}],"name":"setMsg","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_codec","type":"uint256"}],"name":"setMsgCodec","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","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":[{"internalType":"bytes","name":"_digest","type":"bytes"}],"name":"toHash","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"toHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"_digest","type":"bytes"}],"name":"toURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"toURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"token","outputs":[{"internalType":"uint48","name":"count","type":"uint48"},{"internalType":"uint48","name":"cursor","type":"uint48"},{"internalType":"bool","name":"sparse","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","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":"bytes32","name":"_declaration","type":"bytes32"},{"internalType":"bool","name":"_enumeration","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"uint48","name":"_count","type":"uint48"},{"indexed":false,"internalType":"bytes32","name":"_tokenId","type":"bytes32"}],"name":"Allocate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","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":false,"internalType":"bytes","name":"_multiHash","type":"bytes"}],"name":"Msg","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"TransferWithData","type":"event"},{"inputs":[{"internalType":"uint8","name":"_length","type":"uint8"},{"internalType":"uint64","name":"_codecId","type":"uint64"},{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"addCodec","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"addWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"content","type":"bytes32"},{"internalType":"uint48","name":"count","type":"uint48"}],"name":"allocate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURL","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"declaration","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"deleteWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_truncatedId","type":"bytes32"}],"name":"getDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"getDigestHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getMsg","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"isWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"},{"internalType":"uint48","name":"_index","type":"uint48"}],"name":"mintExactFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"}],"name":"mintFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"}],"name":"mintTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"mintedToken","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"multiCodecs","outputs":[{"internalType":"uint8","name":"l","type":"uint8"},{"internalType":"uint8","name":"codecRLength","type":"uint8"},{"internalType":"uint8","name":"prefixRLength","type":"uint8"},{"internalType":"bytes16","name":"prefix","type":"bytes16"},{"internalType":"bytes8","name":"codec","type":"bytes8"}],"stateMutability":"view","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":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseString","type":"string"}],"name":"setBaseURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_digest","type":"bytes"}],"name":"setMsg","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_codec","type":"uint256"}],"name":"setMsgCodec","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","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":[{"internalType":"bytes","name":"_digest","type":"bytes"}],"name":"toHash","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"toHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"_digest","type":"bytes"}],"name":"toURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"toURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"token","outputs":[{"internalType":"uint48","name":"count","type":"uint48"},{"internalType":"uint48","name":"cursor","type":"uint48"},{"internalType":"bool","name":"sparse","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","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/craft_nft/data/CraftNFT.bin b/python/craft_nft/data/CraftNFT.bin @@ -1 +1 @@ -60806040523480156200001157600080fd5b50604051620068eb380380620068eb833981810160405281019062000037919062000b3f565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b8190555082600890816200008f919062000e2a565b508160099081620000a1919062000e2a565b50620000f5602060126040518060400160405280600681526020017f73686132353600000000000000000000000000000000000000000000000000008152506200017c640100000000026401000000009004565b62000110601262000453640100000000026401000000009004565b602067ffffffffffffffff8111156200012e576200012d620009a0565b5b6040519080825280601f01601f191660200182016040528015620001615781602001600182028036833780820191505090505b506010908162000172919062000f81565b5050505062001403565b6060819050601081511115620001c9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001c090620010c9565b60405180910390fd5b620001d36200090b565b6000600790505b60008160ff161062000237576000600882620001f7919062001127565b60ff1660ff9060020a029050600086821667ffffffffffffffff16111562000220575062000237565b81806200022d906200116d565b92505050620001da565b6001816200024691906200119b565b826020019060ff16908160ff16815250506008816007620002689190620011d7565b62000274919062001127565b60ff168567ffffffffffffffff169060020a02780100000000000000000000000000000000000000000000000002826080019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250508251826040019060ff16908160ff168152505082620003029062001266565b82606001906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff19168152505085826000019060ff16908160ff168152505081600e60008767ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060808201518160000160136101000a81548167ffffffffffffffff0219169083780100000000000000000000000000000000000000000000000090040217905550905050505050505050565b6000600e6000838152602001908152602001600020905060008160000160009054906101000a900460ff1660ff16116200048c57600080fd5b81600f819055508060000160009054906101000a900460ff1660ff1667ffffffffffffffff811115620004c457620004c3620009a0565b5b6040519080825280601f01601f191660200182016040528015620004f75781602001600182028036833780820191505090505b506010908162000508919062000f81565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c620005436200055e640100000000026401000000009004565b60405162000552919062001328565b60405180910390a15050565b60606200060c60108054620005739062000c13565b80601f0160208091040260200160405190810160405280929190818152602001828054620005a19062000c13565b8015620005f25780601f10620005c657610100808354040283529160200191620005f2565b820191906000526020600020905b815481529060010190602001808311620005d457829003601f168201915b505050505062000611640100000000026401000000009004565b905090565b606060006060600e6000600f54815260200190815260200160002091508160000160019054906101000a900460ff1660ff168260000160009054906101000a900460ff1660ff1685516200066691906200134c565b6200067291906200134c565b67ffffffffffffffff8111156200068e576200068d620009a0565b5b6040519080825280601f01601f191660200182016040528015620006c15781602001600182028036833780820191505090505b50905060005b8260000160019054906101000a900460ff1660ff16811015620007a1578260000160139054906101000a9004780100000000000000000000000000000000000000000000000002816008811062000723576200072262001387565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000028282815181106200075c576200075b62001387565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806200079890620013b6565b915050620006c7565b8260000160009054906101000a900460ff167f010000000000000000000000000000000000000000000000000000000000000002828281518110620007eb57620007ea62001387565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806200082790620013b6565b91505060005b8551811015620008ff578581815181106200084d576200084c62001387565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002838284620008a691906200134c565b81518110620008ba57620008b962001387565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080620008f690620013b6565b9150506200082d565b50819350505050919050565b6040518060a00160405280600060ff168152602001600060ff168152602001600060ff16815260200160006fffffffffffffffffffffffffffffffff19168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff191681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620009da826200098f565b810181811067ffffffffffffffff82111715620009fc57620009fb620009a0565b5b80604052505050565b600062000a1162000971565b905062000a1f8282620009cf565b919050565b600067ffffffffffffffff82111562000a425762000a41620009a0565b5b62000a4d826200098f565b9050602081019050919050565b60005b8381101562000a7a57808201518184015260208101905062000a5d565b60008484015250505050565b600062000a9d62000a978462000a24565b62000a05565b90508281526020810184848401111562000abc5762000abb6200098a565b5b62000ac984828562000a5a565b509392505050565b600082601f83011262000ae95762000ae862000985565b5b815162000afb84826020860162000a86565b91505092915050565b6000819050919050565b62000b198162000b04565b811462000b2557600080fd5b50565b60008151905062000b398162000b0e565b92915050565b60008060006060848603121562000b5b5762000b5a6200097b565b5b600084015167ffffffffffffffff81111562000b7c5762000b7b62000980565b5b62000b8a8682870162000ad1565b935050602084015167ffffffffffffffff81111562000bae5762000bad62000980565b5b62000bbc8682870162000ad1565b925050604062000bcf8682870162000b28565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000c2c57607f821691505b60208210810362000c425762000c4162000be4565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000caf7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000c6d565b62000cbb868362000c6d565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000d0862000d0262000cfc8462000cd3565b62000cdd565b62000cd3565b9050919050565b6000819050919050565b62000d248362000ce7565b62000d3c62000d338262000d0f565b84845462000c7d565b825550505050565b600090565b62000d5362000d44565b62000d6081848462000d19565b505050565b5b8181101562000d885762000d7c60008262000d49565b60018101905062000d66565b5050565b601f82111562000dd75762000da18162000c48565b62000dac8462000c5d565b8101602085101562000dbc578190505b62000dd462000dcb8562000c5d565b83018262000d65565b50505b505050565b60008160020a8304905092915050565b600062000dff6000198460080262000ddc565b1980831691505092915050565b600062000e1a838362000dec565b9150826002028217905092915050565b62000e358262000bd9565b67ffffffffffffffff81111562000e515762000e50620009a0565b5b62000e5d825462000c13565b62000e6a82828562000d8c565b600060209050601f83116001811462000ea2576000841562000e8d578287015190505b62000e99858262000e0c565b86555062000f09565b601f19841662000eb28662000c48565b60005b8281101562000edc5784890151825560018201915060208501945060208101905062000eb5565b8683101562000efc578489015162000ef8601f89168262000dec565b8355505b6001600288020188555050505b505050505050565b600081519050919050565b60008190508160005260206000209050919050565b601f82111562000f7c5762000f468162000f1c565b62000f518462000c5d565b8101602085101562000f61578190505b62000f7962000f708562000c5d565b83018262000d65565b50505b505050565b62000f8c8262000f11565b67ffffffffffffffff81111562000fa85762000fa7620009a0565b5b62000fb4825462000c13565b62000fc182828562000f31565b600060209050601f83116001811462000ff9576000841562000fe4578287015190505b62000ff0858262000e0c565b86555062001060565b601f198416620010098662000f1c565b60005b8281101562001033578489015182556001820191506020850194506020810190506200100c565b868310156200105357848901516200104f601f89168262000dec565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4552525f5052454649585f544f4f5f4c4f4e4700000000000000000000000000600082015250565b6000620010b160138362001068565b9150620010be8262001079565b602082019050919050565b60006020820190508181036000830152620010e481620010a2565b9050919050565b600060ff82169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200113482620010eb565b91506200114183620010eb565b92508282026200115181620010eb565b9150808214620011665762001165620010f8565b5b5092915050565b60006200117a82620010eb565b91506000820362001190576200118f620010f8565b5b600182039050919050565b6000620011a882620010eb565b9150620011b583620010eb565b9250828201905060ff811115620011d157620011d0620010f8565b5b92915050565b6000620011e482620010eb565b9150620011f183620010eb565b9250828203905060ff8111156200120d576200120c620010f8565b5b92915050565b6000819050602082019050919050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b60006200125d825162001223565b80915050919050565b6000620012738262000f11565b826200127f8462001213565b90506200128c816200124f565b92506010821015620012cf57620012ca7fffffffffffffffffffffffffffffffff000000000000000000000000000000008360100360080262000c6d565b831692505b5050919050565b600082825260208201905092915050565b6000620012f48262000f11565b620013008185620012d6565b93506200131281856020860162000a5a565b6200131d816200098f565b840191505092915050565b60006020820190508181036000830152620013448184620012e7565b905092915050565b6000620013598262000cd3565b9150620013668362000cd3565b9250828201905080821115620013815762001380620010f8565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000620013c38262000cd3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620013f857620013f7620010f8565b5b600182019050919050565b6154d880620014136000396000f3fe60806040526004361061024d576000357c0100000000000000000000000000000000000000000000000000000000900480638da5cb5b1161014b578063c5bec6fc116100c8578063e8a7f4c51161008c578063e8a7f4c514610905578063e985e9c514610942578063f117e1731461097f578063f2fde38b146109bc578063f9613ab2146109f95761024d565b8063c5bec6fc146107fc578063c87b56dd14610839578063ccc094c214610876578063d824ee4f1461089f578063da2824a8146108dc5761024d565b8063adf288df1161010f578063adf288df1461070c578063b1a6afd314610749578063b238d60314610774578063b5fdeb23146107b5578063b88d4fde146107e05761024d565b80638da5cb5b1461062757806395d89b41146106525780639a7c5e9f1461067d578063a22cb465146106a6578063ad0dec2f146106cf5761024d565b806349f2553a116101d95780635ae06f7e1161019d5780635ae06f7e1461050a5780636352211e146105335780636b9cb86a1461057057806370a08231146105ad57806386e90b59146105ea5761024d565b806349f2553a146103ff5780634d03546a146104285780634f64b2be146104655780635344299a146104a2578063559f5dc9146104cb5761024d565b806323b872dd1161022057806323b872dd1461032257806324e0febc1461033e5780632b29ba231461037b57806340c84b0e146103b857806342842e0e146103e35761024d565b806301ffc9a71461025257806306fdde031461028f578063081812fc146102ba57806318160ddd146102f7575b600080fd5b34801561025e57600080fd5b5061027960048036038101906102749190614199565b610a36565b60405161028691906141e1565b60405180910390f35b34801561029b57600080fd5b506102a4610b8a565b6040516102b1919061428c565b60405180910390f35b3480156102c657600080fd5b506102e160048036038101906102dc91906142e4565b610c18565b6040516102ee9190614352565b60405180910390f35b34801561030357600080fd5b5061030c610c55565b604051610319919061437c565b60405180910390f35b61033c600480360381019061033791906143c3565b610c5f565b005b34801561034a57600080fd5b506103656004803603810190610360919061444c565b610cca565b6040516103729190614488565b60405180910390f35b34801561038757600080fd5b506103a2600480360381019061039d91906144a3565b610ce2565b6040516103af91906141e1565b60405180910390f35b3480156103c457600080fd5b506103cd610d8e565b6040516103da9190614525565b60405180910390f35b6103fd60048036038101906103f891906143c3565b610e1c565b005b34801561040b57600080fd5b506104266004803603810190610421919061467c565b610e87565b005b34801561043457600080fd5b5061044f600480360381019061044a9190614703565b61119f565b60405161045c91906141e1565b60405180910390f35b34801561047157600080fd5b5061048c600480360381019061048791906142e4565b61147d565b6040516104999190614488565b60405180910390f35b3480156104ae57600080fd5b506104c960048036038101906104c491906147e4565b6114a1565b005b3480156104d757600080fd5b506104f260048036038101906104ed919061482d565b61152d565b6040516105019392919061487c565b60405180910390f35b34801561051657600080fd5b50610531600480360381019061052c91906144a3565b6115a1565b005b34801561053f57600080fd5b5061055a600480360381019061055591906142e4565b6116c0565b6040516105679190614352565b60405180910390f35b34801561057c57600080fd5b50610597600480360381019061059291906147e4565b6116fc565b6040516105a4919061428c565b60405180910390f35b3480156105b957600080fd5b506105d460048036038101906105cf91906144a3565b611915565b6040516105e1919061437c565b60405180910390f35b3480156105f657600080fd5b50610611600480360381019061060c91906147e4565b61195e565b60405161061e919061428c565b60405180910390f35b34801561063357600080fd5b5061063c611c09565b6040516106499190614352565b60405180910390f35b34801561065e57600080fd5b50610667611c2d565b604051610674919061428c565b60405180910390f35b34801561068957600080fd5b506106a4600480360381019061069f91906142e4565b611cbb565b005b3480156106b257600080fd5b506106cd60048036038101906106c891906148df565b611dac565b005b3480156106db57600080fd5b506106f660048036038101906106f191906147e4565b61204e565b6040516107039190614525565b60405180910390f35b34801561071857600080fd5b50610733600480360381019061072e919061491f565b612325565b6040516107409190614488565b60405180910390f35b34801561075557600080fd5b5061075e612597565b60405161076b9190614488565b60405180910390f35b34801561078057600080fd5b5061079b600480360381019061079691906142e4565b61259d565b6040516107ac9594939291906149f1565b60405180910390f35b3480156107c157600080fd5b506107ca61263c565b6040516107d79190614525565b60405180910390f35b6107fa60048036038101906107f59190614a44565b6126d6565b005b34801561080857600080fd5b50610823600480360381019061081e91906147e4565b6127b1565b6040516108309190614525565b60405180910390f35b34801561084557600080fd5b50610860600480360381019061085b91906142e4565b612b6a565b60405161086d919061428c565b60405180910390f35b34801561088257600080fd5b5061089d60048036038101906108989190614b33565b612cbd565b005b3480156108ab57600080fd5b506108c660048036038101906108c19190614bdc565b612f7f565b6040516108d39190614488565b60405180910390f35b3480156108e857600080fd5b5061090360048036038101906108fe91906144a3565b6131f2565b005b34801561091157600080fd5b5061092c600480360381019061092791906147e4565b6132da565b6040516109399190614525565b60405180910390f35b34801561094e57600080fd5b5061096960048036038101906109649190614c2f565b613693565b60405161097691906141e1565b60405180910390f35b34801561098b57600080fd5b506109a660048036038101906109a19190614c6f565b61372b565b6040516109b39190614488565b60405180910390f35b3480156109c857600080fd5b506109e360048036038101906109de91906144a3565b6138ba565b6040516109f091906141e1565b60405180910390f35b348015610a0557600080fd5b50610a206004803603810190610a1b919061444c565b61395e565b604051610a2d9190614488565b60405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a8a5760019050610b85565b635b5e139f7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610adc5760019050610b85565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b2e5760019050610b85565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b805760019050610b85565b600090505b919050565b60088054610b9790614d05565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc390614d05565b8015610c105780601f10610be557610100808354040283529160200191610c10565b820191906000526020600020905b815481529060010190602001808311610bf357829003601f168201915b505050505081565b60006006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a54905090565b610c6a838383613a0a565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60056020528060005260406000206000915090505481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680610d87575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b600c8054610d9b90614d05565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc790614d05565b8015610e145780601f10610de957610100808354040283529160200191610e14565b820191906000526020600020905b815481529060010190602001808311610df757829003601f168201915b505050505081565b610e27838383613a0a565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ee457600080fd5b82915081519050602f7f01000000000000000000000000000000000000000000000000000000000000000282600183610f1d9190614d65565b81518110610f2e57610f2d614d99565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610fae578080610faa90614dc8565b9150505b8067ffffffffffffffff811115610fc857610fc7614551565b5b6040519080825280601f01601f191660200182016040528015610ffa5781602001600182028036833780820191505090505b50600c90816110099190614fc2565b5060005b82518110156110fa5782818151811061102957611028614d99565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002600c82815461108190614d05565b81106110905761108f614d99565b5b8154600116156110af5790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f01000000000000000000000000000000000000000000000000000000000000008404021790555080806110f290614dc8565b91505061100d565b508151811461119a577f2f00000000000000000000000000000000000000000000000000000000000000600c8351815461113390614d05565b811061114257611141614d99565b5b8154600116156111615790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055505b505050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806112455750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61124e57600080fd5b611256614094565b6004600086815260200190815260200160002080549050915060008211156112d3576000600460008781526020019081526020016000206000815481106112a05761129f614d99565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff16116112d257600080fd5b5b83816000019065ffffffffffff16908165ffffffffffff168152505060046000868152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001600c6101000a81548160ff0219169083151502179055505050600385908060018154018082558091505060019003906000526020600020016000909190919091505560008465ffffffffffff16036113f8576001600a60008282546113ec9190615094565b9250508190555061141a565b8365ffffffffffff16600a60008282546114129190615094565b925050819055505b8365ffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb85ba54b9f6f8241b7e1499e3cfc186ac0b1c8b7100f599bf6ca6844f896c342876040516114699190614488565b60405180910390a360019250505092915050565b6003818154811061148d57600080fd5b906000526020600020016000915090505481565b6000600e6000600f54815260200190815260200160002090508060000160009054906101000a900460ff1660ff168251146114db57600080fd5b81601090816114ea9190614fc2565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c61151461263c565b6040516115219190614525565b60405180910390a15050565b6004602052816000526040600020818154811061154957600080fd5b90600052602060002001600091509150508060000160009054906101000a900465ffffffffffff16908060000160069054906101000a900465ffffffffffff169080600001600c9054906101000a900460ff16905083565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611626575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165c90615114565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080600560008460010281526020019081526020016000205490506060819060020a026c010000000000000000000000009004915050919050565b6060806060600061170c856132da565b9150600c805461171b90614d05565b9050905080825161172c9190615094565b67ffffffffffffffff81111561174557611744614551565b5b6040519080825280601f01601f1916602001820160405280156117775781602001600182028036833780820191505090505b50925060005b8181101561183c57600c81815461179390614d05565b81106117a2576117a1614d99565b5b8154600116156117c15790600052602060002090602091828204019190065b9054901a7f0100000000000000000000000000000000000000000000000000000000000000028482815181106117fa576117f9614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061183490614dc8565b91505061177d565b5060005b82518110156119095782818151811061185c5761185b614d99565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028483815181106118b9576118b8614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081806118f390614dc8565b925050808061190190614dc8565b915050611840565b50829350505050919050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b606060006060806000611970866127b1565b9150600e6000600f54815260200190815260200160002093508360000160029054906101000a900460ff1660ff16905060018251826119af9190615094565b6119b99190615094565b67ffffffffffffffff8111156119d2576119d1614551565b5b6040519080825280601f01601f191660200182016040528015611a045781602001600182028036833780820191505090505b50925060005b81811015611abe578460000160039054906101000a9004700100000000000000000000000000000000028160108110611a4657611a45614d99565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002848281518110611a7c57611a7b614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611ab690614dc8565b915050611a0a565b50603a7f010000000000000000000000000000000000000000000000000000000000000002838281518110611af657611af5614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611b3090614dc8565b91505060005b8251811015611bfc57828181518110611b5257611b51614d99565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002848284611ba99190615094565b81518110611bba57611bb9614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611bf490614dc8565b915050611b36565b5082945050505050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60098054611c3a90614d05565b80601f0160208091040260200160405190810160405280929190818152602001828054611c6690614d05565b8015611cb35780601f10611c8857610100808354040283529160200191611cb3565b820191906000526020600020905b815481529060010190602001808311611c9657829003601f168201915b505050505081565b6000600e6000838152602001908152602001600020905060008160000160009054906101000a900460ff1660ff1611611cf357600080fd5b81600f819055508060000160009054906101000a900460ff1660ff1667ffffffffffffffff811115611d2857611d27614551565b5b6040519080825280601f01601f191660200182016040528015611d5a5781602001600182028036833780820191505090505b5060109081611d699190614fc2565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c611d9361263c565b604051611da09190614525565b60405180910390a15050565b8015611ecd57600073ffffffffffffffffffffffffffffffffffffffff16600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e4a57600080fd5b81600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611fe5565b600073ffffffffffffffffffffffffffffffffffffffff16600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611f6557600080fd5b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161204291906141e1565b60405180910390a35050565b606060006060600e6000600f54815260200190815260200160002091508160000160019054906101000a900460ff1660ff168260000160009054906101000a900460ff1660ff1685516120a19190615094565b6120ab9190615094565b67ffffffffffffffff8111156120c4576120c3614551565b5b6040519080825280601f01601f1916602001820160405280156120f65781602001600182028036833780820191505090505b50905060005b8260000160019054906101000a900460ff1660ff168110156121cc578260000160139054906101000a9004780100000000000000000000000000000000000000000000000002816008811061215457612153614d99565b5b1a7f01000000000000000000000000000000000000000000000000000000000000000282828151811061218a57612189614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806121c490614dc8565b9150506120fc565b8260000160009054906101000a900460ff167f01000000000000000000000000000000000000000000000000000000000000000282828151811061221357612212614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061224d90614dc8565b91505060005b85518110156123195785818151811061226f5761226e614d99565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028382846122c69190615094565b815181106122d7576122d6614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061231190614dc8565b915050612253565b50819350505050919050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806123cb5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6123d457600080fd5b60016004600085815260200190815260200160002080549050146123f757600080fd5b60006004600085815260200190815260200160002060008154811061241f5761241e614d99565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff161461245157600080fd5b600060010260056000858152602001908152602001600020541461247457600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1690507fc000000000000000000000000000000000000000000000000000000000000000811790508060010260056000858152602001908152602001600020819055506001600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461251d9190615094565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560019004604051612585919061437c565b60405180910390a38291505092915050565b600b5481565b600e6020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900460ff16908060000160029054906101000a900460ff16908060000160039054906101000a900470010000000000000000000000000000000002908060000160139054906101000a9004780100000000000000000000000000000000000000000000000002905085565b60606126d16010805461264e90614d05565b80601f016020809104026020016040519081016040528092919081815260200182805461267a90614d05565b80156126c75780601f1061269c576101008083540402835291602001916126c7565b820191906000526020600020905b8154815290600101906020018083116126aa57829003601f168201915b505050505061204e565b905090565b6126e1848484613a0a565b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f75c9e114f073c346aac7d1d7e9a3c3c14edabcdd27de07d1d9e425f45d318c5e8461279690615159565b6040516127a39190614488565b60405180910390a450505050565b606080600080600285516127c591906151c0565b67ffffffffffffffff8111156127de576127dd614551565b5b6040519080825280601f01601f1916602001820160405280156128105781602001600182028036833780820191505090505b5092506000905060005b6020811015612b5e57600460f087838151811061283a57612839614d99565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff161015612939576030836128d09190615202565b7f01000000000000000000000000000000000000000000000000000000000000000284838151811061290557612904614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506129ab565b6057836129469190615202565b7f01000000000000000000000000000000000000000000000000000000000000000284838151811061297b5761297a614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f8682815181106129c0576129bf614d99565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff161015612abe57603083612a499190615202565b7f01000000000000000000000000000000000000000000000000000000000000000284600184612a799190615094565b81518110612a8a57612a89614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612b3c565b605783612acb9190615202565b7f01000000000000000000000000000000000000000000000000000000000000000284600184612afb9190615094565b81518110612b0c57612b0b614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600282612b499190615094565b91508080612b5690614dc8565b91505061281a565b50829350505050919050565b6060600060608360010291506000600460008481526020019081526020016000208054905003612ba057612b9d8261395e565b91505b6000600460008481526020019081526020016000208054905011612bc357600080fd5b602067ffffffffffffffff811115612bde57612bdd614551565b5b6040519080825280601f01601f191660200182016040528015612c105781602001600182028036833780820191505090505b50905060005b6020811015612caa57828160208110612c3257612c31614d99565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002828281518110612c6857612c67614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080612ca290614dc8565b915050612c16565b50612cb4816116fc565b92505050919050565b6060819050601081511115612d07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cfe90615283565b60405180910390fd5b612d0f6140c7565b6000600790505b60008160ff1610612d6b576000600882612d3091906152a3565b60ff1660ff9060020a029050600086821667ffffffffffffffff161115612d575750612d6b565b8180612d62906152e0565b92505050612d16565b600181612d789190615202565b826020019060ff16908160ff16815250506008816007612d989190615309565b612da291906152a3565b60ff168567ffffffffffffffff169060020a02780100000000000000000000000000000000000000000000000002826080019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250508251826040019060ff16908160ff168152505082612e2e90615353565b82606001906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff19168152505085826000019060ff16908160ff168152505081600e60008767ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060808201518160000160136101000a81548167ffffffffffffffff0219169083780100000000000000000000000000000000000000000000000090040217905550905050505050505050565b600080600460008581526020019081526020016000208361ffff1681548110612fab57612faa614d99565b5b90600052602060002001905080600001600c9054906101000a900460ff1615613009576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300090615406565b60405180910390fd5b60008361ffff1614801561303b575060008160000160009054906101000a900465ffffffffffff1665ffffffffffff16145b1561309a5760018160000160068282829054906101000a900465ffffffffffff166130669190615426565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055506130928585612325565b9150506131eb565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061313d5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61317c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161317390615114565b60405180910390fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168160000160069054906101000a900465ffffffffffff1665ffffffffffff16106131c457600080fd5b6131e78585858460000160069054906101000a900465ffffffffffff1685613d21565b9150505b9392505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613280576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161327790615114565b60405180910390fd5b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b606080600080600285516132ee91906151c0565b67ffffffffffffffff81111561330757613306614551565b5b6040519080825280601f01601f1916602001820160405280156133395781602001600182028036833780820191505090505b5092506000905060005b602081101561368757600460f087838151811061336357613362614d99565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff161015613462576030836133f99190615202565b7f01000000000000000000000000000000000000000000000000000000000000000284838151811061342e5761342d614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506134d4565b60578361346f9190615202565b7f0100000000000000000000000000000000000000000000000000000000000000028483815181106134a4576134a3614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f8682815181106134e9576134e8614d99565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff1610156135e7576030836135729190615202565b7f010000000000000000000000000000000000000000000000000000000000000002846001846135a29190615094565b815181106135b3576135b2614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613665565b6057836135f49190615202565b7f010000000000000000000000000000000000000000000000000000000000000002846001846136249190615094565b8151811061363557613634614d99565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b6002826136729190615094565b9150808061367f90614dc8565b915050613343565b50829350505050919050565b60008173ffffffffffffffffffffffffffffffffffffffff16600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600080600460008681526020019081526020016000208461ffff168154811061375757613756614d99565b5b90600052602060002001905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806138065750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b613845576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161383c90615114565b60405180910390fd5b60008160000160009054906101000a900465ffffffffffff1665ffffffffffff161161387057600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168365ffffffffffff16106138a257600080fd5b6138af8686868685613d21565b915050949350505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461391557600080fd5b816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b6000806005600084815260200190815260200160002054905061398081613f9f565b61398957600080fd5b61399281613fd1565b156139a05782915050613a05565b7effffffffffffffff00000000000000000000000000000000000000000000006001028116905060b881908060020a820491505090507fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000600102831681179050809150505b919050565b60003073ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401613a61919061437c565b602060405180830381865afa158015613a7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613aa29190615475565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614613adc57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614613c10573373ffffffffffffffffffffffffffffffffffffffff166006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480613c0657503373ffffffffffffffffffffffffffffffffffffffff16600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b613c0f57600080fd5b5b60006006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550613c6d8284614003565b6001600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613cbd9190614d65565b925050819055506001600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613d149190615094565b9250508190555050505050565b6000806000807fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008860019004169250603067ffffffffffffffff8861ffff161667ffffffffffffffff169060020a0267ffffffffffffffff16831792508565ffffffffffff16831792508260010290506000600102600560008381526020019081526020016000205414613db457600080fd5b84600001600c9054906101000a900460ff16613e16578460000160069054906101000a900465ffffffffffff1665ffffffffffff168665ffffffffffff1614613e1557600185600001600c6101000a81548160ff0219169083151502179055505b5b67ffffffffffffffff886001900416915060b8829060020a0291507f8000000000000000000000000000000000000000000000000000000000000000821791508873ffffffffffffffffffffffffffffffffffffffff168217915060018560000160068282829054906101000a900465ffffffffffff16613e979190615426565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055508160010260056000838152602001908152602001600020819055506001600d60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613f249190615094565b925050819055508873ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051613f88919061437c565b60405180910390a380935050505095945050505050565b6000807f8000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000807f4000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b60008083600102905060056000828152602001908152602001600020546001900491506000820361403357600080fd5b7fffffffffffffffffffffffff0000000000000000000000000000000000000000821691508273ffffffffffffffffffffffffffffffffffffffff168217915081600102600560008381526020019081526020016000208190555050505050565b6040518060600160405280600065ffffffffffff168152602001600065ffffffffffff1681526020016000151581525090565b6040518060a00160405280600060ff168152602001600060ff168152602001600060ff16815260200160006fffffffffffffffffffffffffffffffff19168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff191681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61417681614141565b811461418157600080fd5b50565b6000813590506141938161416d565b92915050565b6000602082840312156141af576141ae614137565b5b60006141bd84828501614184565b91505092915050565b60008115159050919050565b6141db816141c6565b82525050565b60006020820190506141f660008301846141d2565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561423657808201518184015260208101905061421b565b60008484015250505050565b6000601f19601f8301169050919050565b600061425e826141fc565b6142688185614207565b9350614278818560208601614218565b61428181614242565b840191505092915050565b600060208201905081810360008301526142a68184614253565b905092915050565b6000819050919050565b6142c1816142ae565b81146142cc57600080fd5b50565b6000813590506142de816142b8565b92915050565b6000602082840312156142fa576142f9614137565b5b6000614308848285016142cf565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061433c82614311565b9050919050565b61434c81614331565b82525050565b60006020820190506143676000830184614343565b92915050565b614376816142ae565b82525050565b6000602082019050614391600083018461436d565b92915050565b6143a081614331565b81146143ab57600080fd5b50565b6000813590506143bd81614397565b92915050565b6000806000606084860312156143dc576143db614137565b5b60006143ea868287016143ae565b93505060206143fb868287016143ae565b925050604061440c868287016142cf565b9150509250925092565b6000819050919050565b61442981614416565b811461443457600080fd5b50565b60008135905061444681614420565b92915050565b60006020828403121561446257614461614137565b5b600061447084828501614437565b91505092915050565b61448281614416565b82525050565b600060208201905061449d6000830184614479565b92915050565b6000602082840312156144b9576144b8614137565b5b60006144c7848285016143ae565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60006144f7826144d0565b61450181856144db565b9350614511818560208601614218565b61451a81614242565b840191505092915050565b6000602082019050818103600083015261453f81846144ec565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61458982614242565b810181811067ffffffffffffffff821117156145a8576145a7614551565b5b80604052505050565b60006145bb61412d565b90506145c78282614580565b919050565b600067ffffffffffffffff8211156145e7576145e6614551565b5b6145f082614242565b9050602081019050919050565b82818337600083830152505050565b600061461f61461a846145cc565b6145b1565b90508281526020810184848401111561463b5761463a61454c565b5b6146468482856145fd565b509392505050565b600082601f83011261466357614662614547565b5b813561467384826020860161460c565b91505092915050565b60006020828403121561469257614691614137565b5b600082013567ffffffffffffffff8111156146b0576146af61413c565b5b6146bc8482850161464e565b91505092915050565b600065ffffffffffff82169050919050565b6146e0816146c5565b81146146eb57600080fd5b50565b6000813590506146fd816146d7565b92915050565b6000806040838503121561471a57614719614137565b5b600061472885828601614437565b9250506020614739858286016146ee565b9150509250929050565b600067ffffffffffffffff82111561475e5761475d614551565b5b61476782614242565b9050602081019050919050565b600061478761478284614743565b6145b1565b9050828152602081018484840111156147a3576147a261454c565b5b6147ae8482856145fd565b509392505050565b600082601f8301126147cb576147ca614547565b5b81356147db848260208601614774565b91505092915050565b6000602082840312156147fa576147f9614137565b5b600082013567ffffffffffffffff8111156148185761481761413c565b5b614824848285016147b6565b91505092915050565b6000806040838503121561484457614843614137565b5b600061485285828601614437565b9250506020614863858286016142cf565b9150509250929050565b614876816146c5565b82525050565b6000606082019050614891600083018661486d565b61489e602083018561486d565b6148ab60408301846141d2565b949350505050565b6148bc816141c6565b81146148c757600080fd5b50565b6000813590506148d9816148b3565b92915050565b600080604083850312156148f6576148f5614137565b5b6000614904858286016143ae565b9250506020614915858286016148ca565b9150509250929050565b6000806040838503121561493657614935614137565b5b6000614944858286016143ae565b925050602061495585828601614437565b9150509250929050565b600060ff82169050919050565b6149758161495f565b82525050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b6149b08161497b565b82525050565b60007fffffffffffffffff00000000000000000000000000000000000000000000000082169050919050565b6149eb816149b6565b82525050565b600060a082019050614a06600083018861496c565b614a13602083018761496c565b614a20604083018661496c565b614a2d60608301856149a7565b614a3a60808301846149e2565b9695505050505050565b60008060008060808587031215614a5e57614a5d614137565b5b6000614a6c878288016143ae565b9450506020614a7d878288016143ae565b9350506040614a8e878288016142cf565b925050606085013567ffffffffffffffff811115614aaf57614aae61413c565b5b614abb878288016147b6565b91505092959194509250565b614ad08161495f565b8114614adb57600080fd5b50565b600081359050614aed81614ac7565b92915050565b600067ffffffffffffffff82169050919050565b614b1081614af3565b8114614b1b57600080fd5b50565b600081359050614b2d81614b07565b92915050565b600080600060608486031215614b4c57614b4b614137565b5b6000614b5a86828701614ade565b9350506020614b6b86828701614b1e565b925050604084013567ffffffffffffffff811115614b8c57614b8b61413c565b5b614b988682870161464e565b9150509250925092565b600061ffff82169050919050565b614bb981614ba2565b8114614bc457600080fd5b50565b600081359050614bd681614bb0565b92915050565b600080600060608486031215614bf557614bf4614137565b5b6000614c03868287016143ae565b9350506020614c1486828701614437565b9250506040614c2586828701614bc7565b9150509250925092565b60008060408385031215614c4657614c45614137565b5b6000614c54858286016143ae565b9250506020614c65858286016143ae565b9150509250929050565b60008060008060808587031215614c8957614c88614137565b5b6000614c97878288016143ae565b9450506020614ca887828801614437565b9350506040614cb987828801614bc7565b9250506060614cca878288016146ee565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614d1d57607f821691505b602082108103614d3057614d2f614cd6565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614d70826142ae565b9150614d7b836142ae565b9250828203905081811115614d9357614d92614d36565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614dd3826142ae565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614e0557614e04614d36565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302614e757fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614e35565b614e7f8683614e35565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614ebc614eb7614eb2846142ae565b614e97565b6142ae565b9050919050565b6000819050919050565b614ed683614ea1565b614eea614ee282614ec3565b848454614e45565b825550505050565b600090565b614eff614ef2565b614f0a818484614ecd565b505050565b5b81811015614f2e57614f23600082614ef7565b600181019050614f10565b5050565b601f821115614f7357614f4481614e10565b614f4d84614e25565b81016020851015614f5c578190505b614f70614f6885614e25565b830182614f0f565b50505b505050565b60008160020a8304905092915050565b6000614f9960001984600802614f78565b1980831691505092915050565b6000614fb28383614f88565b9150826002028217905092915050565b614fcb826144d0565b67ffffffffffffffff811115614fe457614fe3614551565b5b614fee8254614d05565b614ff9828285614f32565b600060209050601f83116001811461502c576000841561501a578287015190505b6150248582614fa6565b86555061508c565b601f19841661503a86614e10565b60005b828110156150625784890151825560018201915060208501945060208101905061503d565b8683101561507f578489015161507b601f891682614f88565b8355505b6001600288020188555050505b505050505050565b600061509f826142ae565b91506150aa836142ae565b92508282019050808211156150c2576150c1614d36565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b60006150fe600a83614207565b9150615109826150c8565b602082019050919050565b6000602082019050818103600083015261512d816150f1565b9050919050565b6000819050602082019050919050565b60006151508251614416565b80915050919050565b6000615164826144d0565b8261516e84615134565b905061517981615144565b925060208210156151b9576151b47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802614e35565b831692505b5050919050565b60006151cb826142ae565b91506151d6836142ae565b92508282026151e4816142ae565b915082820484148315176151fb576151fa614d36565b5b5092915050565b600061520d8261495f565b91506152188361495f565b9250828201905060ff81111561523157615230614d36565b5b92915050565b7f4552525f5052454649585f544f4f5f4c4f4e4700000000000000000000000000600082015250565b600061526d601383614207565b915061527882615237565b602082019050919050565b6000602082019050818103600083015261529c81615260565b9050919050565b60006152ae8261495f565b91506152b98361495f565b92508282026152c78161495f565b91508082146152d9576152d8614d36565b5b5092915050565b60006152eb8261495f565b9150600082036152fe576152fd614d36565b5b600182039050919050565b60006153148261495f565b915061531f8361495f565b9250828203905060ff81111561533857615337614d36565b5b92915050565b600061534a825161497b565b80915050919050565b600061535e826144d0565b8261536884615134565b90506153738161533e565b925060108210156153b3576153ae7fffffffffffffffffffffffffffffffff0000000000000000000000000000000083601003600802614e35565b831692505b5050919050565b7f4552525f53504152534500000000000000000000000000000000000000000000600082015250565b60006153f0600a83614207565b91506153fb826153ba565b602082019050919050565b6000602082019050818103600083015261541f816153e3565b9050919050565b6000615431826146c5565b915061543c836146c5565b9250828201905065ffffffffffff81111561545a57615459614d36565b5b92915050565b60008151905061546f81614397565b92915050565b60006020828403121561548b5761548a614137565b5b600061549984828501615460565b9150509291505056fea264697066735822122050c11a77622eb8ef9b3cb964041ec68b1bc52e4e275ec465debf91838b61bb5064736f6c63430008120033 -\ No newline at end of file +60806040523480156200001157600080fd5b5060405162006c7d38038062006c7d833981810160405281019062000037919062000b97565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600c8190555083600a90816200008f919062000e98565b5082600b9081620000a1919062000e98565b50620000f5602060126040518060400160405280600681526020017f736861323536000000000000000000000000000000000000000000000000000081525062000197640100000000026401000000009004565b6200011060126200046e640100000000026401000000009004565b602067ffffffffffffffff8111156200012e576200012d620009bb565b5b6040519080825280601f01601f191660200182016040528015620001615781602001600182028036833780820191505090505b506013908162000172919062000fef565b5080600660006101000a81548160ff0219169083151502179055505050505062001471565b6060819050601081511115620001e4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001db9062001137565b60405180910390fd5b620001ee62000926565b6000600790505b60008160ff16106200025257600060088262000212919062001195565b60ff1660ff9060020a029050600086821667ffffffffffffffff1611156200023b575062000252565b81806200024890620011db565b92505050620001f5565b60018162000261919062001209565b826020019060ff16908160ff1681525050600881600762000283919062001245565b6200028f919062001195565b60ff168567ffffffffffffffff169060020a02780100000000000000000000000000000000000000000000000002826080019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250508251826040019060ff16908160ff1681525050826200031d90620012d4565b82606001906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff19168152505085826000019060ff16908160ff168152505081601160008767ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060808201518160000160136101000a81548167ffffffffffffffff0219169083780100000000000000000000000000000000000000000000000090040217905550905050505050505050565b600060116000838152602001908152602001600020905060008160000160009054906101000a900460ff1660ff1611620004a757600080fd5b816012819055508060000160009054906101000a900460ff1660ff1667ffffffffffffffff811115620004df57620004de620009bb565b5b6040519080825280601f01601f191660200182016040528015620005125781602001600182028036833780820191505090505b506013908162000523919062000fef565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c6200055e62000579640100000000026401000000009004565b6040516200056d919062001396565b60405180910390a15050565b606062000627601380546200058e9062000c81565b80601f0160208091040260200160405190810160405280929190818152602001828054620005bc9062000c81565b80156200060d5780601f10620005e1576101008083540402835291602001916200060d565b820191906000526020600020905b815481529060010190602001808311620005ef57829003601f168201915b50505050506200062c640100000000026401000000009004565b905090565b60606000606060116000601254815260200190815260200160002091508160000160019054906101000a900460ff1660ff168260000160009054906101000a900460ff1660ff168551620006819190620013ba565b6200068d9190620013ba565b67ffffffffffffffff811115620006a957620006a8620009bb565b5b6040519080825280601f01601f191660200182016040528015620006dc5781602001600182028036833780820191505090505b50905060005b8260000160019054906101000a900460ff1660ff16811015620007bc578260000160139054906101000a900478010000000000000000000000000000000000000000000000000281600881106200073e576200073d620013f5565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002828281518110620007775762000776620013f5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080620007b39062001424565b915050620006e2565b8260000160009054906101000a900460ff167f010000000000000000000000000000000000000000000000000000000000000002828281518110620008065762000805620013f5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080620008429062001424565b91505060005b85518110156200091a57858181518110620008685762000867620013f5565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002838284620008c19190620013ba565b81518110620008d557620008d4620013f5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080620009119062001424565b91505062000848565b50819350505050919050565b6040518060a00160405280600060ff168152602001600060ff168152602001600060ff16815260200160006fffffffffffffffffffffffffffffffff19168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff191681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620009f582620009aa565b810181811067ffffffffffffffff8211171562000a175762000a16620009bb565b5b80604052505050565b600062000a2c6200098c565b905062000a3a8282620009ea565b919050565b600067ffffffffffffffff82111562000a5d5762000a5c620009bb565b5b62000a6882620009aa565b9050602081019050919050565b60005b8381101562000a9557808201518184015260208101905062000a78565b60008484015250505050565b600062000ab862000ab28462000a3f565b62000a20565b90508281526020810184848401111562000ad75762000ad6620009a5565b5b62000ae484828562000a75565b509392505050565b600082601f83011262000b045762000b03620009a0565b5b815162000b1684826020860162000aa1565b91505092915050565b6000819050919050565b62000b348162000b1f565b811462000b4057600080fd5b50565b60008151905062000b548162000b29565b92915050565b60008115159050919050565b62000b718162000b5a565b811462000b7d57600080fd5b50565b60008151905062000b918162000b66565b92915050565b6000806000806080858703121562000bb45762000bb362000996565b5b600085015167ffffffffffffffff81111562000bd55762000bd46200099b565b5b62000be38782880162000aec565b945050602085015167ffffffffffffffff81111562000c075762000c066200099b565b5b62000c158782880162000aec565b935050604062000c288782880162000b43565b925050606062000c3b8782880162000b80565b91505092959194509250565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000c9a57607f821691505b60208210810362000cb05762000caf62000c52565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000d1d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000cdb565b62000d29868362000cdb565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000d7662000d7062000d6a8462000d41565b62000d4b565b62000d41565b9050919050565b6000819050919050565b62000d928362000d55565b62000daa62000da18262000d7d565b84845462000ceb565b825550505050565b600090565b62000dc162000db2565b62000dce81848462000d87565b505050565b5b8181101562000df65762000dea60008262000db7565b60018101905062000dd4565b5050565b601f82111562000e455762000e0f8162000cb6565b62000e1a8462000ccb565b8101602085101562000e2a578190505b62000e4262000e398562000ccb565b83018262000dd3565b50505b505050565b60008160020a8304905092915050565b600062000e6d6000198460080262000e4a565b1980831691505092915050565b600062000e88838362000e5a565b9150826002028217905092915050565b62000ea38262000c47565b67ffffffffffffffff81111562000ebf5762000ebe620009bb565b5b62000ecb825462000c81565b62000ed882828562000dfa565b600060209050601f83116001811462000f10576000841562000efb578287015190505b62000f07858262000e7a565b86555062000f77565b601f19841662000f208662000cb6565b60005b8281101562000f4a5784890151825560018201915060208501945060208101905062000f23565b8683101562000f6a578489015162000f66601f89168262000e5a565b8355505b6001600288020188555050505b505050505050565b600081519050919050565b60008190508160005260206000209050919050565b601f82111562000fea5762000fb48162000f8a565b62000fbf8462000ccb565b8101602085101562000fcf578190505b62000fe762000fde8562000ccb565b83018262000dd3565b50505b505050565b62000ffa8262000f7f565b67ffffffffffffffff811115620010165762001015620009bb565b5b62001022825462000c81565b6200102f82828562000f9f565b600060209050601f83116001811462001067576000841562001052578287015190505b6200105e858262000e7a565b865550620010ce565b601f198416620010778662000f8a565b60005b82811015620010a1578489015182556001820191506020850194506020810190506200107a565b86831015620010c15784890151620010bd601f89168262000e5a565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4552525f5052454649585f544f4f5f4c4f4e4700000000000000000000000000600082015250565b60006200111f601383620010d6565b91506200112c82620010e7565b602082019050919050565b60006020820190508181036000830152620011528162001110565b9050919050565b600060ff82169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620011a28262001159565b9150620011af8362001159565b9250828202620011bf8162001159565b9150808214620011d457620011d362001166565b5b5092915050565b6000620011e88262001159565b915060008203620011fe57620011fd62001166565b5b600182039050919050565b6000620012168262001159565b9150620012238362001159565b9250828201905060ff8111156200123f576200123e62001166565b5b92915050565b6000620012528262001159565b91506200125f8362001159565b9250828203905060ff8111156200127b576200127a62001166565b5b92915050565b6000819050602082019050919050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b6000620012cb825162001291565b80915050919050565b6000620012e18262000f7f565b82620012ed8462001281565b9050620012fa81620012bd565b925060108210156200133d57620013387fffffffffffffffffffffffffffffffff000000000000000000000000000000008360100360080262000cdb565b831692505b5050919050565b600082825260208201905092915050565b6000620013628262000f7f565b6200136e818562001344565b93506200138081856020860162000a75565b6200138b81620009aa565b840191505092915050565b60006020820190508181036000830152620013b2818462001355565b905092915050565b6000620013c78262000d41565b9150620013d48362000d41565b9250828201905080821115620013ef57620013ee62001166565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000620014318262000d41565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362001466576200146562001166565b5b600182019050919050565b6157fc80620014816000396000f3fe608060405260043610610263576000357c01000000000000000000000000000000000000000000000000000000009004806386e90b5911610156578063b88d4fde116100d3578063da2824a811610097578063da2824a81461096c578063e8a7f4c514610995578063e985e9c5146109d2578063f117e17314610a0f578063f2fde38b14610a4c578063f9613ab214610a8957610263565b8063b88d4fde14610870578063c5bec6fc1461088c578063c87b56dd146108c9578063ccc094c214610906578063d824ee4f1461092f57610263565b8063ad0dec2f1161011a578063ad0dec2f1461075f578063adf288df1461079c578063b1a6afd3146107d9578063b238d60314610804578063b5fdeb231461084557610263565b806386e90b591461067a5780638da5cb5b146106b757806395d89b41146106e25780639a7c5e9f1461070d578063a22cb4651461073657610263565b806349f2553a116101e4578063559f5dc9116101a8578063559f5dc91461055b5780635ae06f7e1461059a5780636352211e146105c35780636b9cb86a1461060057806370a082311461063d57610263565b806349f2553a146104525780634d03546a1461047b5780634f64b2be146104b85780634f6ccce7146104f55780635344299a1461053257610263565b806324e0febc1161022b57806324e0febc146103545780632b29ba23146103915780632f745c59146103ce57806340c84b0e1461040b57806342842e0e1461043657610263565b806301ffc9a71461026857806306fdde03146102a5578063081812fc146102d057806318160ddd1461030d57806323b872dd14610338575b600080fd5b34801561027457600080fd5b5061028f600480360381019061028a919061447d565b610ac6565b60405161029c91906144c5565b60405180910390f35b3480156102b157600080fd5b506102ba610c1a565b6040516102c79190614570565b60405180910390f35b3480156102dc57600080fd5b506102f760048036038101906102f291906145c8565b610ca8565b6040516103049190614636565b60405180910390f35b34801561031957600080fd5b50610322610ce5565b60405161032f9190614660565b60405180910390f35b610352600480360381019061034d91906146a7565b610cf2565b005b34801561036057600080fd5b5061037b60048036038101906103769190614730565b610d5d565b604051610388919061476c565b60405180910390f35b34801561039d57600080fd5b506103b860048036038101906103b39190614787565b610d75565b6040516103c591906144c5565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f091906147b4565b610e21565b6040516104029190614660565b60405180910390f35b34801561041757600080fd5b50610420610e46565b60405161042d9190614849565b60405180910390f35b610450600480360381019061044b91906146a7565b610ed4565b005b34801561045e57600080fd5b50610479600480360381019061047491906149a0565b610f3f565b005b34801561048757600080fd5b506104a2600480360381019061049d9190614a27565b611257565b6040516104af91906144c5565b60405180910390f35b3480156104c457600080fd5b506104df60048036038101906104da91906145c8565b6114e4565b6040516104ec919061476c565b60405180910390f35b34801561050157600080fd5b5061051c600480360381019061051791906145c8565b611508565b6040516105299190614660565b60405180910390f35b34801561053e57600080fd5b5061055960048036038101906105549190614b08565b61152c565b005b34801561056757600080fd5b50610582600480360381019061057d9190614b51565b6115b8565b60405161059193929190614ba0565b60405180910390f35b3480156105a657600080fd5b506105c160048036038101906105bc9190614787565b61162c565b005b3480156105cf57600080fd5b506105ea60048036038101906105e591906145c8565b61174b565b6040516105f79190614636565b60405180910390f35b34801561060c57600080fd5b5061062760048036038101906106229190614b08565b611787565b6040516106349190614570565b60405180910390f35b34801561064957600080fd5b50610664600480360381019061065f9190614787565b6119a0565b6040516106719190614660565b60405180910390f35b34801561068657600080fd5b506106a1600480360381019061069c9190614b08565b6119e9565b6040516106ae9190614570565b60405180910390f35b3480156106c357600080fd5b506106cc611c94565b6040516106d99190614636565b60405180910390f35b3480156106ee57600080fd5b506106f7611cb8565b6040516107049190614570565b60405180910390f35b34801561071957600080fd5b50610734600480360381019061072f91906145c8565b611d46565b005b34801561074257600080fd5b5061075d60048036038101906107589190614c03565b611e37565b005b34801561076b57600080fd5b5061078660048036038101906107819190614b08565b6120d9565b6040516107939190614849565b60405180910390f35b3480156107a857600080fd5b506107c360048036038101906107be9190614c43565b6123b0565b6040516107d0919061476c565b60405180910390f35b3480156107e557600080fd5b506107ee61271c565b6040516107fb919061476c565b60405180910390f35b34801561081057600080fd5b5061082b600480360381019061082691906145c8565b612722565b60405161083c959493929190614d15565b60405180910390f35b34801561085157600080fd5b5061085a6127c1565b6040516108679190614849565b60405180910390f35b61088a60048036038101906108859190614d68565b61285b565b005b34801561089857600080fd5b506108b360048036038101906108ae9190614b08565b612936565b6040516108c09190614849565b60405180910390f35b3480156108d557600080fd5b506108f060048036038101906108eb91906145c8565b612cef565b6040516108fd9190614570565b60405180910390f35b34801561091257600080fd5b5061092d60048036038101906109289190614e57565b612e42565b005b34801561093b57600080fd5b5061095660048036038101906109519190614f00565b613104565b604051610963919061476c565b60405180910390f35b34801561097857600080fd5b50610993600480360381019061098e9190614787565b613377565b005b3480156109a157600080fd5b506109bc60048036038101906109b79190614b08565b61345f565b6040516109c99190614849565b60405180910390f35b3480156109de57600080fd5b506109f960048036038101906109f49190614f53565b613818565b604051610a0691906144c5565b60405180910390f35b348015610a1b57600080fd5b50610a366004803603810190610a319190614f93565b6138b0565b604051610a43919061476c565b60405180910390f35b348015610a5857600080fd5b50610a736004803603810190610a6e9190614787565b613a3f565b604051610a8091906144c5565b60405180910390f35b348015610a9557600080fd5b50610ab06004803603810190610aab9190614730565b613ae3565b604051610abd919061476c565b60405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b1a5760019050610c15565b635b5e139f7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b6c5760019050610c15565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610bbe5760019050610c15565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c105760019050610c15565b600090505b919050565b600a8054610c2790615029565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5390615029565b8015610ca05780601f10610c7557610100808354040283529160200191610ca0565b820191906000526020600020905b815481529060010190602001808311610c8357829003601f168201915b505050505081565b60006008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600780549050905090565b610cfd838383613b8f565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60056020528060005260406000206000915090505481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680610e1a575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b600e602052816000526040600020602052806000526040600020600091509150505481565b600d8054610e5390615029565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7f90615029565b8015610ecc5780601f10610ea157610100808354040283529160200191610ecc565b820191906000526020600020905b815481529060010190602001808311610eaf57829003601f168201915b505050505081565b610edf838383613b8f565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f9c57600080fd5b82915081519050602f7f01000000000000000000000000000000000000000000000000000000000000000282600183610fd59190615089565b81518110610fe657610fe56150bd565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611066578080611062906150ec565b9150505b8067ffffffffffffffff8111156110805761107f614875565b5b6040519080825280601f01601f1916602001820160405280156110b25781602001600182028036833780820191505090505b50600d90816110c191906152e6565b5060005b82518110156111b2578281815181106110e1576110e06150bd565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002600d82815461113990615029565b8110611148576111476150bd565b5b8154600116156111675790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f01000000000000000000000000000000000000000000000000000000000000008404021790555080806111aa906150ec565b9150506110c5565b5081518114611252577f2f00000000000000000000000000000000000000000000000000000000000000600d835181546111eb90615029565b81106111fa576111f96150bd565b5b8154600116156112195790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055505b505050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806112fd5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61130657600080fd5b61130e614378565b60046000868152602001908152602001600020805490509150600082111561138b57600060046000878152602001908152602001600020600081548110611358576113576150bd565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff161161138a57600080fd5b5b83816000019065ffffffffffff16908165ffffffffffff168152505060046000868152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001600c6101000a81548160ff021916908315150217905550505060038590806001815401808255809150506001900390600052602060002001600090919091909150558365ffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fb85ba54b9f6f8241b7e1499e3cfc186ac0b1c8b7100f599bf6ca6844f896c342876040516114d0919061476c565b60405180910390a360019250505092915050565b600381815481106114f457600080fd5b906000526020600020016000915090505481565b6007818154811061151857600080fd5b906000526020600020016000915090505481565b600060116000601254815260200190815260200160002090508060000160009054906101000a900460ff1660ff1682511461156657600080fd5b816013908161157591906152e6565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c61159f6127c1565b6040516115ac9190614849565b60405180910390a15050565b600460205281600052604060002081815481106115d457600080fd5b90600052602060002001600091509150508060000160009054906101000a900465ffffffffffff16908060000160069054906101000a900465ffffffffffff169080600001600c9054906101000a900460ff16905083565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806116b1575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6116f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e790615404565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080600560008460010281526020019081526020016000205490506060819060020a026c010000000000000000000000009004915050919050565b606080606060006117978561345f565b9150600d80546117a690615029565b905090508082516117b79190615424565b67ffffffffffffffff8111156117d0576117cf614875565b5b6040519080825280601f01601f1916602001820160405280156118025781602001600182028036833780820191505090505b50925060005b818110156118c757600d81815461181e90615029565b811061182d5761182c6150bd565b5b81546001161561184c5790600052602060002090602091828204019190065b9054901a7f010000000000000000000000000000000000000000000000000000000000000002848281518110611885576118846150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806118bf906150ec565b915050611808565b5060005b8251811015611994578281815181106118e7576118e66150bd565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002848381518110611944576119436150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350818061197e906150ec565b925050808061198c906150ec565b9150506118cb565b50829350505050919050565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600060608060006119fb86612936565b915060116000601254815260200190815260200160002093508360000160029054906101000a900460ff1660ff1690506001825182611a3a9190615424565b611a449190615424565b67ffffffffffffffff811115611a5d57611a5c614875565b5b6040519080825280601f01601f191660200182016040528015611a8f5781602001600182028036833780820191505090505b50925060005b81811015611b49578460000160039054906101000a9004700100000000000000000000000000000000028160108110611ad157611ad06150bd565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002848281518110611b0757611b066150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611b41906150ec565b915050611a95565b50603a7f010000000000000000000000000000000000000000000000000000000000000002838281518110611b8157611b806150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611bbb906150ec565b91505060005b8251811015611c8757828181518110611bdd57611bdc6150bd565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002848284611c349190615424565b81518110611c4557611c446150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611c7f906150ec565b915050611bc1565b5082945050505050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b8054611cc590615029565b80601f0160208091040260200160405190810160405280929190818152602001828054611cf190615029565b8015611d3e5780601f10611d1357610100808354040283529160200191611d3e565b820191906000526020600020905b815481529060010190602001808311611d2157829003601f168201915b505050505081565b600060116000838152602001908152602001600020905060008160000160009054906101000a900460ff1660ff1611611d7e57600080fd5b816012819055508060000160009054906101000a900460ff1660ff1667ffffffffffffffff811115611db357611db2614875565b5b6040519080825280601f01601f191660200182016040528015611de55781602001600182028036833780820191505090505b5060139081611df491906152e6565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c611e1e6127c1565b604051611e2b9190614849565b60405180910390a15050565b8015611f5857600073ffffffffffffffffffffffffffffffffffffffff16600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ed557600080fd5b81600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612070565b600073ffffffffffffffffffffffffffffffffffffffff16600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611ff057600080fd5b6000600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120cd91906144c5565b60405180910390a35050565b60606000606060116000601254815260200190815260200160002091508160000160019054906101000a900460ff1660ff168260000160009054906101000a900460ff1660ff16855161212c9190615424565b6121369190615424565b67ffffffffffffffff81111561214f5761214e614875565b5b6040519080825280601f01601f1916602001820160405280156121815781602001600182028036833780820191505090505b50905060005b8260000160019054906101000a900460ff1660ff16811015612257578260000160139054906101000a900478010000000000000000000000000000000000000000000000000281600881106121df576121de6150bd565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002828281518110612215576122146150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061224f906150ec565b915050612187565b8260000160009054906101000a900460ff167f01000000000000000000000000000000000000000000000000000000000000000282828151811061229e5761229d6150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806122d8906150ec565b91505060005b85518110156123a4578581815181106122fa576122f96150bd565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028382846123519190615424565b81518110612362576123616150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061239c906150ec565b9150506122de565b50819350505050919050565b60008060008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806124595750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61246257600080fd5b600160046000878152602001908152602001600020805490501461248557600080fd5b6000600460008781526020019081526020016000206000815481106124ad576124ac6150bd565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff16146124df57600080fd5b600060010260056000878152602001908152602001600020541461250257600080fd5b8573ffffffffffffffffffffffffffffffffffffffff1692507fc0000000000000000000000000000000000000000000000000000000000000008317925082600102600560008781526020019081526020016000208190555084600190049150600660009054906101000a900460ff161561262757601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080600f60008481526020019081526020016000208190555081600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055505b6001601060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126779190615424565b925050819055506007856001900490806001815401808255809150506001900390600052602060002001600090919091909150558573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8846040516127089190614660565b60405180910390a384935050505092915050565b600c5481565b60116020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900460ff16908060000160029054906101000a900460ff16908060000160039054906101000a900470010000000000000000000000000000000002908060000160139054906101000a9004780100000000000000000000000000000000000000000000000002905085565b6060612856601380546127d390615029565b80601f01602080910402602001604051908101604052809291908181526020018280546127ff90615029565b801561284c5780601f106128215761010080835404028352916020019161284c565b820191906000526020600020905b81548152906001019060200180831161282f57829003601f168201915b50505050506120d9565b905090565b612866848484613b8f565b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f75c9e114f073c346aac7d1d7e9a3c3c14edabcdd27de07d1d9e425f45d318c5e8461291b9061547d565b604051612928919061476c565b60405180910390a450505050565b6060806000806002855161294a91906154e4565b67ffffffffffffffff81111561296357612962614875565b5b6040519080825280601f01601f1916602001820160405280156129955781602001600182028036833780820191505090505b5092506000905060005b6020811015612ce357600460f08783815181106129bf576129be6150bd565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff161015612abe57603083612a559190615526565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110612a8a57612a896150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612b30565b605783612acb9190615526565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110612b0057612aff6150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f868281518110612b4557612b446150bd565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff161015612c4357603083612bce9190615526565b7f01000000000000000000000000000000000000000000000000000000000000000284600184612bfe9190615424565b81518110612c0f57612c0e6150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612cc1565b605783612c509190615526565b7f01000000000000000000000000000000000000000000000000000000000000000284600184612c809190615424565b81518110612c9157612c906150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600282612cce9190615424565b91508080612cdb906150ec565b91505061299f565b50829350505050919050565b6060600060608360010291506000600460008481526020019081526020016000208054905003612d2557612d2282613ae3565b91505b6000600460008481526020019081526020016000208054905011612d4857600080fd5b602067ffffffffffffffff811115612d6357612d62614875565b5b6040519080825280601f01601f191660200182016040528015612d955781602001600182028036833780820191505090505b50905060005b6020811015612e2f57828160208110612db757612db66150bd565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002828281518110612ded57612dec6150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080612e27906150ec565b915050612d9b565b50612e3981611787565b92505050919050565b6060819050601081511115612e8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e83906155a7565b60405180910390fd5b612e946143ab565b6000600790505b60008160ff1610612ef0576000600882612eb591906155c7565b60ff1660ff9060020a029050600086821667ffffffffffffffff161115612edc5750612ef0565b8180612ee790615604565b92505050612e9b565b600181612efd9190615526565b826020019060ff16908160ff16815250506008816007612f1d919061562d565b612f2791906155c7565b60ff168567ffffffffffffffff169060020a02780100000000000000000000000000000000000000000000000002826080019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250508251826040019060ff16908160ff168152505082612fb390615677565b82606001906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff19168152505085826000019060ff16908160ff168152505081601160008767ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060808201518160000160136101000a81548167ffffffffffffffff0219169083780100000000000000000000000000000000000000000000000090040217905550905050505050505050565b600080600460008581526020019081526020016000208361ffff16815481106131305761312f6150bd565b5b90600052602060002001905080600001600c9054906101000a900460ff161561318e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131859061572a565b60405180910390fd5b60008361ffff161480156131c0575060008160000160009054906101000a900465ffffffffffff1665ffffffffffff16145b1561321f5760018160000160068282829054906101000a900465ffffffffffff166131eb919061574a565b92506101000a81548165ffffffffffff021916908365ffffffffffff16021790555061321785856123b0565b915050613370565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806132c25750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b613301576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132f890615404565b60405180910390fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168160000160069054906101000a900465ffffffffffff1665ffffffffffff161061334957600080fd5b61336c8585858460000160069054906101000a900465ffffffffffff1685613f14565b9150505b9392505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133fc90615404565b60405180910390fd5b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6060806000806002855161347391906154e4565b67ffffffffffffffff81111561348c5761348b614875565b5b6040519080825280601f01601f1916602001820160405280156134be5781602001600182028036833780820191505090505b5092506000905060005b602081101561380c57600460f08783815181106134e8576134e76150bd565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff1610156135e75760308361357e9190615526565b7f0100000000000000000000000000000000000000000000000000000000000000028483815181106135b3576135b26150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613659565b6057836135f49190615526565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110613629576136286150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f86828151811061366e5761366d6150bd565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff16101561376c576030836136f79190615526565b7f010000000000000000000000000000000000000000000000000000000000000002846001846137279190615424565b81518110613738576137376150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506137ea565b6057836137799190615526565b7f010000000000000000000000000000000000000000000000000000000000000002846001846137a99190615424565b815181106137ba576137b96150bd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b6002826137f79190615424565b91508080613804906150ec565b9150506134c8565b50829350505050919050565b60008173ffffffffffffffffffffffffffffffffffffffff16600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600080600460008681526020019081526020016000208461ffff16815481106138dc576138db6150bd565b5b90600052602060002001905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061398b5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6139ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139c190615404565b60405180910390fd5b60008160000160009054906101000a900465ffffffffffff1665ffffffffffff16116139f557600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168365ffffffffffff1610613a2757600080fd5b613a348686868685613f14565b915050949350505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613a9a57600080fd5b816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b60008060056000848152602001908152602001600020549050613b0581614283565b613b0e57600080fd5b613b17816142b5565b15613b255782915050613b8a565b7effffffffffffffff00000000000000000000000000000000000000000000006001028116905060b881908060020a820491505090507fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000600102831681179050809150505b919050565b6000803073ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401613be79190614660565b602060405180830381865afa158015613c04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c289190615799565b91508473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613c6257600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614613d96573373ffffffffffffffffffffffffffffffffffffffff166008600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480613d8c57503373ffffffffffffffffffffffffffffffffffffffff16600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b613d9557600080fd5b5b60006008600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550613df383856142e7565b600f60008481526020019081526020016000205490506000600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055506001601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613eaf9190615089565b925050819055506001601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613f069190615424565b925050819055505050505050565b60008060008060007fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008960019004169350603067ffffffffffffffff8961ffff161667ffffffffffffffff169060020a0267ffffffffffffffff16841793508665ffffffffffff16841793508360010291506000600102600560008481526020019081526020016000205414613fa957600080fd5b85600001600c9054906101000a900460ff1661400b578560000160069054906101000a900465ffffffffffff1665ffffffffffff168765ffffffffffff161461400a57600186600001600c6101000a81548160ff0219169083151502179055505b5b67ffffffffffffffff896001900416925060b8839060020a0292507f8000000000000000000000000000000000000000000000000000000000000000831792508973ffffffffffffffffffffffffffffffffffffffff168317925060018660000160068282829054906101000a900465ffffffffffff1661408c919061574a565b92506101000a81548165ffffffffffff021916908365ffffffffffff160217905550826001026005600084815260200190815260200160002081905550600660009054906101000a900460ff161561418e57601060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080600f60008681526020019081526020016000208190555083600e60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055505b6001601060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546141de9190615424565b9250508190555060078490806001815401808255809150506001900390600052602060002001600090919091909150558973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88660405161426b9190614660565b60405180910390a38194505050505095945050505050565b6000807f8000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000807f4000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b60008083600102905060056000828152602001908152602001600020546001900491506000820361431757600080fd5b7fffffffffffffffffffffffff0000000000000000000000000000000000000000821691508273ffffffffffffffffffffffffffffffffffffffff168217915081600102600560008381526020019081526020016000208190555050505050565b6040518060600160405280600065ffffffffffff168152602001600065ffffffffffff1681526020016000151581525090565b6040518060a00160405280600060ff168152602001600060ff168152602001600060ff16815260200160006fffffffffffffffffffffffffffffffff19168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff191681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61445a81614425565b811461446557600080fd5b50565b60008135905061447781614451565b92915050565b6000602082840312156144935761449261441b565b5b60006144a184828501614468565b91505092915050565b60008115159050919050565b6144bf816144aa565b82525050565b60006020820190506144da60008301846144b6565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561451a5780820151818401526020810190506144ff565b60008484015250505050565b6000601f19601f8301169050919050565b6000614542826144e0565b61454c81856144eb565b935061455c8185602086016144fc565b61456581614526565b840191505092915050565b6000602082019050818103600083015261458a8184614537565b905092915050565b6000819050919050565b6145a581614592565b81146145b057600080fd5b50565b6000813590506145c28161459c565b92915050565b6000602082840312156145de576145dd61441b565b5b60006145ec848285016145b3565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614620826145f5565b9050919050565b61463081614615565b82525050565b600060208201905061464b6000830184614627565b92915050565b61465a81614592565b82525050565b60006020820190506146756000830184614651565b92915050565b61468481614615565b811461468f57600080fd5b50565b6000813590506146a18161467b565b92915050565b6000806000606084860312156146c0576146bf61441b565b5b60006146ce86828701614692565b93505060206146df86828701614692565b92505060406146f0868287016145b3565b9150509250925092565b6000819050919050565b61470d816146fa565b811461471857600080fd5b50565b60008135905061472a81614704565b92915050565b6000602082840312156147465761474561441b565b5b60006147548482850161471b565b91505092915050565b614766816146fa565b82525050565b6000602082019050614781600083018461475d565b92915050565b60006020828403121561479d5761479c61441b565b5b60006147ab84828501614692565b91505092915050565b600080604083850312156147cb576147ca61441b565b5b60006147d985828601614692565b92505060206147ea858286016145b3565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b600061481b826147f4565b61482581856147ff565b93506148358185602086016144fc565b61483e81614526565b840191505092915050565b600060208201905081810360008301526148638184614810565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6148ad82614526565b810181811067ffffffffffffffff821117156148cc576148cb614875565b5b80604052505050565b60006148df614411565b90506148eb82826148a4565b919050565b600067ffffffffffffffff82111561490b5761490a614875565b5b61491482614526565b9050602081019050919050565b82818337600083830152505050565b600061494361493e846148f0565b6148d5565b90508281526020810184848401111561495f5761495e614870565b5b61496a848285614921565b509392505050565b600082601f8301126149875761498661486b565b5b8135614997848260208601614930565b91505092915050565b6000602082840312156149b6576149b561441b565b5b600082013567ffffffffffffffff8111156149d4576149d3614420565b5b6149e084828501614972565b91505092915050565b600065ffffffffffff82169050919050565b614a04816149e9565b8114614a0f57600080fd5b50565b600081359050614a21816149fb565b92915050565b60008060408385031215614a3e57614a3d61441b565b5b6000614a4c8582860161471b565b9250506020614a5d85828601614a12565b9150509250929050565b600067ffffffffffffffff821115614a8257614a81614875565b5b614a8b82614526565b9050602081019050919050565b6000614aab614aa684614a67565b6148d5565b905082815260208101848484011115614ac757614ac6614870565b5b614ad2848285614921565b509392505050565b600082601f830112614aef57614aee61486b565b5b8135614aff848260208601614a98565b91505092915050565b600060208284031215614b1e57614b1d61441b565b5b600082013567ffffffffffffffff811115614b3c57614b3b614420565b5b614b4884828501614ada565b91505092915050565b60008060408385031215614b6857614b6761441b565b5b6000614b768582860161471b565b9250506020614b87858286016145b3565b9150509250929050565b614b9a816149e9565b82525050565b6000606082019050614bb56000830186614b91565b614bc26020830185614b91565b614bcf60408301846144b6565b949350505050565b614be0816144aa565b8114614beb57600080fd5b50565b600081359050614bfd81614bd7565b92915050565b60008060408385031215614c1a57614c1961441b565b5b6000614c2885828601614692565b9250506020614c3985828601614bee565b9150509250929050565b60008060408385031215614c5a57614c5961441b565b5b6000614c6885828601614692565b9250506020614c798582860161471b565b9150509250929050565b600060ff82169050919050565b614c9981614c83565b82525050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b614cd481614c9f565b82525050565b60007fffffffffffffffff00000000000000000000000000000000000000000000000082169050919050565b614d0f81614cda565b82525050565b600060a082019050614d2a6000830188614c90565b614d376020830187614c90565b614d446040830186614c90565b614d516060830185614ccb565b614d5e6080830184614d06565b9695505050505050565b60008060008060808587031215614d8257614d8161441b565b5b6000614d9087828801614692565b9450506020614da187828801614692565b9350506040614db2878288016145b3565b925050606085013567ffffffffffffffff811115614dd357614dd2614420565b5b614ddf87828801614ada565b91505092959194509250565b614df481614c83565b8114614dff57600080fd5b50565b600081359050614e1181614deb565b92915050565b600067ffffffffffffffff82169050919050565b614e3481614e17565b8114614e3f57600080fd5b50565b600081359050614e5181614e2b565b92915050565b600080600060608486031215614e7057614e6f61441b565b5b6000614e7e86828701614e02565b9350506020614e8f86828701614e42565b925050604084013567ffffffffffffffff811115614eb057614eaf614420565b5b614ebc86828701614972565b9150509250925092565b600061ffff82169050919050565b614edd81614ec6565b8114614ee857600080fd5b50565b600081359050614efa81614ed4565b92915050565b600080600060608486031215614f1957614f1861441b565b5b6000614f2786828701614692565b9350506020614f388682870161471b565b9250506040614f4986828701614eeb565b9150509250925092565b60008060408385031215614f6a57614f6961441b565b5b6000614f7885828601614692565b9250506020614f8985828601614692565b9150509250929050565b60008060008060808587031215614fad57614fac61441b565b5b6000614fbb87828801614692565b9450506020614fcc8782880161471b565b9350506040614fdd87828801614eeb565b9250506060614fee87828801614a12565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061504157607f821691505b60208210810361505457615053614ffa565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061509482614592565b915061509f83614592565b92508282039050818111156150b7576150b661505a565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006150f782614592565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036151295761512861505a565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b6000600883026151997fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82615159565b6151a38683615159565b95508019841693508086168417925050509392505050565b6000819050919050565b60006151e06151db6151d684614592565b6151bb565b614592565b9050919050565b6000819050919050565b6151fa836151c5565b61520e615206826151e7565b848454615169565b825550505050565b600090565b615223615216565b61522e8184846151f1565b505050565b5b818110156152525761524760008261521b565b600181019050615234565b5050565b601f8211156152975761526881615134565b61527184615149565b81016020851015615280578190505b61529461528c85615149565b830182615233565b50505b505050565b60008160020a8304905092915050565b60006152bd6000198460080261529c565b1980831691505092915050565b60006152d683836152ac565b9150826002028217905092915050565b6152ef826147f4565b67ffffffffffffffff81111561530857615307614875565b5b6153128254615029565b61531d828285615256565b600060209050601f831160018114615350576000841561533e578287015190505b61534885826152ca565b8655506153b0565b601f19841661535e86615134565b60005b8281101561538657848901518255600182019150602085019450602081019050615361565b868310156153a3578489015161539f601f8916826152ac565b8355505b6001600288020188555050505b505050505050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b60006153ee600a836144eb565b91506153f9826153b8565b602082019050919050565b6000602082019050818103600083015261541d816153e1565b9050919050565b600061542f82614592565b915061543a83614592565b92508282019050808211156154525761545161505a565b5b92915050565b6000819050602082019050919050565b600061547482516146fa565b80915050919050565b6000615488826147f4565b8261549284615458565b905061549d81615468565b925060208210156154dd576154d87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802615159565b831692505b5050919050565b60006154ef82614592565b91506154fa83614592565b925082820261550881614592565b9150828204841483151761551f5761551e61505a565b5b5092915050565b600061553182614c83565b915061553c83614c83565b9250828201905060ff8111156155555761555461505a565b5b92915050565b7f4552525f5052454649585f544f4f5f4c4f4e4700000000000000000000000000600082015250565b60006155916013836144eb565b915061559c8261555b565b602082019050919050565b600060208201905081810360008301526155c081615584565b9050919050565b60006155d282614c83565b91506155dd83614c83565b92508282026155eb81614c83565b91508082146155fd576155fc61505a565b5b5092915050565b600061560f82614c83565b9150600082036156225761562161505a565b5b600182039050919050565b600061563882614c83565b915061564383614c83565b9250828203905060ff81111561565c5761565b61505a565b5b92915050565b600061566e8251614c9f565b80915050919050565b6000615682826147f4565b8261568c84615458565b905061569781615662565b925060108210156156d7576156d27fffffffffffffffffffffffffffffffff0000000000000000000000000000000083601003600802615159565b831692505b5050919050565b7f4552525f53504152534500000000000000000000000000000000000000000000600082015250565b6000615714600a836144eb565b915061571f826156de565b602082019050919050565b6000602082019050818103600083015261574381615707565b9050919050565b6000615755826149e9565b9150615760836149e9565b9250828201905065ffffffffffff81111561577e5761577d61505a565b5b92915050565b6000815190506157938161467b565b92915050565b6000602082840312156157af576157ae61441b565b5b60006157bd84828501615784565b9150509291505056fea26469706673582212209c705c9e1194892f8963a676a7c89711310c7e29ec8d2831c88dc1d43a6ee06c64736f6c63430008120033 +\ No newline at end of file diff --git a/python/craft_nft/data/CraftNFT.json b/python/craft_nft/data/CraftNFT.json @@ -1 +1 @@ -[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"bytes32","name":"_declaration","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"uint48","name":"_count","type":"uint48"},{"indexed":false,"internalType":"bytes32","name":"_tokenId","type":"bytes32"}],"name":"Allocate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","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":false,"internalType":"bytes","name":"_multiHash","type":"bytes"}],"name":"Msg","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"TransferWithData","type":"event"},{"inputs":[{"internalType":"uint8","name":"_length","type":"uint8"},{"internalType":"uint64","name":"_codecId","type":"uint64"},{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"addCodec","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"addWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"content","type":"bytes32"},{"internalType":"uint48","name":"count","type":"uint48"}],"name":"allocate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURL","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"declaration","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"deleteWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_truncatedId","type":"bytes32"}],"name":"getDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"getDigestHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getMsg","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"isWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"},{"internalType":"uint48","name":"_index","type":"uint48"}],"name":"mintExactFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"}],"name":"mintFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"}],"name":"mintTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"mintedToken","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"multiCodecs","outputs":[{"internalType":"uint8","name":"l","type":"uint8"},{"internalType":"uint8","name":"codecRLength","type":"uint8"},{"internalType":"uint8","name":"prefixRLength","type":"uint8"},{"internalType":"bytes16","name":"prefix","type":"bytes16"},{"internalType":"bytes8","name":"codec","type":"bytes8"}],"stateMutability":"view","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":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseString","type":"string"}],"name":"setBaseURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_digest","type":"bytes"}],"name":"setMsg","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_codec","type":"uint256"}],"name":"setMsgCodec","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","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":[{"internalType":"bytes","name":"_digest","type":"bytes"}],"name":"toHash","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"toHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"_digest","type":"bytes"}],"name":"toURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"toURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"token","outputs":[{"internalType":"uint48","name":"count","type":"uint48"},{"internalType":"uint48","name":"cursor","type":"uint48"},{"internalType":"bool","name":"sparse","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","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":"bytes32","name":"_declaration","type":"bytes32"},{"internalType":"bool","name":"_enumeration","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"uint48","name":"_count","type":"uint48"},{"indexed":false,"internalType":"bytes32","name":"_tokenId","type":"bytes32"}],"name":"Allocate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","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":false,"internalType":"bytes","name":"_multiHash","type":"bytes"}],"name":"Msg","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"TransferWithData","type":"event"},{"inputs":[{"internalType":"uint8","name":"_length","type":"uint8"},{"internalType":"uint64","name":"_codecId","type":"uint64"},{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"addCodec","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"addWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"content","type":"bytes32"},{"internalType":"uint48","name":"count","type":"uint48"}],"name":"allocate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURL","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"declaration","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"deleteWriter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_truncatedId","type":"bytes32"}],"name":"getDigest","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"getDigestHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getMsg","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_writer","type":"address"}],"name":"isWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"},{"internalType":"uint48","name":"_index","type":"uint48"}],"name":"mintExactFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"}],"name":"mintFromBatchTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bytes32","name":"_content","type":"bytes32"}],"name":"mintTo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"mintedToken","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"multiCodecs","outputs":[{"internalType":"uint8","name":"l","type":"uint8"},{"internalType":"uint8","name":"codecRLength","type":"uint8"},{"internalType":"uint8","name":"prefixRLength","type":"uint8"},{"internalType":"bytes16","name":"prefix","type":"bytes16"},{"internalType":"bytes8","name":"codec","type":"bytes8"}],"stateMutability":"view","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":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseString","type":"string"}],"name":"setBaseURL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_digest","type":"bytes"}],"name":"setMsg","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_codec","type":"uint256"}],"name":"setMsgCodec","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","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":[{"internalType":"bytes","name":"_digest","type":"bytes"}],"name":"toHash","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"toHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"_digest","type":"bytes"}],"name":"toURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"toURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"token","outputs":[{"internalType":"uint48","name":"count","type":"uint48"},{"internalType":"uint48","name":"cursor","type":"uint48"},{"internalType":"bool","name":"sparse","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","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/craft_nft/nft.py b/python/craft_nft/nft.py @@ -105,21 +105,22 @@ class CraftNFT(ERC721): return 4000000 - def constructor(self, sender_address, name, symbol, declaration=ZERO_CONTENT, tx_format=TxFormat.JSONRPC, version=None): - code = self.cargs(name, symbol, declaration, version=version) + def constructor(self, sender_address, name, symbol, declaration=ZERO_CONTENT, enumeration=False, tx_format=TxFormat.JSONRPC, version=None): + code = self.cargs(name, symbol, declaration, enumeration, version=version) tx = self.template(sender_address, None, use_nonce=True) tx = self.set_code(tx, code) return self.finalize(tx, tx_format) @staticmethod - def cargs(name, symbol, declaration, version=None): + def cargs(name, symbol, declaration, enumeration, version=None): declaration = strip_0x(declaration) code = CraftNFT.bytecode() enc = ABIContractEncoder() enc.string(name) enc.string(symbol) enc.bytes32(declaration) + enc.bool(enumeration) code += enc.get() return code @@ -292,7 +293,7 @@ class CraftNFT(ERC721): return o - def mint_to(self, contract_address, sender_address, recipient, token_id, batch, index=None, tx_format=TxFormat.JSONRPC): + def mint_to(self, contract_address, sender_address, recipient, token_id, batch=0, index=None, tx_format=TxFormat.JSONRPC): enc = ABIContractEncoder() if index != None: diff --git a/python/craft_nft/unittest/base.py b/python/craft_nft/unittest/base.py @@ -29,3 +29,19 @@ class TestCraftNFT(EthTesterCase): o = receipt(r) r = self.conn.do(o) self.address = to_checksum_address(r['contract_address']) + + +class TestCraftNFTEnumerated(EthTesterCase): + + def setUp(self): + super(TestCraftNFT, self).setUp() + nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) + c = CraftNFT(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + (tx_hash, o) = c.constructor(self.accounts[0], 'DevBadge', 'DEV', enumeration=True) + self.conn = RPCConnection.connect(self.chain_spec, 'default') + r = self.conn.do(o) + logg.debug('smart contract published with hash {}'.format(r)) + + o = receipt(r) + r = self.conn.do(o) + self.address = to_checksum_address(r['contract_address']) diff --git a/python/tests/test_supply.py b/python/tests/test_supply.py @@ -55,8 +55,16 @@ class TestSupply(TestCraftNFT): o = c.total_supply(self.address, sender_address=self.accounts[0]) r = self.rpc.do(o) supply = c.parse_total_supply(r) + self.assertEqual(supply, 0); + + (tx_hash_hex, o) = c.mint_to(self.address, self.accounts[0], self.accounts[1], hash_of_foo) + self.rpc.do(o) + + o = c.total_supply(self.address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + supply = c.parse_total_supply(r) self.assertEqual(supply, 1); - + def test_supply_batch(self): nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) @@ -68,8 +76,15 @@ class TestSupply(TestCraftNFT): o = c.total_supply(self.address, sender_address=self.accounts[0]) r = self.rpc.do(o) supply = c.parse_total_supply(r) - self.assertEqual(supply, 9); + self.assertEqual(supply, 0); + (tx_hash_hex, o) = c.mint_to(self.address, self.accounts[0], self.accounts[1], hash_of_foo) + self.rpc.do(o) + + o = c.total_supply(self.address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + supply = c.parse_total_supply(r) + self.assertEqual(supply, 1); def test_supply_mixed(self): @@ -88,7 +103,21 @@ class TestSupply(TestCraftNFT): o = c.total_supply(self.address, sender_address=self.accounts[0]) r = self.rpc.do(o) supply = c.parse_total_supply(r) - self.assertEqual(supply, 16); + self.assertEqual(supply, 0); + + (tx_hash_hex, o) = c.mint_to(self.address, self.accounts[0], self.accounts[3], hash_of_bar) + self.rpc.do(o) + + (tx_hash_hex, o) = c.mint_to(self.address, self.accounts[0], self.accounts[2], hash_of_bar) + self.rpc.do(o) + + (tx_hash_hex, o) = c.mint_to(self.address, self.accounts[0], self.accounts[1], hash_of_foo) + self.rpc.do(o) + + o = c.total_supply(self.address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + supply = c.parse_total_supply(r) + self.assertEqual(supply, 3); if __name__ == '__main__': diff --git a/solidity/CraftNFT.sol b/solidity/CraftNFT.sol @@ -37,6 +37,10 @@ contract CraftNFT { // All Minted Tokens. // Represents both Unique Tokens and Batch Tokens. mapping(bytes32 => bytes32) public mintedToken; + // Activate enumeration + bool enumeration; + // ERC721 - Enumerable - List of tokens in order of minting + uint256[] public tokenByIndex; // Registry for the approve() method mapping(uint256 => address) tokenAllowance; @@ -51,7 +55,7 @@ contract CraftNFT { string public symbol; // The total Token Allocations across all tokens, regardless of whether they have been minted or not. - uint256 supply; + //uint256 supply; // The digest of a human-readable resource that describes the rationale and terms for all tokens created by this contract. bytes32 public declaration; @@ -59,7 +63,9 @@ contract CraftNFT { // Editable base URI against which to look up token data by token id bytes public baseURL; - // Balance + // Enumerated index of all owned tokens + mapping ( address => mapping ( uint256 => uint256 ) ) public tokenOfOwnerByIndex; + mapping ( uint256 => uint256 ) ownerIndexReverse; mapping ( address => uint256 ) balance; // ERC-721 @@ -94,7 +100,7 @@ contract CraftNFT { event Msg(bytes _multiHash); - constructor(string memory _name, string memory _symbol, bytes32 _declaration) { + constructor(string memory _name, string memory _symbol, bytes32 _declaration, bool _enumeration) { owner = msg.sender; declaration =_declaration; name = _name; @@ -102,6 +108,7 @@ contract CraftNFT { addCodec(32, 0x12, "sha256"); setMsgCodec(0x12); currentMsg = new bytes(32); + enumeration = _enumeration; } // Transfer ownership of token contract to new owner. @@ -174,11 +181,11 @@ contract CraftNFT { token[content].push(_token); tokens.push(content); - if (count == 0) { - supply += 1; - } else { - supply += count; - } +// if (count == 0) { +// supply += 1; +// } else { +// supply += count; +// } emit Allocate(msg.sender, count, content); return true; } @@ -197,6 +204,8 @@ contract CraftNFT { // Mint a unique token. The method will fail if the token was allocated as a batch. function mintTo(address _recipient, bytes32 _content) public returns (bytes32) { uint256 right; + uint256 tokenId; + uint256 _balance; require(msg.sender == owner || writer[msg.sender]); require(token[_content].length == 1); @@ -206,10 +215,17 @@ contract CraftNFT { right = uint160(_recipient); right |= (3 << 254); mintedToken[_content] = bytes32(right); - + + tokenId = uint256(_content); + if (enumeration) { + _balance = balance[_recipient]; + ownerIndexReverse[tokenId] = _balance; + tokenOfOwnerByIndex[_recipient][_balance] = tokenId; + } balance[_recipient] += 1; + tokenByIndex.push(uint256(_content)); - emit Mint(msg.sender, _recipient, uint256(_content)); + emit Mint(msg.sender, _recipient, tokenId); return _content; } @@ -272,6 +288,7 @@ contract CraftNFT { uint256 left; uint256 right; bytes32 k; + uint256 _balance; left = uint256(_content) & 0xffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000; left |= ((_batch & 0xffffffffffffffff) << 48); @@ -294,7 +311,14 @@ contract CraftNFT { _spec.cursor += 1; mintedToken[k] = bytes32(right); + if (enumeration) { + _balance = balance[_recipient]; + ownerIndexReverse[left] = _balance; + tokenOfOwnerByIndex[_recipient][_balance] = left; + } + balance[_recipient] += 1; + tokenByIndex.push(left); emit Mint(msg.sender, _recipient, left); @@ -339,6 +363,7 @@ contract CraftNFT { // Common code path for transfer methods function transferCore(address _from, address _to, uint256 _tokenId) internal { address currentTokenOwner; + uint256 reverseIndex; currentTokenOwner = this.ownerOf(_tokenId); @@ -349,6 +374,8 @@ contract CraftNFT { tokenAllowance[_tokenId] = address(0); setTokenOwner(_tokenId, _to); + reverseIndex = ownerIndexReverse[_tokenId]; + tokenOfOwnerByIndex[_from][reverseIndex] = uint256(0); balance[_from] -= 1; balance[_to] += 1; @@ -482,7 +509,7 @@ contract CraftNFT { // ERC-721 function totalSupply() public view returns(uint256) { - return supply; + return tokenByIndex.length; } // Add a multicodec that can later be set as current codec