608060405234801561001057600080fd5b50600180546001600160a01b0319908116731d57a4c1d91f617e42d1b103895a673a60631abf9081179092556000805490911690911790556120e3806100576000396000f3fe608060405234801561001057600080fd5b50600436106101a25760003560e01c80635f2ef9dc116100ee578063b88d4fde11610097578063d371663011610071578063d371663014610333578063d891463814610346578063e725f8771461034e578063e985e9c51461036157600080fd5b8063b88d4fde146102fa578063b9eb03fd1461030d578063c87b56dd1461032057600080fd5b806395d89b41116100c857806395d89b41146102d7578063a22cb465146102df578063a2af30e1146102f257600080fd5b80635f2ef9dc1461029e5780636352211e146102b157806370a08231146102c457600080fd5b8063095ea7b31161015057806323b872dd1161012a57806323b872dd1461026557806342842e0e1461027857806342966c681461028b57600080fd5b8063095ea7b314610240578063139fed7c146102555780632276f3f21461025d57600080fd5b8063051802371161018157806305180237146101f757806306fdde031461020d578063081812fc1461021557600080fd5b8062cd587c146101a757806301ffc9a7146101cf57806302d05d3f146101e2575b600080fd5b6101ba6101b5366004611e60565b61039d565b60405190151581526020015b60405180910390f35b6101ba6101dd366004611daf565b610438565b6101ea6104a4565b6040516101c69190611f1d565b6101ff610542565b6040519081526020016101c6565b6101ea6105c9565b610228610223366004611e60565b610626565b6040516001600160a01b0390911681526020016101c6565b61025361024e366004611d66565b6106d1565b005b610228610870565b6101ff6108f7565b610253610273366004611c48565b610946565b610253610286366004611c48565b610b83565b610253610299366004611e60565b610ba3565b6101ff6102ac366004611e60565b610c4b565b6102286102bf366004611e60565b610ce2565b6101ff6102d2366004611bd5565b610d6d565b6101ea610db9565b6102536102ed366004611d38565b610e16565b610253610edb565b610253610308366004611c89565b6110a1565b61025361031b366004611e60565b61135d565b6101ea61032e366004611e60565b611484565b6101ea610341366004611e60565b61151f565b61022861168b565b6101ea61035c366004611e60565b6116da565b6101ba61036f366004611c0f565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600080546040517ecd587c000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b039091169062cd587c906024015b60206040518083038186803b1580156103fa57600080fd5b505afa15801561040e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104329190611d92565b92915050565b600080546040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527fffffffff00000000000000000000000000000000000000000000000000000000841660048201526001600160a01b03909116906301ffc9a7906024016103e2565b60008054604080517f02d05d3f00000000000000000000000000000000000000000000000000000000815290516060936001600160a01b03909316926302d05d3f9260048082019391829003018186803b15801561050157600080fd5b505afa158015610515573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261053d9190810190611de9565b905090565b60008060009054906101000a90046001600160a01b03166001600160a01b031663051802376040518163ffffffff1660e01b815260040160206040518083038186803b15801561059157600080fd5b505afa1580156105a5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061053d9190611e79565b60008054604080517f06fdde0300000000000000000000000000000000000000000000000000000000815290516060936001600160a01b03909316926306fdde039260048082019391829003018186803b15801561050157600080fd5b6000818152600260205260408120546001600160a01b03166106b55760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006106dc82610ce2565b9050806001600160a01b0316836001600160a01b031614156107665760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016106ac565b336001600160a01b03821614806107825750610782813361036f565b6107f45760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016106ac565b6000828152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038516908117909155829061083682610ce2565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60008060009054906101000a90046001600160a01b03166001600160a01b031663139fed7c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156108bf57600080fd5b505afa1580156108d3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061053d9190611bf2565b60008060009054906101000a90046001600160a01b03166001600160a01b0316632276f3f26040518163ffffffff1660e01b815260040160206040518083038186803b15801561059157600080fd5b6109503382611725565b6109c25760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016106ac565b826001600160a01b03166109d582610ce2565b6001600160a01b031614610a515760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e000000000000000000000000000000000000000000000060648201526084016106ac565b6001600160a01b038216610ab35760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016106ac565b610abe6000826106d1565b6001600160a01b0383166000908152600360205260408120805460019290610ae7908490611fa1565b90915550506001600160a01b0382166000908152600360205260408120805460019290610b15908490611f89565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610b9e838383604051806020016040528060008152506110a1565b505050565b6000610bae82610ce2565b9050610bbb6000836106d1565b6001600160a01b0381166000908152600360205260408120805460019290610be4908490611fa1565b9091555050600082815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600080546040517f5f2ef9dc000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b0390911690635f2ef9dc906024015b60206040518083038186803b158015610caa57600080fd5b505afa158015610cbe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104329190611e79565b6000818152600260205260408120546001600160a01b0316806104325760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e000000000000000000000000000000000000000000000060648201526084016106ac565b600080546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152909116906370a0823190602401610c92565b60008054604080517f95d89b4100000000000000000000000000000000000000000000000000000000815290516060936001600160a01b03909316926395d89b419260048082019391829003018186803b15801561050157600080fd5b6001600160a01b038216331415610e6f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016106ac565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6040517fe37ce6fa000000000000000000000000000000000000000000000000000000008152336004820152736e53130ddff21e3bc963ee902005223b9a20210690819063e37ce6fa9060240160206040518083038186803b158015610f4057600080fd5b505afa158015610f54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f789190611d92565b610fc45760405162461bcd60e51b815260206004820152601f60248201527f4e69667479456e746974793a20496e76616c6964206d73672e73656e6465720060448201526064016106ac565b73e052113bd7d7700d623414a0a4585bcae754e9d56305f608115b6305f608608111610b9e57600080546040516331a9108f60e11b8152600481018490526001600160a01b0390911690636352211e9060240160206040518083038186803b15801561102f57600080fd5b505afa158015611043573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110679190611bf2565b9050826001600160a01b0316816001600160a01b0316141561108e5761108e33308461182d565b508061109981611fe4565b915050610fdf565b6110ab3383611725565b61111d5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016106ac565b836001600160a01b031661113083610ce2565b6001600160a01b0316146111ac5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e000000000000000000000000000000000000000000000060648201526084016106ac565b6001600160a01b03831661120e5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016106ac565b6112196000836106d1565b6001600160a01b0384166000908152600360205260408120805460019290611242908490611fa1565b90915550506001600160a01b0383166000908152600360205260408120805460019290611270908490611f89565b9091555050600082815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a46112e584848484611a63565b6113575760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016106ac565b50505050565b6000818152600260205260409020546001600160a01b0316156113e85760405162461bcd60e51b815260206004820152602a60248201527f457465726e616c57616974577261707065723a20746f6b656e496420616c726560448201527f616479206d696e7465640000000000000000000000000000000000000000000060648201526084016106ac565b600080546040516331a9108f60e11b8152600481018490526001600160a01b0390911690636352211e9060240160206040518083038186803b15801561142d57600080fd5b505afa158015611441573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114659190611bf2565b9050336001600160a01b038216811415610b9e57610b9e81308561182d565b6000546040517fc87b56dd000000000000000000000000000000000000000000000000000000008152600481018390526060916001600160a01b03169063c87b56dd906024015b60006040518083038186803b1580156114e357600080fd5b505afa1580156114f7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526104329190810190611de9565b6060600061152b61168b565b6040517f3e239e1a0000000000000000000000000000000000000000000000000000000081524260048201526001600160a01b039190911690633e239e1a9060240160206040518083038186803b15801561158557600080fd5b505afa158015611599573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115bd9190611e92565b90508060ff16600514156115eb576040518060600160405280602e8152602001612080602e91399392505050565b6000546040517fd3716630000000000000000000000000000000000000000000000000000000008152600481018590526001600160a01b039091169063d37166309060240160006040518083038186803b15801561164857600080fd5b505afa15801561165c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116849190810190611de9565b9392505050565b60008060009054906101000a90046001600160a01b03166001600160a01b031663d89146386040518163ffffffff1660e01b815260040160206040518083038186803b1580156108bf57600080fd5b6000546040517fe725f877000000000000000000000000000000000000000000000000000000008152600481018390526060916001600160a01b03169063e725f877906024016114cb565b6000818152600260205260408120546001600160a01b03166117af5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016106ac565b60006117ba83610ce2565b9050806001600160a01b0316846001600160a01b031614806117f55750836001600160a01b03166117ea84610626565b6001600160a01b0316145b8061182557506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b600080546040517fe985e9c50000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015285811660248301529091169063e985e9c59060440160206040518083038186803b15801561189457600080fd5b505afa1580156118a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118cc9190611d92565b9050806119415760405162461bcd60e51b815260206004820152602f60248201527f457465726e616c57616974577261707065723a2073657420617070726f76616c60448201527f206f6e20457465726e616c57616974000000000000000000000000000000000060648201526084016106ac565b6000546040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015261dead60248301819052604483018690529216906323b872dd90606401600060405180830381600087803b1580156119b157600080fd5b505af11580156119c5573d6000803e3d6000fd5b5050506000848152600260209081526040808320805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038b16908117909155835260039091528120805460019350909190611a1f908490611f89565b909155505060405183906001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050505050565b6000833b15611bca57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611a9e903390899088908890600401611ee1565b602060405180830381600087803b158015611ab857600080fd5b505af1925050508015611ae8575060408051601f3d908101601f19168201909252611ae591810190611dcc565b60015b611b98573d808015611b16576040519150601f19603f3d011682016040523d82523d6000602084013e611b1b565b606091505b508051611b905760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016106ac565b805181602001fd5b7fffffffff0000000000000000000000000000000000000000000000000000000016630a85bd0160e11b149050611825565b506001949350505050565b600060208284031215611be757600080fd5b81356116848161202b565b600060208284031215611c0457600080fd5b81516116848161202b565b60008060408385031215611c2257600080fd5b8235611c2d8161202b565b91506020830135611c3d8161202b565b809150509250929050565b600080600060608486031215611c5d57600080fd5b8335611c688161202b565b92506020840135611c788161202b565b929592945050506040919091013590565b60008060008060808587031215611c9f57600080fd5b8435611caa8161202b565b93506020850135611cba8161202b565b925060408501359150606085013567ffffffffffffffff811115611cdd57600080fd5b8501601f81018713611cee57600080fd5b8035611d01611cfc82611f61565b611f30565b818152886020838501011115611d1657600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b60008060408385031215611d4b57600080fd5b8235611d568161202b565b91506020830135611c3d81612043565b60008060408385031215611d7957600080fd5b8235611d848161202b565b946020939093013593505050565b600060208284031215611da457600080fd5b815161168481612043565b600060208284031215611dc157600080fd5b813561168481612051565b600060208284031215611dde57600080fd5b815161168481612051565b600060208284031215611dfb57600080fd5b815167ffffffffffffffff811115611e1257600080fd5b8201601f81018413611e2357600080fd5b8051611e31611cfc82611f61565b818152856020838501011115611e4657600080fd5b611e57826020830160208601611fb8565b95945050505050565b600060208284031215611e7257600080fd5b5035919050565b600060208284031215611e8b57600080fd5b5051919050565b600060208284031215611ea457600080fd5b815160ff8116811461168457600080fd5b60008151808452611ecd816020860160208601611fb8565b601f01601f19169290920160200192915050565b60006001600160a01b03808716835280861660208401525083604083015260806060830152611f136080830184611eb5565b9695505050505050565b6020815260006116846020830184611eb5565b604051601f8201601f1916810167ffffffffffffffff81118282101715611f5957611f59612015565b604052919050565b600067ffffffffffffffff821115611f7b57611f7b612015565b50601f01601f191660200190565b60008219821115611f9c57611f9c611fff565b500190565b600082821015611fb357611fb3611fff565b500390565b60005b83811015611fd3578181015183820152602001611fbb565b838111156113575750506000910152565b6000600019821415611ff857611ff8611fff565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461204057600080fd5b50565b801515811461204057600080fd5b7fffffffff000000000000000000000000000000000000000000000000000000008116811461204057600080fdfe516d526f655431786252684a6a564370464443336d6d48614138654345584e61476e316f42417745795437653371a264697066735822122035344acae1d8b585f99ba9433c69f619ef7c491b789cece528b969d65971ca6364736f6c63430008060033