60806040523480156200001157600080fd5b50604051620022973803806200229783398101604081905262000034916200012c565b806040518060400160405280600a815260200169145d5958dadbc813919560b21b815250604051806040016040528060048152602001631453999d60e21b815250816000908162000086919062000205565b50600162000095828262000205565b5050506001600160a01b038116620000c757604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b620000d281620000da565b5050620002d1565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000602082840312156200013f57600080fd5b81516001600160a01b03811681146200015757600080fd5b9392505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200018957607f821691505b602082108103620001aa57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000200576000816000526020600020601f850160051c81016020861015620001db5750805b601f850160051c820191505b81811015620001fc57828155600101620001e7565b5050505b505050565b81516001600160401b038111156200022157620002216200015e565b620002398162000232845462000174565b84620001b0565b602080601f831160018114620002715760008415620002585750858301515b600019600386901b1c1916600185901b178555620001fc565b600085815260208120601f198616915b82811015620002a25788860151825594840194600190910190840162000281565b5085821015620002c15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b611fb680620002e16000396000f3fe6080604052600436106101755760003560e01c806395d89b41116100cb578063c87b56dd1161007f578063e985e9c511610059578063e985e9c514610427578063f2fde38b1461047d578063f4812eb91461049d57600080fd5b8063c87b56dd146103d4578063d0def521146103f4578063d96a094a1461041457600080fd5b8063aa46a400116100b0578063aa46a4001461035b578063b4c635b214610371578063b88d4fde146103b457600080fd5b806395d89b4114610326578063a22cb4651461033b57600080fd5b806342842e0e1161012d57806370a082311161010757806370a08231146102b8578063715018a6146102e65780638da5cb5b146102fb57600080fd5b806342842e0e1461025857806342966c68146102785780636352211e1461029857600080fd5b8063081812fc1161015e578063081812fc146101d1578063095ea7b31461021657806323b872dd1461023857600080fd5b806301ffc9a71461017a57806306fdde03146101af575b600080fd5b34801561018657600080fd5b5061019a610195366004611983565b6104ca565b60405190151581526020015b60405180910390f35b3480156101bb57600080fd5b506101c4610526565b6040516101a69190611a0e565b3480156101dd57600080fd5b506101f16101ec366004611a21565b6105b8565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a6565b34801561022257600080fd5b50610236610231366004611a63565b6105ee565b005b34801561024457600080fd5b50610236610253366004611a8d565b6105fd565b34801561026457600080fd5b50610236610273366004611a8d565b6106f3565b34801561028457600080fd5b50610236610293366004611a21565b610713565b3480156102a457600080fd5b506101f16102b3366004611a21565b61071f565b3480156102c457600080fd5b506102d86102d3366004611ac9565b61072a565b6040519081526020016101a6565b3480156102f257600080fd5b506102366107a5565b34801561030757600080fd5b5060075473ffffffffffffffffffffffffffffffffffffffff166101f1565b34801561033257600080fd5b506101c46107b9565b34801561034757600080fd5b50610236610356366004611ae4565b6107c8565b34801561036757600080fd5b506102d860085481565b34801561037d57600080fd5b506101f161038c366004611a21565b600a6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156103c057600080fd5b506102366103cf366004611be3565b6107d3565b3480156103e057600080fd5b506101c46103ef366004611a21565b6107ea565b34801561040057600080fd5b506102d861040f366004611c5f565b6108fb565b610236610422366004611a21565b6109a0565b34801561043357600080fd5b5061019a610442366004611cc1565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561048957600080fd5b50610236610498366004611ac9565b610a78565b3480156104a957600080fd5b506102d86104b8366004611a21565b60096020526000908152604090205481565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f49064906000000000000000000000000000000000000000000000000000000001480610520575061052082610ad9565b92915050565b60606000805461053590611cf4565b80601f016020809104026020016040519081016040528092919081815260200182805461056190611cf4565b80156105ae5780601f10610583576101008083540402835291602001916105ae565b820191906000526020600020905b81548152906001019060200180831161059157829003601f168201915b5050505050905090565b60006105c382610bbc565b5060008281526004602052604090205473ffffffffffffffffffffffffffffffffffffffff16610520565b6105f9828233610c1b565b5050565b73ffffffffffffffffffffffffffffffffffffffff8216610652576040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600060048201526024015b60405180910390fd5b600061065f838333610c28565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146106ed576040517f64283d7b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80861660048301526024820184905282166044820152606401610649565b50505050565b61070e838383604051806020016040528060008152506107d3565b505050565b61071c81610da5565b50565b600061052082610bbc565b600073ffffffffffffffffffffffffffffffffffffffff821661077c576040517f89c62b6400000000000000000000000000000000000000000000000000000000815260006004820152602401610649565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b6107ad610e06565b6107b76000610e59565b565b60606001805461053590611cf4565b6105f9338383610ed0565b6107de8484846105fd565b6106ed84848484610fcd565b60606107f582610bbc565b506000828152600660205260408120805461080f90611cf4565b80601f016020809104026020016040519081016040528092919081815260200182805461083b90611cf4565b80156108885780601f1061085d57610100808354040283529160200191610888565b820191906000526020600020905b81548152906001019060200180831161086b57829003601f168201915b5050505050905060006108a660408051602081019091526000815290565b905080516000036108b8575092915050565b8151156108ea5780826040516020016108d2929190611d47565b60405160208183030381529060405292505050919050565b6108f3846111c4565b949350505050565b6000600a600854101561093e5760016008600082825461091b9190611d76565b909155505060085461092d8482611239565b61093781846112ea565b9050610520565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f546f6b656e206c696d69742065786365656465640000000000000000000000006044820152606401610649565b600081815260096020526040812054906109b98361071f565b60405190915073ffffffffffffffffffffffffffffffffffffffff8216903480156108fc02916000818181858888f193505050501580156109fe573d6000803e3d6000fd5b50610a0a81338561133a565b600083815260096020908152604080832092909255815173ffffffffffffffffffffffffffffffffffffffff841681523391810191909152348183015290517f608f6ac9327c2bf4d3c77adf447d2c448ba7b0971e0aaa9aa03f7ac29d874a449181900360600190a1505050565b610a80610e06565b73ffffffffffffffffffffffffffffffffffffffff8116610ad0576040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260006004820152602401610649565b61071c81610e59565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd000000000000000000000000000000000000000000000000000000001480610b6c57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061052057507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610520565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff1680610520576040517f7e27328900000000000000000000000000000000000000000000000000000000815260048101849052602401610649565b61070e8383836001611476565b60008281526002602052604081205473ffffffffffffffffffffffffffffffffffffffff90811690831615610c6257610c62818486611641565b73ffffffffffffffffffffffffffffffffffffffff811615610cd857610c8c600085600080611476565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190555b73ffffffffffffffffffffffffffffffffffffffff851615610d215773ffffffffffffffffffffffffffffffffffffffff85166000908152600360205260409020805460010190555b60008481526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b6000610db46000836000610c28565b905073ffffffffffffffffffffffffffffffffffffffff81166105f9576040517f7e27328900000000000000000000000000000000000000000000000000000000815260048101839052602401610649565b60075473ffffffffffffffffffffffffffffffffffffffff1633146107b7576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610649565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b73ffffffffffffffffffffffffffffffffffffffff8216610f35576040517f5b08ba1800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401610649565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526005602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff83163b156106ed576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063150b7a0290611042903390889087908790600401611db0565b6020604051808303816000875af192505050801561109b575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261109891810190611df9565b60015b61112a573d8080156110c9576040519150601f19603f3d011682016040523d82523d6000602084013e6110ce565b606091505b508051600003611122576040517f64a0ae9200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610649565b805181602001fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081167f150b7a0200000000000000000000000000000000000000000000000000000000146111bd576040517f64a0ae9200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610649565b5050505050565b60606111cf82610bbc565b5060006111e760408051602081019091526000815290565b905060008151116112075760405180602001604052806000815250611232565b80611211846116f1565b604051602001611222929190611d47565b6040516020818303038152906040525b9392505050565b73ffffffffffffffffffffffffffffffffffffffff8216611289576040517f64a0ae9200000000000000000000000000000000000000000000000000000000815260006004820152602401610649565b600061129783836000610c28565b905073ffffffffffffffffffffffffffffffffffffffff81161561070e576040517f73c6ac6e00000000000000000000000000000000000000000000000000000000815260006004820152602401610649565b60008281526006602052604090206113028282611e66565b506040518281527ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce79060200160405180910390a15050565b73ffffffffffffffffffffffffffffffffffffffff821661138a576040517f64a0ae9200000000000000000000000000000000000000000000000000000000815260006004820152602401610649565b600061139883836000610c28565b905073ffffffffffffffffffffffffffffffffffffffff81166113ea576040517f7e27328900000000000000000000000000000000000000000000000000000000815260048101839052602401610649565b8373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146106ed576040517f64283d7b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80861660048301526024820184905282166044820152606401610649565b8080611497575073ffffffffffffffffffffffffffffffffffffffff821615155b156115ec5760006114a784610bbc565b905073ffffffffffffffffffffffffffffffffffffffff8316158015906114fa57508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b8015611539575073ffffffffffffffffffffffffffffffffffffffff80821660009081526005602090815260408083209387168352929052205460ff16155b15611588576040517fa9fbf51f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610649565b81156115ea57838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b5050600090815260046020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b61164c8383836117af565b61070e5773ffffffffffffffffffffffffffffffffffffffff83166116a0576040517f7e27328900000000000000000000000000000000000000000000000000000000815260048101829052602401610649565b6040517f177e802f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015260248101829052604401610649565b606060006116fe83611873565b600101905060008167ffffffffffffffff81111561171e5761171e611b20565b6040519080825280601f01601f191660200182016040528015611748576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a850494508461175257509392505050565b600073ffffffffffffffffffffffffffffffffffffffff8316158015906108f357508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061183d575073ffffffffffffffffffffffffffffffffffffffff80851660009081526005602090815260408083209387168352929052205460ff165b806108f357505060009081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff908116911614919050565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106118bc577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef810000000083106118e8576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061190657662386f26fc10000830492506010015b6305f5e100831061191e576305f5e100830492506008015b612710831061193257612710830492506004015b60648310611944576064830492506002015b600a83106105205760010192915050565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461071c57600080fd5b60006020828403121561199557600080fd5b813561123281611955565b60005b838110156119bb5781810151838201526020016119a3565b50506000910152565b600081518084526119dc8160208601602086016119a0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061123260208301846119c4565b600060208284031215611a3357600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611a5e57600080fd5b919050565b60008060408385031215611a7657600080fd5b611a7f83611a3a565b946020939093013593505050565b600080600060608486031215611aa257600080fd5b611aab84611a3a565b9250611ab960208501611a3a565b9150604084013590509250925092565b600060208284031215611adb57600080fd5b61123282611a3a565b60008060408385031215611af757600080fd5b611b0083611a3a565b915060208301358015158114611b1557600080fd5b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff80841115611b6a57611b6a611b20565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715611bb057611bb0611b20565b81604052809350858152868686011115611bc957600080fd5b858560208301376000602087830101525050509392505050565b60008060008060808587031215611bf957600080fd5b611c0285611a3a565b9350611c1060208601611a3a565b925060408501359150606085013567ffffffffffffffff811115611c3357600080fd5b8501601f81018713611c4457600080fd5b611c5387823560208401611b4f565b91505092959194509250565b60008060408385031215611c7257600080fd5b611c7b83611a3a565b9150602083013567ffffffffffffffff811115611c9757600080fd5b8301601f81018513611ca857600080fd5b611cb785823560208401611b4f565b9150509250929050565b60008060408385031215611cd457600080fd5b611cdd83611a3a565b9150611ceb60208401611a3a565b90509250929050565b600181811c90821680611d0857607f821691505b602082108103611d41577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60008351611d598184602088016119a0565b835190830190611d6d8183602088016119a0565b01949350505050565b80820180821115610520577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152611def60808301846119c4565b9695505050505050565b600060208284031215611e0b57600080fd5b815161123281611955565b601f82111561070e576000816000526020600020601f850160051c81016020861015611e3f5750805b601f850160051c820191505b81811015611e5e57828155600101611e4b565b505050505050565b815167ffffffffffffffff811115611e8057611e80611b20565b611e9481611e8e8454611cf4565b84611e16565b602080601f831160018114611ee75760008415611eb15750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611e5e565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015611f3457888601518255948401946001909101908401611f15565b5085821015611f7057878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b0190555056fea2646970667358221220a548ec47c05ceea62d498b45c0d9512de363b0e6d5a06245d0b9a5f9825055cb64736f6c6343000818003300000000000000000000000012ef0f1c99d8fd50ffd37ccd12b09ef7f1213269