0x608060405234801561001057600080fd5b5061266f806100206000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c80638456cb59116100de578063bb1c3a9611610097578063f2fde38b11610071578063f2fde38b1461031c578063f3f514151461032f578063f4fe81b114610342578063f7504923146103625761018e565b8063bb1c3a96146102ee578063c63e3f3d146102f6578063cf7a1d77146103095761018e565b80638456cb591461029d5780638aeac501146102a55780638da5cb5b146102b8578063b1c369b4146102c0578063b59589d1146102d3578063b71d98ae146102db5761018e565b80634dea080a1161014b578063715018a611610125578063715018a61461025a578063720f53f9146102625780637b1039991461027557806381c5e03b1461028a5761018e565b80634dea080a1461022c578063579788e81461023f5780635c975abb146102525761018e565b806307040e91146101935780630bcb6c84146101bc578063250540cf146101d15780632803212f146101f15780633f4ba83a146102045780634d320a181461020c575b600080fd5b6101a66101a13660046120af565b610375565b6040516101b391906121cc565b60405180910390f35b6101cf6101ca366004612089565b610394565b005b6101e46101df366004611d24565b610444565b6040516101b391906121d7565b6101cf6101ff366004611dbc565b6104e2565b6101cf610525565b61021f61021a3660046120af565b610564565b6040516101b3919061226f565b6101e461023a366004611d24565b61065d565b6101cf61024d366004611dff565b61066f565b6101a6610b3e565b6101cf610b4e565b61021f610270366004612071565b610bcd565b61027d610c73565b6040516101b3919061217e565b6101cf610298366004611dbc565b610c82565b6101cf610cc1565b6101e46102b3366004611d24565b610cfe565b61027d610d10565b6101cf6102ce3660046120cb565b610d1f565b61027d610df9565b6101e46102e9366004612071565b610e08565b61021f610e1e565b6101cf610304366004611ec1565b610e79565b6101cf610317366004611d5c565b610ec1565b6101cf61032a366004611d24565b610fb2565b6101e461033d366004611d24565b611069565b610355610350366004612071565b61107b565b6040516101b39190612567565b6101cf610370366004611f66565b6110b2565b63ffffffff811660009081526007602052604090205460ff165b919050565b61039c6111e0565b6003546001600160a01b039081169116146103d25760405162461bcd60e51b81526004016103c99061241f565b60405180910390fd5b80600884815481106103e057fe5b9060005260206000200190805190602001906103fd929190611b21565b50816009848154811061040c57fe5b90600052602060002090600891828204019190066004026101000a81548163ffffffff021916908363ffffffff160217905550505050565b6001600160a01b038116600090815260016020526040812054620151800142111561048857506001600160a01b03811660009081526020819052604090205461038f565b6001600160a01b038216600090815260026020908152604080832054918390529091205410156104ba5750600061038f565b506001600160a01b031660009081526002602090815260408083205491839052909120540390565b6104ea6111e0565b6003546001600160a01b039081169116146105175760405162461bcd60e51b81526004016103c99061241f565b61052182826111e4565b5050565b61052d6111e0565b6003546001600160a01b0390811691161461055a5760405162461bcd60e51b81526004016103c99061241f565b610562611200565b565b600954606090600019015b8263ffffffff166009828154811061058357fe5b6000918252602090912060088204015460079091166004026101000a900463ffffffff161161065457600881815481106105b957fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156106475780601f1061061c57610100808354040283529160200191610647565b820191906000526020600020905b81548152906001019060200180831161062a57829003601f168201915b505050505091505061038f565b6000190161056f565b60016020526000908152604090205481565b600354600160a01b900460ff16156106995760405162461bcd60e51b81526004016103c990612366565b60006106a485611276565b63ffffffff811660009081526007602052604090205490915060ff16156106dd5760405162461bcd60e51b81526004016103c99061248b565b60606106e882610564565b90506106f2611b9f565b60065460405163ddc8e8a560e01b815261078b916001600160a01b03169063ddc8e8a590610732908d908d9089908e908e908e908e908d906004016121e0565b60006040518083038186803b15801561074a57600080fd5b505afa15801561075e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526107869190810190611efc565b6112a6565b90506060610798826112c8565b600554604051632ecd14d360e21b81529192506000916001600160a01b039091169063bb34534c906107ee907f434f4e54524143545f52494e475f45524332305f544f4b454e00000000000000906004016121d7565b60206040518083038186803b15801561080657600080fd5b505afa15801561081a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083e9190611d40565b600554604051632ecd14d360e21b81529192506000916001600160a01b039091169063bb34534c90610894907f434f4e54524143545f4b544f4e5f45524332305f544f4b454e00000000000000906004016121d7565b60206040518083038186803b1580156108ac57600080fd5b505afa1580156108c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e49190611d40565b835190915060005b81811015610ad6576108fc611bb9565b85828151811061090857fe5b60200260200101519050600061092a82608001516001600160801b0316610e08565b9050856001600160a01b031682606001516001600160a01b031614156109fc5761095486826113ed565b60408083015190516340c10f1960e01b81526001600160a01b038816916340c10f199161098691908590600401612192565b600060405180830381600087803b1580156109a057600080fd5b505af11580156109b4573d6000803e3d6000fd5b505050507f9f8a20bd822c284054f16c61d4e8ae93c378ac2cb19b34add04c8dc2bf63d21282604001518284602001516040516109f3939291906121ab565b60405180910390a15b846001600160a01b031682606001516001600160a01b03161415610acc57610a2485826113ed565b60408083015190516340c10f1960e01b81526001600160a01b038716916340c10f1991610a5691908590600401612192565b600060405180830381600087803b158015610a7057600080fd5b505af1158015610a84573d6000803e3d6000fd5b505050507f896d1c4292734b39ad2ffd3021d1b8bd7037718cf4d46a1282ddb7d1d2945eb58260400151828460200151604051610ac3939291906121ab565b60405180910390a15b50506001016108ec565b5063ffffffff871660009081526007602052604090819020805460ff19166001179055517f24f95a1329b09cb7fa4dbfea626b93d6b116e4ae6cad154f6fb2215d4e2f87a490610b27908990612567565b60405180910390a150505050505050505050505050565b600354600160a01b900460ff1690565b610b566111e0565b6003546001600160a01b03908116911614610b835760405162461bcd60e51b81526004016103c99061241f565b6003546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600380546001600160a01b0319169055565b60088181548110610bda57fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815293509091830182828015610c6b5780601f10610c4057610100808354040283529160200191610c6b565b820191906000526020600020905b815481529060010190602001808311610c4e57829003601f168201915b505050505081565b6005546001600160a01b031681565b610c8a6111e0565b6003546001600160a01b03908116911614610cb75760405162461bcd60e51b81526004016103c99061241f565b6105218282611435565b610cc96111e0565b6003546001600160a01b03908116911614610cf65760405162461bcd60e51b81526004016103c99061241f565b61056261148e565b60026020526000908152604090205481565b6003546001600160a01b031690565b610d276111e0565b6003546001600160a01b03908116911614610d545760405162461bcd60e51b81526004016103c99061241f565b600880546001810182556000919091528151610d97917ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee301906020840190611b21565b5050600980546001810182556000919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af6008820401805460079092166004026101000a63ffffffff818102199093169390921691909102919091179055565b6006546001600160a01b031681565b6000610e1882633b9aca006114f4565b92915050565b6004805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610c6b5780601f10610c4057610100808354040283529160200191610c6b565b610e816111e0565b6003546001600160a01b03908116911614610eae5760405162461bcd60e51b81526004016103c99061241f565b8051610521906004906020840190611b21565b600354600160b01b900460ff1680610edc5750610edc61152e565b80610ef15750600354600160a81b900460ff16155b610f0d5760405162461bcd60e51b81526004016103c990612390565b600354600160b01b900460ff16158015610f44576003805460ff60a81b1960ff60b01b19909116600160b01b1716600160a81b1790555b610f4c611534565b610f5461158e565b600680546001600160a01b038086166001600160a01b03199283161790925560058054928716929091169190911790558151610f97906004906020850190611b21565b508015610fac576003805460ff60b01b191690555b50505050565b610fba6111e0565b6003546001600160a01b03908116911614610fe75760405162461bcd60e51b81526004016103c99061241f565b6001600160a01b03811661100d5760405162461bcd60e51b81526004016103c990612320565b6003546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600380546001600160a01b0319166001600160a01b0392909216919091179055565b60006020819052908152604090205481565b6009818154811061108857fe5b9060005260206000209060089182820401919006600402915054906101000a900463ffffffff1681565b600354600160a01b900460ff16156110dc5760405162461bcd60e51b81526004016103c990612366565b600654604051630854b05960e01b81526000916001600160a01b031690630854b0599061110d908990600401612567565b60206040518083038186803b15801561112557600080fd5b505afa158015611139573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115d9190611de7565b14156111c85760065460405163479fbdf960e01b81526001600160a01b039091169063479fbdf990611195908b908b90600401612282565b600060405180830381600087803b1580156111af57600080fd5b505af11580156111c3573d6000803e3d6000fd5b505050505b6111d686868686868661066f565b5050505050505050565b3390565b6001600160a01b03909116600090815260208190526040902055565b600354600160a01b900460ff166112295760405162461bcd60e51b81526004016103c9906122f2565b6003805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61125f6111e0565b60405161126c919061217e565b60405180910390a1565b6000611280611b9f565b611289836112a6565b905061129681602061159d565b61129f816115cf565b9392505050565b6112ae611b9f565b506040805180820190915260008152602081019190915290565b606060006112d5836115cf565b905060608163ffffffff1667ffffffffffffffff811180156112f657600080fd5b5060405190808252806020026020018201604052801561133057816020015b61131d611bb9565b8152602001906001900390816113155790505b50905060005b8263ffffffff168110156113e5576040805160a081019091528061136660006113608960026116d8565b90611727565b6001600160f01b031916815260200161137e87611766565b815260200161138c87611771565b6001600160a01b031681526020016113a387611771565b6001600160a01b031681526020016113ba8761178b565b6001600160801b03168152508282815181106113d257fe5b6020908102919091010152600101611336565b509392505050565b6113f782826117b9565b6114135760405162461bcd60e51b81526004016103c990612515565b6001600160a01b03909116600090815260026020526040902080549091019055565b6001600160a01b03821660009081526020819052604090819020829055517f9cf57ddcfa91b59f4d736ce39ea043954e4ea1e05929dea3e544ecb29cd78c26906114829084908490612192565b60405180910390a15050565b600354600160a01b900460ff16156114b85760405162461bcd60e51b81526004016103c990612366565b6003805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861125f6111e0565b60008261150357506000610e18565b8282028284828161151057fe5b041461129f5760405162461bcd60e51b81526004016103c9906123de565b303b1590565b600061153e6111e0565b600380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350565b6003805460ff60a01b19169055565b8082600001510182602001515110156115c85760405162461bcd60e51b81526004016103c9906124e8565b8151019052565b6000806115db83611865565b90506003811660028111156116025760405162461bcd60e51b81526004016103c990612454565b60ff8116611618575060021c603f16905061038f565b8060ff166001141561165157600061162f85611865565b60081b61ff001660ff939093169290921760021c613fff16925061038f915050565b8060ff16600214156116d157600061166885611865565b9050600061167586611865565b9050600061168287611865565b9050600060188260ff1663ffffffff16901b60108460ff1663ffffffff16901b60088660ff1663ffffffff16901b8860ff16171717905060028163ffffffff16901c965050505050505061038f565b5050919050565b606082828082600001510182602001515110156117075760405162461bcd60e51b81526004016103c9906124e8565b8451602086015161171891866118bc565b82519091019091529392505050565b60008060005b60028110156113e55780600802858286018151811061174857fe5b01602001516001600160f81b031916901c919091179060010161172d565b6000610e188261190a565b600060606117808360146116d8565b601401519392505050565b6000606061179a8360106116d8565b90506117af6117aa826000611954565b611998565b60801c9392505050565b6001600160a01b0382166000908152600160205260408120546201518001421115611805576001600160a01b038316600090815260016020908152604080832042905560029091528120555b6001600160a01b038316600090815260208181526040808320546002909252909120548301118061184f57506001600160a01b038316600090815260026020526040902054828101105b1561185c57506000610e18565b50600192915050565b60008160018082600001510182602001515110156118955760405162461bcd60e51b81526004016103c9906124e8565b60208401518451815181106118a657fe5b0160200151825190910190915260f81c92915050565b6060835182840111156118ce57600080fd5b816118e8575060408051602081019091526000815261129f565b60006118f385611a89565b905061190184820184611a8f565b95945050505050565b600081602080826000015101826020015151101561193a5760405162461bcd60e51b81526004016103c9906124e8565b602080850151945190940190930151815190930190525090565b6000805b60108110156119915780600802848285018151811061197357fe5b01602001516001600160f81b031916901c9190911790600101611958565b5092915050565b600881811b7fff00ff00ff00ff00ff00ff00ff00ff0000000000000000000000000000000000167eff00ff00ff00ff00ff00ff00ff00ff000000000000000000000000000000009290911c9190911617601081811b7fffff0000ffff0000ffff0000ffff000000000000000000000000000000000000166dffff0000ffff0000ffff0000ffff60801b9290911c9190911617602081811b600167ffffffff0000000160a01b0319166bffffffff00000000ffffffff60801b9290911c9190911617604081811b6001600160c01b03191691901c77ffffffffffffffffffffffffffffffff0000000000000000161790565b60200190565b60608167ffffffffffffffff81118015611aa857600080fd5b506040519080825280601f01601f191660200182016040528015611ad3576020820181803683370190505b509050602081016119918482855b60208110611b00578251825260209283019290910190601f1901611ae1565b915181516020939093036101000a6000190180199091169216919091179052565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611b6257805160ff1916838001178555611b8f565b82800160010185558215611b8f579182015b82811115611b8f578251825591602001919060010190611b74565b50611b9b929150611be7565b5090565b604051806040016040528060008152602001606081525090565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915290565b5b80821115611b9b5760008155600101611be8565b600082601f830112611c0c578081fd5b8135611c1f611c1a8261259f565b612578565b818152915060208083019084810181840286018201871015611c4057600080fd5b60005b84811015611c5f57813584529282019290820190600101611c43565b505050505092915050565b600082601f830112611c7a578081fd5b8135611c88611c1a8261259f565b818152915060208083019084810160005b84811015611c5f57611cb0888484358a0101611cc2565b84529282019290820190600101611c99565b600082601f830112611cd2578081fd5b8135611ce0611c1a826125bf565b9150808252836020828501011115611cf757600080fd5b8060208401602084013760009082016020015292915050565b803563ffffffff81168114610e1857600080fd5b600060208284031215611d35578081fd5b813561129f8161260f565b600060208284031215611d51578081fd5b815161129f8161260f565b600080600060608486031215611d70578182fd5b8335611d7b8161260f565b92506020840135611d8b8161260f565b9150604084013567ffffffffffffffff811115611da6578182fd5b611db286828701611cc2565b9150509250925092565b60008060408385031215611dce578182fd5b8235611dd98161260f565b946020939093013593505050565b600060208284031215611df8578081fd5b5051919050565b60008060008060008060c08789031215611e17578182fd5b86359550611e288860208901611d10565b9450604087013567ffffffffffffffff80821115611e44578384fd5b611e508a838b01611cc2565b95506060890135915080821115611e65578384fd5b611e718a838b01611bfc565b94506080890135915080821115611e86578384fd5b611e928a838b01611bfc565b935060a0890135915080821115611ea7578283fd5b50611eb489828a01611cc2565b9150509295509295509295565b600060208284031215611ed2578081fd5b813567ffffffffffffffff811115611ee8578182fd5b611ef484828501611cc2565b949350505050565b600060208284031215611f0d578081fd5b815167ffffffffffffffff811115611f23578182fd5b8201601f81018413611f33578182fd5b8051611f41611c1a826125bf565b818152856020838501011115611f55578384fd5b6119018260208301602086016125e3565b600080600080600080600080610100898b031215611f82578182fd5b883567ffffffffffffffff80821115611f99578384fd5b611fa58c838d01611cc2565b995060208b0135915080821115611fba578384fd5b611fc68c838d01611c6a565b985060408b01359750611fdc8c60608d01611d10565b965060808b0135915080821115611ff1578384fd5b611ffd8c838d01611cc2565b955060a08b0135915080821115612012578384fd5b61201e8c838d01611bfc565b945060c08b0135915080821115612033578384fd5b61203f8c838d01611bfc565b935060e08b0135915080821115612054578283fd5b506120618b828c01611cc2565b9150509295985092959890939650565b600060208284031215612082578081fd5b5035919050565b60008060006060848603121561209d578081fd5b833592506020840135611d8b81612627565b6000602082840312156120c0578081fd5b813561129f81612627565b600080604083850312156120dd578182fd5b6120e78484611d10565b9150602083013567ffffffffffffffff811115612102578182fd5b61210e85828601611cc2565b9150509250929050565b6000815180845260208085019450808401835b838110156121475781518752958201959082019060010161212b565b509495945050505050565b6000815180845261216a8160208601602086016125e3565b601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b901515815260200190565b90815260200190565b60006101008a835263ffffffff808b166020850152808a1660408501525080606084015261221081840189612152565b905082810360808401526122248188612118565b905082810360a08401526122388187612118565b905082810360c084015261224c8186612152565b905082810360e08401526122608185612152565b9b9a5050505050505050505050565b60006020825261129f6020830184612152565b6000604082526122956040830185612152565b602083820381850152818551808452828401915082838202850101838801865b838110156122e357601f198784030185526122d1838351612152565b948601949250908501906001016122b5565b50909998505050505050505050565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526018908201527f7363616c65206465636f6465206e6f7420737570706f72740000000000000000604082015260600190565b60208082526038908201527f546f6b656e49737375696e673a3a2076657269667950726f6f663a202054686560408201527f20626c6f636b20686173206265656e2076657269666965640000000000000000606082015260800190565b602080825260139082015272496e7075743a204f7574206f662072616e676560681b604082015260600190565b60208082526032908201527f4461696c794c696d69743a3a20657870656e644461696c794c696d69743a204f6040820152713aba1037ba103230b4b63c903634b6b4ba1760711b606082015260800190565b63ffffffff91909116815260200190565b60405181810167ffffffffffffffff8111828210171561259757600080fd5b604052919050565b600067ffffffffffffffff8211156125b5578081fd5b5060209081020190565b600067ffffffffffffffff8211156125d5578081fd5b50601f01601f191660200190565b60005b838110156125fe5781810151838201526020016125e6565b83811115610fac5750506000910152565b6001600160a01b038116811461262457600080fd5b50565b63ffffffff8116811461262457600080fdfea26469706673582212208a7678c11345ccc345c5dc923622d04413ed3caa386bd28668bbf6b6d1146d6664736f6c634300060c0033