0x608060405234801561001057600080fd5b50600436106101c45760003560e01c80639010d07c116100f9578063b8b8029511610097578063db9020eb11610071578063db9020eb146103d1578063e6fd48bc146103e6578063e949580e146103ef578063fad66df51461041e57600080fd5b8063b8b8029514610384578063ca15c873146103ab578063d547741f146103be57600080fd5b80639abe08e6116100d35780639abe08e61461033f578063a217fddf14610352578063a85adeab1461035a578063a8c7a08a1461036357600080fd5b80639010d07c1461031057806391d1485414610323578063953b8fb81461033657600080fd5b80633c24b7d7116101665780635c60da1b116101405780635c60da1b146102d457806366dfbfb4146102dc5780637af14f24146102ef5780638b22c570146102fd57600080fd5b80633c24b7d71461028e5780634a6a3d10146102b957806359659e90146102cc57600080fd5b8063248a9ca3116101a2578063248a9ca31461021e5780632f2ff15d14610241578063308d1a231461025457806336568abe1461027b57600080fd5b806301ffc9a7146101c957806305a9f274146101f157806315514ac514610209575b600080fd5b6101dc6101d7366004612322565b610431565b60405190151581526020015b60405180910390f35b6101fb6101005481565b6040519081526020016101e8565b61021c610217366004612361565b61045c565b005b6101fb61022c3660046123ea565b60009081526065602052604090206001015490565b61021c61024f366004612403565b610910565b6101fb7fe0a0deb5b4f10c1ea7c65c25ee858cc9b745479ef76ef752650137dc00e2ba2681565b61021c610289366004612403565b61093a565b6102a161029c3660046123ea565b6109b8565b6040516001600160a01b0390911681526020016101e8565b60fb546102a1906001600160a01b031681565b6102a16109e3565b6102a1610a1b565b61021c6102ea366004612403565b610aaf565b610101546101dc9060ff1681565b61021c61030b366004612433565b610f20565b6102a161031e36600461244b565b61106e565b6101dc610331366004612403565b61108d565b6101fb60ff5481565b61021c61034d366004612361565b6110b8565b6101fb600081565b6101fb60fe5481565b6101fb61037136600461246d565b6101026020526000908152604090205481565b6101fb7f49e5f17da994e62b953d3c717479fef724a74bc026068515122a6a2b0fc8de9081565b6101fb6103b93660046123ea565b611573565b61021c6103cc366004612403565b61158a565b6103d96115af565b6040516101e8919061248a565b6101fb60fd5481565b6101dc6103fd3660046124ed565b80516020818301810180516101038252928201919093012091525460ff1681565b60fc546102a1906001600160a01b031681565b60006001600160e01b03198216635a05180f60e01b1480610456575061045682611615565b92915050565b8181610103828260405161047192919061259e565b9081526040519081900360200190205460ff16156104aa5760405162461bcd60e51b81526004016104a1906125ae565b60405180910390fd5b60fc546001600160a01b031633146105015760405162461bcd60e51b81526020600482015260266024820152600080516020612a6883398151915260448201526531b0b63632b960d11b60648201526084016104a1565b6101045461055f5760405162461bcd60e51b815260206004820152602560248201527f537570706f727450726f6a65637454726561737572793a204e6f20737570706f604482015264727465727360d81b60648201526084016104a1565b6001600160a01b03851630146105875760405162461bcd60e51b81526004016104a1906125fc565b6040517510d05390d15317d4d5541413d49517d41493d29150d560521b60208201526bffffffffffffffffffffffff1933606090811b82166036840152604a830189905287901b16606a820152600090607e0160408051601f1981840301815291905260fb548151602083012091925061062f916001600160a01b039091169087877f49e5f17da994e62b953d3c717479fef724a74bc026068515122a6a2b0fc8de9061164a565b61064b5760405162461bcd60e51b81526004016104a190612639565b60fb546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610694573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b89190612670565b90506101005481146106dc5760405162461bcd60e51b81526004016104a190612689565b60fb54604051630852cd8d60e31b8152600481018390526001600160a01b03909116906342966c6890602401600060405180830381600087803b15801561072257600080fd5b505af1158015610736573d6000803e3d6000fd5b50506101045460009250905067ffffffffffffffff81111561075a5761075a6124d7565b604051908082528060200260200182016040528015610783578160200160208202803683370190505b50905060005b6101045481101561080357610102600061010483815481106107ad576107ad6126be565b60009182526020808320909101546001600160a01b0316835282019290925260400190205482518390839081106107e6576107e66126be565b6020908102919091010152806107fb816126ea565b915050610789565b507f5d382f9df485111cb37aa5437841ea06a93e193cc12e4042d6b6c99bbe70ec366101048260405161083792919061277c565b60405180910390a160fb546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610887573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ab9190612670565b156108c85760405162461bcd60e51b81526004016104a1906127a1565b6108d06116df565b505050600161010383836040516108e892919061259e565b908152604051908190036020019020805491151560ff19909216919091179055505050505050565b60008281526065602052604090206001015461092b81611753565b6109358383611760565b505050565b6001600160a01b03811633146109aa5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016104a1565b6109b48282611782565b5050565b61010481815481106109c957600080fd5b6000918252602090912001546001600160a01b0316905081565b6000610a167fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b905090565b6000610a4e7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a1691906127f2565b60fb546001600160a01b03163314610b2f5760405162461bcd60e51b815260206004820152603760248201527f537570706f727450726f6a65637454726561737572793a2043616c6c6572206960448201527f73206e6f74207468652057657075626c6963506f696e7400000000000000000060648201526084016104a1565b60008211610b7c5760405162461bcd60e51b81526020600482015260266024820152600080516020612a68833981519152604482015265185b5bdd5b9d60d21b60648201526084016104a1565b6001600160a01b038116610ba25760405162461bcd60e51b81526004016104a19061280f565b60fd54421015610c005760405162461bcd60e51b815260206004820152602360248201527f537570706f727450726f6a65637454726561737572793a204e6f7420737461726044820152621d195960ea1b60648201526084016104a1565b60fe54421115610c525760405162461bcd60e51b815260206004820152601d60248201527f537570706f727450726f6a65637454726561737572793a20456e64656400000060448201526064016104a1565b8161010054610c619190612844565b60fb546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610ca9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ccd9190612670565b14610cea5760405162461bcd60e51b81526004016104a190612689565b6101015460ff1615156001148015610d6e575060ff5460fb546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610d48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6c9190612670565b115b15610dd05760405162461bcd60e51b815260206004820152602c60248201527f537570706f727450726f6a65637454726561737572793a20526573747269637460448201526b1959081d1bc81d185c99d95d60a21b60648201526084016104a1565b6001600160a01b0381166000908152610102602052604081208054849290610df9908490612844565b92505081905550816101006000828254610e139190612844565b92505081905550610e8881610104805480602002602001604051908101604052809291908181526020018280548015610e7557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610e57575b50505050506117a490919063ffffffff16565b610ed95761010480546001810182556000919091527f4c0be60200faa20559308cb7b5a1bb3255c16cb1cab91f525b5ae7a03d02fabe0180546001600160a01b0319166001600160a01b0383161790555b604080516001600160a01b0383168152602081018490527f9f1ec8c880f76798e7b793325d625e9b60e4082a553c98f42b6cda368dd6000891015b60405180910390a15050565b600054610100900460ff1615808015610f405750600054600160ff909116105b80610f5a5750303b158015610f5a575060005460ff166001145b610fbd5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016104a1565b6000805460ff191660011790558015610fe0576000805461ff0019166101001790555b610fe861180d565b61102c610ff8602084018461246d565b611008604085016020860161246d565b60408501356060860135608087013561102760c0890160a08a01612865565b611836565b80156109b4576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001610f14565b60008281526097602052604081206110869083611a7f565b9392505050565b60009182526065602090815260408084206001600160a01b0393909316845291905290205460ff1690565b818161010382826040516110cd92919061259e565b9081526040519081900360200190205460ff16156110fd5760405162461bcd60e51b81526004016104a1906125ae565b60fe54421161115c5760405162461bcd60e51b815260206004820152602560248201527f537570706f727450726f6a65637454726561737572793a204e6f7420656e646560448201526419081e595d60da1b60648201526084016104a1565b600061010054116111bb5760405162461bcd60e51b8152602060048201526024808201527f537570706f727450726f6a65637454726561737572793a204e6f20737570706f604482015263393a32b960e11b60648201526084016104a1565b6101005460fb546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611207573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122b9190612670565b146112485760405162461bcd60e51b81526004016104a190612689565b6001600160a01b03851630146112705760405162461bcd60e51b81526004016104a1906125fc565b6040517514d15515131157d4d5541413d49517d41493d29150d560521b60208201526bffffffffffffffffffffffff1933606090811b82166036840152604a830189905287901b16606a820152600090607e0160408051601f1981840301815291905260fb5481516020830120919250611318916001600160a01b039091169087877fe0a0deb5b4f10c1ea7c65c25ee858cc9b745479ef76ef752650137dc00e2ba2661164a565b6113345760405162461bcd60e51b81526004016104a190612639565b60fb5460fc546101005460405163a9059cbb60e01b81526001600160a01b039283166004820152602481019190915291169063a9059cbb906044016020604051808303816000875af115801561138e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b29190612882565b506101045460009067ffffffffffffffff8111156113d2576113d26124d7565b6040519080825280602002602001820160405280156113fb578160200160208202803683370190505b50905060005b6101045481101561147b5761010260006101048381548110611425576114256126be565b60009182526020808320909101546001600160a01b03168352820192909252604001902054825183908390811061145e5761145e6126be565b602090810291909101015280611473816126ea565b915050611401565b5060fc54610100546040517fa79d1a02bb1c6f0cc234323a89caa1cf0a7e04ac7c051a5845e2675fd1f347fd926114c3926001600160a01b039091169161010490869061289f565b60405180910390a160fb546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611513573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115379190612670565b156115545760405162461bcd60e51b81526004016104a1906127a1565b61155c6116df565b5050600161010383836040516108e892919061259e565b600081815260976020526040812061045690611a8b565b6000828152606560205260409020600101546115a581611753565b6109358383611782565b6060610a1661010480548060200260200160405190810160405280929190818152602001828054801561160b57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116115ed575b5050505050611a95565b60006001600160e01b03198216637965db0b60e01b148061045657506301ffc9a760e01b6001600160e01b0319831614610456565b6000856001600160a01b03166391d1485483611667888888611b50565b6040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa1580156116b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d59190612882565b9695505050505050565b60005b6101045481101561173d5761010260006101048381548110611706576117066126be565b60009182526020808320909101546001600160a01b0316835282019290925260400181205580611735816126ea565b9150506116e2565b5061174b61010460006122f0565b600061010055565b61175d8133611bf7565b50565b61176a8282611c50565b60008281526097602052604090206109359082611cd6565b61178c8282611ceb565b60008281526097602052604090206109359082611d52565b8151600090815b81811015611802578481815181106117c5576117c56126be565b60200260200101516001600160a01b0316846001600160a01b0316036117f057600192505050610456565b806117fa816126ea565b9150506117ab565b506000949350505050565b600054610100900460ff166118345760405162461bcd60e51b81526004016104a1906128e3565b565b600054610100900460ff1661185d5760405162461bcd60e51b81526004016104a1906128e3565b6001600160a01b0386166118835760405162461bcd60e51b81526004016104a19061280f565b6001600160a01b0385166118a95760405162461bcd60e51b81526004016104a19061280f565b82841061192c5760405162461bcd60e51b815260206004820152604560248201527f537570706f727450726f6a65637454726561737572793a20737461727454696d60448201527f657374616d70206d757374206265206c657373207468616e20656e6454696d6560648201526407374616d760dc1b608482015260a4016104a1565b4283116119b55760405162461bcd60e51b815260206004820152604b60248201527f537570706f727450726f6a65637454726561737572793a20656e6454696d657360448201527f74616d70206d7573742062652067726561746572207468616e2063757272656e60648201526a0742074696d657374616d760ac1b608482015260a4016104a1565b60008211611a2b5760405162461bcd60e51b815260206004820152603b60248201527f537570706f727450726f6a65637454726561737572793a20746172676574416d60448201527f6f756e74206d7573742062652067726561746572207468616e2030000000000060648201526084016104a1565b60fb80546001600160a01b03199081166001600160a01b039889161790915560fc8054909116959096169490941790945560fd9190915560fe5560ff91909155610101805460ff1916911515919091179055565b60006110868383611d67565b6000610456825490565b805160609060008167ffffffffffffffff811115611ab557611ab56124d7565b604051908082528060200260200182016040528015611ade578160200160208202803683370190505b50905060005b82811015611b48576000858281518110611b0057611b006126be565b6020026020010151905080838381518110611b1d57611b1d6126be565b6001600160a01b03909216602092830291909101909101525080611b40816126ea565b915050611ae4565b509392505050565b600080611baa856040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b9050611bee84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508593925050611d919050565b95945050505050565b611c01828261108d565b6109b457611c0e81611dad565b611c19836020611dbf565b604051602001611c2a929190612952565b60408051601f198184030181529082905262461bcd60e51b82526104a1916004016129c7565b611c5a828261108d565b6109b45760008281526065602090815260408083206001600160a01b03851684529091529020805460ff19166001179055611c923390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000611086836001600160a01b038416611f5b565b611cf5828261108d565b156109b45760008281526065602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000611086836001600160a01b038416611faa565b6000826000018281548110611d7e57611d7e6126be565b9060005260206000200154905092915050565b6000806000611da0858561209d565b91509150611b48816120e2565b60606104566001600160a01b03831660145b60606000611dce8360026129fa565b611dd9906002612844565b67ffffffffffffffff811115611df157611df16124d7565b6040519080825280601f01601f191660200182016040528015611e1b576020820181803683370190505b509050600360fc1b81600081518110611e3657611e366126be565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611e6557611e656126be565b60200101906001600160f81b031916908160001a9053506000611e898460026129fa565b611e94906001612844565b90505b6001811115611f0c576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611ec857611ec86126be565b1a60f81b828281518110611ede57611ede6126be565b60200101906001600160f81b031916908160001a90535060049490941c93611f0581612a11565b9050611e97565b5083156110865760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016104a1565b6000818152600183016020526040812054611fa257508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610456565b506000610456565b60008181526001830160205260408120548015612093576000611fce600183612a28565b8554909150600090611fe290600190612a28565b9050818114612047576000866000018281548110612002576120026126be565b9060005260206000200154905080876000018481548110612025576120256126be565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061205857612058612a3b565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610456565b6000915050610456565b60008082516041036120d35760208301516040840151606085015160001a6120c78782858561222c565b945094505050506120db565b506000905060025b9250929050565b60008160048111156120f6576120f6612a51565b036120fe5750565b600181600481111561211257612112612a51565b0361215f5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016104a1565b600281600481111561217357612173612a51565b036121c05760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016104a1565b60038160048111156121d4576121d4612a51565b0361175d5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016104a1565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561226357506000905060036122e7565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156122b7573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166122e0576000600192509250506122e7565b9150600090505b94509492505050565b508054600082559060005260206000209081019061175d91905b8082111561231e576000815560010161230a565b5090565b60006020828403121561233457600080fd5b81356001600160e01b03198116811461108657600080fd5b6001600160a01b038116811461175d57600080fd5b6000806000806060858703121561237757600080fd5b8435935060208501356123898161234c565b9250604085013567ffffffffffffffff808211156123a657600080fd5b818701915087601f8301126123ba57600080fd5b8135818111156123c957600080fd5b8860208285010111156123db57600080fd5b95989497505060200194505050565b6000602082840312156123fc57600080fd5b5035919050565b6000806040838503121561241657600080fd5b8235915060208301356124288161234c565b809150509250929050565b600060c0828403121561244557600080fd5b50919050565b6000806040838503121561245e57600080fd5b50508035926020909101359150565b60006020828403121561247f57600080fd5b81356110868161234c565b6020808252825182820181905260009190848201906040850190845b818110156124cb5783516001600160a01b0316835292840192918401916001016124a6565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b6000602082840312156124ff57600080fd5b813567ffffffffffffffff8082111561251757600080fd5b818401915084601f83011261252b57600080fd5b81358181111561253d5761253d6124d7565b604051601f8201601f19908116603f01168101908382118183101715612565576125656124d7565b8160405282815287602084870101111561257e57600080fd5b826020860160208301376000928101602001929092525095945050505050565b8183823760009101908152919050565b6020808252602e908201527f537570706f727450726f6a65637454726561737572793a205369676e6174757260408201526d1948185b1c9958591e481d5cd95960921b606082015260800190565b6020808252602f90820152600080516020612a6883398151915260408201526e70726f6a656374547265617375727960881b606082015260800190565b6020808252602990820152600080516020612a688339815191526040820152687369676e617475726560b81b606082015260800190565b60006020828403121561268257600080fd5b5051919050565b6020808252602790820152600080516020612a6883398151915260408201526662616c616e636560c81b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016126fc576126fc6126d4565b5060010190565b6000815480845260208085019450836000528060002060005b838110156127415781546001600160a01b03168752958201956001918201910161271c565b509495945050505050565b600081518084526020808501945080840160005b8381101561274157815187529582019590820190600101612760565b60408152600061278f6040830185612703565b8281036020840152611bee818561274c565b60208082526031908201527f537570706f727450726f6a65637454726561737572793a2070726f6a6563742060408201527062616c616e6365206e6f7420656d70747960781b606082015260800190565b60006020828403121561280457600080fd5b81516110868161234c565b6020808252602790820152600080516020612a688339815191526040820152666164647265737360c81b606082015260800190565b80820180821115610456576104566126d4565b801515811461175d57600080fd5b60006020828403121561287757600080fd5b813561108681612857565b60006020828403121561289457600080fd5b815161108681612857565b60018060a01b03851681528360208201526080604082015260006128c66080830185612703565b82810360608401526128d8818561274c565b979650505050505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60005b83811015612949578181015183820152602001612931565b50506000910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161298a81601785016020880161292e565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516129bb81602884016020880161292e565b01602801949350505050565b60208152600082518060208401526129e681604085016020870161292e565b601f01601f19169190910160400192915050565b8082028115828204841417610456576104566126d4565b600081612a2057612a206126d4565b506000190190565b81810381811115610456576104566126d4565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052602160045260246000fdfe537570706f727450726f6a65637454726561737572793a20496e76616c696420a264697066735822122058f2d332e78182401ba293e64424e06c8899de81e86c20367a36d7934d4b6ed764736f6c63430008110033