commit f315c5c8b041179aec6ec5ea4c9720547de360f9
parent 2eaaf30817c332ec5824ee60e37474d5a2016673
Author: lash <dev@holbrook.no>
Date: Mon, 20 Mar 2023 09:21:00 +0000
WIP implement onreceived hook
Diffstat:
6 files changed, 28 insertions(+), 17 deletions(-)
diff --git a/js/contract/CraftNFT.bin b/js/contract/CraftNFT.bin
@@ -1 +1 @@
-60806040523480156200001157600080fd5b50604051620071ad380380620071ad833981810160405281019062000037919062000afc565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550816009908162000088919062000dd2565b5080600a90816200009a919062000dd2565b50620000ee602060126040518060400160405280600681526020017f736861323536000000000000000000000000000000000000000000000000000081525062000174640100000000026401000000009004565b6200010960126200044b640100000000026401000000009004565b602067ffffffffffffffff81111562000127576200012662000998565b5b6040519080825280601f01601f1916602001820160405280156200015a5781602001600182028036833780820191505090505b50601190816200016b919062000f29565b505050620013ab565b6060819050601081511115620001c1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001b89062001071565b60405180910390fd5b620001cb62000903565b6000600790505b60008160ff16106200022f576000600882620001ef9190620010cf565b60ff1660ff9060020a029050600086821667ffffffffffffffff1611156200021857506200022f565b8180620002259062001115565b92505050620001d2565b6001816200023e919062001143565b826020019060ff16908160ff168152505060088160076200026091906200117f565b6200026c9190620010cf565b60ff168567ffffffffffffffff169060020a02780100000000000000000000000000000000000000000000000002826080019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250508251826040019060ff16908160ff168152505082620002fa906200120e565b82606001906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff19168152505085826000019060ff16908160ff168152505081600f60008767ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060808201518160000160136101000a81548167ffffffffffffffff0219169083780100000000000000000000000000000000000000000000000090040217905550905050505050505050565b6000600f6000838152602001908152602001600020905060008160000160009054906101000a900460ff1660ff16116200048457600080fd5b816010819055508060000160009054906101000a900460ff1660ff1667ffffffffffffffff811115620004bc57620004bb62000998565b5b6040519080825280601f01601f191660200182016040528015620004ef5781602001600182028036833780820191505090505b506011908162000500919062000f29565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c6200053b62000556640100000000026401000000009004565b6040516200054a9190620012d0565b60405180910390a15050565b606062000604601180546200056b9062000bbb565b80601f0160208091040260200160405190810160405280929190818152602001828054620005999062000bbb565b8015620005ea5780601f10620005be57610100808354040283529160200191620005ea565b820191906000526020600020905b815481529060010190602001808311620005cc57829003601f168201915b505050505062000609640100000000026401000000009004565b905090565b606060006060600f6000601054815260200190815260200160002091508160000160019054906101000a900460ff1660ff168260000160009054906101000a900460ff1660ff1685516200065e9190620012f4565b6200066a9190620012f4565b67ffffffffffffffff81111562000686576200068562000998565b5b6040519080825280601f01601f191660200182016040528015620006b95781602001600182028036833780820191505090505b50905060005b8260000160019054906101000a900460ff1660ff1681101562000799578260000160139054906101000a900478010000000000000000000000000000000000000000000000000281600881106200071b576200071a6200132f565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000028282815181106200075457620007536200132f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808062000790906200135e565b915050620006bf565b8260000160009054906101000a900460ff167f010000000000000000000000000000000000000000000000000000000000000002828281518110620007e357620007e26200132f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806200081f906200135e565b91505060005b8551811015620008f7578581815181106200084557620008446200132f565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028382846200089e9190620012f4565b81518110620008b257620008b16200132f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080620008ee906200135e565b91505062000825565b50819350505050919050565b6040518060a00160405280600060ff168152602001600060ff168152602001600060ff16815260200160006fffffffffffffffffffffffffffffffff19168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff191681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620009d28262000987565b810181811067ffffffffffffffff82111715620009f457620009f362000998565b5b80604052505050565b600062000a0962000969565b905062000a178282620009c7565b919050565b600067ffffffffffffffff82111562000a3a5762000a3962000998565b5b62000a458262000987565b9050602081019050919050565b60005b8381101562000a7257808201518184015260208101905062000a55565b60008484015250505050565b600062000a9562000a8f8462000a1c565b620009fd565b90508281526020810184848401111562000ab45762000ab362000982565b5b62000ac184828562000a52565b509392505050565b600082601f83011262000ae15762000ae06200097d565b5b815162000af384826020860162000a7e565b91505092915050565b6000806040838503121562000b165762000b1562000973565b5b600083015167ffffffffffffffff81111562000b375762000b3662000978565b5b62000b458582860162000ac9565b925050602083015167ffffffffffffffff81111562000b695762000b6862000978565b5b62000b778582860162000ac9565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000bd457607f821691505b60208210810362000bea5762000be962000b8c565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000c15565b62000c63868362000c15565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000cb062000caa62000ca48462000c7b565b62000c85565b62000c7b565b9050919050565b6000819050919050565b62000ccc8362000c8f565b62000ce462000cdb8262000cb7565b84845462000c25565b825550505050565b600090565b62000cfb62000cec565b62000d0881848462000cc1565b505050565b5b8181101562000d305762000d2460008262000cf1565b60018101905062000d0e565b5050565b601f82111562000d7f5762000d498162000bf0565b62000d548462000c05565b8101602085101562000d64578190505b62000d7c62000d738562000c05565b83018262000d0d565b50505b505050565b60008160020a8304905092915050565b600062000da76000198460080262000d84565b1980831691505092915050565b600062000dc2838362000d94565b9150826002028217905092915050565b62000ddd8262000b81565b67ffffffffffffffff81111562000df95762000df862000998565b5b62000e05825462000bbb565b62000e1282828562000d34565b600060209050601f83116001811462000e4a576000841562000e35578287015190505b62000e41858262000db4565b86555062000eb1565b601f19841662000e5a8662000bf0565b60005b8281101562000e845784890151825560018201915060208501945060208101905062000e5d565b8683101562000ea4578489015162000ea0601f89168262000d94565b8355505b6001600288020188555050505b505050505050565b600081519050919050565b60008190508160005260206000209050919050565b601f82111562000f245762000eee8162000ec4565b62000ef98462000c05565b8101602085101562000f09578190505b62000f2162000f188562000c05565b83018262000d0d565b50505b505050565b62000f348262000eb9565b67ffffffffffffffff81111562000f505762000f4f62000998565b5b62000f5c825462000bbb565b62000f6982828562000ed9565b600060209050601f83116001811462000fa1576000841562000f8c578287015190505b62000f98858262000db4565b86555062001008565b601f19841662000fb18662000ec4565b60005b8281101562000fdb5784890151825560018201915060208501945060208101905062000fb4565b8683101562000ffb578489015162000ff7601f89168262000d94565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4552525f5052454649585f544f4f5f4c4f4e4700000000000000000000000000600082015250565b60006200105960138362001010565b9150620010668262001021565b602082019050919050565b600060208201905081810360008301526200108c816200104a565b9050919050565b600060ff82169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620010dc8262001093565b9150620010e98362001093565b9250828202620010f98162001093565b91508082146200110e576200110d620010a0565b5b5092915050565b6000620011228262001093565b915060008203620011385762001137620010a0565b5b600182039050919050565b6000620011508262001093565b91506200115d8362001093565b9250828201905060ff811115620011795762001178620010a0565b5b92915050565b60006200118c8262001093565b9150620011998362001093565b9250828203905060ff811115620011b557620011b4620010a0565b5b92915050565b6000819050602082019050919050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b6000620012058251620011cb565b80915050919050565b60006200121b8262000eb9565b826200122784620011bb565b90506200123481620011f7565b925060108210156200127757620012727fffffffffffffffffffffffffffffffff000000000000000000000000000000008360100360080262000c15565b831692505b5050919050565b600082825260208201905092915050565b60006200129c8262000eb9565b620012a881856200127e565b9350620012ba81856020860162000a52565b620012c58162000987565b840191505092915050565b60006020820190508181036000830152620012ec81846200128f565b905092915050565b6000620013018262000c7b565b91506200130e8362000c7b565b9250828201905080821115620013295762001328620010a0565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006200136b8262000c7b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620013a0576200139f620010a0565b5b600182019050919050565b615df280620013bb6000396000f3fe608060405260043610610263576000357c0100000000000000000000000000000000000000000000000000000000900480638da5cb5b11610156578063c6eba7c4116100d3578063e8a7f4c511610097578063e8a7f4c514610957578063e985e9c514610994578063f117e173146109d1578063f2fde38b14610a0e578063f70a3de814610a4b578063f9613ab214610a8857610263565b8063c6eba7c414610862578063c87b56dd1461088b578063ccc094c2146108c8578063d824ee4f146108f1578063da2824a81461092e57610263565b8063adf288df1161011a578063adf288df14610760578063b238d6031461079d578063b5fdeb23146107de578063b88d4fde14610809578063c5bec6fc1461082557610263565b80638da5cb5b1461067b57806395d89b41146106a65780639a7c5e9f146106d1578063a22cb465146106fa578063ad0dec2f1461072357610263565b806349f2553a116101e45780635ae06f7e116101a85780635ae06f7e1461055e5780636352211e146105875780636b9cb86a146105c457806370a082311461060157806386e90b591461063e57610263565b806349f2553a146104525780634f64b2be1461047b5780634f6ccce7146104b85780635344299a146104f5578063559f5dc91461051e57610263565b806324e0febc1161022b57806324e0febc146103545780632b29ba23146103915780632f745c59146103ce57806340c84b0e1461040b57806342842e0e1461043657610263565b806301ffc9a71461026857806306fdde03146102a5578063081812fc146102d057806318160ddd1461030d57806323b872dd14610338575b600080fd5b34801561027457600080fd5b5061028f600480360381019061028a9190614901565b610ac5565b60405161029c9190614949565b60405180910390f35b3480156102b157600080fd5b506102ba610c19565b6040516102c791906149f4565b60405180910390f35b3480156102dc57600080fd5b506102f760048036038101906102f29190614a4c565b610ca7565b6040516103049190614aba565b60405180910390f35b34801561031957600080fd5b50610322610ce4565b60405161032f9190614ae4565b60405180910390f35b610352600480360381019061034d9190614b2b565b610cf1565b005b34801561036057600080fd5b5061037b60048036038101906103769190614bb4565b610d5c565b6040516103889190614bf0565b60405180910390f35b34801561039d57600080fd5b506103b860048036038101906103b39190614c0b565b610d74565b6040516103c59190614949565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f09190614c38565b610e20565b6040516104029190614ae4565b60405180910390f35b34801561041757600080fd5b50610420610e45565b60405161042d9190614ccd565b60405180910390f35b610450600480360381019061044b9190614b2b565b610ed3565b005b34801561045e57600080fd5b5061047960048036038101906104749190614e24565b610f3e565b005b34801561048757600080fd5b506104a2600480360381019061049d9190614a4c565b611256565b6040516104af9190614bf0565b60405180910390f35b3480156104c457600080fd5b506104df60048036038101906104da9190614a4c565b61127a565b6040516104ec9190614ae4565b60405180910390f35b34801561050157600080fd5b5061051c60048036038101906105179190614f0e565b61129e565b005b34801561052a57600080fd5b5061054560048036038101906105409190614f57565b61132a565b6040516105559493929190614fb8565b60405180910390f35b34801561056a57600080fd5b5061058560048036038101906105809190614c0b565b6113b1565b005b34801561059357600080fd5b506105ae60048036038101906105a99190614a4c565b6114d0565b6040516105bb9190614aba565b60405180910390f35b3480156105d057600080fd5b506105eb60048036038101906105e69190614f0e565b61150c565b6040516105f891906149f4565b60405180910390f35b34801561060d57600080fd5b5061062860048036038101906106239190614c0b565b611725565b6040516106359190614ae4565b60405180910390f35b34801561064a57600080fd5b5061066560048036038101906106609190614f0e565b61176e565b60405161067291906149f4565b60405180910390f35b34801561068757600080fd5b50610690611a19565b60405161069d9190614aba565b60405180910390f35b3480156106b257600080fd5b506106bb611a3d565b6040516106c891906149f4565b60405180910390f35b3480156106dd57600080fd5b506106f860048036038101906106f39190614a4c565b611acb565b005b34801561070657600080fd5b50610721600480360381019061071c9190615029565b611bbc565b005b34801561072f57600080fd5b5061074a60048036038101906107459190614f0e565b611e5e565b6040516107579190614ccd565b60405180910390f35b34801561076c57600080fd5b5061078760048036038101906107829190615069565b612135565b6040516107949190614bf0565b60405180910390f35b3480156107a957600080fd5b506107c460048036038101906107bf9190614a4c565b61248b565b6040516107d595949392919061513b565b60405180910390f35b3480156107ea57600080fd5b506107f361252a565b6040516108009190614ccd565b60405180910390f35b610823600480360381019061081e919061518e565b6125c4565b005b34801561083157600080fd5b5061084c60048036038101906108479190614f0e565b61269f565b6040516108599190614ccd565b60405180910390f35b34801561086e57600080fd5b5061088960048036038101906108849190615277565b612a58565b005b34801561089757600080fd5b506108b260048036038101906108ad9190614a4c565b612c10565b6040516108bf91906149f4565b60405180910390f35b3480156108d457600080fd5b506108ef60048036038101906108ea9190615336565b612d63565b005b3480156108fd57600080fd5b50610918600480360381019061091391906153a5565b613025565b6040516109259190614bf0565b60405180910390f35b34801561093a57600080fd5b5061095560048036038101906109509190614c0b565b6132ca565b005b34801561096357600080fd5b5061097e60048036038101906109799190614f0e565b6133b2565b60405161098b9190614ccd565b60405180910390f35b3480156109a057600080fd5b506109bb60048036038101906109b691906153f8565b61376b565b6040516109c89190614949565b60405180910390f35b3480156109dd57600080fd5b506109f860048036038101906109f39190615438565b613803565b604051610a059190614bf0565b60405180910390f35b348015610a1a57600080fd5b50610a356004803603810190610a309190614c0b565b6139ad565b604051610a429190614949565b60405180910390f35b348015610a5757600080fd5b50610a726004803603810190610a6d91906154d8565b613a51565b604051610a7f9190614949565b60405180910390f35b348015610a9457600080fd5b50610aaf6004803603810190610aaa9190614bb4565b613d7f565b604051610abc9190614bf0565b60405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b195760019050610c14565b635b5e139f7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b6b5760019050610c14565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610bbd5760019050610c14565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c0f5760019050610c14565b600090505b919050565b60098054610c2690615547565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5290615547565b8015610c9f5780601f10610c7457610100808354040283529160200191610c9f565b820191906000526020600020905b815481529060010190602001808311610c8257829003601f168201915b505050505081565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600680549050905090565b610cfc838383613e2b565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60056020528060005260406000206000915090505481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680610e19575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b600c602052816000526040600020602052806000526040600020600091509150505481565b600b8054610e5290615547565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7e90615547565b8015610ecb5780601f10610ea057610100808354040283529160200191610ecb565b820191906000526020600020905b815481529060010190602001808311610eae57829003601f168201915b505050505081565b610ede838383613e2b565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f9b57600080fd5b82915081519050602f7f01000000000000000000000000000000000000000000000000000000000000000282600183610fd491906155a7565b81518110610fe557610fe46155db565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146110655780806110619061560a565b9150505b8067ffffffffffffffff81111561107f5761107e614cf9565b5b6040519080825280601f01601f1916602001820160405280156110b15781602001600182028036833780820191505090505b50600b90816110c09190615804565b5060005b82518110156111b1578281815181106110e0576110df6155db565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002600b82815461113890615547565b8110611147576111466155db565b5b8154600116156111665790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f01000000000000000000000000000000000000000000000000000000000000008404021790555080806111a99061560a565b9150506110c4565b5081518114611251577f2f00000000000000000000000000000000000000000000000000000000000000600b835181546111ea90615547565b81106111f9576111f86155db565b5b8154600116156112185790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055505b505050565b6003818154811061126657600080fd5b906000526020600020016000915090505481565b6006818154811061128a57600080fd5b906000526020600020016000915090505481565b6000600f6000601054815260200190815260200160002090508060000160009054906101000a900460ff1660ff168251146112d857600080fd5b81601190816112e79190615804565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c61131161252a565b60405161131e9190614ccd565b60405180910390a15050565b6004602052816000526040600020818154811061134657600080fd5b90600052602060002001600091509150508060000160009054906101000a900465ffffffffffff16908060000160069054906101000a900465ffffffffffff169080600001600c9054906101000a900460ff169080600001600d9054906101000a900460ff16905084565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611436575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146c90615922565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080600560008460010281526020019081526020016000205490506060819060020a026c010000000000000000000000009004915050919050565b6060806060600061151c856133b2565b9150600b805461152b90615547565b9050905080825161153c9190615942565b67ffffffffffffffff81111561155557611554614cf9565b5b6040519080825280601f01601f1916602001820160405280156115875781602001600182028036833780820191505090505b50925060005b8181101561164c57600b8181546115a390615547565b81106115b2576115b16155db565b5b8154600116156115d15790600052602060002090602091828204019190065b9054901a7f01000000000000000000000000000000000000000000000000000000000000000284828151811061160a576116096155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806116449061560a565b91505061158d565b5060005b82518110156117195782818151811061166c5761166b6155db565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028483815181106116c9576116c86155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081806117039061560a565b92505080806117119061560a565b915050611650565b50829350505050919050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600060608060006117808661269f565b9150600f6000601054815260200190815260200160002093508360000160029054906101000a900460ff1660ff16905060018251826117bf9190615942565b6117c99190615942565b67ffffffffffffffff8111156117e2576117e1614cf9565b5b6040519080825280601f01601f1916602001820160405280156118145781602001600182028036833780820191505090505b50925060005b818110156118ce578460000160039054906101000a9004700100000000000000000000000000000000028160108110611856576118556155db565b5b1a7f01000000000000000000000000000000000000000000000000000000000000000284828151811061188c5761188b6155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806118c69061560a565b91505061181a565b50603a7f010000000000000000000000000000000000000000000000000000000000000002838281518110611906576119056155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806119409061560a565b91505060005b8251811015611a0c57828181518110611962576119616155db565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028482846119b99190615942565b815181106119ca576119c96155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611a049061560a565b915050611946565b5082945050505050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a8054611a4a90615547565b80601f0160208091040260200160405190810160405280929190818152602001828054611a7690615547565b8015611ac35780601f10611a9857610100808354040283529160200191611ac3565b820191906000526020600020905b815481529060010190602001808311611aa657829003601f168201915b505050505081565b6000600f6000838152602001908152602001600020905060008160000160009054906101000a900460ff1660ff1611611b0357600080fd5b816010819055508060000160009054906101000a900460ff1660ff1667ffffffffffffffff811115611b3857611b37614cf9565b5b6040519080825280601f01601f191660200182016040528015611b6a5781602001600182028036833780820191505090505b5060119081611b799190615804565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c611ba361252a565b604051611bb09190614ccd565b60405180910390a15050565b8015611cdd57600073ffffffffffffffffffffffffffffffffffffffff16600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c5a57600080fd5b81600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611df5565b600073ffffffffffffffffffffffffffffffffffffffff16600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611d7557600080fd5b6000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e529190614949565b60405180910390a35050565b606060006060600f6000601054815260200190815260200160002091508160000160019054906101000a900460ff1660ff168260000160009054906101000a900460ff1660ff168551611eb19190615942565b611ebb9190615942565b67ffffffffffffffff811115611ed457611ed3614cf9565b5b6040519080825280601f01601f191660200182016040528015611f065781602001600182028036833780820191505090505b50905060005b8260000160019054906101000a900460ff1660ff16811015611fdc578260000160139054906101000a90047801000000000000000000000000000000000000000000000000028160088110611f6457611f636155db565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002828281518110611f9a57611f996155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611fd49061560a565b915050611f0c565b8260000160009054906101000a900460ff167f010000000000000000000000000000000000000000000000000000000000000002828281518110612023576120226155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061205d9061560a565b91505060005b85518110156121295785818151811061207f5761207e6155db565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028382846120d69190615942565b815181106120e7576120e66155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806121219061560a565b915050612063565b50819350505050919050565b60008060008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806121de5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6121e757600080fd5b600160046000878152602001908152602001600020805490501461220a57600080fd5b600060046000878152602001908152602001600020600081548110612232576122316155db565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff161461226457600080fd5b600060010260056000878152602001908152602001600020541461228757600080fd5b8573ffffffffffffffffffffffffffffffffffffffff1692507fc0000000000000000000000000000000000000000000000000000000000000008317925082600102600560008781526020019081526020016000208190555084600190049150600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080600d60008481526020019081526020016000208190555081600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055506001600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123e69190615942565b925050819055506006856001900490806001815401808255809150506001900390600052602060002001600090919091909150558573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8846040516124779190614ae4565b60405180910390a384935050505092915050565b600f6020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900460ff16908060000160029054906101000a900460ff16908060000160039054906101000a900470010000000000000000000000000000000002908060000160139054906101000a9004780100000000000000000000000000000000000000000000000002905085565b60606125bf6011805461253c90615547565b80601f016020809104026020016040519081016040528092919081815260200182805461256890615547565b80156125b55780601f1061258a576101008083540402835291602001916125b5565b820191906000526020600020905b81548152906001019060200180831161259857829003601f168201915b5050505050611e5e565b905090565b6125cf848484613e2b565b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f75c9e114f073c346aac7d1d7e9a3c3c14edabcdd27de07d1d9e425f45d318c5e846126849061599b565b6040516126919190614bf0565b60405180910390a450505050565b606080600080600285516126b39190615a02565b67ffffffffffffffff8111156126cc576126cb614cf9565b5b6040519080825280601f01601f1916602001820160405280156126fe5781602001600182028036833780820191505090505b5092506000905060005b6020811015612a4c57600460f0878381518110612728576127276155db565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff161015612827576030836127be9190615a44565b7f0100000000000000000000000000000000000000000000000000000000000000028483815181106127f3576127f26155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612899565b6057836128349190615a44565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110612869576128686155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f8682815181106128ae576128ad6155db565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff1610156129ac576030836129379190615a44565b7f010000000000000000000000000000000000000000000000000000000000000002846001846129679190615942565b81518110612978576129776155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612a2a565b6057836129b99190615a44565b7f010000000000000000000000000000000000000000000000000000000000000002846001846129e99190615942565b815181106129fa576129f96155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600282612a379190615942565b91508080612a449061560a565b915050612708565b50829350505050919050565b6000600460008581526020019081526020016000208361ffff1681548110612a8357612a826155db565b5b90600052602060002001905080600001600c9054906101000a900460ff1615612ae1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad890615ac5565b60405180910390fd5b80600001600d9054906101000a900460ff1615612b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2a90615b31565b60405180910390fd5b60008265ffffffffffff1603612b5d578060000160069054906101000a900465ffffffffffff1691505b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168265ffffffffffff161015612bc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bbd90615b9d565b60405180910390fd5b818160000160006101000a81548165ffffffffffff021916908365ffffffffffff160217905550600181600001600d6101000a81548160ff02191690831515021790555050505050565b6060600060608360010291506000600460008481526020019081526020016000208054905003612c4657612c4382613d7f565b91505b6000600460008481526020019081526020016000208054905011612c6957600080fd5b602067ffffffffffffffff811115612c8457612c83614cf9565b5b6040519080825280601f01601f191660200182016040528015612cb65781602001600182028036833780820191505090505b50905060005b6020811015612d5057828160208110612cd857612cd76155db565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002828281518110612d0e57612d0d6155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080612d489061560a565b915050612cbc565b50612d5a8161150c565b92505050919050565b6060819050601081511115612dad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612da490615c09565b60405180910390fd5b612db56147f3565b6000600790505b60008160ff1610612e11576000600882612dd69190615c29565b60ff1660ff9060020a029050600086821667ffffffffffffffff161115612dfd5750612e11565b8180612e0890615c66565b92505050612dbc565b600181612e1e9190615a44565b826020019060ff16908160ff16815250506008816007612e3e9190615c8f565b612e489190615c29565b60ff168567ffffffffffffffff169060020a02780100000000000000000000000000000000000000000000000002826080019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250508251826040019060ff16908160ff168152505082612ed490615cd9565b82606001906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff19168152505085826000019060ff16908160ff168152505081600f60008767ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060808201518160000160136101000a81548167ffffffffffffffff0219169083780100000000000000000000000000000000000000000000000090040217905550905050505050505050565b600080600460008581526020019081526020016000208361ffff1681548110613051576130506155db565b5b90600052602060002001905080600001600c9054906101000a900460ff16156130af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a690615ac5565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806131525750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b613191576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161318890615922565b60405180910390fd5b60008361ffff161480156131c3575060008160000160009054906101000a900465ffffffffffff1665ffffffffffff16145b80156131dd575080600001600d9054906101000a900460ff165b1561323c5760018160000160068282829054906101000a900465ffffffffffff166132089190615d40565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055506132348585612135565b9150506132c3565b80600001600d9054906101000a900460ff161561329c578060000160009054906101000a900465ffffffffffff1665ffffffffffff168160000160069054906101000a900465ffffffffffff1665ffffffffffff161061329b57600080fd5b5b6132bf8585858460000160069054906101000a900465ffffffffffff1685614346565b9150505b9392505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613358576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161334f90615922565b60405180910390fd5b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b606080600080600285516133c69190615a02565b67ffffffffffffffff8111156133df576133de614cf9565b5b6040519080825280601f01601f1916602001820160405280156134115781602001600182028036833780820191505090505b5092506000905060005b602081101561375f57600460f087838151811061343b5761343a6155db565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff16101561353a576030836134d19190615a44565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110613506576135056155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506135ac565b6057836135479190615a44565b7f01000000000000000000000000000000000000000000000000000000000000000284838151811061357c5761357b6155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f8682815181106135c1576135c06155db565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff1610156136bf5760308361364a9190615a44565b7f0100000000000000000000000000000000000000000000000000000000000000028460018461367a9190615942565b8151811061368b5761368a6155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061373d565b6057836136cc9190615a44565b7f010000000000000000000000000000000000000000000000000000000000000002846001846136fc9190615942565b8151811061370d5761370c6155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b60028261374a9190615942565b915080806137579061560a565b91505061341b565b50829350505050919050565b60008173ffffffffffffffffffffffffffffffffffffffff16600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600080600460008681526020019081526020016000208461ffff168154811061382f5761382e6155db565b5b90600052602060002001905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806138de5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61391d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161391490615922565b60405180910390fd5b60008160000160009054906101000a900465ffffffffffff1665ffffffffffff161161394857600080fd5b80600001600d9054906101000a900460ff1661396357600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168365ffffffffffff161061399557600080fd5b6139a28686868685614346565b915050949350505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613a0857600080fd5b816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480613af75750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b613b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b2d90615922565b60405180910390fd5b613b3e614859565b600460008681526020019081526020016000208054905091506000821115613bbb57600060046000878152602001908152602001600020600081548110613b8857613b876155db565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff1611613bba57600080fd5b5b60008460050b03613bdc576001816060019015159081151581525050613c17565b60008460050b1315613c165783816000019065ffffffffffff16908165ffffffffffff168152505060018160600190151590811515815250505b5b60046000868152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001600c6101000a81548160ff021916908315150217905550606082015181600001600d6101000a81548160ff0219169083151502179055505050600385908060018154018082558091505060019003906000526020600020016000909190919091505580606001511515816000015165ffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f77d96978d8b40ac826d1984d992e71a84672e62d825fda78cd646656481d065b88604051613d6b9190614bf0565b60405180910390a460019250505092915050565b60008060056000848152602001908152602001600020549050613da1816146fe565b613daa57600080fd5b613db381614730565b15613dc15782915050613e26565b7effffffffffffffff00000000000000000000000000000000000000000000006001028116905060b881908060020a820491505090507fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000600102831681179050809150505b919050565b60008060003073ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401613e859190614ae4565b602060405180830381865afa158015613ea2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ec69190615d8f565b92508573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613f0057600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614614034573373ffffffffffffffffffffffffffffffffffffffff166007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061402a57503373ffffffffffffffffffffffffffffffffffffffff16600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61403357600080fd5b5b60006007600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506140918486614762565b600d60008581526020019081526020016000205491506001600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546140f391906155a7565b9050818111156141a357600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082815260200190815260200160002054600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020819055505b6000600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055506001600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546142e091906155a7565b925050819055506001600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546143379190615942565b92505081905550505050505050565b60008060008060007fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008960019004169350603067ffffffffffffffff8961ffff161667ffffffffffffffff169060020a0267ffffffffffffffff16841793508665ffffffffffff168417935083600102915060006001026005600084815260200190815260200160002054146143db57600080fd5b85600001600c9054906101000a900460ff1661443d578560000160069054906101000a900465ffffffffffff1665ffffffffffff168765ffffffffffff161461443c57600186600001600c6101000a81548160ff0219169083151502179055505b5b67ffffffffffffffff896001900416925060b8839060020a0292507f8000000000000000000000000000000000000000000000000000000000000000831792508973ffffffffffffffffffffffffffffffffffffffff168317925060018660000160068282829054906101000a900465ffffffffffff166144be9190615d40565b92506101000a81548165ffffffffffff021916908365ffffffffffff16021790555085600001600d9054906101000a900460ff1661453f5760018660000160008282829054906101000a900465ffffffffffff1661451c9190615d40565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055505b826001026005600084815260200190815260200160002081905550600e60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080600d60008681526020019081526020016000208190555083600c60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055506001600e60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546146599190615942565b9250508190555060068490806001815401808255809150506001900390600052602060002001600090919091909150558973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8866040516146e69190614ae4565b60405180910390a38194505050505095945050505050565b6000807f8000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000807f4000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b60008083600102905060056000828152602001908152602001600020546001900491506000820361479257600080fd5b7fffffffffffffffffffffffff0000000000000000000000000000000000000000821691508273ffffffffffffffffffffffffffffffffffffffff168217915081600102600560008381526020019081526020016000208190555050505050565b6040518060a00160405280600060ff168152602001600060ff168152602001600060ff16815260200160006fffffffffffffffffffffffffffffffff19168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff191681525090565b6040518060800160405280600065ffffffffffff168152602001600065ffffffffffff1681526020016000151581526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6148de816148a9565b81146148e957600080fd5b50565b6000813590506148fb816148d5565b92915050565b6000602082840312156149175761491661489f565b5b6000614925848285016148ec565b91505092915050565b60008115159050919050565b6149438161492e565b82525050565b600060208201905061495e600083018461493a565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561499e578082015181840152602081019050614983565b60008484015250505050565b6000601f19601f8301169050919050565b60006149c682614964565b6149d0818561496f565b93506149e0818560208601614980565b6149e9816149aa565b840191505092915050565b60006020820190508181036000830152614a0e81846149bb565b905092915050565b6000819050919050565b614a2981614a16565b8114614a3457600080fd5b50565b600081359050614a4681614a20565b92915050565b600060208284031215614a6257614a6161489f565b5b6000614a7084828501614a37565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614aa482614a79565b9050919050565b614ab481614a99565b82525050565b6000602082019050614acf6000830184614aab565b92915050565b614ade81614a16565b82525050565b6000602082019050614af96000830184614ad5565b92915050565b614b0881614a99565b8114614b1357600080fd5b50565b600081359050614b2581614aff565b92915050565b600080600060608486031215614b4457614b4361489f565b5b6000614b5286828701614b16565b9350506020614b6386828701614b16565b9250506040614b7486828701614a37565b9150509250925092565b6000819050919050565b614b9181614b7e565b8114614b9c57600080fd5b50565b600081359050614bae81614b88565b92915050565b600060208284031215614bca57614bc961489f565b5b6000614bd884828501614b9f565b91505092915050565b614bea81614b7e565b82525050565b6000602082019050614c056000830184614be1565b92915050565b600060208284031215614c2157614c2061489f565b5b6000614c2f84828501614b16565b91505092915050565b60008060408385031215614c4f57614c4e61489f565b5b6000614c5d85828601614b16565b9250506020614c6e85828601614a37565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000614c9f82614c78565b614ca98185614c83565b9350614cb9818560208601614980565b614cc2816149aa565b840191505092915050565b60006020820190508181036000830152614ce78184614c94565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614d31826149aa565b810181811067ffffffffffffffff82111715614d5057614d4f614cf9565b5b80604052505050565b6000614d63614895565b9050614d6f8282614d28565b919050565b600067ffffffffffffffff821115614d8f57614d8e614cf9565b5b614d98826149aa565b9050602081019050919050565b82818337600083830152505050565b6000614dc7614dc284614d74565b614d59565b905082815260208101848484011115614de357614de2614cf4565b5b614dee848285614da5565b509392505050565b600082601f830112614e0b57614e0a614cef565b5b8135614e1b848260208601614db4565b91505092915050565b600060208284031215614e3a57614e3961489f565b5b600082013567ffffffffffffffff811115614e5857614e576148a4565b5b614e6484828501614df6565b91505092915050565b600067ffffffffffffffff821115614e8857614e87614cf9565b5b614e91826149aa565b9050602081019050919050565b6000614eb1614eac84614e6d565b614d59565b905082815260208101848484011115614ecd57614ecc614cf4565b5b614ed8848285614da5565b509392505050565b600082601f830112614ef557614ef4614cef565b5b8135614f05848260208601614e9e565b91505092915050565b600060208284031215614f2457614f2361489f565b5b600082013567ffffffffffffffff811115614f4257614f416148a4565b5b614f4e84828501614ee0565b91505092915050565b60008060408385031215614f6e57614f6d61489f565b5b6000614f7c85828601614b9f565b9250506020614f8d85828601614a37565b9150509250929050565b600065ffffffffffff82169050919050565b614fb281614f97565b82525050565b6000608082019050614fcd6000830187614fa9565b614fda6020830186614fa9565b614fe7604083018561493a565b614ff4606083018461493a565b95945050505050565b6150068161492e565b811461501157600080fd5b50565b60008135905061502381614ffd565b92915050565b600080604083850312156150405761503f61489f565b5b600061504e85828601614b16565b925050602061505f85828601615014565b9150509250929050565b600080604083850312156150805761507f61489f565b5b600061508e85828601614b16565b925050602061509f85828601614b9f565b9150509250929050565b600060ff82169050919050565b6150bf816150a9565b82525050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b6150fa816150c5565b82525050565b60007fffffffffffffffff00000000000000000000000000000000000000000000000082169050919050565b61513581615100565b82525050565b600060a08201905061515060008301886150b6565b61515d60208301876150b6565b61516a60408301866150b6565b61517760608301856150f1565b615184608083018461512c565b9695505050505050565b600080600080608085870312156151a8576151a761489f565b5b60006151b687828801614b16565b94505060206151c787828801614b16565b93505060406151d887828801614a37565b925050606085013567ffffffffffffffff8111156151f9576151f86148a4565b5b61520587828801614ee0565b91505092959194509250565b600061ffff82169050919050565b61522881615211565b811461523357600080fd5b50565b6000813590506152458161521f565b92915050565b61525481614f97565b811461525f57600080fd5b50565b6000813590506152718161524b565b92915050565b6000806000606084860312156152905761528f61489f565b5b600061529e86828701614b9f565b93505060206152af86828701615236565b92505060406152c086828701615262565b9150509250925092565b6152d3816150a9565b81146152de57600080fd5b50565b6000813590506152f0816152ca565b92915050565b600067ffffffffffffffff82169050919050565b615313816152f6565b811461531e57600080fd5b50565b6000813590506153308161530a565b92915050565b60008060006060848603121561534f5761534e61489f565b5b600061535d868287016152e1565b935050602061536e86828701615321565b925050604084013567ffffffffffffffff81111561538f5761538e6148a4565b5b61539b86828701614df6565b9150509250925092565b6000806000606084860312156153be576153bd61489f565b5b60006153cc86828701614b16565b93505060206153dd86828701614b9f565b92505060406153ee86828701615236565b9150509250925092565b6000806040838503121561540f5761540e61489f565b5b600061541d85828601614b16565b925050602061542e85828601614b16565b9150509250929050565b600080600080608085870312156154525761545161489f565b5b600061546087828801614b16565b945050602061547187828801614b9f565b935050604061548287828801615236565b925050606061549387828801615262565b91505092959194509250565b60008160050b9050919050565b6154b58161549f565b81146154c057600080fd5b50565b6000813590506154d2816154ac565b92915050565b600080604083850312156154ef576154ee61489f565b5b60006154fd85828601614b9f565b925050602061550e858286016154c3565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061555f57607f821691505b60208210810361557257615571615518565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006155b282614a16565b91506155bd83614a16565b92508282039050818111156155d5576155d4615578565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061561582614a16565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361564757615646615578565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b6000600883026156b77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82615677565b6156c18683615677565b95508019841693508086168417925050509392505050565b6000819050919050565b60006156fe6156f96156f484614a16565b6156d9565b614a16565b9050919050565b6000819050919050565b615718836156e3565b61572c61572482615705565b848454615687565b825550505050565b600090565b615741615734565b61574c81848461570f565b505050565b5b8181101561577057615765600082615739565b600181019050615752565b5050565b601f8211156157b55761578681615652565b61578f84615667565b8101602085101561579e578190505b6157b26157aa85615667565b830182615751565b50505b505050565b60008160020a8304905092915050565b60006157db600019846008026157ba565b1980831691505092915050565b60006157f483836157ca565b9150826002028217905092915050565b61580d82614c78565b67ffffffffffffffff81111561582657615825614cf9565b5b6158308254615547565b61583b828285615774565b600060209050601f83116001811461586e576000841561585c578287015190505b61586685826157e8565b8655506158ce565b601f19841661587c86615652565b60005b828110156158a45784890151825560018201915060208501945060208101905061587f565b868310156158c157848901516158bd601f8916826157ca565b8355505b6001600288020188555050505b505050505050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b600061590c600a8361496f565b9150615917826158d6565b602082019050919050565b6000602082019050818103600083015261593b816158ff565b9050919050565b600061594d82614a16565b915061595883614a16565b92508282019050808211156159705761596f615578565b5b92915050565b6000819050602082019050919050565b60006159928251614b7e565b80915050919050565b60006159a682614c78565b826159b084615976565b90506159bb81615986565b925060208210156159fb576159f67fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802615677565b831692505b5050919050565b6000615a0d82614a16565b9150615a1883614a16565b9250828202615a2681614a16565b91508282048414831517615a3d57615a3c615578565b5b5092915050565b6000615a4f826150a9565b9150615a5a836150a9565b9250828201905060ff811115615a7357615a72615578565b5b92915050565b7f4552525f53504152534500000000000000000000000000000000000000000000600082015250565b6000615aaf600a8361496f565b9150615aba82615a79565b602082019050919050565b60006020820190508181036000830152615ade81615aa2565b9050919050565b7f4552525f43415050454400000000000000000000000000000000000000000000600082015250565b6000615b1b600a8361496f565b9150615b2682615ae5565b602082019050919050565b60006020820190508181036000830152615b4a81615b0e565b9050919050565b7f4552525f4341505f4c4f57000000000000000000000000000000000000000000600082015250565b6000615b87600b8361496f565b9150615b9282615b51565b602082019050919050565b60006020820190508181036000830152615bb681615b7a565b9050919050565b7f4552525f5052454649585f544f4f5f4c4f4e4700000000000000000000000000600082015250565b6000615bf360138361496f565b9150615bfe82615bbd565b602082019050919050565b60006020820190508181036000830152615c2281615be6565b9050919050565b6000615c34826150a9565b9150615c3f836150a9565b9250828202615c4d816150a9565b9150808214615c5f57615c5e615578565b5b5092915050565b6000615c71826150a9565b915060008203615c8457615c83615578565b5b600182039050919050565b6000615c9a826150a9565b9150615ca5836150a9565b9250828203905060ff811115615cbe57615cbd615578565b5b92915050565b6000615cd082516150c5565b80915050919050565b6000615ce482614c78565b82615cee84615976565b9050615cf981615cc4565b92506010821015615d3957615d347fffffffffffffffffffffffffffffffff0000000000000000000000000000000083601003600802615677565b831692505b5050919050565b6000615d4b82614f97565b9150615d5683614f97565b9250828201905065ffffffffffff811115615d7457615d73615578565b5b92915050565b600081519050615d8981614aff565b92915050565b600060208284031215615da557615da461489f565b5b6000615db384828501615d7a565b9150509291505056fea2646970667358221220e3ecd63913c2c2b0049a2a85bd8a6c9217553ce71f3579d5e3a4e2f26b14dcf364736f6c63430008120033
-\ No newline at end of file
+60806040523480156200001157600080fd5b50604051620072af380380620072af833981810160405281019062000037919062000afe565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550816009908162000088919062000dd4565b5080600a90816200009a919062000dd4565b50620000ee602060126040518060400160405280600681526020017f736861323536000000000000000000000000000000000000000000000000000081525062000174640100000000026401000000009004565b6200010960126200044b640100000000026401000000009004565b602067ffffffffffffffff8111156200012757620001266200099a565b5b6040519080825280601f01601f1916602001820160405280156200015a5781602001600182028036833780820191505090505b50601190816200016b919062000f2b565b505050620013ad565b6060819050601081511115620001c1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001b89062001073565b60405180910390fd5b620001cb62000905565b6000600790505b60008160ff16106200022f576000600882620001ef9190620010d1565b60ff1660ff9060020a029050600086821667ffffffffffffffff1611156200021857506200022f565b8180620002259062001117565b92505050620001d2565b6001816200023e919062001145565b826020019060ff16908160ff1681525050600881600762000260919062001181565b6200026c9190620010d1565b60ff168567ffffffffffffffff169060020a02780100000000000000000000000000000000000000000000000002826080019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250508251826040019060ff16908160ff168152505082620002fa9062001210565b82606001906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff19168152505085826000019060ff16908160ff168152505081600f60008767ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060808201518160000160136101000a81548167ffffffffffffffff0219169083780100000000000000000000000000000000000000000000000090040217905550905050505050505050565b6000600f6000838152602001908152602001600020905060008160000160009054906101000a900460ff1660ff16116200048457600080fd5b816010819055508060000160009054906101000a900460ff1660ff1667ffffffffffffffff811115620004bc57620004bb6200099a565b5b6040519080825280601f01601f191660200182016040528015620004ef5781602001600182028036833780820191505090505b506011908162000500919062000f2b565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c6200053b62000556640100000000026401000000009004565b6040516200054a9190620012d2565b60405180910390a15050565b606062000607601054601180546200056e9062000bbd565b80601f01602080910402602001604051908101604052809291908181526020018280546200059c9062000bbd565b8015620005ed5780601f10620005c157610100808354040283529160200191620005ed565b820191906000526020600020905b815481529060010190602001808311620005cf57829003601f168201915b50505050506200060c640100000000026401000000009004565b905090565b606060006060600f600086815260200190815260200160002091508160000160019054906101000a900460ff1660ff168260000160009054906101000a900460ff1660ff1685516200065f9190620012f6565b6200066b9190620012f6565b67ffffffffffffffff8111156200068757620006866200099a565b5b6040519080825280601f01601f191660200182016040528015620006ba5781602001600182028036833780820191505090505b50905060005b8260000160019054906101000a900460ff1660ff168110156200079a578260000160139054906101000a900478010000000000000000000000000000000000000000000000000281600881106200071c576200071b62001331565b5b1a7f01000000000000000000000000000000000000000000000000000000000000000282828151811062000755576200075462001331565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080620007919062001360565b915050620006c0565b8260000160009054906101000a900460ff167f010000000000000000000000000000000000000000000000000000000000000002828281518110620007e457620007e362001331565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080620008209062001360565b91505060005b8551811015620008f85785818151811062000846576200084562001331565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028382846200089f9190620012f6565b81518110620008b357620008b262001331565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080620008ef9062001360565b91505062000826565b5081935050505092915050565b6040518060a00160405280600060ff168152602001600060ff168152602001600060ff16815260200160006fffffffffffffffffffffffffffffffff19168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff191681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620009d48262000989565b810181811067ffffffffffffffff82111715620009f657620009f56200099a565b5b80604052505050565b600062000a0b6200096b565b905062000a198282620009c9565b919050565b600067ffffffffffffffff82111562000a3c5762000a3b6200099a565b5b62000a478262000989565b9050602081019050919050565b60005b8381101562000a7457808201518184015260208101905062000a57565b60008484015250505050565b600062000a9762000a918462000a1e565b620009ff565b90508281526020810184848401111562000ab65762000ab562000984565b5b62000ac384828562000a54565b509392505050565b600082601f83011262000ae35762000ae26200097f565b5b815162000af584826020860162000a80565b91505092915050565b6000806040838503121562000b185762000b1762000975565b5b600083015167ffffffffffffffff81111562000b395762000b386200097a565b5b62000b478582860162000acb565b925050602083015167ffffffffffffffff81111562000b6b5762000b6a6200097a565b5b62000b798582860162000acb565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000bd657607f821691505b60208210810362000bec5762000beb62000b8e565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000c597fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000c17565b62000c65868362000c17565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000cb262000cac62000ca68462000c7d565b62000c87565b62000c7d565b9050919050565b6000819050919050565b62000cce8362000c91565b62000ce662000cdd8262000cb9565b84845462000c27565b825550505050565b600090565b62000cfd62000cee565b62000d0a81848462000cc3565b505050565b5b8181101562000d325762000d2660008262000cf3565b60018101905062000d10565b5050565b601f82111562000d815762000d4b8162000bf2565b62000d568462000c07565b8101602085101562000d66578190505b62000d7e62000d758562000c07565b83018262000d0f565b50505b505050565b60008160020a8304905092915050565b600062000da96000198460080262000d86565b1980831691505092915050565b600062000dc4838362000d96565b9150826002028217905092915050565b62000ddf8262000b83565b67ffffffffffffffff81111562000dfb5762000dfa6200099a565b5b62000e07825462000bbd565b62000e1482828562000d36565b600060209050601f83116001811462000e4c576000841562000e37578287015190505b62000e43858262000db6565b86555062000eb3565b601f19841662000e5c8662000bf2565b60005b8281101562000e865784890151825560018201915060208501945060208101905062000e5f565b8683101562000ea6578489015162000ea2601f89168262000d96565b8355505b6001600288020188555050505b505050505050565b600081519050919050565b60008190508160005260206000209050919050565b601f82111562000f265762000ef08162000ec6565b62000efb8462000c07565b8101602085101562000f0b578190505b62000f2362000f1a8562000c07565b83018262000d0f565b50505b505050565b62000f368262000ebb565b67ffffffffffffffff81111562000f525762000f516200099a565b5b62000f5e825462000bbd565b62000f6b82828562000edb565b600060209050601f83116001811462000fa3576000841562000f8e578287015190505b62000f9a858262000db6565b8655506200100a565b601f19841662000fb38662000ec6565b60005b8281101562000fdd5784890151825560018201915060208501945060208101905062000fb6565b8683101562000ffd578489015162000ff9601f89168262000d96565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4552525f5052454649585f544f4f5f4c4f4e4700000000000000000000000000600082015250565b60006200105b60138362001012565b9150620010688262001023565b602082019050919050565b600060208201905081810360008301526200108e816200104c565b9050919050565b600060ff82169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620010de8262001095565b9150620010eb8362001095565b9250828202620010fb8162001095565b915080821462001110576200110f620010a2565b5b5092915050565b6000620011248262001095565b9150600082036200113a5762001139620010a2565b5b600182039050919050565b6000620011528262001095565b91506200115f8362001095565b9250828201905060ff8111156200117b576200117a620010a2565b5b92915050565b60006200118e8262001095565b91506200119b8362001095565b9250828203905060ff811115620011b757620011b6620010a2565b5b92915050565b6000819050602082019050919050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b6000620012078251620011cd565b80915050919050565b60006200121d8262000ebb565b826200122984620011bd565b90506200123681620011f9565b925060108210156200127957620012747fffffffffffffffffffffffffffffffff000000000000000000000000000000008360100360080262000c17565b831692505b5050919050565b600082825260208201905092915050565b60006200129e8262000ebb565b620012aa818562001280565b9350620012bc81856020860162000a54565b620012c78162000989565b840191505092915050565b60006020820190508181036000830152620012ee818462001291565b905092915050565b6000620013038262000c7d565b9150620013108362000c7d565b92508282019050808211156200132b576200132a620010a2565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006200136d8262000c7d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620013a257620013a1620010a2565b5b600182019050919050565b615ef280620013bd6000396000f3fe60806040526004361061026e576000357c01000000000000000000000000000000000000000000000000000000009004806386e90b5911610156578063c6eba7c4116100d3578063e985e9c511610097578063e985e9c51461099f578063f117e173146109dc578063f2fde38b14610a19578063f70a3de814610a56578063f9613ab214610a93578063f9f356e514610ad05761026e565b8063c6eba7c414610896578063c87b56dd146108bf578063d824ee4f146108fc578063da2824a814610939578063e8a7f4c5146109625761026e565b8063a5d6f2091161011a578063a5d6f20914610794578063adf288df146107d5578063b5fdeb2314610812578063b88d4fde1461083d578063c5bec6fc146108595761026e565b806386e90b59146106af5780638da5cb5b146106ec57806395d89b41146107175780639a7c5e9f14610742578063a22cb4651461076b5761026e565b806340c84b0e116101ef5780635344299a116101b35780635344299a14610566578063559f5dc91461058f5780635ae06f7e146105cf5780636352211e146105f85780636b9cb86a1461063557806370a08231146106725761026e565b806340c84b0e1461047c57806342842e0e146104a757806349f2553a146104c35780634f64b2be146104ec5780634f6ccce7146105295761026e565b80631f8cf649116102365780631f8cf6491461038057806323b872dd146103a957806324e0febc146103c55780632b29ba23146104025780632f745c591461043f5761026e565b806301ffc9a71461027357806306fdde03146102b0578063081812fc146102db578063150b7a021461031857806318160ddd14610355575b600080fd5b34801561027f57600080fd5b5061029a6004803603810190610295919061497b565b610b0d565b6040516102a791906149c3565b60405180910390f35b3480156102bc57600080fd5b506102c5610c61565b6040516102d29190614a6e565b60405180910390f35b3480156102e757600080fd5b5061030260048036038101906102fd9190614ac6565b610cef565b60405161030f9190614b34565b60405180910390f35b34801561032457600080fd5b5061033f600480360381019061033a9190614cb0565b610d2c565b60405161034c9190614d42565b60405180910390f35b34801561036157600080fd5b5061036a610d5c565b6040516103779190614d6c565b60405180910390f35b34801561038c57600080fd5b506103a760048036038101906103a29190614ea1565b610d69565b005b6103c360048036038101906103be9190614f10565b61102b565b005b3480156103d157600080fd5b506103ec60048036038101906103e79190614f99565b611096565b6040516103f99190614fd5565b60405180910390f35b34801561040e57600080fd5b5061042960048036038101906104249190614ff0565b6110ae565b60405161043691906149c3565b60405180910390f35b34801561044b57600080fd5b506104666004803603810190610461919061501d565b61115a565b6040516104739190614d6c565b60405180910390f35b34801561048857600080fd5b5061049161117f565b60405161049e91906150b2565b60405180910390f35b6104c160048036038101906104bc9190614f10565b61120d565b005b3480156104cf57600080fd5b506104ea60048036038101906104e591906150d4565b611278565b005b3480156104f857600080fd5b50610513600480360381019061050e9190614ac6565b611590565b6040516105209190614fd5565b60405180910390f35b34801561053557600080fd5b50610550600480360381019061054b9190614ac6565b6115b4565b60405161055d9190614d6c565b60405180910390f35b34801561057257600080fd5b5061058d6004803603810190610588919061511d565b6115d8565b005b34801561059b57600080fd5b506105b660048036038101906105b19190615166565b611664565b6040516105c694939291906151c7565b60405180910390f35b3480156105db57600080fd5b506105f660048036038101906105f19190614ff0565b6116eb565b005b34801561060457600080fd5b5061061f600480360381019061061a9190614ac6565b61180a565b60405161062c9190614b34565b60405180910390f35b34801561064157600080fd5b5061065c6004803603810190610657919061511d565b611846565b6040516106699190614a6e565b60405180910390f35b34801561067e57600080fd5b5061069960048036038101906106949190614ff0565b611a5f565b6040516106a69190614d6c565b60405180910390f35b3480156106bb57600080fd5b506106d660048036038101906106d1919061511d565b611aa8565b6040516106e39190614a6e565b60405180910390f35b3480156106f857600080fd5b50610701611d53565b60405161070e9190614b34565b60405180910390f35b34801561072357600080fd5b5061072c611d77565b6040516107399190614a6e565b60405180910390f35b34801561074e57600080fd5b5061076960048036038101906107649190614ac6565b611e05565b005b34801561077757600080fd5b50610792600480360381019061078d9190615238565b611ef6565b005b3480156107a057600080fd5b506107bb60048036038101906107b69190614ac6565b612198565b6040516107cc9594939291906152fd565b60405180910390f35b3480156107e157600080fd5b506107fc60048036038101906107f79190615350565b612237565b6040516108099190614fd5565b60405180910390f35b34801561081e57600080fd5b5061082761258d565b60405161083491906150b2565b60405180910390f35b61085760048036038101906108529190614cb0565b61262a565b005b34801561086557600080fd5b50610880600480360381019061087b919061511d565b612705565b60405161088d91906150b2565b60405180910390f35b3480156108a257600080fd5b506108bd60048036038101906108b891906153f6565b612abe565b005b3480156108cb57600080fd5b506108e660048036038101906108e19190614ac6565b612c76565b6040516108f39190614a6e565b60405180910390f35b34801561090857600080fd5b50610923600480360381019061091e9190615449565b612dc9565b6040516109309190614fd5565b60405180910390f35b34801561094557600080fd5b50610960600480360381019061095b9190614ff0565b61306e565b005b34801561096e57600080fd5b506109896004803603810190610984919061511d565b613156565b60405161099691906150b2565b60405180910390f35b3480156109ab57600080fd5b506109c660048036038101906109c1919061549c565b61350f565b6040516109d391906149c3565b60405180910390f35b3480156109e857600080fd5b50610a0360048036038101906109fe91906154dc565b6135a7565b604051610a109190614fd5565b60405180910390f35b348015610a2557600080fd5b50610a406004803603810190610a3b9190614ff0565b613751565b604051610a4d91906149c3565b60405180910390f35b348015610a6257600080fd5b50610a7d6004803603810190610a78919061557c565b6137f5565b604051610a8a91906149c3565b60405180910390f35b348015610a9f57600080fd5b50610aba6004803603810190610ab59190614f99565b613b23565b604051610ac79190614fd5565b60405180910390f35b348015610adc57600080fd5b50610af76004803603810190610af291906155bc565b613bcf565b604051610b0491906150b2565b60405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b615760019050610c5c565b635b5e139f7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610bb35760019050610c5c565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c055760019050610c5c565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c575760019050610c5c565b600090505b919050565b60098054610c6e90615647565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9a90615647565b8015610ce75780601f10610cbc57610100808354040283529160200191610ce7565b820191906000526020600020905b815481529060010190602001808311610cca57829003601f168201915b505050505081565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600063150b7a027c0100000000000000000000000000000000000000000000000000000000029050949350505050565b6000600680549050905090565b6060819050601081511115610db3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610daa906156c4565b60405180910390fd5b610dbb61486d565b6000600790505b60008160ff1610610e17576000600882610ddc9190615713565b60ff1660ff9060020a029050600086821667ffffffffffffffff161115610e035750610e17565b8180610e0e90615750565b92505050610dc2565b600181610e249190615779565b826020019060ff16908160ff16815250506008816007610e4491906157ae565b610e4e9190615713565b60ff168567ffffffffffffffff169060020a02780100000000000000000000000000000000000000000000000002826080019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250508251826040019060ff16908160ff168152505082610eda90615818565b82606001906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff19168152505085826000019060ff16908160ff168152505081600f60008767ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060808201518160000160136101000a81548167ffffffffffffffff0219169083780100000000000000000000000000000000000000000000000090040217905550905050505050505050565b611036838383613ea5565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60056020528060005260406000206000915090505481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611153575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b600c602052816000526040600020602052806000526040600020600091509150505481565b600b805461118c90615647565b80601f01602080910402602001604051908101604052809291908181526020018280546111b890615647565b80156112055780601f106111da57610100808354040283529160200191611205565b820191906000526020600020905b8154815290600101906020018083116111e857829003601f168201915b505050505081565b611218838383613ea5565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112d557600080fd5b82915081519050602f7f0100000000000000000000000000000000000000000000000000000000000000028260018361130e919061587f565b8151811061131f5761131e6158b3565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461139f57808061139b906158e2565b9150505b8067ffffffffffffffff8111156113b9576113b8614b85565b5b6040519080825280601f01601f1916602001820160405280156113eb5781602001600182028036833780820191505090505b50600b90816113fa9190615acc565b5060005b82518110156114eb5782818151811061141a576114196158b3565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002600b82815461147290615647565b8110611481576114806158b3565b5b8154600116156114a05790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f01000000000000000000000000000000000000000000000000000000000000008404021790555080806114e3906158e2565b9150506113fe565b508151811461158b577f2f00000000000000000000000000000000000000000000000000000000000000600b8351815461152490615647565b8110611533576115326158b3565b5b8154600116156115525790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055505b505050565b600381815481106115a057600080fd5b906000526020600020016000915090505481565b600681815481106115c457600080fd5b906000526020600020016000915090505481565b6000600f6000601054815260200190815260200160002090508060000160009054906101000a900460ff1660ff1682511461161257600080fd5b81601190816116219190615acc565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c61164b61258d565b60405161165891906150b2565b60405180910390a15050565b6004602052816000526040600020818154811061168057600080fd5b90600052602060002001600091509150508060000160009054906101000a900465ffffffffffff16908060000160069054906101000a900465ffffffffffff169080600001600c9054906101000a900460ff169080600001600d9054906101000a900460ff16905084565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611770575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6117af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a690615bea565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080600560008460010281526020019081526020016000205490506060819060020a026c010000000000000000000000009004915050919050565b6060806060600061185685613156565b9150600b805461186590615647565b905090508082516118769190615c0a565b67ffffffffffffffff81111561188f5761188e614b85565b5b6040519080825280601f01601f1916602001820160405280156118c15781602001600182028036833780820191505090505b50925060005b8181101561198657600b8181546118dd90615647565b81106118ec576118eb6158b3565b5b81546001161561190b5790600052602060002090602091828204019190065b9054901a7f010000000000000000000000000000000000000000000000000000000000000002848281518110611944576119436158b3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061197e906158e2565b9150506118c7565b5060005b8251811015611a53578281815181106119a6576119a56158b3565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002848381518110611a0357611a026158b3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508180611a3d906158e2565b9250508080611a4b906158e2565b91505061198a565b50829350505050919050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b606060006060806000611aba86612705565b9150600f6000601054815260200190815260200160002093508360000160029054906101000a900460ff1660ff1690506001825182611af99190615c0a565b611b039190615c0a565b67ffffffffffffffff811115611b1c57611b1b614b85565b5b6040519080825280601f01601f191660200182016040528015611b4e5781602001600182028036833780820191505090505b50925060005b81811015611c08578460000160039054906101000a9004700100000000000000000000000000000000028160108110611b9057611b8f6158b3565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002848281518110611bc657611bc56158b3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611c00906158e2565b915050611b54565b50603a7f010000000000000000000000000000000000000000000000000000000000000002838281518110611c4057611c3f6158b3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611c7a906158e2565b91505060005b8251811015611d4657828181518110611c9c57611c9b6158b3565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002848284611cf39190615c0a565b81518110611d0457611d036158b3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611d3e906158e2565b915050611c80565b5082945050505050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a8054611d8490615647565b80601f0160208091040260200160405190810160405280929190818152602001828054611db090615647565b8015611dfd5780601f10611dd257610100808354040283529160200191611dfd565b820191906000526020600020905b815481529060010190602001808311611de057829003601f168201915b505050505081565b6000600f6000838152602001908152602001600020905060008160000160009054906101000a900460ff1660ff1611611e3d57600080fd5b816010819055508060000160009054906101000a900460ff1660ff1667ffffffffffffffff811115611e7257611e71614b85565b5b6040519080825280601f01601f191660200182016040528015611ea45781602001600182028036833780820191505090505b5060119081611eb39190615acc565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c611edd61258d565b604051611eea91906150b2565b60405180910390a15050565b801561201757600073ffffffffffffffffffffffffffffffffffffffff16600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f9457600080fd5b81600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061212f565b600073ffffffffffffffffffffffffffffffffffffffff16600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036120af57600080fd5b6000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161218c91906149c3565b60405180910390a35050565b600f6020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900460ff16908060000160029054906101000a900460ff16908060000160039054906101000a900470010000000000000000000000000000000002908060000160139054906101000a9004780100000000000000000000000000000000000000000000000002905085565b60008060008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806122e05750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6122e957600080fd5b600160046000878152602001908152602001600020805490501461230c57600080fd5b600060046000878152602001908152602001600020600081548110612334576123336158b3565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff161461236657600080fd5b600060010260056000878152602001908152602001600020541461238957600080fd5b8573ffffffffffffffffffffffffffffffffffffffff1692507fc0000000000000000000000000000000000000000000000000000000000000008317925082600102600560008781526020019081526020016000208190555084600190049150600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080600d60008481526020019081526020016000208190555081600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055506001600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124e89190615c0a565b925050819055506006856001900490806001815401808255809150506001900390600052602060002001600090919091909150558573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8846040516125799190614d6c565b60405180910390a384935050505092915050565b6060612625601054601180546125a290615647565b80601f01602080910402602001604051908101604052809291908181526020018280546125ce90615647565b801561261b5780601f106125f05761010080835404028352916020019161261b565b820191906000526020600020905b8154815290600101906020018083116125fe57829003601f168201915b5050505050613bcf565b905090565b612635848484613ea5565b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f75c9e114f073c346aac7d1d7e9a3c3c14edabcdd27de07d1d9e425f45d318c5e846126ea90615c53565b6040516126f79190614fd5565b60405180910390a450505050565b606080600080600285516127199190615cba565b67ffffffffffffffff81111561273257612731614b85565b5b6040519080825280601f01601f1916602001820160405280156127645781602001600182028036833780820191505090505b5092506000905060005b6020811015612ab257600460f087838151811061278e5761278d6158b3565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff16101561288d576030836128249190615779565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110612859576128586158b3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506128ff565b60578361289a9190615779565b7f0100000000000000000000000000000000000000000000000000000000000000028483815181106128cf576128ce6158b3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f868281518110612914576129136158b3565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff161015612a125760308361299d9190615779565b7f010000000000000000000000000000000000000000000000000000000000000002846001846129cd9190615c0a565b815181106129de576129dd6158b3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612a90565b605783612a1f9190615779565b7f01000000000000000000000000000000000000000000000000000000000000000284600184612a4f9190615c0a565b81518110612a6057612a5f6158b3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600282612a9d9190615c0a565b91508080612aaa906158e2565b91505061276e565b50829350505050919050565b6000600460008581526020019081526020016000208361ffff1681548110612ae957612ae86158b3565b5b90600052602060002001905080600001600c9054906101000a900460ff1615612b47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3e90615d48565b60405180910390fd5b80600001600d9054906101000a900460ff1615612b99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9090615db4565b60405180910390fd5b60008265ffffffffffff1603612bc3578060000160069054906101000a900465ffffffffffff1691505b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168265ffffffffffff161015612c2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2390615e20565b60405180910390fd5b818160000160006101000a81548165ffffffffffff021916908365ffffffffffff160217905550600181600001600d6101000a81548160ff02191690831515021790555050505050565b6060600060608360010291506000600460008481526020019081526020016000208054905003612cac57612ca982613b23565b91505b6000600460008481526020019081526020016000208054905011612ccf57600080fd5b602067ffffffffffffffff811115612cea57612ce9614b85565b5b6040519080825280601f01601f191660200182016040528015612d1c5781602001600182028036833780820191505090505b50905060005b6020811015612db657828160208110612d3e57612d3d6158b3565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002828281518110612d7457612d736158b3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080612dae906158e2565b915050612d22565b50612dc081611846565b92505050919050565b600080600460008581526020019081526020016000208361ffff1681548110612df557612df46158b3565b5b90600052602060002001905080600001600c9054906101000a900460ff1615612e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4a90615d48565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612ef65750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612f35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2c90615bea565b60405180910390fd5b60008361ffff16148015612f67575060008160000160009054906101000a900465ffffffffffff1665ffffffffffff16145b8015612f81575080600001600d9054906101000a900460ff165b15612fe05760018160000160068282829054906101000a900465ffffffffffff16612fac9190615e40565b92506101000a81548165ffffffffffff021916908365ffffffffffff160217905550612fd88585612237565b915050613067565b80600001600d9054906101000a900460ff1615613040578060000160009054906101000a900465ffffffffffff1665ffffffffffff168160000160069054906101000a900465ffffffffffff1665ffffffffffff161061303f57600080fd5b5b6130638585858460000160069054906101000a900465ffffffffffff16856143c0565b9150505b9392505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146130fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f390615bea565b60405180910390fd5b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6060806000806002855161316a9190615cba565b67ffffffffffffffff81111561318357613182614b85565b5b6040519080825280601f01601f1916602001820160405280156131b55781602001600182028036833780820191505090505b5092506000905060005b602081101561350357600460f08783815181106131df576131de6158b3565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff1610156132de576030836132759190615779565b7f0100000000000000000000000000000000000000000000000000000000000000028483815181106132aa576132a96158b3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613350565b6057836132eb9190615779565b7f0100000000000000000000000000000000000000000000000000000000000000028483815181106133205761331f6158b3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f868281518110613365576133646158b3565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff161015613463576030836133ee9190615779565b7f0100000000000000000000000000000000000000000000000000000000000000028460018461341e9190615c0a565b8151811061342f5761342e6158b3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506134e1565b6057836134709190615779565b7f010000000000000000000000000000000000000000000000000000000000000002846001846134a09190615c0a565b815181106134b1576134b06158b3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b6002826134ee9190615c0a565b915080806134fb906158e2565b9150506131bf565b50829350505050919050565b60008173ffffffffffffffffffffffffffffffffffffffff16600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600080600460008681526020019081526020016000208461ffff16815481106135d3576135d26158b3565b5b90600052602060002001905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806136825750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6136c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136b890615bea565b60405180910390fd5b60008160000160009054906101000a900465ffffffffffff1665ffffffffffff16116136ec57600080fd5b80600001600d9054906101000a900460ff1661370757600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168365ffffffffffff161061373957600080fd5b61374686868686856143c0565b915050949350505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146137ac57600080fd5b816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061389b5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6138da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138d190615bea565b60405180910390fd5b6138e26148d3565b60046000868152602001908152602001600020805490509150600082111561395f5760006004600087815260200190815260200160002060008154811061392c5761392b6158b3565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff161161395e57600080fd5b5b60008460050b036139805760018160600190151590811515815250506139bb565b60008460050b13156139ba5783816000019065ffffffffffff16908165ffffffffffff168152505060018160600190151590811515815250505b5b60046000868152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001600c6101000a81548160ff021916908315150217905550606082015181600001600d6101000a81548160ff0219169083151502179055505050600385908060018154018082558091505060019003906000526020600020016000909190919091505580606001511515816000015165ffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f77d96978d8b40ac826d1984d992e71a84672e62d825fda78cd646656481d065b88604051613b0f9190614fd5565b60405180910390a460019250505092915050565b60008060056000848152602001908152602001600020549050613b4581614778565b613b4e57600080fd5b613b57816147aa565b15613b655782915050613bca565b7effffffffffffffff00000000000000000000000000000000000000000000006001028116905060b881908060020a820491505090507fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000600102831681179050809150505b919050565b606060006060600f600086815260200190815260200160002091508160000160019054906101000a900460ff1660ff168260000160009054906101000a900460ff1660ff168551613c209190615c0a565b613c2a9190615c0a565b67ffffffffffffffff811115613c4357613c42614b85565b5b6040519080825280601f01601f191660200182016040528015613c755781602001600182028036833780820191505090505b50905060005b8260000160019054906101000a900460ff1660ff16811015613d4b578260000160139054906101000a90047801000000000000000000000000000000000000000000000000028160088110613cd357613cd26158b3565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002828281518110613d0957613d086158b3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080613d43906158e2565b915050613c7b565b8260000160009054906101000a900460ff167f010000000000000000000000000000000000000000000000000000000000000002828281518110613d9257613d916158b3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080613dcc906158e2565b91505060005b8551811015613e9857858181518110613dee57613ded6158b3565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002838284613e459190615c0a565b81518110613e5657613e556158b3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080613e90906158e2565b915050613dd2565b5081935050505092915050565b60008060003073ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401613eff9190614d6c565b602060405180830381865afa158015613f1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f409190615e8f565b92508573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613f7a57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146140ae573373ffffffffffffffffffffffffffffffffffffffff166007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806140a457503373ffffffffffffffffffffffffffffffffffffffff16600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b6140ad57600080fd5b5b60006007600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061410b84866147dc565b600d60008581526020019081526020016000205491506001600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461416d919061587f565b90508181111561421d57600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082815260200190815260200160002054600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020819055505b6000600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055506001600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461435a919061587f565b925050819055506001600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546143b19190615c0a565b92505081905550505050505050565b60008060008060007fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008960019004169350603067ffffffffffffffff8961ffff161667ffffffffffffffff169060020a0267ffffffffffffffff16841793508665ffffffffffff1684179350836001029150600060010260056000848152602001908152602001600020541461445557600080fd5b85600001600c9054906101000a900460ff166144b7578560000160069054906101000a900465ffffffffffff1665ffffffffffff168765ffffffffffff16146144b657600186600001600c6101000a81548160ff0219169083151502179055505b5b67ffffffffffffffff896001900416925060b8839060020a0292507f8000000000000000000000000000000000000000000000000000000000000000831792508973ffffffffffffffffffffffffffffffffffffffff168317925060018660000160068282829054906101000a900465ffffffffffff166145389190615e40565b92506101000a81548165ffffffffffff021916908365ffffffffffff16021790555085600001600d9054906101000a900460ff166145b95760018660000160008282829054906101000a900465ffffffffffff166145969190615e40565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055505b826001026005600084815260200190815260200160002081905550600e60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080600d60008681526020019081526020016000208190555083600c60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055506001600e60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546146d39190615c0a565b9250508190555060068490806001815401808255809150506001900390600052602060002001600090919091909150558973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8866040516147609190614d6c565b60405180910390a38194505050505095945050505050565b6000807f8000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000807f4000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b60008083600102905060056000828152602001908152602001600020546001900491506000820361480c57600080fd5b7fffffffffffffffffffffffff0000000000000000000000000000000000000000821691508273ffffffffffffffffffffffffffffffffffffffff168217915081600102600560008381526020019081526020016000208190555050505050565b6040518060a00160405280600060ff168152602001600060ff168152602001600060ff16815260200160006fffffffffffffffffffffffffffffffff19168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff191681525090565b6040518060800160405280600065ffffffffffff168152602001600065ffffffffffff1681526020016000151581526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61495881614923565b811461496357600080fd5b50565b6000813590506149758161494f565b92915050565b60006020828403121561499157614990614919565b5b600061499f84828501614966565b91505092915050565b60008115159050919050565b6149bd816149a8565b82525050565b60006020820190506149d860008301846149b4565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614a185780820151818401526020810190506149fd565b60008484015250505050565b6000601f19601f8301169050919050565b6000614a40826149de565b614a4a81856149e9565b9350614a5a8185602086016149fa565b614a6381614a24565b840191505092915050565b60006020820190508181036000830152614a888184614a35565b905092915050565b6000819050919050565b614aa381614a90565b8114614aae57600080fd5b50565b600081359050614ac081614a9a565b92915050565b600060208284031215614adc57614adb614919565b5b6000614aea84828501614ab1565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614b1e82614af3565b9050919050565b614b2e81614b13565b82525050565b6000602082019050614b496000830184614b25565b92915050565b614b5881614b13565b8114614b6357600080fd5b50565b600081359050614b7581614b4f565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614bbd82614a24565b810181811067ffffffffffffffff82111715614bdc57614bdb614b85565b5b80604052505050565b6000614bef61490f565b9050614bfb8282614bb4565b919050565b600067ffffffffffffffff821115614c1b57614c1a614b85565b5b614c2482614a24565b9050602081019050919050565b82818337600083830152505050565b6000614c53614c4e84614c00565b614be5565b905082815260208101848484011115614c6f57614c6e614b80565b5b614c7a848285614c31565b509392505050565b600082601f830112614c9757614c96614b7b565b5b8135614ca7848260208601614c40565b91505092915050565b60008060008060808587031215614cca57614cc9614919565b5b6000614cd887828801614b66565b9450506020614ce987828801614b66565b9350506040614cfa87828801614ab1565b925050606085013567ffffffffffffffff811115614d1b57614d1a61491e565b5b614d2787828801614c82565b91505092959194509250565b614d3c81614923565b82525050565b6000602082019050614d576000830184614d33565b92915050565b614d6681614a90565b82525050565b6000602082019050614d816000830184614d5d565b92915050565b600060ff82169050919050565b614d9d81614d87565b8114614da857600080fd5b50565b600081359050614dba81614d94565b92915050565b600067ffffffffffffffff82169050919050565b614ddd81614dc0565b8114614de857600080fd5b50565b600081359050614dfa81614dd4565b92915050565b600067ffffffffffffffff821115614e1b57614e1a614b85565b5b614e2482614a24565b9050602081019050919050565b6000614e44614e3f84614e00565b614be5565b905082815260208101848484011115614e6057614e5f614b80565b5b614e6b848285614c31565b509392505050565b600082601f830112614e8857614e87614b7b565b5b8135614e98848260208601614e31565b91505092915050565b600080600060608486031215614eba57614eb9614919565b5b6000614ec886828701614dab565b9350506020614ed986828701614deb565b925050604084013567ffffffffffffffff811115614efa57614ef961491e565b5b614f0686828701614e73565b9150509250925092565b600080600060608486031215614f2957614f28614919565b5b6000614f3786828701614b66565b9350506020614f4886828701614b66565b9250506040614f5986828701614ab1565b9150509250925092565b6000819050919050565b614f7681614f63565b8114614f8157600080fd5b50565b600081359050614f9381614f6d565b92915050565b600060208284031215614faf57614fae614919565b5b6000614fbd84828501614f84565b91505092915050565b614fcf81614f63565b82525050565b6000602082019050614fea6000830184614fc6565b92915050565b60006020828403121561500657615005614919565b5b600061501484828501614b66565b91505092915050565b6000806040838503121561503457615033614919565b5b600061504285828601614b66565b925050602061505385828601614ab1565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60006150848261505d565b61508e8185615068565b935061509e8185602086016149fa565b6150a781614a24565b840191505092915050565b600060208201905081810360008301526150cc8184615079565b905092915050565b6000602082840312156150ea576150e9614919565b5b600082013567ffffffffffffffff8111156151085761510761491e565b5b61511484828501614e73565b91505092915050565b60006020828403121561513357615132614919565b5b600082013567ffffffffffffffff8111156151515761515061491e565b5b61515d84828501614c82565b91505092915050565b6000806040838503121561517d5761517c614919565b5b600061518b85828601614f84565b925050602061519c85828601614ab1565b9150509250929050565b600065ffffffffffff82169050919050565b6151c1816151a6565b82525050565b60006080820190506151dc60008301876151b8565b6151e960208301866151b8565b6151f660408301856149b4565b61520360608301846149b4565b95945050505050565b615215816149a8565b811461522057600080fd5b50565b6000813590506152328161520c565b92915050565b6000806040838503121561524f5761524e614919565b5b600061525d85828601614b66565b925050602061526e85828601615223565b9150509250929050565b61528181614d87565b82525050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b6152bc81615287565b82525050565b60007fffffffffffffffff00000000000000000000000000000000000000000000000082169050919050565b6152f7816152c2565b82525050565b600060a0820190506153126000830188615278565b61531f6020830187615278565b61532c6040830186615278565b61533960608301856152b3565b61534660808301846152ee565b9695505050505050565b6000806040838503121561536757615366614919565b5b600061537585828601614b66565b925050602061538685828601614f84565b9150509250929050565b600061ffff82169050919050565b6153a781615390565b81146153b257600080fd5b50565b6000813590506153c48161539e565b92915050565b6153d3816151a6565b81146153de57600080fd5b50565b6000813590506153f0816153ca565b92915050565b60008060006060848603121561540f5761540e614919565b5b600061541d86828701614f84565b935050602061542e868287016153b5565b925050604061543f868287016153e1565b9150509250925092565b60008060006060848603121561546257615461614919565b5b600061547086828701614b66565b935050602061548186828701614f84565b9250506040615492868287016153b5565b9150509250925092565b600080604083850312156154b3576154b2614919565b5b60006154c185828601614b66565b92505060206154d285828601614b66565b9150509250929050565b600080600080608085870312156154f6576154f5614919565b5b600061550487828801614b66565b945050602061551587828801614f84565b9350506040615526878288016153b5565b9250506060615537878288016153e1565b91505092959194509250565b60008160050b9050919050565b61555981615543565b811461556457600080fd5b50565b60008135905061557681615550565b92915050565b6000806040838503121561559357615592614919565b5b60006155a185828601614f84565b92505060206155b285828601615567565b9150509250929050565b600080604083850312156155d3576155d2614919565b5b60006155e185828601614ab1565b925050602083013567ffffffffffffffff8111156156025761560161491e565b5b61560e85828601614c82565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061565f57607f821691505b60208210810361567257615671615618565b5b50919050565b7f4552525f5052454649585f544f4f5f4c4f4e4700000000000000000000000000600082015250565b60006156ae6013836149e9565b91506156b982615678565b602082019050919050565b600060208201905081810360008301526156dd816156a1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061571e82614d87565b915061572983614d87565b925082820261573781614d87565b9150808214615749576157486156e4565b5b5092915050565b600061575b82614d87565b91506000820361576e5761576d6156e4565b5b600182039050919050565b600061578482614d87565b915061578f83614d87565b9250828201905060ff8111156157a8576157a76156e4565b5b92915050565b60006157b982614d87565b91506157c483614d87565b9250828203905060ff8111156157dd576157dc6156e4565b5b92915050565b6000819050602082019050919050565b60006157ff8251615287565b80915050919050565b60008160020a8302905092915050565b60006158238261505d565b8261582d846157e3565b9050615838816157f3565b92506010821015615878576158737fffffffffffffffffffffffffffffffff0000000000000000000000000000000083601003600802615808565b831692505b5050919050565b600061588a82614a90565b915061589583614a90565b92508282039050818111156158ad576158ac6156e4565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006158ed82614a90565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361591f5761591e6156e4565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60006008830261597f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82615808565b6159898683615808565b95508019841693508086168417925050509392505050565b6000819050919050565b60006159c66159c16159bc84614a90565b6159a1565b614a90565b9050919050565b6000819050919050565b6159e0836159ab565b6159f46159ec826159cd565b84845461594f565b825550505050565b600090565b615a096159fc565b615a148184846159d7565b505050565b5b81811015615a3857615a2d600082615a01565b600181019050615a1a565b5050565b601f821115615a7d57615a4e8161592a565b615a578461593f565b81016020851015615a66578190505b615a7a615a728561593f565b830182615a19565b50505b505050565b60008160020a8304905092915050565b6000615aa360001984600802615a82565b1980831691505092915050565b6000615abc8383615a92565b9150826002028217905092915050565b615ad58261505d565b67ffffffffffffffff811115615aee57615aed614b85565b5b615af88254615647565b615b03828285615a3c565b600060209050601f831160018114615b365760008415615b24578287015190505b615b2e8582615ab0565b865550615b96565b601f198416615b448661592a565b60005b82811015615b6c57848901518255600182019150602085019450602081019050615b47565b86831015615b895784890151615b85601f891682615a92565b8355505b6001600288020188555050505b505050505050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b6000615bd4600a836149e9565b9150615bdf82615b9e565b602082019050919050565b60006020820190508181036000830152615c0381615bc7565b9050919050565b6000615c1582614a90565b9150615c2083614a90565b9250828201905080821115615c3857615c376156e4565b5b92915050565b6000615c4a8251614f63565b80915050919050565b6000615c5e8261505d565b82615c68846157e3565b9050615c7381615c3e565b92506020821015615cb357615cae7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802615808565b831692505b5050919050565b6000615cc582614a90565b9150615cd083614a90565b9250828202615cde81614a90565b91508282048414831517615cf557615cf46156e4565b5b5092915050565b7f4552525f53504152534500000000000000000000000000000000000000000000600082015250565b6000615d32600a836149e9565b9150615d3d82615cfc565b602082019050919050565b60006020820190508181036000830152615d6181615d25565b9050919050565b7f4552525f43415050454400000000000000000000000000000000000000000000600082015250565b6000615d9e600a836149e9565b9150615da982615d68565b602082019050919050565b60006020820190508181036000830152615dcd81615d91565b9050919050565b7f4552525f4341505f4c4f57000000000000000000000000000000000000000000600082015250565b6000615e0a600b836149e9565b9150615e1582615dd4565b602082019050919050565b60006020820190508181036000830152615e3981615dfd565b9050919050565b6000615e4b826151a6565b9150615e56836151a6565b9250828201905065ffffffffffff811115615e7457615e736156e4565b5b92915050565b600081519050615e8981614b4f565b92915050565b600060208284031215615ea557615ea4614919565b5b6000615eb384828501615e7a565b9150509291505056fea264697066735822122036de01f0c34ed69e76839e3f19f567768f25c770c15b5a5399b6f98bb3141eb064736f6c63430008120033
+\ 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"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"uint48","name":"_count","type":"uint48"},{"indexed":true,"internalType":"bool","name":"_capped","type":"bool"},{"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":"int48","name":"count","type":"int48"}],"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":[{"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":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"},{"internalType":"uint48","name":"_cap","type":"uint48"}],"name":"setCap","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"},{"internalType":"bool","name":"capped","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"}]
+[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"uint48","name":"_count","type":"uint48"},{"indexed":true,"internalType":"bool","name":"_capped","type":"bool"},{"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":"addMultiCodec","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":"int48","name":"count","type":"int48"}],"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":[{"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":"multiHash","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":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","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":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"},{"internalType":"uint48","name":"_cap","type":"uint48"}],"name":"setCap","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":"_data","type":"bytes"}],"name":"toHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_codec","type":"uint256"},{"internalType":"bytes","name":"_digest","type":"bytes"}],"name":"toMultiHash","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","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"},{"internalType":"bool","name":"capped","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 @@
-60806040523480156200001157600080fd5b50604051620071ad380380620071ad833981810160405281019062000037919062000afc565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550816009908162000088919062000dd2565b5080600a90816200009a919062000dd2565b50620000ee602060126040518060400160405280600681526020017f736861323536000000000000000000000000000000000000000000000000000081525062000174640100000000026401000000009004565b6200010960126200044b640100000000026401000000009004565b602067ffffffffffffffff81111562000127576200012662000998565b5b6040519080825280601f01601f1916602001820160405280156200015a5781602001600182028036833780820191505090505b50601190816200016b919062000f29565b505050620013ab565b6060819050601081511115620001c1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001b89062001071565b60405180910390fd5b620001cb62000903565b6000600790505b60008160ff16106200022f576000600882620001ef9190620010cf565b60ff1660ff9060020a029050600086821667ffffffffffffffff1611156200021857506200022f565b8180620002259062001115565b92505050620001d2565b6001816200023e919062001143565b826020019060ff16908160ff168152505060088160076200026091906200117f565b6200026c9190620010cf565b60ff168567ffffffffffffffff169060020a02780100000000000000000000000000000000000000000000000002826080019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250508251826040019060ff16908160ff168152505082620002fa906200120e565b82606001906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff19168152505085826000019060ff16908160ff168152505081600f60008767ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060808201518160000160136101000a81548167ffffffffffffffff0219169083780100000000000000000000000000000000000000000000000090040217905550905050505050505050565b6000600f6000838152602001908152602001600020905060008160000160009054906101000a900460ff1660ff16116200048457600080fd5b816010819055508060000160009054906101000a900460ff1660ff1667ffffffffffffffff811115620004bc57620004bb62000998565b5b6040519080825280601f01601f191660200182016040528015620004ef5781602001600182028036833780820191505090505b506011908162000500919062000f29565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c6200053b62000556640100000000026401000000009004565b6040516200054a9190620012d0565b60405180910390a15050565b606062000604601180546200056b9062000bbb565b80601f0160208091040260200160405190810160405280929190818152602001828054620005999062000bbb565b8015620005ea5780601f10620005be57610100808354040283529160200191620005ea565b820191906000526020600020905b815481529060010190602001808311620005cc57829003601f168201915b505050505062000609640100000000026401000000009004565b905090565b606060006060600f6000601054815260200190815260200160002091508160000160019054906101000a900460ff1660ff168260000160009054906101000a900460ff1660ff1685516200065e9190620012f4565b6200066a9190620012f4565b67ffffffffffffffff81111562000686576200068562000998565b5b6040519080825280601f01601f191660200182016040528015620006b95781602001600182028036833780820191505090505b50905060005b8260000160019054906101000a900460ff1660ff1681101562000799578260000160139054906101000a900478010000000000000000000000000000000000000000000000000281600881106200071b576200071a6200132f565b5b1a7f0100000000000000000000000000000000000000000000000000000000000000028282815181106200075457620007536200132f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808062000790906200135e565b915050620006bf565b8260000160009054906101000a900460ff167f010000000000000000000000000000000000000000000000000000000000000002828281518110620007e357620007e26200132f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806200081f906200135e565b91505060005b8551811015620008f7578581815181106200084557620008446200132f565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028382846200089e9190620012f4565b81518110620008b257620008b16200132f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080620008ee906200135e565b91505062000825565b50819350505050919050565b6040518060a00160405280600060ff168152602001600060ff168152602001600060ff16815260200160006fffffffffffffffffffffffffffffffff19168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff191681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620009d28262000987565b810181811067ffffffffffffffff82111715620009f457620009f362000998565b5b80604052505050565b600062000a0962000969565b905062000a178282620009c7565b919050565b600067ffffffffffffffff82111562000a3a5762000a3962000998565b5b62000a458262000987565b9050602081019050919050565b60005b8381101562000a7257808201518184015260208101905062000a55565b60008484015250505050565b600062000a9562000a8f8462000a1c565b620009fd565b90508281526020810184848401111562000ab45762000ab362000982565b5b62000ac184828562000a52565b509392505050565b600082601f83011262000ae15762000ae06200097d565b5b815162000af384826020860162000a7e565b91505092915050565b6000806040838503121562000b165762000b1562000973565b5b600083015167ffffffffffffffff81111562000b375762000b3662000978565b5b62000b458582860162000ac9565b925050602083015167ffffffffffffffff81111562000b695762000b6862000978565b5b62000b778582860162000ac9565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000bd457607f821691505b60208210810362000bea5762000be962000b8c565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000c15565b62000c63868362000c15565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000cb062000caa62000ca48462000c7b565b62000c85565b62000c7b565b9050919050565b6000819050919050565b62000ccc8362000c8f565b62000ce462000cdb8262000cb7565b84845462000c25565b825550505050565b600090565b62000cfb62000cec565b62000d0881848462000cc1565b505050565b5b8181101562000d305762000d2460008262000cf1565b60018101905062000d0e565b5050565b601f82111562000d7f5762000d498162000bf0565b62000d548462000c05565b8101602085101562000d64578190505b62000d7c62000d738562000c05565b83018262000d0d565b50505b505050565b60008160020a8304905092915050565b600062000da76000198460080262000d84565b1980831691505092915050565b600062000dc2838362000d94565b9150826002028217905092915050565b62000ddd8262000b81565b67ffffffffffffffff81111562000df95762000df862000998565b5b62000e05825462000bbb565b62000e1282828562000d34565b600060209050601f83116001811462000e4a576000841562000e35578287015190505b62000e41858262000db4565b86555062000eb1565b601f19841662000e5a8662000bf0565b60005b8281101562000e845784890151825560018201915060208501945060208101905062000e5d565b8683101562000ea4578489015162000ea0601f89168262000d94565b8355505b6001600288020188555050505b505050505050565b600081519050919050565b60008190508160005260206000209050919050565b601f82111562000f245762000eee8162000ec4565b62000ef98462000c05565b8101602085101562000f09578190505b62000f2162000f188562000c05565b83018262000d0d565b50505b505050565b62000f348262000eb9565b67ffffffffffffffff81111562000f505762000f4f62000998565b5b62000f5c825462000bbb565b62000f6982828562000ed9565b600060209050601f83116001811462000fa1576000841562000f8c578287015190505b62000f98858262000db4565b86555062001008565b601f19841662000fb18662000ec4565b60005b8281101562000fdb5784890151825560018201915060208501945060208101905062000fb4565b8683101562000ffb578489015162000ff7601f89168262000d94565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4552525f5052454649585f544f4f5f4c4f4e4700000000000000000000000000600082015250565b60006200105960138362001010565b9150620010668262001021565b602082019050919050565b600060208201905081810360008301526200108c816200104a565b9050919050565b600060ff82169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620010dc8262001093565b9150620010e98362001093565b9250828202620010f98162001093565b91508082146200110e576200110d620010a0565b5b5092915050565b6000620011228262001093565b915060008203620011385762001137620010a0565b5b600182039050919050565b6000620011508262001093565b91506200115d8362001093565b9250828201905060ff811115620011795762001178620010a0565b5b92915050565b60006200118c8262001093565b9150620011998362001093565b9250828203905060ff811115620011b557620011b4620010a0565b5b92915050565b6000819050602082019050919050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b6000620012058251620011cb565b80915050919050565b60006200121b8262000eb9565b826200122784620011bb565b90506200123481620011f7565b925060108210156200127757620012727fffffffffffffffffffffffffffffffff000000000000000000000000000000008360100360080262000c15565b831692505b5050919050565b600082825260208201905092915050565b60006200129c8262000eb9565b620012a881856200127e565b9350620012ba81856020860162000a52565b620012c58162000987565b840191505092915050565b60006020820190508181036000830152620012ec81846200128f565b905092915050565b6000620013018262000c7b565b91506200130e8362000c7b565b9250828201905080821115620013295762001328620010a0565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006200136b8262000c7b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620013a0576200139f620010a0565b5b600182019050919050565b615df280620013bb6000396000f3fe608060405260043610610263576000357c0100000000000000000000000000000000000000000000000000000000900480638da5cb5b11610156578063c6eba7c4116100d3578063e8a7f4c511610097578063e8a7f4c514610957578063e985e9c514610994578063f117e173146109d1578063f2fde38b14610a0e578063f70a3de814610a4b578063f9613ab214610a8857610263565b8063c6eba7c414610862578063c87b56dd1461088b578063ccc094c2146108c8578063d824ee4f146108f1578063da2824a81461092e57610263565b8063adf288df1161011a578063adf288df14610760578063b238d6031461079d578063b5fdeb23146107de578063b88d4fde14610809578063c5bec6fc1461082557610263565b80638da5cb5b1461067b57806395d89b41146106a65780639a7c5e9f146106d1578063a22cb465146106fa578063ad0dec2f1461072357610263565b806349f2553a116101e45780635ae06f7e116101a85780635ae06f7e1461055e5780636352211e146105875780636b9cb86a146105c457806370a082311461060157806386e90b591461063e57610263565b806349f2553a146104525780634f64b2be1461047b5780634f6ccce7146104b85780635344299a146104f5578063559f5dc91461051e57610263565b806324e0febc1161022b57806324e0febc146103545780632b29ba23146103915780632f745c59146103ce57806340c84b0e1461040b57806342842e0e1461043657610263565b806301ffc9a71461026857806306fdde03146102a5578063081812fc146102d057806318160ddd1461030d57806323b872dd14610338575b600080fd5b34801561027457600080fd5b5061028f600480360381019061028a9190614901565b610ac5565b60405161029c9190614949565b60405180910390f35b3480156102b157600080fd5b506102ba610c19565b6040516102c791906149f4565b60405180910390f35b3480156102dc57600080fd5b506102f760048036038101906102f29190614a4c565b610ca7565b6040516103049190614aba565b60405180910390f35b34801561031957600080fd5b50610322610ce4565b60405161032f9190614ae4565b60405180910390f35b610352600480360381019061034d9190614b2b565b610cf1565b005b34801561036057600080fd5b5061037b60048036038101906103769190614bb4565b610d5c565b6040516103889190614bf0565b60405180910390f35b34801561039d57600080fd5b506103b860048036038101906103b39190614c0b565b610d74565b6040516103c59190614949565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f09190614c38565b610e20565b6040516104029190614ae4565b60405180910390f35b34801561041757600080fd5b50610420610e45565b60405161042d9190614ccd565b60405180910390f35b610450600480360381019061044b9190614b2b565b610ed3565b005b34801561045e57600080fd5b5061047960048036038101906104749190614e24565b610f3e565b005b34801561048757600080fd5b506104a2600480360381019061049d9190614a4c565b611256565b6040516104af9190614bf0565b60405180910390f35b3480156104c457600080fd5b506104df60048036038101906104da9190614a4c565b61127a565b6040516104ec9190614ae4565b60405180910390f35b34801561050157600080fd5b5061051c60048036038101906105179190614f0e565b61129e565b005b34801561052a57600080fd5b5061054560048036038101906105409190614f57565b61132a565b6040516105559493929190614fb8565b60405180910390f35b34801561056a57600080fd5b5061058560048036038101906105809190614c0b565b6113b1565b005b34801561059357600080fd5b506105ae60048036038101906105a99190614a4c565b6114d0565b6040516105bb9190614aba565b60405180910390f35b3480156105d057600080fd5b506105eb60048036038101906105e69190614f0e565b61150c565b6040516105f891906149f4565b60405180910390f35b34801561060d57600080fd5b5061062860048036038101906106239190614c0b565b611725565b6040516106359190614ae4565b60405180910390f35b34801561064a57600080fd5b5061066560048036038101906106609190614f0e565b61176e565b60405161067291906149f4565b60405180910390f35b34801561068757600080fd5b50610690611a19565b60405161069d9190614aba565b60405180910390f35b3480156106b257600080fd5b506106bb611a3d565b6040516106c891906149f4565b60405180910390f35b3480156106dd57600080fd5b506106f860048036038101906106f39190614a4c565b611acb565b005b34801561070657600080fd5b50610721600480360381019061071c9190615029565b611bbc565b005b34801561072f57600080fd5b5061074a60048036038101906107459190614f0e565b611e5e565b6040516107579190614ccd565b60405180910390f35b34801561076c57600080fd5b5061078760048036038101906107829190615069565b612135565b6040516107949190614bf0565b60405180910390f35b3480156107a957600080fd5b506107c460048036038101906107bf9190614a4c565b61248b565b6040516107d595949392919061513b565b60405180910390f35b3480156107ea57600080fd5b506107f361252a565b6040516108009190614ccd565b60405180910390f35b610823600480360381019061081e919061518e565b6125c4565b005b34801561083157600080fd5b5061084c60048036038101906108479190614f0e565b61269f565b6040516108599190614ccd565b60405180910390f35b34801561086e57600080fd5b5061088960048036038101906108849190615277565b612a58565b005b34801561089757600080fd5b506108b260048036038101906108ad9190614a4c565b612c10565b6040516108bf91906149f4565b60405180910390f35b3480156108d457600080fd5b506108ef60048036038101906108ea9190615336565b612d63565b005b3480156108fd57600080fd5b50610918600480360381019061091391906153a5565b613025565b6040516109259190614bf0565b60405180910390f35b34801561093a57600080fd5b5061095560048036038101906109509190614c0b565b6132ca565b005b34801561096357600080fd5b5061097e60048036038101906109799190614f0e565b6133b2565b60405161098b9190614ccd565b60405180910390f35b3480156109a057600080fd5b506109bb60048036038101906109b691906153f8565b61376b565b6040516109c89190614949565b60405180910390f35b3480156109dd57600080fd5b506109f860048036038101906109f39190615438565b613803565b604051610a059190614bf0565b60405180910390f35b348015610a1a57600080fd5b50610a356004803603810190610a309190614c0b565b6139ad565b604051610a429190614949565b60405180910390f35b348015610a5757600080fd5b50610a726004803603810190610a6d91906154d8565b613a51565b604051610a7f9190614949565b60405180910390f35b348015610a9457600080fd5b50610aaf6004803603810190610aaa9190614bb4565b613d7f565b604051610abc9190614bf0565b60405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b195760019050610c14565b635b5e139f7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b6b5760019050610c14565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610bbd5760019050610c14565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c0f5760019050610c14565b600090505b919050565b60098054610c2690615547565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5290615547565b8015610c9f5780601f10610c7457610100808354040283529160200191610c9f565b820191906000526020600020905b815481529060010190602001808311610c8257829003601f168201915b505050505081565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600680549050905090565b610cfc838383613e2b565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60056020528060005260406000206000915090505481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680610e19575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b600c602052816000526040600020602052806000526040600020600091509150505481565b600b8054610e5290615547565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7e90615547565b8015610ecb5780601f10610ea057610100808354040283529160200191610ecb565b820191906000526020600020905b815481529060010190602001808311610eae57829003601f168201915b505050505081565b610ede838383613e2b565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f9b57600080fd5b82915081519050602f7f01000000000000000000000000000000000000000000000000000000000000000282600183610fd491906155a7565b81518110610fe557610fe46155db565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146110655780806110619061560a565b9150505b8067ffffffffffffffff81111561107f5761107e614cf9565b5b6040519080825280601f01601f1916602001820160405280156110b15781602001600182028036833780820191505090505b50600b90816110c09190615804565b5060005b82518110156111b1578281815181106110e0576110df6155db565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002600b82815461113890615547565b8110611147576111466155db565b5b8154600116156111665790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f01000000000000000000000000000000000000000000000000000000000000008404021790555080806111a99061560a565b9150506110c4565b5081518114611251577f2f00000000000000000000000000000000000000000000000000000000000000600b835181546111ea90615547565b81106111f9576111f86155db565b5b8154600116156112185790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055505b505050565b6003818154811061126657600080fd5b906000526020600020016000915090505481565b6006818154811061128a57600080fd5b906000526020600020016000915090505481565b6000600f6000601054815260200190815260200160002090508060000160009054906101000a900460ff1660ff168251146112d857600080fd5b81601190816112e79190615804565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c61131161252a565b60405161131e9190614ccd565b60405180910390a15050565b6004602052816000526040600020818154811061134657600080fd5b90600052602060002001600091509150508060000160009054906101000a900465ffffffffffff16908060000160069054906101000a900465ffffffffffff169080600001600c9054906101000a900460ff169080600001600d9054906101000a900460ff16905084565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611436575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146c90615922565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080600560008460010281526020019081526020016000205490506060819060020a026c010000000000000000000000009004915050919050565b6060806060600061151c856133b2565b9150600b805461152b90615547565b9050905080825161153c9190615942565b67ffffffffffffffff81111561155557611554614cf9565b5b6040519080825280601f01601f1916602001820160405280156115875781602001600182028036833780820191505090505b50925060005b8181101561164c57600b8181546115a390615547565b81106115b2576115b16155db565b5b8154600116156115d15790600052602060002090602091828204019190065b9054901a7f01000000000000000000000000000000000000000000000000000000000000000284828151811061160a576116096155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806116449061560a565b91505061158d565b5060005b82518110156117195782818151811061166c5761166b6155db565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028483815181106116c9576116c86155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081806117039061560a565b92505080806117119061560a565b915050611650565b50829350505050919050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600060608060006117808661269f565b9150600f6000601054815260200190815260200160002093508360000160029054906101000a900460ff1660ff16905060018251826117bf9190615942565b6117c99190615942565b67ffffffffffffffff8111156117e2576117e1614cf9565b5b6040519080825280601f01601f1916602001820160405280156118145781602001600182028036833780820191505090505b50925060005b818110156118ce578460000160039054906101000a9004700100000000000000000000000000000000028160108110611856576118556155db565b5b1a7f01000000000000000000000000000000000000000000000000000000000000000284828151811061188c5761188b6155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806118c69061560a565b91505061181a565b50603a7f010000000000000000000000000000000000000000000000000000000000000002838281518110611906576119056155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806119409061560a565b91505060005b8251811015611a0c57828181518110611962576119616155db565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028482846119b99190615942565b815181106119ca576119c96155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611a049061560a565b915050611946565b5082945050505050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a8054611a4a90615547565b80601f0160208091040260200160405190810160405280929190818152602001828054611a7690615547565b8015611ac35780601f10611a9857610100808354040283529160200191611ac3565b820191906000526020600020905b815481529060010190602001808311611aa657829003601f168201915b505050505081565b6000600f6000838152602001908152602001600020905060008160000160009054906101000a900460ff1660ff1611611b0357600080fd5b816010819055508060000160009054906101000a900460ff1660ff1667ffffffffffffffff811115611b3857611b37614cf9565b5b6040519080825280601f01601f191660200182016040528015611b6a5781602001600182028036833780820191505090505b5060119081611b799190615804565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c611ba361252a565b604051611bb09190614ccd565b60405180910390a15050565b8015611cdd57600073ffffffffffffffffffffffffffffffffffffffff16600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c5a57600080fd5b81600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611df5565b600073ffffffffffffffffffffffffffffffffffffffff16600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611d7557600080fd5b6000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e529190614949565b60405180910390a35050565b606060006060600f6000601054815260200190815260200160002091508160000160019054906101000a900460ff1660ff168260000160009054906101000a900460ff1660ff168551611eb19190615942565b611ebb9190615942565b67ffffffffffffffff811115611ed457611ed3614cf9565b5b6040519080825280601f01601f191660200182016040528015611f065781602001600182028036833780820191505090505b50905060005b8260000160019054906101000a900460ff1660ff16811015611fdc578260000160139054906101000a90047801000000000000000000000000000000000000000000000000028160088110611f6457611f636155db565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002828281518110611f9a57611f996155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611fd49061560a565b915050611f0c565b8260000160009054906101000a900460ff167f010000000000000000000000000000000000000000000000000000000000000002828281518110612023576120226155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061205d9061560a565b91505060005b85518110156121295785818151811061207f5761207e6155db565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028382846120d69190615942565b815181106120e7576120e66155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806121219061560a565b915050612063565b50819350505050919050565b60008060008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806121de5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6121e757600080fd5b600160046000878152602001908152602001600020805490501461220a57600080fd5b600060046000878152602001908152602001600020600081548110612232576122316155db565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff161461226457600080fd5b600060010260056000878152602001908152602001600020541461228757600080fd5b8573ffffffffffffffffffffffffffffffffffffffff1692507fc0000000000000000000000000000000000000000000000000000000000000008317925082600102600560008781526020019081526020016000208190555084600190049150600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080600d60008481526020019081526020016000208190555081600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055506001600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123e69190615942565b925050819055506006856001900490806001815401808255809150506001900390600052602060002001600090919091909150558573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8846040516124779190614ae4565b60405180910390a384935050505092915050565b600f6020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900460ff16908060000160029054906101000a900460ff16908060000160039054906101000a900470010000000000000000000000000000000002908060000160139054906101000a9004780100000000000000000000000000000000000000000000000002905085565b60606125bf6011805461253c90615547565b80601f016020809104026020016040519081016040528092919081815260200182805461256890615547565b80156125b55780601f1061258a576101008083540402835291602001916125b5565b820191906000526020600020905b81548152906001019060200180831161259857829003601f168201915b5050505050611e5e565b905090565b6125cf848484613e2b565b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f75c9e114f073c346aac7d1d7e9a3c3c14edabcdd27de07d1d9e425f45d318c5e846126849061599b565b6040516126919190614bf0565b60405180910390a450505050565b606080600080600285516126b39190615a02565b67ffffffffffffffff8111156126cc576126cb614cf9565b5b6040519080825280601f01601f1916602001820160405280156126fe5781602001600182028036833780820191505090505b5092506000905060005b6020811015612a4c57600460f0878381518110612728576127276155db565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff161015612827576030836127be9190615a44565b7f0100000000000000000000000000000000000000000000000000000000000000028483815181106127f3576127f26155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612899565b6057836128349190615a44565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110612869576128686155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f8682815181106128ae576128ad6155db565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff1610156129ac576030836129379190615a44565b7f010000000000000000000000000000000000000000000000000000000000000002846001846129679190615942565b81518110612978576129776155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612a2a565b6057836129b99190615a44565b7f010000000000000000000000000000000000000000000000000000000000000002846001846129e99190615942565b815181106129fa576129f96155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600282612a379190615942565b91508080612a449061560a565b915050612708565b50829350505050919050565b6000600460008581526020019081526020016000208361ffff1681548110612a8357612a826155db565b5b90600052602060002001905080600001600c9054906101000a900460ff1615612ae1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad890615ac5565b60405180910390fd5b80600001600d9054906101000a900460ff1615612b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2a90615b31565b60405180910390fd5b60008265ffffffffffff1603612b5d578060000160069054906101000a900465ffffffffffff1691505b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168265ffffffffffff161015612bc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bbd90615b9d565b60405180910390fd5b818160000160006101000a81548165ffffffffffff021916908365ffffffffffff160217905550600181600001600d6101000a81548160ff02191690831515021790555050505050565b6060600060608360010291506000600460008481526020019081526020016000208054905003612c4657612c4382613d7f565b91505b6000600460008481526020019081526020016000208054905011612c6957600080fd5b602067ffffffffffffffff811115612c8457612c83614cf9565b5b6040519080825280601f01601f191660200182016040528015612cb65781602001600182028036833780820191505090505b50905060005b6020811015612d5057828160208110612cd857612cd76155db565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002828281518110612d0e57612d0d6155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080612d489061560a565b915050612cbc565b50612d5a8161150c565b92505050919050565b6060819050601081511115612dad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612da490615c09565b60405180910390fd5b612db56147f3565b6000600790505b60008160ff1610612e11576000600882612dd69190615c29565b60ff1660ff9060020a029050600086821667ffffffffffffffff161115612dfd5750612e11565b8180612e0890615c66565b92505050612dbc565b600181612e1e9190615a44565b826020019060ff16908160ff16815250506008816007612e3e9190615c8f565b612e489190615c29565b60ff168567ffffffffffffffff169060020a02780100000000000000000000000000000000000000000000000002826080019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250508251826040019060ff16908160ff168152505082612ed490615cd9565b82606001906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff19168152505085826000019060ff16908160ff168152505081600f60008767ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060808201518160000160136101000a81548167ffffffffffffffff0219169083780100000000000000000000000000000000000000000000000090040217905550905050505050505050565b600080600460008581526020019081526020016000208361ffff1681548110613051576130506155db565b5b90600052602060002001905080600001600c9054906101000a900460ff16156130af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a690615ac5565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806131525750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b613191576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161318890615922565b60405180910390fd5b60008361ffff161480156131c3575060008160000160009054906101000a900465ffffffffffff1665ffffffffffff16145b80156131dd575080600001600d9054906101000a900460ff165b1561323c5760018160000160068282829054906101000a900465ffffffffffff166132089190615d40565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055506132348585612135565b9150506132c3565b80600001600d9054906101000a900460ff161561329c578060000160009054906101000a900465ffffffffffff1665ffffffffffff168160000160069054906101000a900465ffffffffffff1665ffffffffffff161061329b57600080fd5b5b6132bf8585858460000160069054906101000a900465ffffffffffff1685614346565b9150505b9392505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613358576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161334f90615922565b60405180910390fd5b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b606080600080600285516133c69190615a02565b67ffffffffffffffff8111156133df576133de614cf9565b5b6040519080825280601f01601f1916602001820160405280156134115781602001600182028036833780820191505090505b5092506000905060005b602081101561375f57600460f087838151811061343b5761343a6155db565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff16101561353a576030836134d19190615a44565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110613506576135056155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506135ac565b6057836135479190615a44565b7f01000000000000000000000000000000000000000000000000000000000000000284838151811061357c5761357b6155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f8682815181106135c1576135c06155db565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff1610156136bf5760308361364a9190615a44565b7f0100000000000000000000000000000000000000000000000000000000000000028460018461367a9190615942565b8151811061368b5761368a6155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061373d565b6057836136cc9190615a44565b7f010000000000000000000000000000000000000000000000000000000000000002846001846136fc9190615942565b8151811061370d5761370c6155db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b60028261374a9190615942565b915080806137579061560a565b91505061341b565b50829350505050919050565b60008173ffffffffffffffffffffffffffffffffffffffff16600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600080600460008681526020019081526020016000208461ffff168154811061382f5761382e6155db565b5b90600052602060002001905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806138de5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61391d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161391490615922565b60405180910390fd5b60008160000160009054906101000a900465ffffffffffff1665ffffffffffff161161394857600080fd5b80600001600d9054906101000a900460ff1661396357600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168365ffffffffffff161061399557600080fd5b6139a28686868685614346565b915050949350505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613a0857600080fd5b816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480613af75750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b613b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b2d90615922565b60405180910390fd5b613b3e614859565b600460008681526020019081526020016000208054905091506000821115613bbb57600060046000878152602001908152602001600020600081548110613b8857613b876155db565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff1611613bba57600080fd5b5b60008460050b03613bdc576001816060019015159081151581525050613c17565b60008460050b1315613c165783816000019065ffffffffffff16908165ffffffffffff168152505060018160600190151590811515815250505b5b60046000868152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001600c6101000a81548160ff021916908315150217905550606082015181600001600d6101000a81548160ff0219169083151502179055505050600385908060018154018082558091505060019003906000526020600020016000909190919091505580606001511515816000015165ffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f77d96978d8b40ac826d1984d992e71a84672e62d825fda78cd646656481d065b88604051613d6b9190614bf0565b60405180910390a460019250505092915050565b60008060056000848152602001908152602001600020549050613da1816146fe565b613daa57600080fd5b613db381614730565b15613dc15782915050613e26565b7effffffffffffffff00000000000000000000000000000000000000000000006001028116905060b881908060020a820491505090507fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000600102831681179050809150505b919050565b60008060003073ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401613e859190614ae4565b602060405180830381865afa158015613ea2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ec69190615d8f565b92508573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613f0057600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614614034573373ffffffffffffffffffffffffffffffffffffffff166007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061402a57503373ffffffffffffffffffffffffffffffffffffffff16600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b61403357600080fd5b5b60006007600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506140918486614762565b600d60008581526020019081526020016000205491506001600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546140f391906155a7565b9050818111156141a357600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082815260200190815260200160002054600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020819055505b6000600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055506001600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546142e091906155a7565b925050819055506001600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546143379190615942565b92505081905550505050505050565b60008060008060007fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008960019004169350603067ffffffffffffffff8961ffff161667ffffffffffffffff169060020a0267ffffffffffffffff16841793508665ffffffffffff168417935083600102915060006001026005600084815260200190815260200160002054146143db57600080fd5b85600001600c9054906101000a900460ff1661443d578560000160069054906101000a900465ffffffffffff1665ffffffffffff168765ffffffffffff161461443c57600186600001600c6101000a81548160ff0219169083151502179055505b5b67ffffffffffffffff896001900416925060b8839060020a0292507f8000000000000000000000000000000000000000000000000000000000000000831792508973ffffffffffffffffffffffffffffffffffffffff168317925060018660000160068282829054906101000a900465ffffffffffff166144be9190615d40565b92506101000a81548165ffffffffffff021916908365ffffffffffff16021790555085600001600d9054906101000a900460ff1661453f5760018660000160008282829054906101000a900465ffffffffffff1661451c9190615d40565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055505b826001026005600084815260200190815260200160002081905550600e60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080600d60008681526020019081526020016000208190555083600c60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055506001600e60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546146599190615942565b9250508190555060068490806001815401808255809150506001900390600052602060002001600090919091909150558973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8866040516146e69190614ae4565b60405180910390a38194505050505095945050505050565b6000807f8000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000807f4000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b60008083600102905060056000828152602001908152602001600020546001900491506000820361479257600080fd5b7fffffffffffffffffffffffff0000000000000000000000000000000000000000821691508273ffffffffffffffffffffffffffffffffffffffff168217915081600102600560008381526020019081526020016000208190555050505050565b6040518060a00160405280600060ff168152602001600060ff168152602001600060ff16815260200160006fffffffffffffffffffffffffffffffff19168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff191681525090565b6040518060800160405280600065ffffffffffff168152602001600065ffffffffffff1681526020016000151581526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6148de816148a9565b81146148e957600080fd5b50565b6000813590506148fb816148d5565b92915050565b6000602082840312156149175761491661489f565b5b6000614925848285016148ec565b91505092915050565b60008115159050919050565b6149438161492e565b82525050565b600060208201905061495e600083018461493a565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561499e578082015181840152602081019050614983565b60008484015250505050565b6000601f19601f8301169050919050565b60006149c682614964565b6149d0818561496f565b93506149e0818560208601614980565b6149e9816149aa565b840191505092915050565b60006020820190508181036000830152614a0e81846149bb565b905092915050565b6000819050919050565b614a2981614a16565b8114614a3457600080fd5b50565b600081359050614a4681614a20565b92915050565b600060208284031215614a6257614a6161489f565b5b6000614a7084828501614a37565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614aa482614a79565b9050919050565b614ab481614a99565b82525050565b6000602082019050614acf6000830184614aab565b92915050565b614ade81614a16565b82525050565b6000602082019050614af96000830184614ad5565b92915050565b614b0881614a99565b8114614b1357600080fd5b50565b600081359050614b2581614aff565b92915050565b600080600060608486031215614b4457614b4361489f565b5b6000614b5286828701614b16565b9350506020614b6386828701614b16565b9250506040614b7486828701614a37565b9150509250925092565b6000819050919050565b614b9181614b7e565b8114614b9c57600080fd5b50565b600081359050614bae81614b88565b92915050565b600060208284031215614bca57614bc961489f565b5b6000614bd884828501614b9f565b91505092915050565b614bea81614b7e565b82525050565b6000602082019050614c056000830184614be1565b92915050565b600060208284031215614c2157614c2061489f565b5b6000614c2f84828501614b16565b91505092915050565b60008060408385031215614c4f57614c4e61489f565b5b6000614c5d85828601614b16565b9250506020614c6e85828601614a37565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000614c9f82614c78565b614ca98185614c83565b9350614cb9818560208601614980565b614cc2816149aa565b840191505092915050565b60006020820190508181036000830152614ce78184614c94565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614d31826149aa565b810181811067ffffffffffffffff82111715614d5057614d4f614cf9565b5b80604052505050565b6000614d63614895565b9050614d6f8282614d28565b919050565b600067ffffffffffffffff821115614d8f57614d8e614cf9565b5b614d98826149aa565b9050602081019050919050565b82818337600083830152505050565b6000614dc7614dc284614d74565b614d59565b905082815260208101848484011115614de357614de2614cf4565b5b614dee848285614da5565b509392505050565b600082601f830112614e0b57614e0a614cef565b5b8135614e1b848260208601614db4565b91505092915050565b600060208284031215614e3a57614e3961489f565b5b600082013567ffffffffffffffff811115614e5857614e576148a4565b5b614e6484828501614df6565b91505092915050565b600067ffffffffffffffff821115614e8857614e87614cf9565b5b614e91826149aa565b9050602081019050919050565b6000614eb1614eac84614e6d565b614d59565b905082815260208101848484011115614ecd57614ecc614cf4565b5b614ed8848285614da5565b509392505050565b600082601f830112614ef557614ef4614cef565b5b8135614f05848260208601614e9e565b91505092915050565b600060208284031215614f2457614f2361489f565b5b600082013567ffffffffffffffff811115614f4257614f416148a4565b5b614f4e84828501614ee0565b91505092915050565b60008060408385031215614f6e57614f6d61489f565b5b6000614f7c85828601614b9f565b9250506020614f8d85828601614a37565b9150509250929050565b600065ffffffffffff82169050919050565b614fb281614f97565b82525050565b6000608082019050614fcd6000830187614fa9565b614fda6020830186614fa9565b614fe7604083018561493a565b614ff4606083018461493a565b95945050505050565b6150068161492e565b811461501157600080fd5b50565b60008135905061502381614ffd565b92915050565b600080604083850312156150405761503f61489f565b5b600061504e85828601614b16565b925050602061505f85828601615014565b9150509250929050565b600080604083850312156150805761507f61489f565b5b600061508e85828601614b16565b925050602061509f85828601614b9f565b9150509250929050565b600060ff82169050919050565b6150bf816150a9565b82525050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b6150fa816150c5565b82525050565b60007fffffffffffffffff00000000000000000000000000000000000000000000000082169050919050565b61513581615100565b82525050565b600060a08201905061515060008301886150b6565b61515d60208301876150b6565b61516a60408301866150b6565b61517760608301856150f1565b615184608083018461512c565b9695505050505050565b600080600080608085870312156151a8576151a761489f565b5b60006151b687828801614b16565b94505060206151c787828801614b16565b93505060406151d887828801614a37565b925050606085013567ffffffffffffffff8111156151f9576151f86148a4565b5b61520587828801614ee0565b91505092959194509250565b600061ffff82169050919050565b61522881615211565b811461523357600080fd5b50565b6000813590506152458161521f565b92915050565b61525481614f97565b811461525f57600080fd5b50565b6000813590506152718161524b565b92915050565b6000806000606084860312156152905761528f61489f565b5b600061529e86828701614b9f565b93505060206152af86828701615236565b92505060406152c086828701615262565b9150509250925092565b6152d3816150a9565b81146152de57600080fd5b50565b6000813590506152f0816152ca565b92915050565b600067ffffffffffffffff82169050919050565b615313816152f6565b811461531e57600080fd5b50565b6000813590506153308161530a565b92915050565b60008060006060848603121561534f5761534e61489f565b5b600061535d868287016152e1565b935050602061536e86828701615321565b925050604084013567ffffffffffffffff81111561538f5761538e6148a4565b5b61539b86828701614df6565b9150509250925092565b6000806000606084860312156153be576153bd61489f565b5b60006153cc86828701614b16565b93505060206153dd86828701614b9f565b92505060406153ee86828701615236565b9150509250925092565b6000806040838503121561540f5761540e61489f565b5b600061541d85828601614b16565b925050602061542e85828601614b16565b9150509250929050565b600080600080608085870312156154525761545161489f565b5b600061546087828801614b16565b945050602061547187828801614b9f565b935050604061548287828801615236565b925050606061549387828801615262565b91505092959194509250565b60008160050b9050919050565b6154b58161549f565b81146154c057600080fd5b50565b6000813590506154d2816154ac565b92915050565b600080604083850312156154ef576154ee61489f565b5b60006154fd85828601614b9f565b925050602061550e858286016154c3565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061555f57607f821691505b60208210810361557257615571615518565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006155b282614a16565b91506155bd83614a16565b92508282039050818111156155d5576155d4615578565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061561582614a16565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361564757615646615578565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b6000600883026156b77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82615677565b6156c18683615677565b95508019841693508086168417925050509392505050565b6000819050919050565b60006156fe6156f96156f484614a16565b6156d9565b614a16565b9050919050565b6000819050919050565b615718836156e3565b61572c61572482615705565b848454615687565b825550505050565b600090565b615741615734565b61574c81848461570f565b505050565b5b8181101561577057615765600082615739565b600181019050615752565b5050565b601f8211156157b55761578681615652565b61578f84615667565b8101602085101561579e578190505b6157b26157aa85615667565b830182615751565b50505b505050565b60008160020a8304905092915050565b60006157db600019846008026157ba565b1980831691505092915050565b60006157f483836157ca565b9150826002028217905092915050565b61580d82614c78565b67ffffffffffffffff81111561582657615825614cf9565b5b6158308254615547565b61583b828285615774565b600060209050601f83116001811461586e576000841561585c578287015190505b61586685826157e8565b8655506158ce565b601f19841661587c86615652565b60005b828110156158a45784890151825560018201915060208501945060208101905061587f565b868310156158c157848901516158bd601f8916826157ca565b8355505b6001600288020188555050505b505050505050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b600061590c600a8361496f565b9150615917826158d6565b602082019050919050565b6000602082019050818103600083015261593b816158ff565b9050919050565b600061594d82614a16565b915061595883614a16565b92508282019050808211156159705761596f615578565b5b92915050565b6000819050602082019050919050565b60006159928251614b7e565b80915050919050565b60006159a682614c78565b826159b084615976565b90506159bb81615986565b925060208210156159fb576159f67fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802615677565b831692505b5050919050565b6000615a0d82614a16565b9150615a1883614a16565b9250828202615a2681614a16565b91508282048414831517615a3d57615a3c615578565b5b5092915050565b6000615a4f826150a9565b9150615a5a836150a9565b9250828201905060ff811115615a7357615a72615578565b5b92915050565b7f4552525f53504152534500000000000000000000000000000000000000000000600082015250565b6000615aaf600a8361496f565b9150615aba82615a79565b602082019050919050565b60006020820190508181036000830152615ade81615aa2565b9050919050565b7f4552525f43415050454400000000000000000000000000000000000000000000600082015250565b6000615b1b600a8361496f565b9150615b2682615ae5565b602082019050919050565b60006020820190508181036000830152615b4a81615b0e565b9050919050565b7f4552525f4341505f4c4f57000000000000000000000000000000000000000000600082015250565b6000615b87600b8361496f565b9150615b9282615b51565b602082019050919050565b60006020820190508181036000830152615bb681615b7a565b9050919050565b7f4552525f5052454649585f544f4f5f4c4f4e4700000000000000000000000000600082015250565b6000615bf360138361496f565b9150615bfe82615bbd565b602082019050919050565b60006020820190508181036000830152615c2281615be6565b9050919050565b6000615c34826150a9565b9150615c3f836150a9565b9250828202615c4d816150a9565b9150808214615c5f57615c5e615578565b5b5092915050565b6000615c71826150a9565b915060008203615c8457615c83615578565b5b600182039050919050565b6000615c9a826150a9565b9150615ca5836150a9565b9250828203905060ff811115615cbe57615cbd615578565b5b92915050565b6000615cd082516150c5565b80915050919050565b6000615ce482614c78565b82615cee84615976565b9050615cf981615cc4565b92506010821015615d3957615d347fffffffffffffffffffffffffffffffff0000000000000000000000000000000083601003600802615677565b831692505b5050919050565b6000615d4b82614f97565b9150615d5683614f97565b9250828201905065ffffffffffff811115615d7457615d73615578565b5b92915050565b600081519050615d8981614aff565b92915050565b600060208284031215615da557615da461489f565b5b6000615db384828501615d7a565b9150509291505056fea2646970667358221220e3ecd63913c2c2b0049a2a85bd8a6c9217553ce71f3579d5e3a4e2f26b14dcf364736f6c63430008120033
-\ No newline at end of file
+60806040523480156200001157600080fd5b50604051620072af380380620072af833981810160405281019062000037919062000afe565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550816009908162000088919062000dd4565b5080600a90816200009a919062000dd4565b50620000ee602060126040518060400160405280600681526020017f736861323536000000000000000000000000000000000000000000000000000081525062000174640100000000026401000000009004565b6200010960126200044b640100000000026401000000009004565b602067ffffffffffffffff8111156200012757620001266200099a565b5b6040519080825280601f01601f1916602001820160405280156200015a5781602001600182028036833780820191505090505b50601190816200016b919062000f2b565b505050620013ad565b6060819050601081511115620001c1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001b89062001073565b60405180910390fd5b620001cb62000905565b6000600790505b60008160ff16106200022f576000600882620001ef9190620010d1565b60ff1660ff9060020a029050600086821667ffffffffffffffff1611156200021857506200022f565b8180620002259062001117565b92505050620001d2565b6001816200023e919062001145565b826020019060ff16908160ff1681525050600881600762000260919062001181565b6200026c9190620010d1565b60ff168567ffffffffffffffff169060020a02780100000000000000000000000000000000000000000000000002826080019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250508251826040019060ff16908160ff168152505082620002fa9062001210565b82606001906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff19168152505085826000019060ff16908160ff168152505081600f60008767ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060808201518160000160136101000a81548167ffffffffffffffff0219169083780100000000000000000000000000000000000000000000000090040217905550905050505050505050565b6000600f6000838152602001908152602001600020905060008160000160009054906101000a900460ff1660ff16116200048457600080fd5b816010819055508060000160009054906101000a900460ff1660ff1667ffffffffffffffff811115620004bc57620004bb6200099a565b5b6040519080825280601f01601f191660200182016040528015620004ef5781602001600182028036833780820191505090505b506011908162000500919062000f2b565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c6200053b62000556640100000000026401000000009004565b6040516200054a9190620012d2565b60405180910390a15050565b606062000607601054601180546200056e9062000bbd565b80601f01602080910402602001604051908101604052809291908181526020018280546200059c9062000bbd565b8015620005ed5780601f10620005c157610100808354040283529160200191620005ed565b820191906000526020600020905b815481529060010190602001808311620005cf57829003601f168201915b50505050506200060c640100000000026401000000009004565b905090565b606060006060600f600086815260200190815260200160002091508160000160019054906101000a900460ff1660ff168260000160009054906101000a900460ff1660ff1685516200065f9190620012f6565b6200066b9190620012f6565b67ffffffffffffffff8111156200068757620006866200099a565b5b6040519080825280601f01601f191660200182016040528015620006ba5781602001600182028036833780820191505090505b50905060005b8260000160019054906101000a900460ff1660ff168110156200079a578260000160139054906101000a900478010000000000000000000000000000000000000000000000000281600881106200071c576200071b62001331565b5b1a7f01000000000000000000000000000000000000000000000000000000000000000282828151811062000755576200075462001331565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080620007919062001360565b915050620006c0565b8260000160009054906101000a900460ff167f010000000000000000000000000000000000000000000000000000000000000002828281518110620007e457620007e362001331565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080620008209062001360565b91505060005b8551811015620008f85785818151811062000846576200084562001331565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000028382846200089f9190620012f6565b81518110620008b357620008b262001331565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080620008ef9062001360565b91505062000826565b5081935050505092915050565b6040518060a00160405280600060ff168152602001600060ff168152602001600060ff16815260200160006fffffffffffffffffffffffffffffffff19168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff191681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620009d48262000989565b810181811067ffffffffffffffff82111715620009f657620009f56200099a565b5b80604052505050565b600062000a0b6200096b565b905062000a198282620009c9565b919050565b600067ffffffffffffffff82111562000a3c5762000a3b6200099a565b5b62000a478262000989565b9050602081019050919050565b60005b8381101562000a7457808201518184015260208101905062000a57565b60008484015250505050565b600062000a9762000a918462000a1e565b620009ff565b90508281526020810184848401111562000ab65762000ab562000984565b5b62000ac384828562000a54565b509392505050565b600082601f83011262000ae35762000ae26200097f565b5b815162000af584826020860162000a80565b91505092915050565b6000806040838503121562000b185762000b1762000975565b5b600083015167ffffffffffffffff81111562000b395762000b386200097a565b5b62000b478582860162000acb565b925050602083015167ffffffffffffffff81111562000b6b5762000b6a6200097a565b5b62000b798582860162000acb565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000bd657607f821691505b60208210810362000bec5762000beb62000b8e565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000c597fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000c17565b62000c65868362000c17565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000cb262000cac62000ca68462000c7d565b62000c87565b62000c7d565b9050919050565b6000819050919050565b62000cce8362000c91565b62000ce662000cdd8262000cb9565b84845462000c27565b825550505050565b600090565b62000cfd62000cee565b62000d0a81848462000cc3565b505050565b5b8181101562000d325762000d2660008262000cf3565b60018101905062000d10565b5050565b601f82111562000d815762000d4b8162000bf2565b62000d568462000c07565b8101602085101562000d66578190505b62000d7e62000d758562000c07565b83018262000d0f565b50505b505050565b60008160020a8304905092915050565b600062000da96000198460080262000d86565b1980831691505092915050565b600062000dc4838362000d96565b9150826002028217905092915050565b62000ddf8262000b83565b67ffffffffffffffff81111562000dfb5762000dfa6200099a565b5b62000e07825462000bbd565b62000e1482828562000d36565b600060209050601f83116001811462000e4c576000841562000e37578287015190505b62000e43858262000db6565b86555062000eb3565b601f19841662000e5c8662000bf2565b60005b8281101562000e865784890151825560018201915060208501945060208101905062000e5f565b8683101562000ea6578489015162000ea2601f89168262000d96565b8355505b6001600288020188555050505b505050505050565b600081519050919050565b60008190508160005260206000209050919050565b601f82111562000f265762000ef08162000ec6565b62000efb8462000c07565b8101602085101562000f0b578190505b62000f2362000f1a8562000c07565b83018262000d0f565b50505b505050565b62000f368262000ebb565b67ffffffffffffffff81111562000f525762000f516200099a565b5b62000f5e825462000bbd565b62000f6b82828562000edb565b600060209050601f83116001811462000fa3576000841562000f8e578287015190505b62000f9a858262000db6565b8655506200100a565b601f19841662000fb38662000ec6565b60005b8281101562000fdd5784890151825560018201915060208501945060208101905062000fb6565b8683101562000ffd578489015162000ff9601f89168262000d96565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4552525f5052454649585f544f4f5f4c4f4e4700000000000000000000000000600082015250565b60006200105b60138362001012565b9150620010688262001023565b602082019050919050565b600060208201905081810360008301526200108e816200104c565b9050919050565b600060ff82169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620010de8262001095565b9150620010eb8362001095565b9250828202620010fb8162001095565b915080821462001110576200110f620010a2565b5b5092915050565b6000620011248262001095565b9150600082036200113a5762001139620010a2565b5b600182039050919050565b6000620011528262001095565b91506200115f8362001095565b9250828201905060ff8111156200117b576200117a620010a2565b5b92915050565b60006200118e8262001095565b91506200119b8362001095565b9250828203905060ff811115620011b757620011b6620010a2565b5b92915050565b6000819050602082019050919050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b6000620012078251620011cd565b80915050919050565b60006200121d8262000ebb565b826200122984620011bd565b90506200123681620011f9565b925060108210156200127957620012747fffffffffffffffffffffffffffffffff000000000000000000000000000000008360100360080262000c17565b831692505b5050919050565b600082825260208201905092915050565b60006200129e8262000ebb565b620012aa818562001280565b9350620012bc81856020860162000a54565b620012c78162000989565b840191505092915050565b60006020820190508181036000830152620012ee818462001291565b905092915050565b6000620013038262000c7d565b9150620013108362000c7d565b92508282019050808211156200132b576200132a620010a2565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006200136d8262000c7d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620013a257620013a1620010a2565b5b600182019050919050565b615ef280620013bd6000396000f3fe60806040526004361061026e576000357c01000000000000000000000000000000000000000000000000000000009004806386e90b5911610156578063c6eba7c4116100d3578063e985e9c511610097578063e985e9c51461099f578063f117e173146109dc578063f2fde38b14610a19578063f70a3de814610a56578063f9613ab214610a93578063f9f356e514610ad05761026e565b8063c6eba7c414610896578063c87b56dd146108bf578063d824ee4f146108fc578063da2824a814610939578063e8a7f4c5146109625761026e565b8063a5d6f2091161011a578063a5d6f20914610794578063adf288df146107d5578063b5fdeb2314610812578063b88d4fde1461083d578063c5bec6fc146108595761026e565b806386e90b59146106af5780638da5cb5b146106ec57806395d89b41146107175780639a7c5e9f14610742578063a22cb4651461076b5761026e565b806340c84b0e116101ef5780635344299a116101b35780635344299a14610566578063559f5dc91461058f5780635ae06f7e146105cf5780636352211e146105f85780636b9cb86a1461063557806370a08231146106725761026e565b806340c84b0e1461047c57806342842e0e146104a757806349f2553a146104c35780634f64b2be146104ec5780634f6ccce7146105295761026e565b80631f8cf649116102365780631f8cf6491461038057806323b872dd146103a957806324e0febc146103c55780632b29ba23146104025780632f745c591461043f5761026e565b806301ffc9a71461027357806306fdde03146102b0578063081812fc146102db578063150b7a021461031857806318160ddd14610355575b600080fd5b34801561027f57600080fd5b5061029a6004803603810190610295919061497b565b610b0d565b6040516102a791906149c3565b60405180910390f35b3480156102bc57600080fd5b506102c5610c61565b6040516102d29190614a6e565b60405180910390f35b3480156102e757600080fd5b5061030260048036038101906102fd9190614ac6565b610cef565b60405161030f9190614b34565b60405180910390f35b34801561032457600080fd5b5061033f600480360381019061033a9190614cb0565b610d2c565b60405161034c9190614d42565b60405180910390f35b34801561036157600080fd5b5061036a610d5c565b6040516103779190614d6c565b60405180910390f35b34801561038c57600080fd5b506103a760048036038101906103a29190614ea1565b610d69565b005b6103c360048036038101906103be9190614f10565b61102b565b005b3480156103d157600080fd5b506103ec60048036038101906103e79190614f99565b611096565b6040516103f99190614fd5565b60405180910390f35b34801561040e57600080fd5b5061042960048036038101906104249190614ff0565b6110ae565b60405161043691906149c3565b60405180910390f35b34801561044b57600080fd5b506104666004803603810190610461919061501d565b61115a565b6040516104739190614d6c565b60405180910390f35b34801561048857600080fd5b5061049161117f565b60405161049e91906150b2565b60405180910390f35b6104c160048036038101906104bc9190614f10565b61120d565b005b3480156104cf57600080fd5b506104ea60048036038101906104e591906150d4565b611278565b005b3480156104f857600080fd5b50610513600480360381019061050e9190614ac6565b611590565b6040516105209190614fd5565b60405180910390f35b34801561053557600080fd5b50610550600480360381019061054b9190614ac6565b6115b4565b60405161055d9190614d6c565b60405180910390f35b34801561057257600080fd5b5061058d6004803603810190610588919061511d565b6115d8565b005b34801561059b57600080fd5b506105b660048036038101906105b19190615166565b611664565b6040516105c694939291906151c7565b60405180910390f35b3480156105db57600080fd5b506105f660048036038101906105f19190614ff0565b6116eb565b005b34801561060457600080fd5b5061061f600480360381019061061a9190614ac6565b61180a565b60405161062c9190614b34565b60405180910390f35b34801561064157600080fd5b5061065c6004803603810190610657919061511d565b611846565b6040516106699190614a6e565b60405180910390f35b34801561067e57600080fd5b5061069960048036038101906106949190614ff0565b611a5f565b6040516106a69190614d6c565b60405180910390f35b3480156106bb57600080fd5b506106d660048036038101906106d1919061511d565b611aa8565b6040516106e39190614a6e565b60405180910390f35b3480156106f857600080fd5b50610701611d53565b60405161070e9190614b34565b60405180910390f35b34801561072357600080fd5b5061072c611d77565b6040516107399190614a6e565b60405180910390f35b34801561074e57600080fd5b5061076960048036038101906107649190614ac6565b611e05565b005b34801561077757600080fd5b50610792600480360381019061078d9190615238565b611ef6565b005b3480156107a057600080fd5b506107bb60048036038101906107b69190614ac6565b612198565b6040516107cc9594939291906152fd565b60405180910390f35b3480156107e157600080fd5b506107fc60048036038101906107f79190615350565b612237565b6040516108099190614fd5565b60405180910390f35b34801561081e57600080fd5b5061082761258d565b60405161083491906150b2565b60405180910390f35b61085760048036038101906108529190614cb0565b61262a565b005b34801561086557600080fd5b50610880600480360381019061087b919061511d565b612705565b60405161088d91906150b2565b60405180910390f35b3480156108a257600080fd5b506108bd60048036038101906108b891906153f6565b612abe565b005b3480156108cb57600080fd5b506108e660048036038101906108e19190614ac6565b612c76565b6040516108f39190614a6e565b60405180910390f35b34801561090857600080fd5b50610923600480360381019061091e9190615449565b612dc9565b6040516109309190614fd5565b60405180910390f35b34801561094557600080fd5b50610960600480360381019061095b9190614ff0565b61306e565b005b34801561096e57600080fd5b506109896004803603810190610984919061511d565b613156565b60405161099691906150b2565b60405180910390f35b3480156109ab57600080fd5b506109c660048036038101906109c1919061549c565b61350f565b6040516109d391906149c3565b60405180910390f35b3480156109e857600080fd5b50610a0360048036038101906109fe91906154dc565b6135a7565b604051610a109190614fd5565b60405180910390f35b348015610a2557600080fd5b50610a406004803603810190610a3b9190614ff0565b613751565b604051610a4d91906149c3565b60405180910390f35b348015610a6257600080fd5b50610a7d6004803603810190610a78919061557c565b6137f5565b604051610a8a91906149c3565b60405180910390f35b348015610a9f57600080fd5b50610aba6004803603810190610ab59190614f99565b613b23565b604051610ac79190614fd5565b60405180910390f35b348015610adc57600080fd5b50610af76004803603810190610af291906155bc565b613bcf565b604051610b0491906150b2565b60405180910390f35b60006380ac58cd7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b615760019050610c5c565b635b5e139f7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610bb35760019050610c5c565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c055760019050610c5c565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c575760019050610c5c565b600090505b919050565b60098054610c6e90615647565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9a90615647565b8015610ce75780601f10610cbc57610100808354040283529160200191610ce7565b820191906000526020600020905b815481529060010190602001808311610cca57829003601f168201915b505050505081565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600063150b7a027c0100000000000000000000000000000000000000000000000000000000029050949350505050565b6000600680549050905090565b6060819050601081511115610db3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610daa906156c4565b60405180910390fd5b610dbb61486d565b6000600790505b60008160ff1610610e17576000600882610ddc9190615713565b60ff1660ff9060020a029050600086821667ffffffffffffffff161115610e035750610e17565b8180610e0e90615750565b92505050610dc2565b600181610e249190615779565b826020019060ff16908160ff16815250506008816007610e4491906157ae565b610e4e9190615713565b60ff168567ffffffffffffffff169060020a02780100000000000000000000000000000000000000000000000002826080019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250508251826040019060ff16908160ff168152505082610eda90615818565b82606001906fffffffffffffffffffffffffffffffff191690816fffffffffffffffffffffffffffffffff19168152505085826000019060ff16908160ff168152505081600f60008767ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a8154816fffffffffffffffffffffffffffffffff02191690837001000000000000000000000000000000009004021790555060808201518160000160136101000a81548167ffffffffffffffff0219169083780100000000000000000000000000000000000000000000000090040217905550905050505050505050565b611036838383613ea5565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60056020528060005260406000206000915090505481565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611153575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b600c602052816000526040600020602052806000526040600020600091509150505481565b600b805461118c90615647565b80601f01602080910402602001604051908101604052809291908181526020018280546111b890615647565b80156112055780601f106111da57610100808354040283529160200191611205565b820191906000526020600020905b8154815290600101906020018083116111e857829003601f168201915b505050505081565b611218838383613ea5565b808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112d557600080fd5b82915081519050602f7f0100000000000000000000000000000000000000000000000000000000000000028260018361130e919061587f565b8151811061131f5761131e6158b3565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461139f57808061139b906158e2565b9150505b8067ffffffffffffffff8111156113b9576113b8614b85565b5b6040519080825280601f01601f1916602001820160405280156113eb5781602001600182028036833780820191505090505b50600b90816113fa9190615acc565b5060005b82518110156114eb5782818151811061141a576114196158b3565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002600b82815461147290615647565b8110611481576114806158b3565b5b8154600116156114a05790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f01000000000000000000000000000000000000000000000000000000000000008404021790555080806114e3906158e2565b9150506113fe565b508151811461158b577f2f00000000000000000000000000000000000000000000000000000000000000600b8351815461152490615647565b8110611533576115326158b3565b5b8154600116156115525790600052602060002090602091828204019190065b601f036101000a81548160ff021916907f0100000000000000000000000000000000000000000000000000000000000000840402179055505b505050565b600381815481106115a057600080fd5b906000526020600020016000915090505481565b600681815481106115c457600080fd5b906000526020600020016000915090505481565b6000600f6000601054815260200190815260200160002090508060000160009054906101000a900460ff1660ff1682511461161257600080fd5b81601190816116219190615acc565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c61164b61258d565b60405161165891906150b2565b60405180910390a15050565b6004602052816000526040600020818154811061168057600080fd5b90600052602060002001600091509150508060000160009054906101000a900465ffffffffffff16908060000160069054906101000a900465ffffffffffff169080600001600c9054906101000a900460ff169080600001600d9054906101000a900460ff16905084565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611770575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6117af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a690615bea565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080600560008460010281526020019081526020016000205490506060819060020a026c010000000000000000000000009004915050919050565b6060806060600061185685613156565b9150600b805461186590615647565b905090508082516118769190615c0a565b67ffffffffffffffff81111561188f5761188e614b85565b5b6040519080825280601f01601f1916602001820160405280156118c15781602001600182028036833780820191505090505b50925060005b8181101561198657600b8181546118dd90615647565b81106118ec576118eb6158b3565b5b81546001161561190b5790600052602060002090602091828204019190065b9054901a7f010000000000000000000000000000000000000000000000000000000000000002848281518110611944576119436158b3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061197e906158e2565b9150506118c7565b5060005b8251811015611a53578281815181106119a6576119a56158b3565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002848381518110611a0357611a026158b3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508180611a3d906158e2565b9250508080611a4b906158e2565b91505061198a565b50829350505050919050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b606060006060806000611aba86612705565b9150600f6000601054815260200190815260200160002093508360000160029054906101000a900460ff1660ff1690506001825182611af99190615c0a565b611b039190615c0a565b67ffffffffffffffff811115611b1c57611b1b614b85565b5b6040519080825280601f01601f191660200182016040528015611b4e5781602001600182028036833780820191505090505b50925060005b81811015611c08578460000160039054906101000a9004700100000000000000000000000000000000028160108110611b9057611b8f6158b3565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002848281518110611bc657611bc56158b3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611c00906158e2565b915050611b54565b50603a7f010000000000000000000000000000000000000000000000000000000000000002838281518110611c4057611c3f6158b3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611c7a906158e2565b91505060005b8251811015611d4657828181518110611c9c57611c9b6158b3565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002848284611cf39190615c0a565b81518110611d0457611d036158b3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080611d3e906158e2565b915050611c80565b5082945050505050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a8054611d8490615647565b80601f0160208091040260200160405190810160405280929190818152602001828054611db090615647565b8015611dfd5780601f10611dd257610100808354040283529160200191611dfd565b820191906000526020600020905b815481529060010190602001808311611de057829003601f168201915b505050505081565b6000600f6000838152602001908152602001600020905060008160000160009054906101000a900460ff1660ff1611611e3d57600080fd5b816010819055508060000160009054906101000a900460ff1660ff1667ffffffffffffffff811115611e7257611e71614b85565b5b6040519080825280601f01601f191660200182016040528015611ea45781602001600182028036833780820191505090505b5060119081611eb39190615acc565b507f502ae868d71f78c5d099f033dd3007a4f58aebb3a2816544fe690f8b9604b56c611edd61258d565b604051611eea91906150b2565b60405180910390a15050565b801561201757600073ffffffffffffffffffffffffffffffffffffffff16600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f9457600080fd5b81600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061212f565b600073ffffffffffffffffffffffffffffffffffffffff16600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036120af57600080fd5b6000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161218c91906149c3565b60405180910390a35050565b600f6020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900460ff16908060000160029054906101000a900460ff16908060000160039054906101000a900470010000000000000000000000000000000002908060000160139054906101000a9004780100000000000000000000000000000000000000000000000002905085565b60008060008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806122e05750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6122e957600080fd5b600160046000878152602001908152602001600020805490501461230c57600080fd5b600060046000878152602001908152602001600020600081548110612334576123336158b3565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff161461236657600080fd5b600060010260056000878152602001908152602001600020541461238957600080fd5b8573ffffffffffffffffffffffffffffffffffffffff1692507fc0000000000000000000000000000000000000000000000000000000000000008317925082600102600560008781526020019081526020016000208190555084600190049150600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080600d60008481526020019081526020016000208190555081600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055506001600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124e89190615c0a565b925050819055506006856001900490806001815401808255809150506001900390600052602060002001600090919091909150558573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8846040516125799190614d6c565b60405180910390a384935050505092915050565b6060612625601054601180546125a290615647565b80601f01602080910402602001604051908101604052809291908181526020018280546125ce90615647565b801561261b5780601f106125f05761010080835404028352916020019161261b565b820191906000526020600020905b8154815290600101906020018083116125fe57829003601f168201915b5050505050613bcf565b905090565b612635848484613ea5565b818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f75c9e114f073c346aac7d1d7e9a3c3c14edabcdd27de07d1d9e425f45d318c5e846126ea90615c53565b6040516126f79190614fd5565b60405180910390a450505050565b606080600080600285516127199190615cba565b67ffffffffffffffff81111561273257612731614b85565b5b6040519080825280601f01601f1916602001820160405280156127645781602001600182028036833780820191505090505b5092506000905060005b6020811015612ab257600460f087838151811061278e5761278d6158b3565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff16101561288d576030836128249190615779565b7f010000000000000000000000000000000000000000000000000000000000000002848381518110612859576128586158b3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506128ff565b60578361289a9190615779565b7f0100000000000000000000000000000000000000000000000000000000000000028483815181106128cf576128ce6158b3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f868281518110612914576129136158b3565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff161015612a125760308361299d9190615779565b7f010000000000000000000000000000000000000000000000000000000000000002846001846129cd9190615c0a565b815181106129de576129dd6158b3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612a90565b605783612a1f9190615779565b7f01000000000000000000000000000000000000000000000000000000000000000284600184612a4f9190615c0a565b81518110612a6057612a5f6158b3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600282612a9d9190615c0a565b91508080612aaa906158e2565b91505061276e565b50829350505050919050565b6000600460008581526020019081526020016000208361ffff1681548110612ae957612ae86158b3565b5b90600052602060002001905080600001600c9054906101000a900460ff1615612b47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3e90615d48565b60405180910390fd5b80600001600d9054906101000a900460ff1615612b99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9090615db4565b60405180910390fd5b60008265ffffffffffff1603612bc3578060000160069054906101000a900465ffffffffffff1691505b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168265ffffffffffff161015612c2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2390615e20565b60405180910390fd5b818160000160006101000a81548165ffffffffffff021916908365ffffffffffff160217905550600181600001600d6101000a81548160ff02191690831515021790555050505050565b6060600060608360010291506000600460008481526020019081526020016000208054905003612cac57612ca982613b23565b91505b6000600460008481526020019081526020016000208054905011612ccf57600080fd5b602067ffffffffffffffff811115612cea57612ce9614b85565b5b6040519080825280601f01601f191660200182016040528015612d1c5781602001600182028036833780820191505090505b50905060005b6020811015612db657828160208110612d3e57612d3d6158b3565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002828281518110612d7457612d736158b3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080612dae906158e2565b915050612d22565b50612dc081611846565b92505050919050565b600080600460008581526020019081526020016000208361ffff1681548110612df557612df46158b3565b5b90600052602060002001905080600001600c9054906101000a900460ff1615612e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4a90615d48565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612ef65750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612f35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2c90615bea565b60405180910390fd5b60008361ffff16148015612f67575060008160000160009054906101000a900465ffffffffffff1665ffffffffffff16145b8015612f81575080600001600d9054906101000a900460ff165b15612fe05760018160000160068282829054906101000a900465ffffffffffff16612fac9190615e40565b92506101000a81548165ffffffffffff021916908365ffffffffffff160217905550612fd88585612237565b915050613067565b80600001600d9054906101000a900460ff1615613040578060000160009054906101000a900465ffffffffffff1665ffffffffffff168160000160069054906101000a900465ffffffffffff1665ffffffffffff161061303f57600080fd5b5b6130638585858460000160069054906101000a900465ffffffffffff16856143c0565b9150505b9392505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146130fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f390615bea565b60405180910390fd5b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6060806000806002855161316a9190615cba565b67ffffffffffffffff81111561318357613182614b85565b5b6040519080825280601f01601f1916602001820160405280156131b55781602001600182028036833780820191505090505b5092506000905060005b602081101561350357600460f08783815181106131df576131de6158b3565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090041660ff16908060020a82049150509250600a8360ff1610156132de576030836132759190615779565b7f0100000000000000000000000000000000000000000000000000000000000000028483815181106132aa576132a96158b3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613350565b6057836132eb9190615779565b7f0100000000000000000000000000000000000000000000000000000000000000028483815181106133205761331f6158b3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b600f868281518110613365576133646158b3565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004169250600a8360ff161015613463576030836133ee9190615779565b7f0100000000000000000000000000000000000000000000000000000000000000028460018461341e9190615c0a565b8151811061342f5761342e6158b3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506134e1565b6057836134709190615779565b7f010000000000000000000000000000000000000000000000000000000000000002846001846134a09190615c0a565b815181106134b1576134b06158b3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b6002826134ee9190615c0a565b915080806134fb906158e2565b9150506131bf565b50829350505050919050565b60008173ffffffffffffffffffffffffffffffffffffffff16600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600080600460008681526020019081526020016000208461ffff16815481106135d3576135d26158b3565b5b90600052602060002001905060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806136825750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6136c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136b890615bea565b60405180910390fd5b60008160000160009054906101000a900465ffffffffffff1665ffffffffffff16116136ec57600080fd5b80600001600d9054906101000a900460ff1661370757600080fd5b8060000160009054906101000a900465ffffffffffff1665ffffffffffff168365ffffffffffff161061373957600080fd5b61374686868686856143c0565b915050949350505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146137ac57600080fd5b816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061389b5750600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6138da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138d190615bea565b60405180910390fd5b6138e26148d3565b60046000868152602001908152602001600020805490509150600082111561395f5760006004600087815260200190815260200160002060008154811061392c5761392b6158b3565b5b9060005260206000200160000160009054906101000a900465ffffffffffff1665ffffffffffff161161395e57600080fd5b5b60008460050b036139805760018160600190151590811515815250506139bb565b60008460050b13156139ba5783816000019065ffffffffffff16908165ffffffffffff168152505060018160600190151590811515815250505b5b60046000868152602001908152602001600020819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548165ffffffffffff021916908365ffffffffffff16021790555060208201518160000160066101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001600c6101000a81548160ff021916908315150217905550606082015181600001600d6101000a81548160ff0219169083151502179055505050600385908060018154018082558091505060019003906000526020600020016000909190919091505580606001511515816000015165ffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f77d96978d8b40ac826d1984d992e71a84672e62d825fda78cd646656481d065b88604051613b0f9190614fd5565b60405180910390a460019250505092915050565b60008060056000848152602001908152602001600020549050613b4581614778565b613b4e57600080fd5b613b57816147aa565b15613b655782915050613bca565b7effffffffffffffff00000000000000000000000000000000000000000000006001028116905060b881908060020a820491505090507fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000600102831681179050809150505b919050565b606060006060600f600086815260200190815260200160002091508160000160019054906101000a900460ff1660ff168260000160009054906101000a900460ff1660ff168551613c209190615c0a565b613c2a9190615c0a565b67ffffffffffffffff811115613c4357613c42614b85565b5b6040519080825280601f01601f191660200182016040528015613c755781602001600182028036833780820191505090505b50905060005b8260000160019054906101000a900460ff1660ff16811015613d4b578260000160139054906101000a90047801000000000000000000000000000000000000000000000000028160088110613cd357613cd26158b3565b5b1a7f010000000000000000000000000000000000000000000000000000000000000002828281518110613d0957613d086158b3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080613d43906158e2565b915050613c7b565b8260000160009054906101000a900460ff167f010000000000000000000000000000000000000000000000000000000000000002828281518110613d9257613d916158b3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080613dcc906158e2565b91505060005b8551811015613e9857858181518110613dee57613ded6158b3565b5b60200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002838284613e459190615c0a565b81518110613e5657613e556158b3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080613e90906158e2565b915050613dd2565b5081935050505092915050565b60008060003073ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401613eff9190614d6c565b602060405180830381865afa158015613f1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f409190615e8f565b92508573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613f7a57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146140ae573373ffffffffffffffffffffffffffffffffffffffff166007600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806140a457503373ffffffffffffffffffffffffffffffffffffffff16600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b6140ad57600080fd5b5b60006007600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061410b84866147dc565b600d60008581526020019081526020016000205491506001600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461416d919061587f565b90508181111561421d57600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082815260200190815260200160002054600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020819055505b6000600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550600e60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083600c60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055506001600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461435a919061587f565b925050819055506001600e60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546143b19190615c0a565b92505081905550505050505050565b60008060008060007fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008960019004169350603067ffffffffffffffff8961ffff161667ffffffffffffffff169060020a0267ffffffffffffffff16841793508665ffffffffffff1684179350836001029150600060010260056000848152602001908152602001600020541461445557600080fd5b85600001600c9054906101000a900460ff166144b7578560000160069054906101000a900465ffffffffffff1665ffffffffffff168765ffffffffffff16146144b657600186600001600c6101000a81548160ff0219169083151502179055505b5b67ffffffffffffffff896001900416925060b8839060020a0292507f8000000000000000000000000000000000000000000000000000000000000000831792508973ffffffffffffffffffffffffffffffffffffffff168317925060018660000160068282829054906101000a900465ffffffffffff166145389190615e40565b92506101000a81548165ffffffffffff021916908365ffffffffffff16021790555085600001600d9054906101000a900460ff166145b95760018660000160008282829054906101000a900465ffffffffffff166145969190615e40565b92506101000a81548165ffffffffffff021916908365ffffffffffff1602179055505b826001026005600084815260200190815260200160002081905550600e60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080600d60008681526020019081526020016000208190555083600c60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055506001600e60008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546146d39190615c0a565b9250508190555060068490806001815401808255809150506001900390600052602060002001600090919091909150558973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8866040516147609190614d6c565b60405180910390a38194505050505095945050505050565b6000807f8000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b6000807f4000000000000000000000000000000000000000000000000000000000000000836001900416119050919050565b60008083600102905060056000828152602001908152602001600020546001900491506000820361480c57600080fd5b7fffffffffffffffffffffffff0000000000000000000000000000000000000000821691508273ffffffffffffffffffffffffffffffffffffffff168217915081600102600560008381526020019081526020016000208190555050505050565b6040518060a00160405280600060ff168152602001600060ff168152602001600060ff16815260200160006fffffffffffffffffffffffffffffffff19168152602001600077ffffffffffffffffffffffffffffffffffffffffffffffff191681525090565b6040518060800160405280600065ffffffffffff168152602001600065ffffffffffff1681526020016000151581526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61495881614923565b811461496357600080fd5b50565b6000813590506149758161494f565b92915050565b60006020828403121561499157614990614919565b5b600061499f84828501614966565b91505092915050565b60008115159050919050565b6149bd816149a8565b82525050565b60006020820190506149d860008301846149b4565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614a185780820151818401526020810190506149fd565b60008484015250505050565b6000601f19601f8301169050919050565b6000614a40826149de565b614a4a81856149e9565b9350614a5a8185602086016149fa565b614a6381614a24565b840191505092915050565b60006020820190508181036000830152614a888184614a35565b905092915050565b6000819050919050565b614aa381614a90565b8114614aae57600080fd5b50565b600081359050614ac081614a9a565b92915050565b600060208284031215614adc57614adb614919565b5b6000614aea84828501614ab1565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614b1e82614af3565b9050919050565b614b2e81614b13565b82525050565b6000602082019050614b496000830184614b25565b92915050565b614b5881614b13565b8114614b6357600080fd5b50565b600081359050614b7581614b4f565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614bbd82614a24565b810181811067ffffffffffffffff82111715614bdc57614bdb614b85565b5b80604052505050565b6000614bef61490f565b9050614bfb8282614bb4565b919050565b600067ffffffffffffffff821115614c1b57614c1a614b85565b5b614c2482614a24565b9050602081019050919050565b82818337600083830152505050565b6000614c53614c4e84614c00565b614be5565b905082815260208101848484011115614c6f57614c6e614b80565b5b614c7a848285614c31565b509392505050565b600082601f830112614c9757614c96614b7b565b5b8135614ca7848260208601614c40565b91505092915050565b60008060008060808587031215614cca57614cc9614919565b5b6000614cd887828801614b66565b9450506020614ce987828801614b66565b9350506040614cfa87828801614ab1565b925050606085013567ffffffffffffffff811115614d1b57614d1a61491e565b5b614d2787828801614c82565b91505092959194509250565b614d3c81614923565b82525050565b6000602082019050614d576000830184614d33565b92915050565b614d6681614a90565b82525050565b6000602082019050614d816000830184614d5d565b92915050565b600060ff82169050919050565b614d9d81614d87565b8114614da857600080fd5b50565b600081359050614dba81614d94565b92915050565b600067ffffffffffffffff82169050919050565b614ddd81614dc0565b8114614de857600080fd5b50565b600081359050614dfa81614dd4565b92915050565b600067ffffffffffffffff821115614e1b57614e1a614b85565b5b614e2482614a24565b9050602081019050919050565b6000614e44614e3f84614e00565b614be5565b905082815260208101848484011115614e6057614e5f614b80565b5b614e6b848285614c31565b509392505050565b600082601f830112614e8857614e87614b7b565b5b8135614e98848260208601614e31565b91505092915050565b600080600060608486031215614eba57614eb9614919565b5b6000614ec886828701614dab565b9350506020614ed986828701614deb565b925050604084013567ffffffffffffffff811115614efa57614ef961491e565b5b614f0686828701614e73565b9150509250925092565b600080600060608486031215614f2957614f28614919565b5b6000614f3786828701614b66565b9350506020614f4886828701614b66565b9250506040614f5986828701614ab1565b9150509250925092565b6000819050919050565b614f7681614f63565b8114614f8157600080fd5b50565b600081359050614f9381614f6d565b92915050565b600060208284031215614faf57614fae614919565b5b6000614fbd84828501614f84565b91505092915050565b614fcf81614f63565b82525050565b6000602082019050614fea6000830184614fc6565b92915050565b60006020828403121561500657615005614919565b5b600061501484828501614b66565b91505092915050565b6000806040838503121561503457615033614919565b5b600061504285828601614b66565b925050602061505385828601614ab1565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60006150848261505d565b61508e8185615068565b935061509e8185602086016149fa565b6150a781614a24565b840191505092915050565b600060208201905081810360008301526150cc8184615079565b905092915050565b6000602082840312156150ea576150e9614919565b5b600082013567ffffffffffffffff8111156151085761510761491e565b5b61511484828501614e73565b91505092915050565b60006020828403121561513357615132614919565b5b600082013567ffffffffffffffff8111156151515761515061491e565b5b61515d84828501614c82565b91505092915050565b6000806040838503121561517d5761517c614919565b5b600061518b85828601614f84565b925050602061519c85828601614ab1565b9150509250929050565b600065ffffffffffff82169050919050565b6151c1816151a6565b82525050565b60006080820190506151dc60008301876151b8565b6151e960208301866151b8565b6151f660408301856149b4565b61520360608301846149b4565b95945050505050565b615215816149a8565b811461522057600080fd5b50565b6000813590506152328161520c565b92915050565b6000806040838503121561524f5761524e614919565b5b600061525d85828601614b66565b925050602061526e85828601615223565b9150509250929050565b61528181614d87565b82525050565b60007fffffffffffffffffffffffffffffffff0000000000000000000000000000000082169050919050565b6152bc81615287565b82525050565b60007fffffffffffffffff00000000000000000000000000000000000000000000000082169050919050565b6152f7816152c2565b82525050565b600060a0820190506153126000830188615278565b61531f6020830187615278565b61532c6040830186615278565b61533960608301856152b3565b61534660808301846152ee565b9695505050505050565b6000806040838503121561536757615366614919565b5b600061537585828601614b66565b925050602061538685828601614f84565b9150509250929050565b600061ffff82169050919050565b6153a781615390565b81146153b257600080fd5b50565b6000813590506153c48161539e565b92915050565b6153d3816151a6565b81146153de57600080fd5b50565b6000813590506153f0816153ca565b92915050565b60008060006060848603121561540f5761540e614919565b5b600061541d86828701614f84565b935050602061542e868287016153b5565b925050604061543f868287016153e1565b9150509250925092565b60008060006060848603121561546257615461614919565b5b600061547086828701614b66565b935050602061548186828701614f84565b9250506040615492868287016153b5565b9150509250925092565b600080604083850312156154b3576154b2614919565b5b60006154c185828601614b66565b92505060206154d285828601614b66565b9150509250929050565b600080600080608085870312156154f6576154f5614919565b5b600061550487828801614b66565b945050602061551587828801614f84565b9350506040615526878288016153b5565b9250506060615537878288016153e1565b91505092959194509250565b60008160050b9050919050565b61555981615543565b811461556457600080fd5b50565b60008135905061557681615550565b92915050565b6000806040838503121561559357615592614919565b5b60006155a185828601614f84565b92505060206155b285828601615567565b9150509250929050565b600080604083850312156155d3576155d2614919565b5b60006155e185828601614ab1565b925050602083013567ffffffffffffffff8111156156025761560161491e565b5b61560e85828601614c82565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061565f57607f821691505b60208210810361567257615671615618565b5b50919050565b7f4552525f5052454649585f544f4f5f4c4f4e4700000000000000000000000000600082015250565b60006156ae6013836149e9565b91506156b982615678565b602082019050919050565b600060208201905081810360008301526156dd816156a1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061571e82614d87565b915061572983614d87565b925082820261573781614d87565b9150808214615749576157486156e4565b5b5092915050565b600061575b82614d87565b91506000820361576e5761576d6156e4565b5b600182039050919050565b600061578482614d87565b915061578f83614d87565b9250828201905060ff8111156157a8576157a76156e4565b5b92915050565b60006157b982614d87565b91506157c483614d87565b9250828203905060ff8111156157dd576157dc6156e4565b5b92915050565b6000819050602082019050919050565b60006157ff8251615287565b80915050919050565b60008160020a8302905092915050565b60006158238261505d565b8261582d846157e3565b9050615838816157f3565b92506010821015615878576158737fffffffffffffffffffffffffffffffff0000000000000000000000000000000083601003600802615808565b831692505b5050919050565b600061588a82614a90565b915061589583614a90565b92508282039050818111156158ad576158ac6156e4565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006158ed82614a90565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361591f5761591e6156e4565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60006008830261597f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82615808565b6159898683615808565b95508019841693508086168417925050509392505050565b6000819050919050565b60006159c66159c16159bc84614a90565b6159a1565b614a90565b9050919050565b6000819050919050565b6159e0836159ab565b6159f46159ec826159cd565b84845461594f565b825550505050565b600090565b615a096159fc565b615a148184846159d7565b505050565b5b81811015615a3857615a2d600082615a01565b600181019050615a1a565b5050565b601f821115615a7d57615a4e8161592a565b615a578461593f565b81016020851015615a66578190505b615a7a615a728561593f565b830182615a19565b50505b505050565b60008160020a8304905092915050565b6000615aa360001984600802615a82565b1980831691505092915050565b6000615abc8383615a92565b9150826002028217905092915050565b615ad58261505d565b67ffffffffffffffff811115615aee57615aed614b85565b5b615af88254615647565b615b03828285615a3c565b600060209050601f831160018114615b365760008415615b24578287015190505b615b2e8582615ab0565b865550615b96565b601f198416615b448661592a565b60005b82811015615b6c57848901518255600182019150602085019450602081019050615b47565b86831015615b895784890151615b85601f891682615a92565b8355505b6001600288020188555050505b505050505050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b6000615bd4600a836149e9565b9150615bdf82615b9e565b602082019050919050565b60006020820190508181036000830152615c0381615bc7565b9050919050565b6000615c1582614a90565b9150615c2083614a90565b9250828201905080821115615c3857615c376156e4565b5b92915050565b6000615c4a8251614f63565b80915050919050565b6000615c5e8261505d565b82615c68846157e3565b9050615c7381615c3e565b92506020821015615cb357615cae7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802615808565b831692505b5050919050565b6000615cc582614a90565b9150615cd083614a90565b9250828202615cde81614a90565b91508282048414831517615cf557615cf46156e4565b5b5092915050565b7f4552525f53504152534500000000000000000000000000000000000000000000600082015250565b6000615d32600a836149e9565b9150615d3d82615cfc565b602082019050919050565b60006020820190508181036000830152615d6181615d25565b9050919050565b7f4552525f43415050454400000000000000000000000000000000000000000000600082015250565b6000615d9e600a836149e9565b9150615da982615d68565b602082019050919050565b60006020820190508181036000830152615dcd81615d91565b9050919050565b7f4552525f4341505f4c4f57000000000000000000000000000000000000000000600082015250565b6000615e0a600b836149e9565b9150615e1582615dd4565b602082019050919050565b60006020820190508181036000830152615e3981615dfd565b9050919050565b6000615e4b826151a6565b9150615e56836151a6565b9250828201905065ffffffffffff811115615e7457615e736156e4565b5b92915050565b600081519050615e8981614b4f565b92915050565b600060208284031215615ea557615ea4614919565b5b6000615eb384828501615e7a565b9150509291505056fea264697066735822122036de01f0c34ed69e76839e3f19f567768f25c770c15b5a5399b6f98bb3141eb064736f6c63430008120033
+\ 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"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"uint48","name":"_count","type":"uint48"},{"indexed":true,"internalType":"bool","name":"_capped","type":"bool"},{"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":"int48","name":"count","type":"int48"}],"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":[{"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":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"},{"internalType":"uint48","name":"_cap","type":"uint48"}],"name":"setCap","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"},{"internalType":"bool","name":"capped","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"}]
+[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"uint48","name":"_count","type":"uint48"},{"indexed":true,"internalType":"bool","name":"_capped","type":"bool"},{"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":"addMultiCodec","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":"int48","name":"count","type":"int48"}],"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":[{"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":"multiHash","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":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","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":"bytes32","name":"_content","type":"bytes32"},{"internalType":"uint16","name":"_batch","type":"uint16"},{"internalType":"uint48","name":"_cap","type":"uint48"}],"name":"setCap","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":"_data","type":"bytes"}],"name":"toHex","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_codec","type":"uint256"},{"internalType":"bytes","name":"_digest","type":"bytes"}],"name":"toMultiHash","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","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"},{"internalType":"bool","name":"capped","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,7 +105,6 @@ class CraftNFT(ERC721):
return 4000000
- #def constructor(self, sender_address, name, symbol, declaration=ZERO_CONTENT, enumeration=False, tx_format=TxFormat.JSONRPC, version=None):
def constructor(self, sender_address, name, symbol, tx_format=TxFormat.JSONRPC, version=None):
#code = self.cargs(name, symbol, declaration, enumeration, version=version)
code = self.cargs(name, symbol, version=version)
diff --git a/solidity/CraftNFT.sol b/solidity/CraftNFT.sol
@@ -91,7 +91,7 @@ contract CraftNFT {
bytes8 codec;
}
// All registered multicodecs
- mapping (uint256 => MultiHash) public multiCodecs;
+ mapping (uint256 => MultiHash) public multiHash;
uint256 msgCodec;
bytes currentMsg;
@@ -102,7 +102,7 @@ contract CraftNFT {
owner = msg.sender;
name = _name;
symbol = _symbol;
- addCodec(32, 0x12, "sha256");
+ addMultiCodec(32, 0x12, "sha256");
setMsgCodec(0x12);
currentMsg = new bytes(32);
}
@@ -443,6 +443,7 @@ contract CraftNFT {
}
}
+ // Implements cic.Locator
function toURL(bytes memory _data) public view returns(string memory) {
bytes memory out;
bytes memory _hexDigest;
@@ -536,7 +537,7 @@ contract CraftNFT {
}
// Add a multicodec that can later be set as current codec
- function addCodec(uint8 _length, uint64 _codecId, string memory _uriPrefix) public {
+ function addMultiCodec(uint8 _length, uint64 _codecId, string memory _uriPrefix) public {
bytes memory prefixBytes;
prefixBytes = bytes(_uriPrefix);
@@ -558,15 +559,15 @@ contract CraftNFT {
_hsh.prefix = bytes16(prefixBytes);
_hsh.l = _length;
- multiCodecs[uint256(_codecId)] = _hsh;
+ multiHash[uint256(_codecId)] = _hsh;
}
// Generate a multihash from the given digest and current selected multicodec
- function toHash(bytes memory _digest) public view returns(bytes memory) {
+ function toMultiHash(uint256 _codec, bytes memory _digest) public view returns(bytes memory) {
MultiHash storage m;
bytes memory r;
- m = multiCodecs[msgCodec];
+ m = multiHash[_codec];
r = new bytes(_digest.length + m.l + m.codecRLength);
uint256 i = 0;
@@ -584,6 +585,7 @@ contract CraftNFT {
// Generate a URI representing the digest and the string prefix representation
// of the currently selected multicodec
+ // Implements cic.Locator
function toURI(bytes memory _digest) public view returns(string memory) {
MultiHash storage m;
@@ -592,7 +594,7 @@ contract CraftNFT {
uint256 l;
digestHex = toHex(_digest);
- m = multiCodecs[msgCodec];
+ m = multiHash[msgCodec];
l = m.prefixRLength;
codecString = new bytes(l + digestHex.length + 1);
for (uint256 i = 0; i < l; i++) {
@@ -639,7 +641,7 @@ contract CraftNFT {
function setMsgCodec(uint256 _codec) public {
MultiHash storage _hsh;
- _hsh = multiCodecs[_codec];
+ _hsh = multiHash[_codec];
require(_hsh.l > 0);
msgCodec = _codec;
@@ -652,7 +654,7 @@ contract CraftNFT {
function setMsg(bytes memory _digest) public {
MultiHash storage _hsh;
- _hsh = multiCodecs[msgCodec];
+ _hsh = multiHash[msgCodec];
require(_digest.length == _hsh.l);
currentMsg = _digest;
@@ -661,6 +663,16 @@ contract CraftNFT {
// Return a multihash of the latest persistent message
function getMsg() public view returns(bytes memory) {
- return toHash(currentMsg);
+ return toMultiHash(msgCodec, currentMsg);
+ }
+
+ // implements ERC721Receiver
+ function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes memory _data) external pure returns(bytes4) {
+ _operator;
+ _from;
+ _tokenId;
+ _data;
+
+ return bytes4(0x150b7a02);
}
}