0x608060405234801561001057600080fd5b506121ee806100206000396000f3fe6080604052600436106101445760003560e01c8063813d31c9116100b6578063b1d995dd1161006f578063b1d995dd14610463578063bd51f42e1461048e578063d1dc83c2146104c4578063d294f093146104d9578063d60b347f146104ee578063fe2db7d014610527576101ab565b8063813d31c91461038d5780638da5cb5b146103ad5780639a8a0592146103cb5780639f0a22a6146103ee578063aa4efa5b14610403578063ae04d45d14610443576101ab565b80634f64ca19116101085780634f64ca19146102a457806365bb3ea7146102c457806366798c2c146102e45780636b83252a1461031e5780637cf5744f146103585780638129fc1c14610378576101ab565b80630d668087146101e1578063396f7b23146102055780633a552757146102375780633fe3da36146102595780633ff032071461028d576101ab565b366101ab5760405162461bcd60e51b815260206004820152602c60248201527f746865205a6b42726964676520636f6e747261637420646f6573206e6f74206160448201526b63636570742061737365747360a01b60648201526084015b60405180910390fd5b60405162461bcd60e51b815260206004820152600b60248201526a1d5b9cdd5c1c1bdc9d195960aa1b60448201526064016101a2565b3480156101ed57600080fd5b506004545b6040519081526020015b60405180910390f35b34801561021157600080fd5b506002546001600160a01b03165b6040516001600160a01b0390911681526020016101fc565b34801561024357600080fd5b50610257610252366004611adf565b610558565b005b34801561026557600080fd5b506101f27fb8abfd5c33667c7440a4fc1153ae39a24833dbe44f7eb19cbe5cd5f2583e494081565b34801561029957600080fd5b506101f26201518081565b3480156102b057600080fd5b506102576102bf366004611bcf565b610665565b3480156102d057600080fd5b506102576102df366004611c31565b610b5b565b3480156102f057600080fd5b5061021f6102ff366004611c5d565b61ffff166000908152600a60205260409020546001600160a01b031690565b34801561032a57600080fd5b5061021f610339366004611c5d565b61ffff166000908152600960205260409020546001600160a01b031690565b34801561036457600080fd5b50610257610373366004611c7a565b610bac565b34801561038457600080fd5b50610257610c15565b34801561039957600080fd5b506102576103a8366004611c7a565b610cda565b3480156103b957600080fd5b506001546001600160a01b031661021f565b3480156103d757600080fd5b5060005460405161ffff90911681526020016101fc565b3480156103fa57600080fd5b506003546101f2565b34801561040f57600080fd5b5061043361041e366004611cb3565b60009081526008602052604090205460ff1690565b60405190151581526020016101fc565b34801561044f57600080fd5b5061025761045e366004611cb3565b610d43565b610476610471366004611ccc565b610dd8565b6040516001600160401b0390911681526020016101fc565b34801561049a57600080fd5b506104766104a9366004611cb3565b6000908152600560205260409020546001600160401b031690565b3480156104d057600080fd5b50610257610ea7565b3480156104e557600080fd5b506102576110db565b3480156104fa57600080fd5b50610433610509366004611adf565b6001600160a01b031660009081526007602052604090205460ff1690565b34801561053357600080fd5b506101f2610542366004611c5d565b61ffff1660009081526006602052604090205490565b3361056b6001546001600160a01b031690565b6001600160a01b0316146105915760405162461bcd60e51b81526004016101a290611d2d565b6001600160a01b0381166105e75760405162461bcd60e51b815260206004820152601b60248201527f436865636b2070656e64696e67496d706c656d656e746174696f6e000000000060448201526064016101a2565b60006105fb6002546001600160a01b031690565b90506106068261114d565b61062161061260045490565b61061c9042611d78565b600355565b816001600160a01b0316816001600160a01b03167fe945ccee5d701fc83f9b8aa8ca94ea4219ec1fcbd4f4cab4f0ea57c5c3e1d81560405160405180910390a35050565b61ffff8416600090815260096020908152604080832054600a909252909120546001600160a01b039182169116816106d85760405162461bcd60e51b8152602060048201526016602482015275135c1d15995c9a599a595c881a5cc81b9bdd081cd95d60521b60448201526064016101a2565b6001600160a01b03811661072e5760405162461bcd60e51b815260206004820152601860248201527f426c6f636b2055706461746572206973206e6f7420736574000000000000000060448201526064016101a2565b60405163057d916d60e11b81526000906001600160a01b03841690630afb22da9061075d908790600401611dec565b600060405180830381865afa15801561077a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526107a29190810190611e44565b905080602001516001146107f85760405162461bcd60e51b815260206004820181905260248201527f536f7572636520436861696e205472616e73616374696f6e204661696c75726560448201526064016101a2565b8051604051636e1ac47560e11b81526001600160a01b0384169163dc3588ea9161082f918a91600401918252602082015260400190565b602060405180830381865afa15801561084c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108709190611edc565b6108bc5760405162461bcd60e51b815260206004820152601760248201527f426c6f636b20486561646572206973206e6f742073657400000000000000000060448201526064016101a2565b60006108cc82604001518761116f565b90506108e88861ffff1660009081526006602052604090205490565b81608001511461093a5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420736f75726365205a4b42726964676500000000000000000060448201526064016101a2565b600054815161ffff9081169116146109945760405162461bcd60e51b815260206004820152601960248201527f496e76616c69642064657374696e6174696f6e20636861696e0000000000000060448201526064016101a2565b600088826060015183602001516040516020016109d39392919061ffff93909316835260208301919091526001600160401b0316604082015260600190565b604051602081830303815290604052805190602001209050610a048160009081526008602052604090205460ff1690565b15610a515760405162461bcd60e51b815260206004820152601960248201527f4d65737361676520616c72656164792065786563757465642e0000000000000060448201526064016101a2565b610a70816000908152600860205260409020805460ff19166001179055565b6000610a7f83606001516113cb565b905082604001516001600160a01b0316632de9952a8b8386602001518760a001516040518563ffffffff1660e01b8152600401610abf9493929190611efe565b600060405180830381600087803b158015610ad957600080fd5b505af1158015610aed573d6000803e3d6000fd5b5050505082602001516001600160401b03168a61ffff16826001600160a01b03167f4a008ac830958ba6fe8a6e667e2ab53a530eb6cdf93e55b27fc42d7a54cf25b786604001518760a00151604051610b47929190611f45565b60405180910390a450505050505050505050565b33610b6e6001546001600160a01b031690565b6001600160a01b031614610b945760405162461bcd60e51b81526004016101a290611d2d565b61ffff91909116600090815260066020526040902055565b33610bbf6001546001600160a01b031690565b6001600160a01b031614610be55760405162461bcd60e51b81526004016101a290611d2d565b61ffff8216600090815260096020526040902080546001600160a01b0319166001600160a01b0383161790555050565b6000610c487f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b9050610c6c816001600160a01b031660009081526007602052604090205460ff1690565b15610caf5760405162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b60448201526064016101a2565b610cd7816001600160a01b03166000908152600760205260409020805460ff19166001179055565b50565b33610ced6001546001600160a01b031690565b6001600160a01b031614610d135760405162461bcd60e51b81526004016101a290611d2d565b61ffff82166000908152600a6020526040902080546001600160a01b0319166001600160a01b0383161790555050565b33610d566001546001600160a01b031690565b6001600160a01b031614610d7c5760405162461bcd60e51b81526004016101a290611d2d565b62015180811015610dcf5760405162461bcd60e51b815260206004820152601b60248201527f496e636f7272656374206c6f636b54696d652073657474696e6773000000000060448201526064016101a2565b610cd781600455565b6000805461ffff1661ffff168461ffff1603610e365760405162461bcd60e51b815260206004820152601960248201527f43616e6e6f742073656e6420746f2073616d6520636861696e0000000000000060448201526064016101a2565b610e4c610e4660005461ffff1690565b3361141f565b9050806001600160401b03168461ffff16336001600160a01b03167fb8abfd5c33667c7440a4fc1153ae39a24833dbe44f7eb19cbe5cd5f2583e49408686604051610e98929190611f45565b60405180910390a49392505050565b33610eba6001546001600160a01b031690565b6001600160a01b031614610ee05760405162461bcd60e51b81526004016101a290611d2d565b6000610ef46002546001600160a01b031690565b6001600160a01b031603610f4a5760405162461bcd60e51b815260206004820152601b60248201527f436865636b2070656e64696e67496d706c656d656e746174696f6e000000000060448201526064016101a2565b600354421015610f8e5760405162461bcd60e51b815260206004820152600f60248201526e29ba34b636103637b1b5b2b21034b760891b60448201526064016101a2565b6000610fc17f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b90506000610fd76002546001600160a01b031690565b9050610fe3600061114d565b610fec816114c4565b60408051600481526024810182526020810180516001600160e01b031663204a7f0760e21b179052905160009182916001600160a01b0385169161102f91611f69565b600060405180830381855af49150503d806000811461106a576040519150601f19603f3d011682016040523d82523d6000602084013e61106f565b606091505b50915091508181906110945760405162461bcd60e51b81526004016101a29190611dec565b50826001600160a01b0316846001600160a01b03167f2e4cc16c100f0b55e2df82ab0b1a7e294aa9cbd01b48fbaf622683fbc0507a4960405160405180910390a350505050565b336110ee6001546001600160a01b031690565b6001600160a01b0316146111145760405162461bcd60e51b81526004016101a290611d2d565b6001546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610cd7573d6000803e3d6000fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6040805160c0810182526000808252602080830182905282840182905260608084018390526080840183905260a08401528351808501855282815281018290528351808501909452855184528581019084015290916111d290611504565b611504565b9050821561123c576112396111cd61120c836111ef876002611d78565b815181106111ff576111ff611f85565b6020026020010151611619565b60408051808201825260008082526020918201528151808301909252825182529182019181019190915290565b90505b600061125a6111cd61120c846001815181106111ff576111ff611f85565b905060006112818260008151811061127457611274611f85565b6020026020010151611690565b8060200190518101906112949190611f9b565b90507f475402a3cc99838bbf5b03eeac51c65db7cc241bb0814e6341a32a0da7c1b6c081016113c2576112e0836000815181106112d3576112d3611f85565b602002602001015161170d565b608085015281516112fe908390600190811061127457611274611f85565b8060200190518101906113119190611f9b565b6060850152815161132f908390600290811061127457611274611f85565b8060200190518101906113429190611fb4565b61ffff1684528151611361908390600390811061127457611274611f85565b8060200190518101906113749190611fd1565b6001600160401b03166020850152825161139b908490600290811061127457611274611f85565b8060200190518101906113ae9190611ffa565b60a08601526001600160a01b031660408501525b50505092915050565b60006001600160a01b031982161561141b5760405162461bcd60e51b8152602060048201526013602482015272696e76616c69642045564d206164647265737360681b60448201526064016101a2565b5090565b6040805161ffff841660208201526001600160a01b03831691810191909152600090819060600160405160208183030381529060405280519060200120905061147d816000908152600560205260409020546001600160401b031690565b91506114bd8161148e84600161204a565b600091825260056020526040909120805467ffffffffffffffff19166001600160401b03909216919091179055565b5092915050565b6114cd8161171e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b606061150f826117cc565b61151857600080fd5b600061152383611807565b90506000816001600160401b0381111561153f5761153f611b0c565b60405190808252806020026020018201604052801561158457816020015b604080518082019091526000808252602082015281526020019060019003908161155d5790505b5090506000611596856020015161188c565b85602001516115a59190611d78565b90506000805b8481101561160e576115bc8361190e565b91506040518060400160405280838152602001848152508482815181106115e5576115e5611f85565b60209081029190910101526115fa8284611d78565b92508061160681612075565b9150506115ab565b509195945050505050565b6060600082600001516001600160401b0381111561163957611639611b0c565b6040519080825280601f01601f191660200182016040528015611663576020820181803683370190505b50905080516000036116755792915050565b60008160200190506114bd84602001518286600001516119b2565b805160609061169e57600080fd5b6000806116aa84611a35565b915091506000816001600160401b038111156116c8576116c8611b0c565b6040519080825280601f01601f1916602001820160405280156116f2576020820181803683370190505b509050602081016117048482856119b2565b50949350505050565b600061171882611a7c565b92915050565b6001600160a01b0381163b61178b5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016101a2565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b805160009081036117df57506000919050565b6020820151805160001a9060c08210156117fd575060009392505050565b5060019392505050565b8051600090810361181a57506000919050565b60008061182a846020015161188c565b84602001516118399190611d78565b90506000846000015185602001516118519190611d78565b90505b80821015611883576118658261190e565b61186f9083611d78565b91508261187b81612075565b935050611854565b50909392505050565b8051600090811a60808110156118a55750600092915050565b60b88110806118c0575060c081108015906118c0575060f881105b156118ce5750600192915050565b60c0811015611902576118e3600160b861208e565b6118f09060ff16826120b1565b6118fb906001611d78565b9392505050565b6118e3600160f861208e565b80516000908190811a608081101561192957600191506114bd565b60b881101561194f5761193d6080826120b1565b611948906001611d78565b91506114bd565b60c081101561197c5760b78103600185019450806020036101000a855104600182018101935050506114bd565b60f88110156119905761193d60c0826120b1565b60019390930151602084900360f7016101000a900490920160f5190192915050565b806000036119bf57505050565b602081106119f757825182526119d6602084611d78565b92506119e3602083611d78565b91506119f06020826120b1565b90506119bf565b8015611a305760006001611a0c8360206120b1565b611a18906101006121ac565b611a2291906120b1565b845184518216911916178352505b505050565b6000806000611a47846020015161188c565b90506000818560200151611a5b9190611d78565b90506000828660000151611a6f91906120b1565b9196919550909350505050565b805160009015801590611a9157508151602110155b611a9a57600080fd5b600080611aa684611a35565b815191935091506020821015611ac25760208290036101000a90045b949350505050565b6001600160a01b0381168114610cd757600080fd5b600060208284031215611af157600080fd5b81356118fb81611aca565b61ffff81168114610cd757600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611b4a57611b4a611b0c565b604052919050565b60006001600160401b03821115611b6b57611b6b611b0c565b50601f01601f191660200190565b600082601f830112611b8a57600080fd5b8135611b9d611b9882611b52565b611b22565b818152846020838601011115611bb257600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215611be557600080fd5b8435611bf081611afc565b9350602085013592506040850135915060608501356001600160401b03811115611c1957600080fd5b611c2587828801611b79565b91505092959194509250565b60008060408385031215611c4457600080fd5b8235611c4f81611afc565b946020939093013593505050565b600060208284031215611c6f57600080fd5b81356118fb81611afc565b60008060408385031215611c8d57600080fd5b8235611c9881611afc565b91506020830135611ca881611aca565b809150509250929050565b600060208284031215611cc557600080fd5b5035919050565b600080600060608486031215611ce157600080fd5b8335611cec81611afc565b92506020840135611cfc81611aca565b915060408401356001600160401b03811115611d1757600080fd5b611d2386828701611b79565b9150509250925092565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115611d8b57611d8b611d62565b500190565b60005b83811015611dab578181015183820152602001611d93565b83811115611dba576000848401525b50505050565b60008151808452611dd8816020860160208601611d90565b601f01601f19169290920160200192915050565b6020815260006118fb6020830184611dc0565b600082601f830112611e1057600080fd5b8151611e1e611b9882611b52565b818152846020838601011115611e3357600080fd5b611ac2826020830160208701611d90565b600060208284031215611e5657600080fd5b81516001600160401b0380821115611e6d57600080fd5b9083019060608286031215611e8157600080fd5b604051606081018181108382111715611e9c57611e9c611b0c565b80604052508251815260208301516020820152604083015182811115611ec157600080fd5b611ecd87828601611dff565b60408301525095945050505050565b600060208284031215611eee57600080fd5b815180151581146118fb57600080fd5b61ffff851681526001600160a01b03841660208201526001600160401b0383166040820152608060608201819052600090611f3b90830184611dc0565b9695505050505050565b6001600160a01b0383168152604060208201819052600090611ac290830184611dc0565b60008251611f7b818460208701611d90565b9190910192915050565b634e487b7160e01b600052603260045260246000fd5b600060208284031215611fad57600080fd5b5051919050565b600060208284031215611fc657600080fd5b81516118fb81611afc565b600060208284031215611fe357600080fd5b81516001600160401b03811681146118fb57600080fd5b6000806040838503121561200d57600080fd5b825161201881611aca565b60208401519092506001600160401b0381111561203457600080fd5b61204085828601611dff565b9150509250929050565b60006001600160401b0380831681851680830382111561206c5761206c611d62565b01949350505050565b60006001820161208757612087611d62565b5060010190565b600060ff821660ff8416808210156120a8576120a8611d62565b90039392505050565b6000828210156120c3576120c3611d62565b500390565b600181815b808511156121035781600019048211156120e9576120e9611d62565b808516156120f657918102915b93841c93908002906120cd565b509250929050565b60008261211a57506001611718565b8161212757506000611718565b816001811461213d576002811461214757612163565b6001915050611718565b60ff84111561215857612158611d62565b50506001821b611718565b5060208310610133831016604e8410600b8410161715612186575081810a611718565b61219083836120c8565b80600019048211156121a4576121a4611d62565b029392505050565b60006118fb838361210b56fea2646970667358221220aca67fd56b11b803902027b44648ec38f60bde397396a4a6fe265fc7399940bd64736f6c634300080e0033