0x608060405234801561001057600080fd5b5060018055612016806100246000396000f3fe6080604052600436106101395760003560e01c80636b0509b1116100ab578063ba5460e31161006f578063ba5460e314610414578063c403f90f14610434578063ca45c51a1461044a578063cf756fdf146104c1578063d0ebdbe7146104e1578063f3fef3a31461050157600080fd5b80636b0509b114610337578063799622371461036b578063895d73861461038b5780638b754c6d146103c15780638da5cb5b146103f457600080fd5b8063481c6a75116100fd578063481c6a75146102455780634ab5b1871461027d5780634b2ee4ee1461029d5780634d06068a146102bd57806354fd4d50146102dd5780635e6d0ac81461031757600080fd5b80630288a1e01461014557806313af40351461016757806320606b70146101875780632d8949d0146101ce57806338471bd81461022557600080fd5b3661014057005b600080fd5b34801561015157600080fd5b50610165610160366004611b68565b610521565b005b34801561017357600080fd5b50610165610182366004611c2a565b610623565b34801561019357600080fd5b506101bb7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6040519081526020015b60405180910390f35b3480156101da57600080fd5b5061020a6101e9366004611c2a565b60076020526000908152604090208054600182015460029092015490919083565b604080519384526020840192909252908201526060016101c5565b34801561023157600080fd5b506101bb610240366004611c5b565b6106c5565b34801561025157600080fd5b50600554610265906001600160a01b031681565b6040516001600160a01b0390911681526020016101c5565b34801561028957600080fd5b506101bb610298366004611c5b565b610a3f565b3480156102a957600080fd5b506101656102b8366004611ce2565b610cd8565b3480156102c957600080fd5b50600254610265906001600160a01b031681565b3480156102e957600080fd5b5061030a604051806040016040528060018152602001603160f81b81525081565b6040516101c59190611d7d565b34801561032357600080fd5b50600354610265906001600160a01b031681565b34801561034357600080fd5b506101bb7f850f4d483fdb056e5b90a6178dc09e2762b5c2b390bca3ab54e4dee5122b7e5381565b34801561037757600080fd5b50610165610386366004611d90565b610d44565b34801561039757600080fd5b5061030a6040518060400160405280600a8152602001694b4f4c56657374696e6760b01b81525081565b3480156103cd57600080fd5b506005546103e290600160a01b900460ff1681565b60405160ff90911681526020016101c5565b34801561040057600080fd5b50600454610265906001600160a01b031681565b34801561042057600080fd5b506101bb61042f366004611da9565b610d73565b34801561044057600080fd5b506101bb60065481565b34801561045657600080fd5b5061030a610465366004611dde565b604080516001600160a01b03958616602482015293851660448501529190931660648301526084808301939093528051808303909301835260a490910190526020810180516001600160e01b031663cf756fdf60e01b17905290565b3480156104cd57600080fd5b506101656104dc366004611dde565b610d86565b3480156104ed57600080fd5b506101656104fc366004611c2a565b610ed5565b34801561050d57600080fd5b5061016561051c366004611e2f565b610f77565b6004546001600160a01b031633146105545760405162461bcd60e51b815260040161054b90611e5b565b60405180910390fd5b805182511461059a5760405162461bcd60e51b8152602060048201526012602482015271506172616d657465722069732077726f6e6760701b604482015260640161054b565b60005b825181101561061e576000600760008584815181106105be576105be611e8a565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002090508282815181106105fa576105fa611e8a565b6020026020010151816001018190555050808061061690611eb6565b91505061059d565b505050565b6004546001600160a01b0316331461064d5760405162461bcd60e51b815260040161054b90611e5b565b6001600160a01b0381166106a35760405162461bcd60e51b815260206004820152601b60248201527f4f776e65722063616e2774206265207a65726f20616464726573730000000000604482015260640161054b565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b60008480156106d6576106d6611ed1565b84848460006106e633868661107c565b9050600061072a8285858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506110f492505050565b6005549091506001600160a01b0380831691161461078a5760405162461bcd60e51b815260206004820152601a60248201527f4b4f4c56657374696e673a20696e76616c6964207369676e6572000000000000604482015260640161054b565b6003546001600160a01b03166107e25760405162461bcd60e51b815260206004820152601c60248201527f506f727433205374616b65206164647265737320697320656d70747900000000604482015260640161054b565b6000808c80156107f4576107f4611ed1565b141561080f5750336000908152600760205260409020610815565b50610a31565b600181015461082657600181018b90555b610830338d61111a565b9750600088116108795760405162461bcd60e51b8152602060048201526014602482015273125b9d985b1a590818db185a5b48185b5bdd5b9d60621b604482015260640161054b565b428155600281015461088b90896112d5565b8160020181905550336001600160a01b03167f8e3a3c9cb1053e365062561003e3cf87b3de309aff9d418c06a7327098537e41898e6040516108ce929190611ee7565b60405180910390a26002546040516370a0823160e01b815230600482015289916001600160a01b0316906370a082319060240160206040518083038186803b15801561091957600080fd5b505afa15801561092d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109519190611f19565b101561099b5760405162461bcd60e51b8152602060048201526019602482015278496e73756666696369656e7420706f6f6c2062616c616e636560381b604482015260640161054b565b6003546002546109b8916001600160a01b0391821691168a6112e1565b600354600554604051632689a78360e21b8152600160a01b90910460ff166004820152602481018a90523360448201526001600160a01b0390911690639a269e0c90606401600060405180830381600087803b158015610a1757600080fd5b505af1158015610a2b573d6000803e3d6000fd5b50505050505b505050505050949350505050565b6000848015610a5057610a50611ed1565b8484846000610a6033868661107c565b90506000610aa48285858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506110f492505050565b6005549091506001600160a01b03808316911614610b045760405162461bcd60e51b815260206004820152601a60248201527f4b4f4c56657374696e673a20696e76616c6964207369676e6572000000000000604482015260640161054b565b6000808c8015610b1657610b16611ed1565b141561080f57503360009081526007602052604090206001810154610b3d57600181018b90555b610b47338d61111a565b975060008811610b905760405162461bcd60e51b8152602060048201526014602482015273125b9d985b1a590818db185a5b48185b5bdd5b9d60621b604482015260640161054b565b4281556002810154610ba290896112d5565b8160020181905550336001600160a01b03167f8e3a3c9cb1053e365062561003e3cf87b3de309aff9d418c06a7327098537e41898e604051610be5929190611ee7565b60405180910390a26002546040516370a0823160e01b815230600482015289916001600160a01b0316906370a082319060240160206040518083038186803b158015610c3057600080fd5b505afa158015610c44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c689190611f19565b1015610cb25760405162461bcd60e51b8152602060048201526019602482015278496e73756666696369656e7420706f6f6c2062616c616e636560381b604482015260640161054b565b600254610cc9906001600160a01b0316338a611438565b50505050505050949350505050565b6004546001600160a01b03163314610d025760405162461bcd60e51b815260040161054b90611e5b565b600380546001600160a01b039093166001600160a01b0319909316929092179091556005805460ff909216600160a01b0260ff60a01b19909216919091179055565b6004546001600160a01b03163314610d6e5760405162461bcd60e51b815260040161054b90611e5b565b600655565b6000610d7f838361111a565b9392505050565b600054610100900460ff1615808015610da65750600054600160ff909116105b80610dc05750303b158015610dc0575060005460ff166001145b610e235760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161054b565b6000805460ff191660011790558015610e46576000805461ff0019166101001790555b600480546001600160a01b038088166001600160a01b03199283161790925560058054878416908316179055600684905560028054928616929091169190911790558015610ece576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b6004546001600160a01b03163314610eff5760405162461bcd60e51b815260040161054b90611e5b565b6001600160a01b038116610f555760405162461bcd60e51b815260206004820152601d60248201527f4d616e616765722063616e2774206265207a65726f2061646472657373000000604482015260640161054b565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6004546001600160a01b03163314610fa15760405162461bcd60e51b815260040161054b90611e5b565b6002546040516370a0823160e01b815230600482015282916001600160a01b0316906370a082319060240160206040518083038186803b158015610fe457600080fd5b505afa158015610ff8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101c9190611f19565b10156110615760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015260640161054b565b600254611078906001600160a01b03168383611438565b5050565b604080517f850f4d483fdb056e5b90a6178dc09e2762b5c2b390bca3ab54e4dee5122b7e5360208201526001600160a01b0385169181019190915260ff83166060820152608081018290526000906110ec9060a00160405160208183030381529060405280519060200120611468565b949350505050565b60008060006111038585611582565b91509150611110816115c8565b5090505b92915050565b6000808083801561112d5761112d611ed1565b141561115157506001600160a01b0383166000908152600760205260409020611157565b50611114565b60006111748260020154836001015461178690919063ffffffff16565b9050816001015460001480611187575080155b15611193575050611114565b6201518060008580156111a8576111a8611ed1565b14156112745760028301546111e5576111de620f42406111d86203d090866001015461179290919063ffffffff16565b9061179e565b9350611274565b611244620f42406111d861121f6111fd856015611f32565b6111d861120b876007611f32565b600654611219904290611786565b90611786565b61123e60036111d8620b71b08a6001015461179290919063ffffffff16565b90611792565b935061127161126a620f42406111d86203d090876001015461179290919063ffffffff16565b85906112d5565b93505b8260020154841115611297576002830154611290908590611786565b935061129c565b600093505b600283015460018401546112af91611786565b8411156112cc57600283015460018401546112c991611786565b93505b50505092915050565b6000610d7f8284611f51565b80158061136a5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b15801561133057600080fd5b505afa158015611344573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113689190611f19565b155b6113d55760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606482015260840161054b565b6040516001600160a01b03831660248201526044810182905261061e90849063095ea7b360e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526117aa565b6040516001600160a01b03831660248201526044810182905261061e90849063a9059cbb60e01b90606401611401565b6000611114611541604080518082018252600a8152694b4f4c56657374696e6760b01b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527f08f8fb64c7b27b545f23d4fec1261c60b040d7b575a55b978fbfa76ca728c48e818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528351808303909101815260c0909101909252815191012090565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000808251604114156115b95760208301516040840151606085015160001a6115ad8782858561187c565b945094505050506115c1565b506000905060025b9250929050565b60008160048111156115dc576115dc611ed1565b14156115e55750565b60018160048111156115f9576115f9611ed1565b14156116475760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161054b565b600281600481111561165b5761165b611ed1565b14156116a95760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161054b565b60038160048111156116bd576116bd611ed1565b14156117165760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161054b565b600481600481111561172a5761172a611ed1565b14156117835760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161054b565b50565b6000610d7f8284611f69565b6000610d7f8284611f32565b6000610d7f8284611f80565b60006117ff826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166119699092919063ffffffff16565b80519091501561061e578080602001905181019061181d9190611fa2565b61061e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161054b565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156118b35750600090506003611960565b8460ff16601b141580156118cb57508460ff16601c14155b156118dc5750600090506004611960565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611930573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661195957600060019250925050611960565b9150600090505b94509492505050565b60606110ec8484600085856001600160a01b0385163b6119cb5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161054b565b600080866001600160a01b031685876040516119e79190611fc4565b60006040518083038185875af1925050503d8060008114611a24576040519150601f19603f3d011682016040523d82523d6000602084013e611a29565b606091505b5091509150611a39828286611a44565b979650505050505050565b60608315611a53575081610d7f565b825115611a635782518084602001fd5b8160405162461bcd60e51b815260040161054b9190611d7d565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611abc57611abc611a7d565b604052919050565b600067ffffffffffffffff821115611ade57611ade611a7d565b5060051b60200190565b6001600160a01b038116811461178357600080fd5b600082601f830112611b0e57600080fd5b81356020611b23611b1e83611ac4565b611a93565b82815260059290921b84018101918181019086841115611b4257600080fd5b8286015b84811015611b5d5780358352918301918301611b46565b509695505050505050565b60008060408385031215611b7b57600080fd5b823567ffffffffffffffff80821115611b9357600080fd5b818501915085601f830112611ba757600080fd5b81356020611bb7611b1e83611ac4565b82815260059290921b84018101918181019089841115611bd657600080fd5b948201945b83861015611bfd578535611bee81611ae8565b82529482019490820190611bdb565b96505086013592505080821115611c1357600080fd5b50611c2085828601611afd565b9150509250929050565b600060208284031215611c3c57600080fd5b8135610d7f81611ae8565b803560018110611c5657600080fd5b919050565b60008060008060608587031215611c7157600080fd5b611c7a85611c47565b935060208501359250604085013567ffffffffffffffff80821115611c9e57600080fd5b818701915087601f830112611cb257600080fd5b813581811115611cc157600080fd5b886020828501011115611cd357600080fd5b95989497505060200194505050565b60008060408385031215611cf557600080fd5b8235611d0081611ae8565b9150602083013560ff81168114611d1657600080fd5b809150509250929050565b60005b83811015611d3c578181015183820152602001611d24565b83811115611d4b576000848401525b50505050565b60008151808452611d69816020860160208601611d21565b601f01601f19169290920160200192915050565b602081526000610d7f6020830184611d51565b600060208284031215611da257600080fd5b5035919050565b60008060408385031215611dbc57600080fd5b8235611dc781611ae8565b9150611dd560208401611c47565b90509250929050565b60008060008060808587031215611df457600080fd5b8435611dff81611ae8565b93506020850135611e0f81611ae8565b92506040850135611e1f81611ae8565b9396929550929360600135925050565b60008060408385031215611e4257600080fd5b8235611e4d81611ae8565b946020939093013593505050565b6020808252601590820152741bdb9b1e4818591b5a5b881a5cc8185b1b1bddd959605a1b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415611eca57611eca611ea0565b5060010190565b634e487b7160e01b600052602160045260246000fd5b8281526040810160018310611f0c57634e487b7160e01b600052602160045260246000fd5b8260208301529392505050565b600060208284031215611f2b57600080fd5b5051919050565b6000816000190483118215151615611f4c57611f4c611ea0565b500290565b60008219821115611f6457611f64611ea0565b500190565b600082821015611f7b57611f7b611ea0565b500390565b600082611f9d57634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611fb457600080fd5b81518015158114610d7f57600080fd5b60008251611fd6818460208701611d21565b919091019291505056fea26469706673582212200badc4d2cc7e07bb41901c2bd596c74792404d976e2873a2657415d1142a228b64736f6c63430008090033