608060405234801561000f575f80fd5b5060405161142538038061142583398181016040528101906100319190610123565b6040518060400160405280600381526020017f41544400000000000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f415444000000000000000000000000000000000000000000000000000000000081525081600390816100ac9190610388565b5080600490816100bc9190610388565b50505050610457565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6100f2826100c9565b9050919050565b610102816100e8565b811461010c575f80fd5b50565b5f8151905061011d816100f9565b92915050565b5f60208284031215610138576101376100c5565b5b5f6101458482850161010f565b91505092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806101c957607f821691505b6020821081036101dc576101db610185565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261023e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610203565b6102488683610203565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61028c61028761028284610260565b610269565b610260565b9050919050565b5f819050919050565b6102a583610272565b6102b96102b182610293565b84845461020f565b825550505050565b5f90565b6102cd6102c1565b6102d881848461029c565b505050565b5b818110156102fb576102f05f826102c5565b6001810190506102de565b5050565b601f82111561034057610311816101e2565b61031a846101f4565b81016020851015610329578190505b61033d610335856101f4565b8301826102dd565b50505b505050565b5f82821c905092915050565b5f6103605f1984600802610345565b1980831691505092915050565b5f6103788383610351565b9150826002028217905092915050565b6103918261014e565b67ffffffffffffffff8111156103aa576103a9610158565b5b6103b482546101b2565b6103bf8282856102ff565b5f60209050601f8311600181146103f0575f84156103de578287015190505b6103e8858261036d565b86555061044f565b601f1984166103fe866101e2565b5f5b8281101561042557848901518255600182019150602085019450602081019050610400565b86831015610442578489015161043e601f891682610351565b8355505b6001600288020188555050505b505050505050565b610fc1806104645f395ff3fe608060405234801561000f575f80fd5b50600436106100b2575f3560e01c806342966c681161006f57806342966c681461018c57806370a08231146101a857806379cc6790146101d857806395d89b41146101f4578063a9059cbb14610212578063dd62ed3e14610242576100b2565b806306fdde03146100b6578063095ea7b3146100d457806318160ddd1461010457806323b872dd14610122578063313ce5671461015257806340c10f1914610170575b5f80fd5b6100be610272565b6040516100cb9190610c0f565b60405180910390f35b6100ee60048036038101906100e99190610cc0565b610302565b6040516100fb9190610d18565b60405180910390f35b61010c610324565b6040516101199190610d40565b60405180910390f35b61013c60048036038101906101379190610d59565b61032d565b6040516101499190610d18565b60405180910390f35b61015a61035b565b6040516101679190610dc4565b60405180910390f35b61018a60048036038101906101859190610cc0565b610363565b005b6101a660048036038101906101a19190610ddd565b610371565b005b6101c260048036038101906101bd9190610e08565b610385565b6040516101cf9190610d40565b60405180910390f35b6101f260048036038101906101ed9190610cc0565b6103ca565b005b6101fc6103ea565b6040516102099190610c0f565b60405180910390f35b61022c60048036038101906102279190610cc0565b61047a565b6040516102399190610d18565b60405180910390f35b61025c60048036038101906102579190610e33565b61049c565b6040516102699190610d40565b60405180910390f35b60606003805461028190610e9e565b80601f01602080910402602001604051908101604052809291908181526020018280546102ad90610e9e565b80156102f85780601f106102cf576101008083540402835291602001916102f8565b820191905f5260205f20905b8154815290600101906020018083116102db57829003601f168201915b5050505050905090565b5f8061030c61051e565b9050610319818585610525565b600191505092915050565b5f600254905090565b5f8061033761051e565b9050610344858285610537565b61034f8585856105c9565b60019150509392505050565b5f6012905090565b61036d82826106b9565b5050565b61038261037c61051e565b82610738565b50565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6103dc826103d661051e565b83610537565b6103e68282610738565b5050565b6060600480546103f990610e9e565b80601f016020809104026020016040519081016040528092919081815260200182805461042590610e9e565b80156104705780601f1061044757610100808354040283529160200191610470565b820191905f5260205f20905b81548152906001019060200180831161045357829003601f168201915b5050505050905090565b5f8061048461051e565b90506104918185856105c9565b600191505092915050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b5f33905090565b61053283838360016107b7565b505050565b5f610542848461049c565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146105c357818110156105b4578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016105ab93929190610edd565b60405180910390fd5b6105c284848484035f6107b7565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610639575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016106309190610f12565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036106a9575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016106a09190610f12565b60405180910390fd5b6106b4838383610986565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610729575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016107209190610f12565b60405180910390fd5b6107345f8383610986565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036107a8575f6040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260040161079f9190610f12565b60405180910390fd5b6107b3825f83610986565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610827575f6040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161081e9190610f12565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610897575f6040517f94280d6200000000000000000000000000000000000000000000000000000000815260040161088e9190610f12565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015610980578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516109779190610d40565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036109d6578060025f8282546109ca9190610f58565b92505081905550610aa4565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015610a5f578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401610a5693929190610edd565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610aeb578060025f8282540392505081905550610b35565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610b929190610d40565b60405180910390a3505050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f610be182610b9f565b610beb8185610ba9565b9350610bfb818560208601610bb9565b610c0481610bc7565b840191505092915050565b5f6020820190508181035f830152610c278184610bd7565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610c5c82610c33565b9050919050565b610c6c81610c52565b8114610c76575f80fd5b50565b5f81359050610c8781610c63565b92915050565b5f819050919050565b610c9f81610c8d565b8114610ca9575f80fd5b50565b5f81359050610cba81610c96565b92915050565b5f8060408385031215610cd657610cd5610c2f565b5b5f610ce385828601610c79565b9250506020610cf485828601610cac565b9150509250929050565b5f8115159050919050565b610d1281610cfe565b82525050565b5f602082019050610d2b5f830184610d09565b92915050565b610d3a81610c8d565b82525050565b5f602082019050610d535f830184610d31565b92915050565b5f805f60608486031215610d7057610d6f610c2f565b5b5f610d7d86828701610c79565b9350506020610d8e86828701610c79565b9250506040610d9f86828701610cac565b9150509250925092565b5f60ff82169050919050565b610dbe81610da9565b82525050565b5f602082019050610dd75f830184610db5565b92915050565b5f60208284031215610df257610df1610c2f565b5b5f610dff84828501610cac565b91505092915050565b5f60208284031215610e1d57610e1c610c2f565b5b5f610e2a84828501610c79565b91505092915050565b5f8060408385031215610e4957610e48610c2f565b5b5f610e5685828601610c79565b9250506020610e6785828601610c79565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680610eb557607f821691505b602082108103610ec857610ec7610e71565b5b50919050565b610ed781610c52565b82525050565b5f606082019050610ef05f830186610ece565b610efd6020830185610d31565b610f0a6040830184610d31565b949350505050565b5f602082019050610f255f830184610ece565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610f6282610c8d565b9150610f6d83610c8d565b9250828201905080821115610f8557610f84610f2b565b5b9291505056fea264697066735822122084d857f081c82f9f8ef4795e73cc1a72eeb46c47019152ca8640314fd489d41764736f6c63430008190033000000000000000000000000bed4619bf534b1df3cf68e203f1465f71b77223f