60806040526012600560146101000a81548160ff021916908360ff16021790555068056bc75e2d63100000600655348015610038575f80fd5b50604051611a66380380611a66833981810160405281019061005a9190610290565b806040518060400160405280600581526020017fd09554d09d0000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f45d0a2d09d00000000000000000000000000000000000000000000000000000081525081600390816100d691906104f5565b5080600490816100e691906104f5565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610159575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161015091906105d3565b60405180910390fd5b6101688161016f60201b60201c565b50506105ec565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61025f82610236565b9050919050565b61026f81610255565b8114610279575f80fd5b50565b5f8151905061028a81610266565b92915050565b5f602082840312156102a5576102a4610232565b5b5f6102b28482850161027c565b91505092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061033657607f821691505b602082108103610349576103486102f2565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026103ab7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610370565b6103b58683610370565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6103f96103f46103ef846103cd565b6103d6565b6103cd565b9050919050565b5f819050919050565b610412836103df565b61042661041e82610400565b84845461037c565b825550505050565b5f90565b61043a61042e565b610445818484610409565b505050565b5b818110156104685761045d5f82610432565b60018101905061044b565b5050565b601f8211156104ad5761047e8161034f565b61048784610361565b81016020851015610496578190505b6104aa6104a285610361565b83018261044a565b50505b505050565b5f82821c905092915050565b5f6104cd5f19846008026104b2565b1980831691505092915050565b5f6104e583836104be565b9150826002028217905092915050565b6104fe826102bb565b67ffffffffffffffff811115610517576105166102c5565b5b610521825461031f565b61052c82828561046c565b5f60209050601f83116001811461055d575f841561054b578287015190505b61055585826104da565b8655506105bc565b601f19841661056b8661034f565b5f5b828110156105925784890151825560018201915060208501945060208101905061056d565b868310156105af57848901516105ab601f8916826104be565b8355505b6001600288020188555050505b505050505050565b6105cd81610255565b82525050565b5f6020820190506105e65f8301846105c4565b92915050565b61146d806105f95f395ff3fe608060405234801561000f575f80fd5b50600436106100e8575f3560e01c8063715018a61161008a578063a9059cbb11610064578063a9059cbb14610238578063b351889f14610268578063dd62ed3e14610298578063f2fde38b146102c8576100e8565b8063715018a6146101f25780638da5cb5b146101fc57806395d89b411461021a576100e8565b806323b872dd116100c657806323b872dd14610158578063313ce5671461018857806340c10f19146101a657806370a08231146101c2576100e8565b806306fdde03146100ec578063095ea7b31461010a57806318160ddd1461013a575b5f80fd5b6100f46102e4565b6040516101019190610ec8565b60405180910390f35b610124600480360381019061011f9190610f86565b610374565b6040516101319190610fde565b60405180910390f35b610142610396565b60405161014f9190611006565b60405180910390f35b610172600480360381019061016d919061101f565b61039f565b60405161017f9190610fde565b60405180910390f35b6101906103cd565b60405161019d919061108a565b60405180910390f35b6101c060048036038101906101bb9190610f86565b6103e3565b005b6101dc60048036038101906101d791906110a3565b6103f9565b6040516101e99190611006565b60405180910390f35b6101fa61043e565b005b610204610451565b60405161021191906110dd565b60405180910390f35b610222610479565b60405161022f9190610ec8565b60405180910390f35b610252600480360381019061024d9190610f86565b610509565b60405161025f9190610fde565b60405180910390f35b610282600480360381019061027d9190611236565b61052b565b60405161028f9190610fde565b60405180910390f35b6102b260048036038101906102ad91906112da565b610606565b6040516102bf9190611006565b60405180910390f35b6102e260048036038101906102dd91906110a3565b610688565b005b6060600380546102f390611345565b80601f016020809104026020016040519081016040528092919081815260200182805461031f90611345565b801561036a5780601f106103415761010080835404028352916020019161036a565b820191905f5260205f20905b81548152906001019060200180831161034d57829003601f168201915b5050505050905090565b5f8061037e61070c565b905061038b818585610713565b600191505092915050565b5f600654905090565b5f806103a961070c565b90506103b6858285610725565b6103c18585856107b7565b60019150509392505050565b5f600560149054906101000a900460ff16905090565b6103eb6108a7565b6103f5828261092e565b5050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6104466108a7565b61044f5f6109ad565b565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461048890611345565b80601f01602080910402602001604051908101604052809291908181526020018280546104b490611345565b80156104ff5780601f106104d6576101008083540402835291602001916104ff565b820191905f5260205f20905b8154815290600101906020018083116104e257829003601f168201915b5050505050905090565b5f8061051361070c565b90506105208185856107b7565b600191505092915050565b5f805f90505b84518110156105fa5783818151811061054d5761054c611375565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1685828151811061057e5761057d611375565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8584815181106105d0576105cf611375565b5b60200260200101516040516105e59190611006565b60405180910390a38080600101915050610531565b50600190509392505050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b6106906108a7565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610700575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016106f791906110dd565b60405180910390fd5b610709816109ad565b50565b5f33905090565b6107208383836001610a70565b505050565b5f6107308484610606565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146107b157818110156107a2578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401610799939291906113a2565b60405180910390fd5b6107b084848484035f610a70565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610827575f6040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260040161081e91906110dd565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610897575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161088e91906110dd565b60405180910390fd5b6108a2838383610c3f565b505050565b6108af61070c565b73ffffffffffffffffffffffffffffffffffffffff166108cd610451565b73ffffffffffffffffffffffffffffffffffffffff161461092c576108f061070c565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161092391906110dd565b60405180910390fd5b565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361099e575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161099591906110dd565b60405180910390fd5b6109a95f8383610c3f565b5050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610ae0575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401610ad791906110dd565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b50575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610b4791906110dd565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015610c39578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610c309190611006565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c8f578060025f828254610c839190611404565b92505081905550610d5d565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015610d18578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401610d0f939291906113a2565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610da4578060025f8282540392505081905550610dee565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610e4b9190611006565b60405180910390a3505050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f610e9a82610e58565b610ea48185610e62565b9350610eb4818560208601610e72565b610ebd81610e80565b840191505092915050565b5f6020820190508181035f830152610ee08184610e90565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610f2282610ef9565b9050919050565b610f3281610f18565b8114610f3c575f80fd5b50565b5f81359050610f4d81610f29565b92915050565b5f819050919050565b610f6581610f53565b8114610f6f575f80fd5b50565b5f81359050610f8081610f5c565b92915050565b5f8060408385031215610f9c57610f9b610ef1565b5b5f610fa985828601610f3f565b9250506020610fba85828601610f72565b9150509250929050565b5f8115159050919050565b610fd881610fc4565b82525050565b5f602082019050610ff15f830184610fcf565b92915050565b61100081610f53565b82525050565b5f6020820190506110195f830184610ff7565b92915050565b5f805f6060848603121561103657611035610ef1565b5b5f61104386828701610f3f565b935050602061105486828701610f3f565b925050604061106586828701610f72565b9150509250925092565b5f60ff82169050919050565b6110848161106f565b82525050565b5f60208201905061109d5f83018461107b565b92915050565b5f602082840312156110b8576110b7610ef1565b5b5f6110c584828501610f3f565b91505092915050565b6110d781610f18565b82525050565b5f6020820190506110f05f8301846110ce565b92915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61113082610e80565b810181811067ffffffffffffffff8211171561114f5761114e6110fa565b5b80604052505050565b5f611161610ee8565b905061116d8282611127565b919050565b5f67ffffffffffffffff82111561118c5761118b6110fa565b5b602082029050602081019050919050565b5f80fd5b5f6111b36111ae84611172565b611158565b905080838252602082019050602084028301858111156111d6576111d561119d565b5b835b818110156111ff57806111eb8882610f72565b8452602084019350506020810190506111d8565b5050509392505050565b5f82601f83011261121d5761121c6110f6565b5b813561122d8482602086016111a1565b91505092915050565b5f805f6060848603121561124d5761124c610ef1565b5b5f84013567ffffffffffffffff81111561126a57611269610ef5565b5b61127686828701611209565b935050602084013567ffffffffffffffff81111561129757611296610ef5565b5b6112a386828701611209565b925050604084013567ffffffffffffffff8111156112c4576112c3610ef5565b5b6112d086828701611209565b9150509250925092565b5f80604083850312156112f0576112ef610ef1565b5b5f6112fd85828601610f3f565b925050602061130e85828601610f3f565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061135c57607f821691505b60208210810361136f5761136e611318565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6060820190506113b55f8301866110ce565b6113c26020830185610ff7565b6113cf6040830184610ff7565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61140e82610f53565b915061141983610f53565b9250828201905080821115611431576114306113d7565b5b9291505056fea26469706673582212201a634276478512913f1a161bb534bb917e000c3c67c04f9453410e5786f44e0464736f6c634300081a0033000000000000000000000000a4059e02fc435b4591efeb65c649cb9547438955