608060405234801561000f575f80fd5b50604051611ac3380380611ac383398181016040528101906100319190610443565b6040518060400160405280600681526020017f535052494e5400000000000000000000000000000000000000000000000000008152506040518060400160405280600d81526020017f7765656b277320737072696e740000000000000000000000000000000000000081525081600390816100ac91906106a8565b5080600490816100bc91906106a8565b5050508060055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506101393361011161013f60201b60201c565b60ff16600a61012091906108d3565b620f424061012e919061091d565b61014760201b60201c565b50610a16565b5f6012905090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036101b7575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016101ae919061096d565b60405180910390fd5b6101c85f83836101cc60201b60201c565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361021c578060025f8282546102109190610986565b925050819055506102ea565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156102a5578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161029c939291906109c8565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610331578060025f828254039250508190555061037b565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516103d891906109fd565b60405180910390a3505050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610412826103e9565b9050919050565b61042281610408565b811461042c575f80fd5b50565b5f8151905061043d81610419565b92915050565b5f60208284031215610458576104576103e5565b5b5f6104658482850161042f565b91505092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806104e957607f821691505b6020821081036104fc576104fb6104a5565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261055e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610523565b6105688683610523565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6105ac6105a76105a284610580565b610589565b610580565b9050919050565b5f819050919050565b6105c583610592565b6105d96105d1826105b3565b84845461052f565b825550505050565b5f90565b6105ed6105e1565b6105f88184846105bc565b505050565b5b8181101561061b576106105f826105e5565b6001810190506105fe565b5050565b601f8211156106605761063181610502565b61063a84610514565b81016020851015610649578190505b61065d61065585610514565b8301826105fd565b50505b505050565b5f82821c905092915050565b5f6106805f1984600802610665565b1980831691505092915050565b5f6106988383610671565b9150826002028217905092915050565b6106b18261046e565b67ffffffffffffffff8111156106ca576106c9610478565b5b6106d482546104d2565b6106df82828561061f565b5f60209050601f831160018114610710575f84156106fe578287015190505b610708858261068d565b86555061076f565b601f19841661071e86610502565b5f5b8281101561074557848901518255600182019150602085019450602081019050610720565b86831015610762578489015161075e601f891682610671565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b60018511156107f9578086048111156107d5576107d4610777565b5b60018516156107e45780820291505b80810290506107f2856107a4565b94506107b9565b94509492505050565b5f8261081157600190506108cc565b8161081e575f90506108cc565b8160018114610834576002811461083e5761086d565b60019150506108cc565b60ff8411156108505761084f610777565b5b8360020a91508482111561086757610866610777565b5b506108cc565b5060208310610133831016604e8410600b84101617156108a25782820a90508381111561089d5761089c610777565b5b6108cc565b6108af84848460016107b0565b925090508184048111156108c6576108c5610777565b5b81810290505b9392505050565b5f6108dd82610580565b91506108e883610580565b92506109157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484610802565b905092915050565b5f61092782610580565b915061093283610580565b925082820261094081610580565b9150828204841483151761095757610956610777565b5b5092915050565b61096781610408565b82525050565b5f6020820190506109805f83018461095e565b92915050565b5f61099082610580565b915061099b83610580565b92508282019050808211156109b3576109b2610777565b5b92915050565b6109c281610580565b82525050565b5f6060820190506109db5f83018661095e565b6109e860208301856109b9565b6109f560408301846109b9565b949350505050565b5f602082019050610a105f8301846109b9565b92915050565b6110a080610a235f395ff3fe608060405234801561000f575f80fd5b50600436106100b2575f3560e01c80638da5cb5b1161006f5780638da5cb5b146101a057806395d89b41146101be578063a7a517d1146101dc578063a9059cbb146101f8578063da6ab12f14610228578063dd62ed3e14610244576100b2565b806306fdde03146100b6578063095ea7b3146100d457806318160ddd1461010457806323b872dd14610122578063313ce5671461015257806370a0823114610170575b5f80fd5b6100be610274565b6040516100cb9190610cb1565b60405180910390f35b6100ee60048036038101906100e99190610d62565b610304565b6040516100fb9190610dba565b60405180910390f35b61010c610326565b6040516101199190610de2565b60405180910390f35b61013c60048036038101906101379190610dfb565b61032f565b6040516101499190610dba565b60405180910390f35b61015a61035d565b6040516101679190610e66565b60405180910390f35b61018a60048036038101906101859190610e7f565b610365565b6040516101979190610de2565b60405180910390f35b6101a86103aa565b6040516101b59190610eb9565b60405180910390f35b6101c66103cf565b6040516101d39190610cb1565b60405180910390f35b6101f660048036038101906101f19190610dfb565b61045f565b005b610212600480360381019061020d9190610d62565b6104fe565b60405161021f9190610dba565b60405180910390f35b610242600480360381019061023d9190610d62565b610520565b005b61025e60048036038101906102599190610ed2565b6105bd565b60405161026b9190610de2565b60405180910390f35b60606003805461028390610f3d565b80601f01602080910402602001604051908101604052809291908181526020018280546102af90610f3d565b80156102fa5780601f106102d1576101008083540402835291602001916102fa565b820191905f5260205f20905b8154815290600101906020018083116102dd57829003601f168201915b5050505050905090565b5f8061030e61063f565b905061031b818585610646565b600191505092915050565b5f600254905090565b5f8061033961063f565b9050610346858285610658565b6103518585856106ea565b60019150509392505050565b5f6012905090565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600480546103de90610f3d565b80601f016020809104026020016040519081016040528092919081815260200182805461040a90610f3d565b80156104555780601f1061042c57610100808354040283529160200191610455565b820191905f5260205f20905b81548152906001019060200180831161043857829003601f168201915b5050505050905090565b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146104ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104e590610fb7565b60405180910390fd5b6104f98383836106ea565b505050565b5f8061050861063f565b90506105158185856106ea565b600191505092915050565b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105a690610fb7565b60405180910390fd5b6105b982826107da565b5050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b5f33905090565b6106538383836001610859565b505050565b5f61066384846105bd565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146106e457818110156106d5578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016106cc93929190610fd5565b60405180910390fd5b6106e384848484035f610859565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361075a575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016107519190610eb9565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036107ca575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016107c19190610eb9565b60405180910390fd5b6107d5838383610a28565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361084a575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016108419190610eb9565b60405180910390fd5b6108555f8383610a28565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036108c9575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016108c09190610eb9565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610939575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016109309190610eb9565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015610a22578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610a199190610de2565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a78578060025f828254610a6c9190611037565b92505081905550610b46565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015610b01578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401610af893929190610fd5565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b8d578060025f8282540392505081905550610bd7565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610c349190610de2565b60405180910390a3505050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f610c8382610c41565b610c8d8185610c4b565b9350610c9d818560208601610c5b565b610ca681610c69565b840191505092915050565b5f6020820190508181035f830152610cc98184610c79565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610cfe82610cd5565b9050919050565b610d0e81610cf4565b8114610d18575f80fd5b50565b5f81359050610d2981610d05565b92915050565b5f819050919050565b610d4181610d2f565b8114610d4b575f80fd5b50565b5f81359050610d5c81610d38565b92915050565b5f8060408385031215610d7857610d77610cd1565b5b5f610d8585828601610d1b565b9250506020610d9685828601610d4e565b9150509250929050565b5f8115159050919050565b610db481610da0565b82525050565b5f602082019050610dcd5f830184610dab565b92915050565b610ddc81610d2f565b82525050565b5f602082019050610df55f830184610dd3565b92915050565b5f805f60608486031215610e1257610e11610cd1565b5b5f610e1f86828701610d1b565b9350506020610e3086828701610d1b565b9250506040610e4186828701610d4e565b9150509250925092565b5f60ff82169050919050565b610e6081610e4b565b82525050565b5f602082019050610e795f830184610e57565b92915050565b5f60208284031215610e9457610e93610cd1565b5b5f610ea184828501610d1b565b91505092915050565b610eb381610cf4565b82525050565b5f602082019050610ecc5f830184610eaa565b92915050565b5f8060408385031215610ee857610ee7610cd1565b5b5f610ef585828601610d1b565b9250506020610f0685828601610d1b565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680610f5457607f821691505b602082108103610f6757610f66610f10565b5b50919050565b7f4e6f742074686520636f6e7472616374206f776e6572000000000000000000005f82015250565b5f610fa1601683610c4b565b9150610fac82610f6d565b602082019050919050565b5f6020820190508181035f830152610fce81610f95565b9050919050565b5f606082019050610fe85f830186610eaa565b610ff56020830185610dd3565b6110026040830184610dd3565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61104182610d2f565b915061104c83610d2f565b92508282019050808211156110645761106361100a565b5b9291505056fea26469706673582212209a9c5a7fc4e195a16ad034dad9cb7141ca237440aa751001acc3111b38c4aee964736f6c634300081a0033000000000000000000000000b01292cb44dacf4e04c3f9a67cc988b33f4de230