60806040523480156200001157600080fd5b50604051806040016040528060078152602001662137b735b632b960c91b81525060405180604001604052806005815260200164212725a62960d91b8152508160009081620000619190620001a4565b506001620000708282620001a4565b5050506200008d62000087620000a960201b60201c565b620000ad565b6008805463ffffffff60a01b1916600160a01b17905562000270565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200012a57607f821691505b6020821081036200014b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200019f57600081815260208120601f850160051c810160208610156200017a5750805b601f850160051c820191505b818110156200019b5782815560010162000186565b5050505b505050565b81516001600160401b03811115620001c057620001c0620000ff565b620001d881620001d1845462000115565b8462000151565b602080601f831160018114620002105760008415620001f75750858301515b600019600386901b1c1916600185901b1785556200019b565b600085815260208120601f198616915b82811015620002415788860151825594840194600190910190840162000220565b5085821015620002605787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6126fb80620002806000396000f3fe60806040526004361061026a5760003560e01c806387f65c9111610153578063b88d4fde116100cb578063e985e9c51161007f578063f2fde38b11610064578063f2fde38b1461070b578063f35dad401461072b578063fca3b5aa1461074f57600080fd5b8063e985e9c514610695578063ef85ade7146106de57600080fd5b8063cc54cce3116100b0578063cc54cce31461063e578063df3c3a301461065f578063e0b6bb671461068057600080fd5b8063b88d4fde146105fe578063c87b56dd1461061e57600080fd5b8063a0712d6811610122578063a2309ff811610107578063a2309ff81461058f578063a44fa396146105a4578063ac936d4a146105d157600080fd5b8063a0712d681461055c578063a22cb4651461056f57600080fd5b806387f65c91146105015780638da5cb5b146105165780639229407d1461053457806395d89b411461054757600080fd5b806355f804b3116101e6578063715018a6116101b557806376daebe11161019a57806376daebe11461049f5780637a1d33a6146104b45780638462151c146104d457600080fd5b8063715018a61461045157806375794a3c1461046657600080fd5b806355f804b3146103d05780635d148e5c146103f05780636352211e1461041157806370a082311461043157600080fd5b806318160ddd1161023d57806342842e0e1161022257806342842e0e146103635780634f558e791461038357806353df5c7c146103bb57600080fd5b806318160ddd1461032057806323b872dd1461034357600080fd5b806301ffc9a71461026f57806306fdde03146102a4578063081812fc146102c6578063095ea7b3146102fe575b600080fd5b34801561027b57600080fd5b5061028f61028a36600461204e565b61076f565b60405190151581526020015b60405180910390f35b3480156102b057600080fd5b506102b961080c565b60405161029b91906120b8565b3480156102d257600080fd5b506102e66102e13660046120cb565b61089e565b6040516001600160a01b03909116815260200161029b565b34801561030a57600080fd5b5061031e6103193660046120fb565b6108c5565b005b34801561032c57600080fd5b50610335610a19565b60405190815260200161029b565b34801561034f57600080fd5b5061031e61035e366004612125565b610a51565b34801561036f57600080fd5b5061031e61037e366004612125565b610ac8565b34801561038f57600080fd5b5061028f61039e3660046120cb565b6000908152600260205260409020546001600160a01b0316151590565b3480156103c757600080fd5b5061031e610ae3565b3480156103dc57600080fd5b5061031e6103eb366004612200565b610b1b565b3480156103fc57600080fd5b5060085461028f90600160f01b900460ff1681565b34801561041d57600080fd5b506102e661042c3660046120cb565b610b77565b34801561043d57600080fd5b5061033561044c366004612249565b610bdc565b34801561045d57600080fd5b5061031e610c76565b34801561047257600080fd5b5060085461048a90600160a01b900463ffffffff1681565b60405163ffffffff909116815260200161029b565b3480156104ab57600080fd5b5061031e610c8a565b3480156104c057600080fd5b5061031e6104cf3660046120cb565b610cc2565b3480156104e057600080fd5b506104f46104ef366004612249565b610df7565b60405161029b9190612264565b34801561050d57600080fd5b50610335600181565b34801561052257600080fd5b506006546001600160a01b03166102e6565b61031e6105423660046122a8565b610ed9565b34801561055357600080fd5b506102b9610f4f565b61033561056a3660046120cb565b610f5e565b34801561057b57600080fd5b5061031e61058a3660046122d4565b611061565b34801561059b57600080fd5b5061033561106c565b3480156105b057600080fd5b506103356105bf3660046120cb565b60009081526009602052604090205490565b3480156105dd57600080fd5b506105f16105ec366004612310565b61108b565b60405161029b91906123b6565b34801561060a57600080fd5b5061031e6106193660046123f0565b611167565b34801561062a57600080fd5b506102b96106393660046120cb565b6111e5565b34801561064a57600080fd5b5060085461028f90600160e01b900460ff1681565b34801561066b57600080fd5b5060085461028f90600160e81b900460ff1681565b34801561068c57600080fd5b5061031e6113df565b3480156106a157600080fd5b5061028f6106b036600461246c565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106ea57600080fd5b506103356106f93660046120cb565b6000908152600a602052604090205490565b34801561071757600080fd5b5061031e610726366004612249565b611417565b34801561073757600080fd5b5060085461048a90600160c01b900463ffffffff1681565b34801561075b57600080fd5b5061031e61076a366004612249565b6114a7565b60006001600160e01b031982167f80ac58cd0000000000000000000000000000000000000000000000000000000014806107d257506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061080657507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b60606000805461081b90612496565b80601f016020809104026020016040519081016040528092919081815260200182805461084790612496565b80156108945780601f1061086957610100808354040283529160200191610894565b820191906000526020600020905b81548152906001019060200180831161087757829003601f168201915b5050505050905090565b60006108a982611515565b506000908152600460205260409020546001600160a01b031690565b60006108d082610b77565b9050806001600160a01b0316836001600160a01b03160361095e5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b336001600160a01b038216148061099857506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b610a0a5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610955565b610a148383611579565b505050565b60085460009063ffffffff600160c01b8204811691610a4291600191600160a01b9004166124e6565b610a4c91906124e6565b905090565b610a5b33826115e7565b610abd5760405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201526c1c881bdc88185c1c1c9bdd9959609a1b6064820152608401610955565b610a14838383611666565b610a1483838360405180602001604052806000815250611167565b610aeb61186c565b600880547fff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160f01b179055565b610b2361186c565b600854600160f01b900460ff1615610b675760405162461bcd60e51b81526020600482015260076024820152662637b1b5b2b21760c91b6044820152606401610955565b6007610b738282612547565b5050565b6000818152600260205260408120546001600160a01b0316806108065760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152606401610955565b60006001600160a01b038216610c5a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152608401610955565b506001600160a01b031660009081526003602052604090205490565b610c7e61186c565b610c8860006118c6565b565b610c9261186c565b600880547fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160e01b179055565b60088054601890610cdf90600160c01b900463ffffffff16612607565b825463ffffffff9182166101009390930a928302919092021990911617905560008181526009602052604090205433610d1783610b77565b6001600160a01b031614610d6d5760405162461bcd60e51b815260206004820152601e60248201527f4d757374206f776e20426f6e6b6c657220746f2072656465656d2069742e00006044820152606401610955565b610d7682611918565b6008546040517ff591e6f3000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b039091169063f591e6f390602401600060405180830381600087803b158015610dd557600080fd5b505af1158015610de9573d6000803e3d6000fd5b50505050610b7333826119bb565b60606000610e0483610bdc565b90508067ffffffffffffffff811115610e1f57610e1f612161565b604051908082528060200260200182016040528015610e48578160200160208202803683370190505b50600854909250600160a01b900463ffffffff16600060015b8281108015610e6f57508382105b15610ed0576000818152600260205260409020546001600160a01b03878116911603610ec057808583610ea18161262a565b945081518110610eb357610eb3612643565b6020026020010181815250505b610ec98161262a565b9050610e61565b50505050919050565b6008546001600160a01b03163314610f335760405162461bcd60e51b815260206004820152601460248201527f556e617574686f72697a6564206d696e7465722e0000000000000000000000006044820152606401610955565b6000828152600960205260409020349055610b73338284611666565b60606001805461081b90612496565b6008546000906001600160a01b03163314610fbb5760405162461bcd60e51b815260206004820152601460248201527f556e617574686f72697a6564206d696e7465722e0000000000000000000000006044820152606401610955565b600854600160e81b900460ff1615610fff5760405162461bcd60e51b81526020600482015260076024820152662637b1b5b2b21760c91b6044820152606401610955565b60088054600160a01b900463ffffffff1690601461101c83612607565b91906101000a81548163ffffffff021916908363ffffffff16021790555063ffffffff16905061104c33826119ff565b6000818152600a602052604090209190915590565b610b73338383611b98565b600854600090610a4c90600190600160a01b900463ffffffff166124e6565b80516060908067ffffffffffffffff8111156110a9576110a9612161565b6040519080825280602002602001820160405280156110d2578160200160208202803683370190505b50915060005b818110156111605760006001600160a01b031661112385838151811061110057611100612643565b60200260200101516000908152600260205260409020546001600160a01b031690565b6001600160a01b0316141583828151811061114057611140612643565b911515602092830291909101909101526111598161262a565b90506110d8565b5050919050565b61117133836115e7565b6111d35760405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201526c1c881bdc88185c1c1c9bdd9959609a1b6064820152608401610955565b6111df84848484611c66565b50505050565b6000818152600260205260409020546060906001600160a01b031661124c5760405162461bcd60e51b815260206004820152601560248201527f546f6b656e20646f6573206e6f742065786973742e00000000000000000000006044820152606401610955565b6007805461125990612496565b80601f016020809104026020016040519081016040528092919081815260200182805461128590612496565b80156112d25780601f106112a7576101008083540402835291602001916112d2565b820191906000526020600020905b8154815290600101906020018083116112b557829003601f168201915b5050505050905080516000146113da5761132c6040518060400160405280600481526020017f7b69647d0000000000000000000000000000000000000000000000000000000081525061132484611cef565b839190611d33565b90506113836040518060400160405280600881526020017f7b7368617265737d0000000000000000000000000000000000000000000000008152506113246009600086815260200190815260200160002054611cef565b90506108066040518060400160405280600681526020017f7b686173687d0000000000000000000000000000000000000000000000000000815250611324600a600086815260200190815260200160002054611cef565b919050565b6113e761186c565b600880547fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160e81b179055565b61141f61186c565b6001600160a01b03811661149b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610955565b6114a4816118c6565b50565b6114af61186c565b600854600160e01b900460ff16156114f35760405162461bcd60e51b81526020600482015260076024820152662637b1b5b2b21760c91b6044820152606401610955565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600260205260409020546001600160a01b03166114a45760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152606401610955565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906115ae82610b77565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806115f383610b77565b9050806001600160a01b0316846001600160a01b0316148061163a57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b8061165e5750836001600160a01b03166116538461089e565b6001600160a01b0316145b949350505050565b826001600160a01b031661167982610b77565b6001600160a01b0316146116dd5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610955565b6001600160a01b0382166117585760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610955565b6117658383836001611e59565b826001600160a01b031661177882610b77565b6001600160a01b0316146117dc5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610955565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6006546001600160a01b03163314610c885760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610955565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600061192382610b77565b9050611933816000846001611e59565b61193c82610b77565b600083815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0385168085526003845282852080546000190190558785526002909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b804710156119d15763b12d13eb6000526004601cfd5b6000806000808486620186a0f1610b7357816000526073600b5360ff6020536016600b82f0610b7357600080fd5b6001600160a01b038216611a555760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610955565b6000818152600260205260409020546001600160a01b031615611aba5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610955565b611ac8600083836001611e59565b6000818152600260205260409020546001600160a01b031615611b2d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610955565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b816001600160a01b0316836001600160a01b031603611bf95760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610955565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611c71848484611666565b611c7d84848484611ee1565b6111df5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610955565b60606080604051019050602081016040526000815280600019835b928101926030600a8206018453600a900480611d0a575050819003601f19909101908152919050565b60608351835183516020870196506020860195506020850194506020604051019350828701838311611e0557600183820301600060208510611d7457508388205b601f851660200360031b89515b8b51818118831c611dec578315611dbb5783888e2014611dbb57808a5260019c8d019c90990198848d10611db55750611e00565b50611d81565b60005b8b8101518b820152602001878110611dbe57509b87019b988601988715611dec57848d10611db55750611e00565b895260019b8c019b90980197838c10611d81575b505050505b84935060206040510194508781038585030192505b80881015611e35578751845260209788019790930192611e1a565b50506000818401908152601f01601f19908116604052909201918252509392505050565b60018111156111df576001600160a01b03841615611e9f576001600160a01b03841660009081526003602052604081208054839290611e999084906124e6565b90915550505b6001600160a01b038316156111df576001600160a01b03831660009081526003602052604081208054839290611ed6908490612659565b909155505050505050565b60006001600160a01b0384163b1561202d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611f2590339089908890889060040161266c565b6020604051808303816000875af1925050508015611f60575060408051601f3d908101601f19168201909252611f5d918101906126a8565b60015b612013573d808015611f8e576040519150601f19603f3d011682016040523d82523d6000602084013e611f93565b606091505b50805160000361200b5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610955565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061165e565b506001949350505050565b6001600160e01b0319811681146114a457600080fd5b60006020828403121561206057600080fd5b813561206b81612038565b9392505050565b6000815180845260005b818110156120985760208185018101518683018201520161207c565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061206b6020830184612072565b6000602082840312156120dd57600080fd5b5035919050565b80356001600160a01b03811681146113da57600080fd5b6000806040838503121561210e57600080fd5b612117836120e4565b946020939093013593505050565b60008060006060848603121561213a57600080fd5b612143846120e4565b9250612151602085016120e4565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156121a0576121a0612161565b604052919050565b600067ffffffffffffffff8311156121c2576121c2612161565b6121d5601f8401601f1916602001612177565b90508281528383830111156121e957600080fd5b828260208301376000602084830101529392505050565b60006020828403121561221257600080fd5b813567ffffffffffffffff81111561222957600080fd5b8201601f8101841361223a57600080fd5b61165e848235602084016121a8565b60006020828403121561225b57600080fd5b61206b826120e4565b6020808252825182820181905260009190848201906040850190845b8181101561229c57835183529284019291840191600101612280565b50909695505050505050565b600080604083850312156122bb57600080fd5b823591506122cb602084016120e4565b90509250929050565b600080604083850312156122e757600080fd5b6122f0836120e4565b91506020830135801515811461230557600080fd5b809150509250929050565b6000602080838503121561232357600080fd5b823567ffffffffffffffff8082111561233b57600080fd5b818501915085601f83011261234f57600080fd5b81358181111561236157612361612161565b8060051b9150612372848301612177565b818152918301840191848101908884111561238c57600080fd5b938501935b838510156123aa57843582529385019390850190612391565b98975050505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561229c5783511515835292840192918401916001016123d2565b6000806000806080858703121561240657600080fd5b61240f856120e4565b935061241d602086016120e4565b925060408501359150606085013567ffffffffffffffff81111561244057600080fd5b8501601f8101871361245157600080fd5b612460878235602084016121a8565b91505092959194509250565b6000806040838503121561247f57600080fd5b612488836120e4565b91506122cb602084016120e4565b600181811c908216806124aa57607f821691505b6020821081036124ca57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610806576108066124d0565b601f821115610a1457600081815260208120601f850160051c810160208610156125205750805b601f850160051c820191505b8181101561253f5782815560010161252c565b505050505050565b815167ffffffffffffffff81111561256157612561612161565b6125758161256f8454612496565b846124f9565b602080601f8311600181146125aa57600084156125925750858301515b600019600386901b1c1916600185901b17855561253f565b600085815260208120601f198616915b828110156125d9578886015182559484019460019091019084016125ba565b50858210156125f75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600063ffffffff808316818103612620576126206124d0565b6001019392505050565b60006001820161263c5761263c6124d0565b5060010190565b634e487b7160e01b600052603260045260246000fd5b80820180821115610806576108066124d0565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261269e6080830184612072565b9695505050505050565b6000602082840312156126ba57600080fd5b815161206b8161203856fea264697066735822122044d2163eec47380a2b39c8ca4c80827f4a52799d0e681e7414761d72ce09f53864736f6c63430008110033