60806040523480156200001157600080fd5b50604051620021c5380380620021c58339818101604052810190620000379190620004d0565b600a60009054906101000a900460ff16156200008a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200008190620005e1565b60405180910390fd5b6001600a60006101000a81548160ff0219169083151502179055508360039081620000b691906200084e565b508260049081620000c891906200084e565b506001600981905550682567ac70392b8800006005819055508173ffffffffffffffffffffffffffffffffffffffff16816040516024016200010b919062000946565b6040516020818303038152906040527f02b8a21d000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051620001979190620009b0565b6000604051808303816000865af19150503d8060008114620001d6576040519150601f19603f3d011682016040523d82523d6000602084013e620001db565b606091505b5050508173ffffffffffffffffffffffffffffffffffffffff166040516024016040516020818303038152906040527f25ce9a37000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051620002879190620009b0565b6000604051808303816000865af19150503d8060008114620002c6576040519150601f19603f3d011682016040523d82523d6000602084013e620002cb565b606091505b50505050505050620009c9565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200034182620002f6565b810181811067ffffffffffffffff8211171562000363576200036262000307565b5b80604052505050565b600062000378620002d8565b905062000386828262000336565b919050565b600067ffffffffffffffff821115620003a957620003a862000307565b5b620003b482620002f6565b9050602081019050919050565b60005b83811015620003e1578082015181840152602081019050620003c4565b60008484015250505050565b600062000404620003fe846200038b565b6200036c565b905082815260208101848484011115620004235762000422620002f1565b5b62000430848285620003c1565b509392505050565b600082601f83011262000450576200044f620002ec565b5b815162000462848260208601620003ed565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000498826200046b565b9050919050565b620004aa816200048b565b8114620004b657600080fd5b50565b600081519050620004ca816200049f565b92915050565b60008060008060808587031215620004ed57620004ec620002e2565b5b600085015167ffffffffffffffff8111156200050e576200050d620002e7565b5b6200051c8782880162000438565b945050602085015167ffffffffffffffff81111562000540576200053f620002e7565b5b6200054e8782880162000438565b93505060406200056187828801620004b9565b92505060606200057487828801620004b9565b91505092959194509250565b600082825260208201905092915050565b7f696e697469616c697a6564000000000000000000000000000000000000000000600082015250565b6000620005c9600b8362000580565b9150620005d68262000591565b602082019050919050565b60006020820190508181036000830152620005fc81620005ba565b9050919050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200065657607f821691505b6020821081036200066c576200066b6200060e565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620006d67fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000697565b620006e2868362000697565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200072f620007296200072384620006fa565b62000704565b620006fa565b9050919050565b6000819050919050565b6200074b836200070e565b620007636200075a8262000736565b848454620006a4565b825550505050565b600090565b6200077a6200076b565b6200078781848462000740565b505050565b5b81811015620007af57620007a360008262000770565b6001810190506200078d565b5050565b601f821115620007fe57620007c88162000672565b620007d38462000687565b81016020851015620007e3578190505b620007fb620007f28562000687565b8301826200078c565b50505b505050565b600082821c905092915050565b6000620008236000198460080262000803565b1980831691505092915050565b60006200083e838362000810565b9150826002028217905092915050565b620008598262000603565b67ffffffffffffffff81111562000875576200087462000307565b5b6200088182546200063d565b6200088e828285620007b3565b600060209050601f831160018114620008c65760008415620008b1578287015190505b620008bd858262000830565b8655506200092d565b601f198416620008d68662000672565b60005b828110156200090057848901518255600182019150602085019450602081019050620008d9565b868310156200092057848901516200091c601f89168262000810565b8355505b6001600288020188555050505b505050505050565b62000940816200048b565b82525050565b60006020820190506200095d600083018462000935565b92915050565b600081519050919050565b600081905092915050565b6000620009868262000963565b6200099281856200096e565b9350620009a4818560208601620003c1565b80840191505092915050565b6000620009be828462000979565b915081905092915050565b6117ec80620009d96000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c80634d2fd2431161009757806395d89b411161006657806395d89b41146102b1578063a9059cbb146102cf578063d14ab6ff146102ff578063dd62ed3e1461032f57610100565b80634d2fd24314610229578063511efb411461024557806370a082311461026357806373db01901461029357610100565b806323b872dd116100d357806323b872dd1461018f578063313ce567146101bf5780633252e04f146101dd57806344d58ce5146101f957610100565b806306fdde0314610105578063095ea7b31461012357806316eab96b1461015357806318160ddd14610171575b600080fd5b61010d61035f565b60405161011a9190611082565b60405180910390f35b61013d6004803603810190610138919061114c565b6103f1565b60405161014a91906111a7565b60405180910390f35b61015b610414565b60405161016891906111d1565b60405180910390f35b61017961041a565b60405161018691906111d1565b60405180910390f35b6101a960048036038101906101a491906111ec565b610424565b6040516101b691906111a7565b60405180910390f35b6101c7610453565b6040516101d4919061125b565b60405180910390f35b6101f760048036038101906101f29190611276565b61045c565b005b610213600480360381019061020e91906112a3565b610516565b60405161022091906111d1565b60405180910390f35b610243600480360381019061023e9190611418565b61052e565b005b61024d61071c565b60405161025a91906111d1565b60405180910390f35b61027d600480360381019061027891906112a3565b610722565b60405161028a91906111d1565b60405180910390f35b61029b61076a565b6040516102a891906111d1565b60405180910390f35b6102b9610770565b6040516102c69190611082565b60405180910390f35b6102e960048036038101906102e4919061114c565b610802565b6040516102f691906111a7565b60405180910390f35b61031960048036038101906103149190611276565b610825565b6040516103269190611470565b60405180910390f35b6103496004803603810190610344919061148b565b610858565b60405161035691906111d1565b60405180910390f35b60606003805461036e906114fa565b80601f016020809104026020016040519081016040528092919081815260200182805461039a906114fa565b80156103e75780601f106103bc576101008083540402835291602001916103e7565b820191906000526020600020905b8154815290600101906020018083116103ca57829003601f168201915b5050505050905090565b6000806103fc6108df565b90506104098185856108e7565b600191505092915050565b60055481565b6000600254905090565b60008061042f6108df565b905061043c8582856108f9565b61044785858561098d565b60019150509392505050565b60006012905090565b610473338260055461046e919061155a565b610a81565b60005b81811015610512576104cc60076000600954815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166103e86005546104c791906115cb565b610a81565b600654600954106104e45760016009819055506104ff565b6001600960008282546104f791906115fc565b925050819055505b808061050a90611630565b915050610476565b5050565b60086020528060005260406000206000915090505481565b600080600090505b82518110156106245782818151811061055257610551611678565b5b6020026020010151915060005b8351811015610610578181141580156105bd575083818151811061058657610585611678565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b156105fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f4906116f3565b60405180910390fd5b808061060890611630565b91505061055f565b50808061061c90611630565b915050610536565b5060005b82518110156106ff573373ffffffffffffffffffffffffffffffffffffffff1683828151811061065b5761065a611678565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16036106b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b09061175f565b60405180910390fd5b6106ec8382815181106106cf576106ce611678565b5b60200260200101516103e86005546106e791906115cb565b610a81565b80806106f790611630565b915050610628565b50610718338351600554610713919061155a565b610a81565b5050565b60065481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60095481565b60606004805461077f906114fa565b80601f01602080910402602001604051908101604052809291908181526020018280546107ab906114fa565b80156107f85780601f106107cd576101008083540402835291602001916107f8565b820191906000526020600020905b8154815290600101906020018083116107db57829003601f168201915b5050505050905090565b60008061080d6108df565b905061081a81858561098d565b600191505092915050565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b6108f48383836001610b03565b505050565b60006109058484610858565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146109875781811015610977578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161096e9392919061177f565b60405180910390fd5b61098684848484036000610b03565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036109ff5760006040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016109f69190611470565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610a715760006040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610a689190611470565b60405180910390fd5b610a7c838383610cda565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610af35760006040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610aea9190611470565b60405180910390fd5b610aff60008383610cda565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610b755760006040517fe602df05000000000000000000000000000000000000000000000000000000008152600401610b6c9190611470565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610be75760006040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610bde9190611470565b60405180910390fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508015610cd4578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610ccb91906111d1565b60405180910390a35b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610d2c578060026000828254610d2091906115fc565b92505081905550610dff565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015610db8578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401610daf9392919061177f565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e485780600260008282540392505081905550610f88565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610f875760016006600082825401925050819055508160076000600654815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600654600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610fe591906111d1565b60405180910390a3505050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561102c578082015181840152602081019050611011565b60008484015250505050565b6000601f19601f8301169050919050565b600061105482610ff2565b61105e8185610ffd565b935061106e81856020860161100e565b61107781611038565b840191505092915050565b6000602082019050818103600083015261109c8184611049565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006110e3826110b8565b9050919050565b6110f3816110d8565b81146110fe57600080fd5b50565b600081359050611110816110ea565b92915050565b6000819050919050565b61112981611116565b811461113457600080fd5b50565b60008135905061114681611120565b92915050565b60008060408385031215611163576111626110ae565b5b600061117185828601611101565b925050602061118285828601611137565b9150509250929050565b60008115159050919050565b6111a18161118c565b82525050565b60006020820190506111bc6000830184611198565b92915050565b6111cb81611116565b82525050565b60006020820190506111e660008301846111c2565b92915050565b600080600060608486031215611205576112046110ae565b5b600061121386828701611101565b935050602061122486828701611101565b925050604061123586828701611137565b9150509250925092565b600060ff82169050919050565b6112558161123f565b82525050565b6000602082019050611270600083018461124c565b92915050565b60006020828403121561128c5761128b6110ae565b5b600061129a84828501611137565b91505092915050565b6000602082840312156112b9576112b86110ae565b5b60006112c784828501611101565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61130d82611038565b810181811067ffffffffffffffff8211171561132c5761132b6112d5565b5b80604052505050565b600061133f6110a4565b905061134b8282611304565b919050565b600067ffffffffffffffff82111561136b5761136a6112d5565b5b602082029050602081019050919050565b600080fd5b600061139461138f84611350565b611335565b905080838252602082019050602084028301858111156113b7576113b661137c565b5b835b818110156113e057806113cc8882611101565b8452602084019350506020810190506113b9565b5050509392505050565b600082601f8301126113ff576113fe6112d0565b5b813561140f848260208601611381565b91505092915050565b60006020828403121561142e5761142d6110ae565b5b600082013567ffffffffffffffff81111561144c5761144b6110b3565b5b611458848285016113ea565b91505092915050565b61146a816110d8565b82525050565b60006020820190506114856000830184611461565b92915050565b600080604083850312156114a2576114a16110ae565b5b60006114b085828601611101565b92505060206114c185828601611101565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061151257607f821691505b602082108103611525576115246114cb565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061156582611116565b915061157083611116565b925082820261157e81611116565b915082820484148315176115955761159461152b565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006115d682611116565b91506115e183611116565b9250826115f1576115f061159c565b5b828204905092915050565b600061160782611116565b915061161283611116565b925082820190508082111561162a5761162961152b565b5b92915050565b600061163b82611116565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166c61152b565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f6475706c69636174652075736572000000000000000000000000000000000000600082015250565b60006116dd600e83610ffd565b91506116e8826116a7565b602082019050919050565b6000602082019050818103600083015261170c816116d0565b9050919050565b7f63616e6e6f74206769667420746f2073656c6600000000000000000000000000600082015250565b6000611749601383610ffd565b915061175482611713565b602082019050919050565b600060208201905081810360008301526117788161173c565b9050919050565b60006060820190506117946000830186611461565b6117a160208301856111c2565b6117ae60408301846111c2565b94935050505056fea2646970667358221220e420f31aa9f6fefdd4d80a1bca26ace182509db5880c790bee7fa60d2966f26564736f6c63430008140033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000f5ca906f05cafa944c27c6881bed3dfd3a785b6a0000000000000000000000005b9ffd1f2338884cfdcfa8eb2de4b4408347767d000000000000000000000000000000000000000000000000000000000000000753616d20696e7500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000653616d496e750000000000000000000000000000000000000000000000000000