6080604052600061012e5534801561001657600080fd5b50612877806100266000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80636352211e1161010457806395d89b41116100a2578063d5abeb0111610071578063d5abeb011461040f578063e985e9c514610419578063f2fde38b14610455578063fca3b5aa1461046857600080fd5b806395d89b41146103ce578063a22cb465146103d6578063b88d4fde146103e9578063c87b56dd146103fc57600080fd5b8063715018a6116100de578063715018a61461038f57806383455d06146103975780638642d0c4146103aa5780638da5cb5b146103bd57600080fd5b80636352211e146103615780636c0360eb1461037457806370a082311461037c57600080fd5b806318160ddd1161017c578063479e46a21161014b578063479e46a21461031d5780634f0e0ef3146103275780634f6ccce71461033b57806354ba0f271461034e57600080fd5b806318160ddd146102dc57806323b872dd146102e45780632f745c59146102f757806342842e0e1461030a57600080fd5b806306fdde03116101b857806306fdde03146102735780630754617214610288578063081812fc146102b4578063095ea7b3146102c757600080fd5b8063017fe809146101df57806301ffc9a71461021357806302ce8fa114610236575b600080fd5b6102006101ed366004612388565b600090815261012d602052604090205490565b6040519081526020015b60405180910390f35b6102266102213660046122ab565b61047b565b604051901515815260200161020a565b61025e610244366004612388565b61012d602052600090815260409020805460019091015482565b6040805192835260208301919091520161020a565b61027b6104a6565b60405161020a91906124f9565b6101305461029c906001600160a01b031681565b6040516001600160a01b03909116815260200161020a565b61029c6102c2366004612388565b610538565b6102da6102d5366004612281565b6105d2565b005b60fd54610200565b6102da6102f236600461218d565b6106e8565b610200610305366004612281565b610719565b6102da61031836600461218d565b6107af565b61020061012e5481565b6101325461029c906001600160a01b031681565b610200610349366004612388565b6107ca565b61020061035c36600461213f565b61085d565b61029c61036f366004612388565b610921565b61027b610998565b61020061038a36600461213f565b610a27565b6102da610aae565b6102da6103a53660046122e5565b610b22565b6102da6103b83660046123a1565b610c01565b6065546001600160a01b031661029c565b61027b610f25565b6102da6103e4366004612245565b610f34565b6102da6103f73660046121c9565b610f43565b61027b61040a366004612388565b610f7b565b61020061012f5481565b61022661042736600461215a565b6001600160a01b03918216600090815260ce6020908152604080832093909416825291909152205460ff1690565b6102da61046336600461213f565b611058565b6102da61047636600461213f565b611143565b60006001600160e01b0319821663780e9d6360e01b14806104a057506104a082611190565b92915050565b606060c980546104b590612753565b80601f01602080910402602001604051908101604052809291908181526020018280546104e190612753565b801561052e5780601f106105035761010080835404028352916020019161052e565b820191906000526020600020905b81548152906001019060200180831161051157829003601f168201915b5050505050905090565b600081815260cb60205260408120546001600160a01b03166105b65760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b50600090815260cd60205260409020546001600160a01b031690565b60006105dd82610921565b9050806001600160a01b0316836001600160a01b0316141561064b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016105ad565b336001600160a01b038216148061066757506106678133610427565b6106d95760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016105ad565b6106e383836111e0565b505050565b6106f2338261124e565b61070e5760405162461bcd60e51b81526004016105ad906125e1565b6106e3838383611345565b600061072483610a27565b82106107865760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016105ad565b506001600160a01b0391909116600090815260fb60209081526040808320938352929052205490565b6106e383838360405180602001604052806000815250610f43565b60006107d560fd5490565b82106108385760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016105ad565b60fd828154811061084b5761084b6127ff565b90600052602060002001549050919050565b600061012e54600161086f91906126bf565b61012e55610130546001600160a01b031633146108bb5760405162461bcd60e51b815260206004820152600a60248201526910b7379036b4b73a32b960b11b60448201526064016105ad565b61012f5461012e5411156108ff5760405162461bcd60e51b815260206004820152600b60248201526a216d617820737570706c7960a81b60448201526064016105ad565b61090c8261012e546114ec565b61091861012e5461163a565b505061012e5490565b600081815260cb60205260408120546001600160a01b0316806104a05760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016105ad565b61013180546109a690612753565b80601f01602080910402602001604051908101604052809291908181526020018280546109d290612753565b8015610a1f5780601f106109f457610100808354040283529160200191610a1f565b820191906000526020600020905b815481529060010190602001808311610a0257829003601f168201915b505050505081565b60006001600160a01b038216610a925760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016105ad565b506001600160a01b0316600090815260cc602052604090205490565b6065546001600160a01b03163314610ad85760405162461bcd60e51b81526004016105ad9061255e565b6065546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606580546001600160a01b0319169055565b600054610100900460ff1680610b375750303b155b80610b45575060005460ff16155b610b615760405162461bcd60e51b81526004016105ad90612593565b600054610100900460ff16158015610b83576000805461ffff19166101011790555b610b8b611725565b610b936117ab565b610b9d86866117d4565b61012f84905561013080546001600160a01b031916331790558251610bca90610131906020860190611ff4565b5061013280546001600160a01b0319166001600160a01b0384161790558015610bf9576000805461ff00191690555b505050505050565b828282610c0d82610921565b6001600160a01b0316610c1f84610921565b6001600160a01b031614610c715760405162461bcd60e51b8152602060048201526019602482015278024b9903737ba10103a3432902a37b5b2b7399037b73bb2b91603d1b60448201526064016105ad565b610c7a81610921565b6001600160a01b0316610c8c84610921565b6001600160a01b031614610cde5760405162461bcd60e51b8152602060048201526019602482015278024b9903737ba10103a3432902a37b5b2b7399037b73bb2b91603d1b60448201526064016105ad565b33610ce884610921565b6001600160a01b031614610d295760405162461bcd60e51b815260206004820152600860248201526737379037b73bb2b960c11b60448201526064016105ad565b600082815261012d6020526040808220548583529120541015610d5e5760405162461bcd60e51b81526004016105ad90612632565b600081815261012d6020526040808220548583529120541015610d935760405162461bcd60e51b81526004016105ad90612632565b600082815261012d602052604090206001015415610df35760405162461bcd60e51b815260206004820152601c60248201527f417578696c6961727920746f6b656e2063616e2774206265206d69780000000060448201526064016105ad565b600081815261012d602052604090206001015415610e535760405162461bcd60e51b815260206004820152601c60248201527f417578696c6961727920746f6b656e2063616e2774206265206d69780000000060448201526064016105ad565b600083815261012d6020526040902060010154600a11610eab5760405162461bcd60e51b815260206004820152601360248201527209ad2f040e8d2dacae64040e8dede40daeac6d606b1b60448201526064016105ad565b610eb485611805565b610ebd84611805565b600084815261012d602052604080822054878352818320548984529190922054610ee791906126bf565b610ef191906126bf565b600087815261012d6020526040812091825560019182018054909190610f189084906126bf565b9091555050505050505050565b606060ca80546104b590612753565b610f3f3383836118ac565b5050565b610f4d338361124e565b610f695760405162461bcd60e51b81526004016105ad906125e1565b610f758484848461197b565b50505050565b600081815260cb60205260409020546060906001600160a01b0316610ffa5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016105ad565b6000610131805461100a90612753565b90501161102657604051806020016040528060008152506104a0565b610131611032836119ae565b604051602001611043929190612415565b60405160208183030381529060405292915050565b6065546001600160a01b031633146110825760405162461bcd60e51b81526004016105ad9061255e565b6001600160a01b0381166110e75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105ad565b6065546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b6065546001600160a01b0316331461116d5760405162461bcd60e51b81526004016105ad9061255e565b61013080546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160e01b031982166380ac58cd60e01b14806111c157506001600160e01b03198216635b5e139f60e01b145b806104a057506301ffc9a760e01b6001600160e01b03198316146104a0565b600081815260cd6020526040902080546001600160a01b0319166001600160a01b038416908117909155819061121582610921565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081815260cb60205260408120546001600160a01b03166112c75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016105ad565b60006112d283610921565b9050806001600160a01b0316846001600160a01b0316148061130d5750836001600160a01b031661130284610538565b6001600160a01b0316145b8061133d57506001600160a01b03808216600090815260ce602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661135882610921565b6001600160a01b0316146113bc5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b60648201526084016105ad565b6001600160a01b03821661141e5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016105ad565b611429838383611aac565b6114346000826111e0565b6001600160a01b038316600090815260cc6020526040812080546001929061145d908490612710565b90915550506001600160a01b038216600090815260cc6020526040812080546001929061148b9084906126bf565b9091555050600081815260cb602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b0382166115425760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016105ad565b600081815260cb60205260409020546001600160a01b0316156115a75760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016105ad565b6115b360008383611aac565b6001600160a01b038216600090815260cc602052604081208054600192906115dc9084906126bf565b9091555050600081815260cb602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600061164860646001611b64565b6116539060016126d7565b60ff169050602281116116925761166c601e6002611b64565b61167790600a6126d7565b600092835261012d602052604090922060ff90921690915550565b604081116116b1576116a660196002611b64565b6116779060286126d7565b605481116116d0576116c5601e6002611b64565b6116779060416126d7565b605e81116116ef576116e460146002611b64565b61167790605f6126d7565b6063811161170e5761170360196002611b64565b6116779060736126d7565b61171a600b6002611b64565b61167790608c6126d7565b600054610100900460ff168061173a5750303b155b80611748575060005460ff16155b6117645760405162461bcd60e51b81526004016105ad90612593565b600054610100900460ff16158015611786576000805461ffff19166101011790555b61178e611bdd565b611796611c51565b80156117a8576000805461ff00191690555b50565b600054610100900460ff166117d25760405162461bcd60e51b81526004016105ad90612674565b565b600054610100900460ff166117fb5760405162461bcd60e51b81526004016105ad90612674565b610f3f8282611d09565b600061181082610921565b905061181e81600084611aac565b6118296000836111e0565b6001600160a01b038116600090815260cc60205260408120805460019290611852908490612710565b9091555050600082815260cb602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b816001600160a01b0316836001600160a01b0316141561190e5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016105ad565b6001600160a01b03838116600081815260ce6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611986848484611345565b61199284848484611d57565b610f755760405162461bcd60e51b81526004016105ad9061250c565b6060816119d25750506040805180820190915260018152600360fc1b602082015290565b8160005b81156119fc57806119e68161278e565b91506119f59050600a836126fc565b91506119d6565b60008167ffffffffffffffff811115611a1757611a17612815565b6040519080825280601f01601f191660200182016040528015611a41576020820181803683370190505b5090505b841561133d57611a56600183612710565b9150611a63600a866127a9565b611a6e9060306126bf565b60f81b818381518110611a8357611a836127ff565b60200101906001600160f81b031916908160001a905350611aa5600a866126fc565b9450611a45565b6001600160a01b038316611b0757611b028160fd8054600083815260fe60205260408120829055600182018355919091527f9346ac6dd7de6b96975fec380d4d994c4c12e6a8897544f22915316cc6cca2800155565b611b2a565b816001600160a01b0316836001600160a01b031614611b2a57611b2a8382611e64565b6001600160a01b038216611b41576106e381611f01565b826001600160a01b0316826001600160a01b0316146106e3576106e38282611fb0565b6101325460408051426020820152449181019190915233606090811b6bffffffffffffffffffffffff191690820152607481018390526001600160a01b03909116316094820152600090839060b4016040516020818303038152906040528051906020012060001c611bd691906127a9565b9392505050565b600054610100900460ff1680611bf25750303b155b80611c00575060005460ff16155b611c1c5760405162461bcd60e51b81526004016105ad90612593565b600054610100900460ff16158015611796576000805461ffff191661010117905580156117a8576000805461ff001916905550565b600054610100900460ff1680611c665750303b155b80611c74575060005460ff16155b611c905760405162461bcd60e51b81526004016105ad90612593565b600054610100900460ff16158015611cb2576000805461ffff19166101011790555b606580546001600160a01b0319163390811790915560405181906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35080156117a8576000805461ff001916905550565b600054610100900460ff16611d305760405162461bcd60e51b81526004016105ad90612674565b8151611d439060c9906020850190611ff4565b5080516106e39060ca906020840190611ff4565b60006001600160a01b0384163b15611e5957604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611d9b9033908990889088906004016124bc565b602060405180830381600087803b158015611db557600080fd5b505af1925050508015611de5575060408051601f3d908101601f19168201909252611de2918101906122c8565b60015b611e3f573d808015611e13576040519150601f19603f3d011682016040523d82523d6000602084013e611e18565b606091505b508051611e375760405162461bcd60e51b81526004016105ad9061250c565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061133d565b506001949350505050565b60006001611e7184610a27565b611e7b9190612710565b600083815260fc6020526040902054909150808214611ece576001600160a01b038416600090815260fb60209081526040808320858452825280832054848452818420819055835260fc90915290208190555b50600091825260fc602090815260408084208490556001600160a01b03909416835260fb81528383209183525290812055565b60fd54600090611f1390600190612710565b600083815260fe602052604081205460fd8054939450909284908110611f3b57611f3b6127ff565b906000526020600020015490508060fd8381548110611f5c57611f5c6127ff565b600091825260208083209091019290925582815260fe909152604080822084905585825281205560fd805480611f9457611f946127e9565b6001900381819060005260206000200160009055905550505050565b6000611fbb83610a27565b6001600160a01b03909316600090815260fb60209081526040808320868452825280832085905593825260fc9052919091209190915550565b82805461200090612753565b90600052602060002090601f0160209004810192826120225760008555612068565b82601f1061203b57805160ff1916838001178555612068565b82800160010185558215612068579182015b8281111561206857825182559160200191906001019061204d565b50612074929150612078565b5090565b5b808211156120745760008155600101612079565b600067ffffffffffffffff808411156120a8576120a8612815565b604051601f8501601f19908116603f011681019082821181831017156120d0576120d0612815565b816040528093508581528686860111156120e957600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461211a57600080fd5b919050565b600082601f83011261213057600080fd5b611bd68383356020850161208d565b60006020828403121561215157600080fd5b611bd682612103565b6000806040838503121561216d57600080fd5b61217683612103565b915061218460208401612103565b90509250929050565b6000806000606084860312156121a257600080fd5b6121ab84612103565b92506121b960208501612103565b9150604084013590509250925092565b600080600080608085870312156121df57600080fd5b6121e885612103565b93506121f660208601612103565b925060408501359150606085013567ffffffffffffffff81111561221957600080fd5b8501601f8101871361222a57600080fd5b6122398782356020840161208d565b91505092959194509250565b6000806040838503121561225857600080fd5b61226183612103565b91506020830135801515811461227657600080fd5b809150509250929050565b6000806040838503121561229457600080fd5b61229d83612103565b946020939093013593505050565b6000602082840312156122bd57600080fd5b8135611bd68161282b565b6000602082840312156122da57600080fd5b8151611bd68161282b565b600080600080600060a086880312156122fd57600080fd5b853567ffffffffffffffff8082111561231557600080fd5b61232189838a0161211f565b9650602088013591508082111561233757600080fd5b61234389838a0161211f565b955060408801359450606088013591508082111561236057600080fd5b5061236d8882890161211f565b92505061237c60808701612103565b90509295509295909350565b60006020828403121561239a57600080fd5b5035919050565b6000806000606084860312156123b657600080fd5b505081359360208301359350604090920135919050565b600081518084526123e5816020860160208601612727565b601f01601f19169290920160200192915050565b6000815161240b818560208601612727565b9290920192915050565b600080845481600182811c91508083168061243157607f831692505b602080841082141561245157634e487b7160e01b86526022600452602486fd5b8180156124655760018114612476576124a3565b60ff198616895284890196506124a3565b60008b81526020902060005b8681101561249b5781548b820152908501908301612482565b505084890196505b5050505050506124b381856123f9565b95945050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906124ef908301846123cd565b9695505050505050565b602081526000611bd660208301846123cd565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602e908201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560408201526d195b881a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526022908201527f4d61696e20746f6b656e20706f77657220206c657373207468616e206f746865604082015261727360f01b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600082198211156126d2576126d26127bd565b500190565b600060ff821660ff84168060ff038211156126f4576126f46127bd565b019392505050565b60008261270b5761270b6127d3565b500490565b600082821015612722576127226127bd565b500390565b60005b8381101561274257818101518382015260200161272a565b83811115610f755750506000910152565b600181811c9082168061276757607f821691505b6020821081141561278857634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156127a2576127a26127bd565b5060010190565b6000826127b8576127b86127d3565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146117a857600080fdfea26469706673582212201603feda7c5565d3092e1574b244df9582db8e14afc36480758b46f22c6cddf264736f6c63430008060033