6080604052600160095534801561001557600080fd5b50336040518060400160405280601181526020017015195cdd081250d38814185cdcdc1bdc9d607a1b815250604051806040016040528060048152602001632a24a1a760e11b815250816000908161006d91906101ab565b50600161007a82826101ab565b5050506001600160a01b0381166100ab57604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b6100b4816100ba565b50610269565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168061013657607f821691505b60208210810361015657634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156101a657806000526020600020601f840160051c810160208510156101835750805b601f840160051c820191505b818110156101a3576000815560010161018f565b50505b505050565b81516001600160401b038111156101c4576101c461010c565b6101d8816101d28454610122565b8461015c565b6020601f82116001811461020c57600083156101f45750848201515b600019600385901b1c1916600184901b1784556101a3565b600084815260208120601f198516915b8281101561023c578785015182556020948501946001909201910161021c565b508482101561025a5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b611ddb806102786000396000f3fe608060405234801561001057600080fd5b50600436106101985760003560e01c8063715018a6116100e3578063b88d4fde1161008c578063e985e9c511610066578063e985e9c514610377578063f2fde38b146103c0578063f324c8eb146103d357600080fd5b8063b88d4fde1461033e578063c87b56dd14610351578063e0df5b6f1461036457600080fd5b8063a22cb465116100bd578063a22cb4651461030f578063a44285a514610322578063b3942cbd1461032b57600080fd5b8063715018a6146102e15780638da5cb5b146102e957806395d89b411461030757600080fd5b806334fec467116101455780634fac7e411161011f5780634fac7e411461029b5780636352211e146102bb57806370a08231146102ce57600080fd5b806334fec4671461024d57806342842e0e146102725780634e71d92d1461028557600080fd5b8063081812fc11610176578063081812fc146101ef578063095ea7b31461022757806323b872dd1461023a57600080fd5b806301ffc9a71461019d578063028ebc44146101c557806306fdde03146101da575b600080fd5b6101b06101ab3660046116eb565b6103e6565b60405190151581526020015b60405180910390f35b6101d86101d3366004611738565b6104cb565b005b6101e261051a565b6040516101bc91906117b7565b6102026101fd3660046117ca565b6105ac565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bc565b6101d86102353660046117e3565b6105e2565b6101d861024836600461180d565b6105f1565b6006546101b09074010000000000000000000000000000000000000000900460ff1681565b6101d861028036600461180d565b6106e7565b61028d610707565b6040519081526020016101bc565b6102ae6102a9366004611738565b610798565b6040516101bc919061184a565b6102026102c93660046117ca565b610811565b61028d6102dc366004611738565b61081c565b6101d8610897565b60065473ffffffffffffffffffffffffffffffffffffffff16610202565b6101e26108ab565b6101d861031d36600461189b565b6108ba565b61028d60095481565b6101d86103393660046118d2565b6108c5565b6101d861034c3660046119b6565b610917565b6101e261035f3660046117ca565b61092e565b6101d8610372366004611a32565b6109b8565b6101b0610385366004611a7b565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205460ff1690565b6101d86103ce366004611738565b6109cc565b6101d86103e13660046117ca565b610a30565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061047957507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806104c557507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6104d3610a3d565b600a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60606000805461052990611aae565b80601f016020809104026020016040519081016040528092919081815260200182805461055590611aae565b80156105a25780601f10610577576101008083540402835291602001916105a2565b820191906000526020600020905b81548152906001019060200180831161058557829003601f168201915b5050505050905090565b60006105b782610a90565b5060008281526004602052604090205473ffffffffffffffffffffffffffffffffffffffff166104c5565b6105ed828233610aef565b5050565b73ffffffffffffffffffffffffffffffffffffffff8216610646576040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600060048201526024015b60405180910390fd5b6000610653838333610afc565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146106e1576040517f64283d7b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8086166004830152602482018490528216604482015260640161063d565b50505050565b61070283838360405180602001604052806000815250610917565b505050565b60006009546107153361081c565b1061074c576040517f8c10944b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60076000815461075b90611b30565b9091555060075461076d903390610cc0565b50336000908152600b6020908152604082206007805482546001810184559285529290932001555490565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600b602090815260409182902080548351818402810184019094528084526060939283018282801561080557602002820191906000526020600020905b8154815260200190600101908083116107f1575b50505050509050919050565b60006104c582610a90565b600073ffffffffffffffffffffffffffffffffffffffff821661086e576040517f89c62b640000000000000000000000000000000000000000000000000000000081526000600482015260240161063d565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b61089f610a3d565b6108a96000610cda565b565b60606001805461052990611aae565b6105ed338383610d51565b6108cd610a3d565b6006805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6109228484846105f1565b6106e184848484610e4e565b60606008805461093d90611aae565b80601f016020809104026020016040519081016040528092919081815260200182805461096990611aae565b80156108055780601f1061098b57610100808354040283529160200191610805565b820191906000526020600020905b8154815290600101906020018083116109995750939695505050505050565b6109c0610a3d565b60086105ed8282611baf565b6109d4610a3d565b73ffffffffffffffffffffffffffffffffffffffff8116610a24576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526000600482015260240161063d565b610a2d81610cda565b50565b610a38610a3d565b600955565b60065473ffffffffffffffffffffffffffffffffffffffff1633146108a9576040517f118cdaa700000000000000000000000000000000000000000000000000000000815233600482015260240161063d565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff16806104c5576040517f7e2732890000000000000000000000000000000000000000000000000000000081526004810184905260240161063d565b6107028383836001611045565b600a546040517f21d6ff460000000000000000000000000000000000000000000000000000000081526004810184905260009173ffffffffffffffffffffffffffffffffffffffff16906321d6ff4690602401602060405180830381865afa158015610b6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b909190611cc8565b15610bc7576040517faf167ba600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526002602052604090205473ffffffffffffffffffffffffffffffffffffffff168015801590610c10575073ffffffffffffffffffffffffffffffffffffffff851615155b15610cac5760065474010000000000000000000000000000000000000000900460ff16610c69576040517f1f8926f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c738185611210565b73ffffffffffffffffffffffffffffffffffffffff85166000908152600b60209081526040822080546001810182559083529120018490555b610cb7858585611301565b95945050505050565b6105ed82826040518060200160405280600081525061147e565b6006805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b73ffffffffffffffffffffffffffffffffffffffff8216610db6576040517f5b08ba1800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015260240161063d565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526005602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff83163b156106e1576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063150b7a0290610ec3903390889087908790600401611ce5565b6020604051808303816000875af1925050508015610f1c575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610f1991810190611d40565b60015b610fab573d808015610f4a576040519150601f19603f3d011682016040523d82523d6000602084013e610f4f565b606091505b508051600003610fa3576040517f64a0ae9200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260240161063d565b805181602001fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081167f150b7a02000000000000000000000000000000000000000000000000000000001461103e576040517f64a0ae9200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260240161063d565b5050505050565b8080611066575073ffffffffffffffffffffffffffffffffffffffff821615155b156111bb57600061107684610a90565b905073ffffffffffffffffffffffffffffffffffffffff8316158015906110c957508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b8015611108575073ffffffffffffffffffffffffffffffffffffffff80821660009081526005602090815260408083209387168352929052205460ff16155b15611157576040517fa9fbf51f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260240161063d565b81156111b957838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b5050600090815260046020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600b60205260408120805490919061124690600190611d5d565b90506000805b828111611290578484828154811061126657611266611d70565b90600052602060002001540361127e57809150611290565b8061128881611b30565b91505061124c565b508181146112d4578282815481106112aa576112aa611d70565b90600052602060002001548382815481106112c7576112c7611d70565b6000918252602090912001555b828054806112e4576112e4611d9f565b600190038181906000526020600020016000905590555050505050565b60008281526002602052604081205473ffffffffffffffffffffffffffffffffffffffff9081169083161561133b5761133b818486611495565b73ffffffffffffffffffffffffffffffffffffffff8116156113b157611365600085600080611045565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190555b73ffffffffffffffffffffffffffffffffffffffff8516156113fa5773ffffffffffffffffffffffffffffffffffffffff85166000908152600360205260409020805460010190555b60008481526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b6114888383611545565b6107026000848484610e4e565b6114a08383836115f6565b6107025773ffffffffffffffffffffffffffffffffffffffff83166114f4576040517f7e2732890000000000000000000000000000000000000000000000000000000081526004810182905260240161063d565b6040517f177e802f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024810182905260440161063d565b73ffffffffffffffffffffffffffffffffffffffff8216611595576040517f64a0ae920000000000000000000000000000000000000000000000000000000081526000600482015260240161063d565b60006115a383836000610afc565b905073ffffffffffffffffffffffffffffffffffffffff811615610702576040517f73c6ac6e0000000000000000000000000000000000000000000000000000000081526000600482015260240161063d565b600073ffffffffffffffffffffffffffffffffffffffff8316158015906116b557508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611684575073ffffffffffffffffffffffffffffffffffffffff80851660009081526005602090815260408083209387168352929052205460ff165b806116b5575060008281526004602052604090205473ffffffffffffffffffffffffffffffffffffffff8481169116145b949350505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610a2d57600080fd5b6000602082840312156116fd57600080fd5b8135611708816116bd565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461173357600080fd5b919050565b60006020828403121561174a57600080fd5b6117088261170f565b6000815180845260005b818110156117795760208185018101518683018201520161175d565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6020815260006117086020830184611753565b6000602082840312156117dc57600080fd5b5035919050565b600080604083850312156117f657600080fd5b6117ff8361170f565b946020939093013593505050565b60008060006060848603121561182257600080fd5b61182b8461170f565b92506118396020850161170f565b929592945050506040919091013590565b602080825282518282018190526000918401906040840190835b81811015611882578351835260209384019390920191600101611864565b509095945050505050565b8015158114610a2d57600080fd5b600080604083850312156118ae57600080fd5b6118b78361170f565b915060208301356118c78161188d565b809150509250929050565b6000602082840312156118e457600080fd5b81356117088161188d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008067ffffffffffffffff841115611939576119396118ef565b506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85018116603f0116810181811067ffffffffffffffff82111715611986576119866118ef565b60405283815290508082840185101561199e57600080fd5b83836020830137600060208583010152509392505050565b600080600080608085870312156119cc57600080fd5b6119d58561170f565b93506119e36020860161170f565b925060408501359150606085013567ffffffffffffffff811115611a0657600080fd5b8501601f81018713611a1757600080fd5b611a268782356020840161191e565b91505092959194509250565b600060208284031215611a4457600080fd5b813567ffffffffffffffff811115611a5b57600080fd5b8201601f81018413611a6c57600080fd5b6116b58482356020840161191e565b60008060408385031215611a8e57600080fd5b611a978361170f565b9150611aa56020840161170f565b90509250929050565b600181811c90821680611ac257607f821691505b602082108103611afb577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611b6157611b61611b01565b5060010190565b601f82111561070257806000526020600020601f840160051c81016020851015611b8f5750805b601f840160051c820191505b8181101561103e5760008155600101611b9b565b815167ffffffffffffffff811115611bc957611bc96118ef565b611bdd81611bd78454611aae565b84611b68565b6020601f821160018114611c2f5760008315611bf95750848201515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600385901b1c1916600184901b17845561103e565b6000848152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08516915b82811015611c7d5787850151825560209485019460019092019101611c5d565b5084821015611cb957868401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b60f8161c191681555b50505050600190811b01905550565b600060208284031215611cda57600080fd5b81516117088161188d565b73ffffffffffffffffffffffffffffffffffffffff8516815273ffffffffffffffffffffffffffffffffffffffff84166020820152826040820152608060608201526000611d366080830184611753565b9695505050505050565b600060208284031215611d5257600080fd5b8151611708816116bd565b818103818111156104c5576104c5611b01565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c634300081a000a