0x60806040526004361061004e5760003560e01c806318e1bb271461005d5780633a380f7c146100865780634bcdc1d9146100af578063a375bb86146100ed578063b69bc3581461012b57610058565b3661005857600080fd5b600080fd5b34801561006957600080fd5b50610084600480360381019061007f9190610fb7565b610154565b005b34801561009257600080fd5b506100ad60048036038101906100a891906110df565b610599565b005b3480156100bb57600080fd5b506100d660048036038101906100d191906111ea565b61077e565b6040516100e4929190611293565b60405180910390f35b3480156100f957600080fd5b50610114600480360381019061010f91906112bc565b610905565b6040516101229291906113ba565b60405180910390f35b34801561013757600080fd5b50610152600480360381019061014d9190611427565b610aa5565b005b6000803373ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101c6919061147c565b91503373ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610213573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610237919061147c565b905060003373ffffffffffffffffffffffffffffffffffffffff1663ddca3f436040518163ffffffff1660e01b8152600401602060405180830381865afa158015610286573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102aa91906114e4565b90507f000000000000000000000000da2f048c128506e720b0b0b32f20432157dde1c773ffffffffffffffffffffffffffffffffffffffff16631698ee828484846040518463ffffffff1660e01b81526004016103099392919061152f565b602060405180830381865afa158015610326573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061034a919061147c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103ae906115c3565b60405180910390fd5b6000871280156103c75750600086135b806103de57506000861280156103dd5750600087135b5b61041d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104149061162f565b60405180910390fd5b506000848490500361053b5760008613156104b6578173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33886040518363ffffffff1660e01b815260040161046d92919061165e565b6020604051808303816000875af115801561048c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b0919061169c565b50610536565b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33876040518363ffffffff1660e01b81526004016104f192919061165e565b6020604051808303816000875af1158015610510573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610534919061169c565b505b610591565b600080858581019061054d91906116c9565b91509150600088121561057657610571848961056890611738565b858a8686610b48565b61058e565b61058d838861058490611738565b868b8686610b48565b5b50505b505050505050565b7f000000000000000000000000583b2be32eb6da0213bfabacaaa8b0cbb417120173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610627576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061e906117cc565b60405180910390fd5b6040518060400160405280858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508152602001838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508152506000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000019080519060200190610755929190610e61565b506020820151816001019080519060200190610772929190610e61565b50905050505050505050565b6000807f000000000000000000000000583b2be32eb6da0213bfabacaaa8b0cbb417120173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461080f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080690611838565b60405180910390fd5b8773ffffffffffffffffffffffffffffffffffffffff1663128acb0830898960008a73ffffffffffffffffffffffffffffffffffffffff16146108525789610891565b8b61087d57600173fffd8963efd1fc6a506488495d951d5263988d266108789190611858565b610890565b60016401000276a361088f91906118a0565b5b5b89896040518763ffffffff1660e01b81526004016108b496959493929190611964565b60408051808303816000875af11580156108d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f691906119d5565b91509150965096945050505050565b60608060008060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905080600001805480602002602001604051908101604052809291908181526020018280548015610a0b57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116109c1575b5050505050925080600101805480602002602001604051908101604052809291908181526020018280548015610a9657602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610a4c575b50505050509150509250929050565b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb7f000000000000000000000000583b2be32eb6da0213bfabacaaa8b0cbb4171201836040518363ffffffff1660e01b8152600401610b0092919061165e565b6020604051808303816000875af1158015610b1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b43919061169c565b505050565b848673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610b829190611a15565b602060405180830381865afa158015610b9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bc39190611a45565b1015610c04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfb90611abe565b60405180910390fd5b60008060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508673ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f0000000000000000000000004a064418ea8fd135433e366400850ad0d6497b45886040518363ffffffff1660e01b8152600401610cde92919061165e565b6020604051808303816000875af1158015610cfd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d21919061169c565b507f0000000000000000000000004a064418ea8fd135433e366400850ad0d6497b4573ffffffffffffffffffffffffffffffffffffffff16635d50b3698785846000013087876001016000806040518963ffffffff1660e01b8152600401610d90989796959493929190611c4d565b6000604051808303816000875af1158015610daf573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610dd89190611e17565b508473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33866040518363ffffffff1660e01b8152600401610e1492919061165e565b6020604051808303816000875af1158015610e33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e57919061169c565b5050505050505050565b828054828255906000526020600020908101928215610eda579160200282015b82811115610ed95782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190610e81565b5b509050610ee79190610eeb565b5090565b5b80821115610f04576000816000905550600101610eec565b5090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b610f2f81610f1c565b8114610f3a57600080fd5b50565b600081359050610f4c81610f26565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112610f7757610f76610f52565b5b8235905067ffffffffffffffff811115610f9457610f93610f57565b5b602083019150836001820283011115610fb057610faf610f5c565b5b9250929050565b60008060008060608587031215610fd157610fd0610f12565b5b6000610fdf87828801610f3d565b9450506020610ff087828801610f3d565b935050604085013567ffffffffffffffff81111561101157611010610f17565b5b61101d87828801610f61565b925092505092959194509250565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006110568261102b565b9050919050565b6110668161104b565b811461107157600080fd5b50565b6000813590506110838161105d565b92915050565b60008083601f84011261109f5761109e610f52565b5b8235905067ffffffffffffffff8111156110bc576110bb610f57565b5b6020830191508360208202830111156110d8576110d7610f5c565b5b9250929050565b600080600080600080608087890312156110fc576110fb610f12565b5b600061110a89828a01611074565b965050602061111b89828a01611074565b955050604087013567ffffffffffffffff81111561113c5761113b610f17565b5b61114889828a01611089565b9450945050606087013567ffffffffffffffff81111561116b5761116a610f17565b5b61117789828a01611089565b92509250509295509295509295565b60008115159050919050565b61119b81611186565b81146111a657600080fd5b50565b6000813590506111b881611192565b92915050565b6111c78161102b565b81146111d257600080fd5b50565b6000813590506111e4816111be565b92915050565b60008060008060008060a0878903121561120757611206610f12565b5b600061121589828a01611074565b965050602061122689828a016111a9565b955050604061123789828a01610f3d565b945050606061124889828a016111d5565b935050608087013567ffffffffffffffff81111561126957611268610f17565b5b61127589828a01610f61565b92509250509295509295509295565b61128d81610f1c565b82525050565b60006040820190506112a86000830185611284565b6112b56020830184611284565b9392505050565b600080604083850312156112d3576112d2610f12565b5b60006112e185828601611074565b92505060206112f285828601611074565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6113318161104b565b82525050565b60006113438383611328565b60208301905092915050565b6000602082019050919050565b6000611367826112fc565b6113718185611307565b935061137c83611318565b8060005b838110156113ad5781516113948882611337565b975061139f8361134f565b925050600181019050611380565b5085935050505092915050565b600060408201905081810360008301526113d4818561135c565b905081810360208301526113e8818461135c565b90509392505050565b6000819050919050565b611404816113f1565b811461140f57600080fd5b50565b600081359050611421816113fb565b92915050565b6000806040838503121561143e5761143d610f12565b5b600061144c85828601611074565b925050602061145d85828601611412565b9150509250929050565b6000815190506114768161105d565b92915050565b60006020828403121561149257611491610f12565b5b60006114a084828501611467565b91505092915050565b600062ffffff82169050919050565b6114c1816114a9565b81146114cc57600080fd5b50565b6000815190506114de816114b8565b92915050565b6000602082840312156114fa576114f9610f12565b5b6000611508848285016114cf565b91505092915050565b61151a8161104b565b82525050565b611529816114a9565b82525050565b60006060820190506115446000830186611511565b6115516020830185611511565b61155e6040830184611520565b949350505050565b600082825260208201905092915050565b7f4153534552543200000000000000000000000000000000000000000000000000600082015250565b60006115ad600783611566565b91506115b882611577565b602082019050919050565b600060208201905081810360008301526115dc816115a0565b9050919050565b7f4153534552543300000000000000000000000000000000000000000000000000600082015250565b6000611619600783611566565b9150611624826115e3565b602082019050919050565b600060208201905081810360008301526116488161160c565b9050919050565b611658816113f1565b82525050565b60006040820190506116736000830185611511565b611680602083018461164f565b9392505050565b60008151905061169681611192565b92915050565b6000602082840312156116b2576116b1610f12565b5b60006116c084828501611687565b91505092915050565b600080604083850312156116e0576116df610f12565b5b60006116ee85828601611412565b92505060206116ff85828601611412565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061174382610f1c565b91507f8000000000000000000000000000000000000000000000000000000000000000820361177557611774611709565b5b816000039050919050565b7f4153534552543100000000000000000000000000000000000000000000000000600082015250565b60006117b6600783611566565b91506117c182611780565b602082019050919050565b600060208201905081810360008301526117e5816117a9565b9050919050565b7f4153534552543500000000000000000000000000000000000000000000000000600082015250565b6000611822600783611566565b915061182d826117ec565b602082019050919050565b6000602082019050818103600083015261185181611815565b9050919050565b60006118638261102b565b915061186e8361102b565b9250828203905073ffffffffffffffffffffffffffffffffffffffff81111561189a57611899611709565b5b92915050565b60006118ab8261102b565b91506118b68361102b565b9250828201905073ffffffffffffffffffffffffffffffffffffffff8111156118e2576118e1611709565b5b92915050565b6118f181611186565b82525050565b6119008161102b565b82525050565b600082825260208201905092915050565b82818337600083830152505050565b6000601f19601f8301169050919050565b60006119438385611906565b9350611950838584611917565b61195983611926565b840190509392505050565b600060a0820190506119796000830189611511565b61198660208301886118e8565b6119936040830187611284565b6119a060608301866118f7565b81810360808301526119b3818486611937565b9050979650505050505050565b6000815190506119cf81610f26565b92915050565b600080604083850312156119ec576119eb610f12565b5b60006119fa858286016119c0565b9250506020611a0b858286016119c0565b9150509250929050565b6000602082019050611a2a6000830184611511565b92915050565b600081519050611a3f816113fb565b92915050565b600060208284031215611a5b57611a5a610f12565b5b6000611a6984828501611a30565b91505092915050565b7f4153534552543400000000000000000000000000000000000000000000000000600082015250565b6000611aa8600783611566565b9150611ab382611a72565b602082019050919050565b60006020820190508181036000830152611ad781611a9b565b9050919050565b600081549050919050565b60008190508160005260206000209050919050565b60008160001c9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611b3e611b3983611afe565b611b0b565b9050919050565b6000611b518254611b2b565b9050919050565b6000600182019050919050565b6000611b7082611ade565b611b7a8185611307565b9350611b8583611ae9565b8060005b83811015611bbd57611b9a82611b45565b611ba48882611337565b9750611baf83611b58565b925050600181019050611b89565b5085935050505092915050565b6000819050919050565b6000819050919050565b6000611bf9611bf4611bef84611bca565b611bd4565b6113f1565b9050919050565b611c0981611bde565b82525050565b600060ff82169050919050565b6000611c37611c32611c2d84611bca565b611bd4565b611c0f565b9050919050565b611c4781611c1c565b82525050565b600061010082019050611c63600083018b61164f565b611c70602083018a61164f565b8181036040830152611c828189611b65565b9050611c916060830188611511565b611c9e608083018761164f565b81810360a0830152611cb08186611b65565b9050611cbf60c0830185611c00565b611ccc60e0830184611c3e565b9998505050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611d1182611926565b810181811067ffffffffffffffff82111715611d3057611d2f611cd9565b5b80604052505050565b6000611d43610f08565b9050611d4f8282611d08565b919050565b600067ffffffffffffffff821115611d6f57611d6e611cd9565b5b602082029050602081019050919050565b6000611d93611d8e84611d54565b611d39565b90508083825260208201905060208402830185811115611db657611db5610f5c565b5b835b81811015611ddf5780611dcb8882611a30565b845260208401935050602081019050611db8565b5050509392505050565b600082601f830112611dfe57611dfd610f52565b5b8151611e0e848260208601611d80565b91505092915050565b600060208284031215611e2d57611e2c610f12565b5b600082015167ffffffffffffffff811115611e4b57611e4a610f17565b5b611e5784828501611de9565b9150509291505056fea2646970667358221220a49bdda14838aaf1a54b616fce2052dc0bc52e75ed7ca3132687ff71e3e145cb64736f6c63430008180033