0x60a06040523060805234801561001457600080fd5b50608051611a3961003e60003960008181610e1c01528181610e450152610ef20152611a396000f3fe6080604052600436106101965760003560e01c80636c2d2f32116100e1578063950e61c61161008a578063ad3cb1cc11610064578063ad3cb1cc14610475578063e127b067146104cb578063f2fde38b146104eb578063fe07c7ee1461050b57600080fd5b8063950e61c6146103db57806399d25c8f14610415578063a658551d1461045557600080fd5b8063790fcf9f116100bb578063790fcf9f146103575780637fe4b65f146103775780638da5cb5b1461039e57600080fd5b80636c2d2f321461030d578063715018a61461032d57806378e66ecb1461034257600080fd5b806341abf5a81161014357806352d1902d1161011d57806352d1902d146102d857806356650a59146102ed57806369f9d7fc1461023e57600080fd5b806341abf5a8146102855780634a506553146102a55780634f1ef286146102c557600080fd5b806320ff430b1161017457806320ff430b1461021e578063225ac2f21461023e5780633bed82991461026557600080fd5b806309ff18f01461019b57806311532e77146101d85780631d996766146101fc575b600080fd5b3480156101a757600080fd5b506000546101bb906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101e457600080fd5b506101ee60015481565b6040519081526020016101cf565b34801561020857600080fd5b5061021c6102173660046115c2565b61053b565b005b34801561022a57600080fd5b5061021c6102393660046115dd565b610598565b34801561024a57600080fd5b50610253600681565b60405160ff90911681526020016101cf565b34801561027157600080fd5b5061021c610280366004611627565b6105b9565b34801561029157600080fd5b5061021c6102a036600461165e565b610625565b3480156102b157600080fd5b5061021c6102c03660046116fa565b61077e565b61021c6102d33660046116fa565b61080c565b3480156102e457600080fd5b506101ee610900565b3480156102f957600080fd5b5061021c610308366004611627565b61092f565b34801561031957600080fd5b5061021c6103283660046115c2565b610993565b34801561033957600080fd5b5061021c610a0a565b34801561034e57600080fd5b506101ee603b81565b34801561036357600080fd5b5061021c610372366004611827565b610a1e565b34801561038357600080fd5b506002546101bb90600160401b90046001600160a01b031681565b3480156103aa57600080fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03166101bb565b3480156103e757600080fd5b506002546103fc9067ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016101cf565b34801561042157600080fd5b506104456104303660046115c2565b60056020526000908152604090205460ff1681565b60405190151581526020016101cf565b34801561046157600080fd5b506003546101bb906001600160a01b031681565b34801561048157600080fd5b506104be6040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516101cf919061190d565b3480156104d757600080fd5b5061021c6104e636600461165e565b610b59565b3480156104f757600080fd5b5061021c6105063660046115c2565b610c93565b34801561051757600080fd5b506104456105263660046115c2565b60046020526000908152604090205460ff1681565b610543610cea565b600380546001600160a01b0319166001600160a01b0383169081179091556040519081527f9571cc54cfa80ead8e8e93dd428266203b9a87d40db79a6ec6748d815c135354906020015b60405180910390a150565b6105a0610cea565b6105b46001600160a01b0384168383610d5e565b505050565b6105c1610cea565b6001600160a01b038216600081815260046020908152604091829020805460ff19168515159081179091558251938452908301527f4e01eaf60160a0ebf7bd5f0c5a210bc16d5028505bbe3f2f31db5fec0ba4d48491015b60405180910390a15050565b6001600160a01b03861660009081526004602052604090205460ff166106925760405162461bcd60e51b815260206004820152601960248201527f494e56414c49445f544f4b454e5f464f525f4d494e54494e470000000000000060448201526064015b60405180910390fd5b61069d603b82611936565b4211156106ec5760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f54494d455354414d500000000000000000000000000000006044820152606401610689565b600254610710906001600160a01b03888116913391600160401b9091041687610dd2565b60025460408051600160401b9092046001600160a01b03908116835260208301879052908201859052606082018490523391878216918916907ec9e2cc407234e92452eb2ed66d21a046da7ef1ae6b0fc6be89fd25e4f1ad28906080015b60405180910390a4505050505050565b610786610cea565b600080546001600160a01b0319166001600160a01b0384161790558051602082012060015561a8c06107b89042611949565b6002805467ffffffffffffffff191667ffffffffffffffff929092169190911790556040517fcc54b42f78b332711d2d2b40bd7edb325a1fef0124753b0689728b7209ca1e2e906106199084908490611971565b610814610e11565b6000546001600160a01b0383811691161461085b576040517f9ab1811500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154815160208301201461089c576040517fefac8be100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025467ffffffffffffffff168015806108bf5750428167ffffffffffffffff16115b156108f6576040517f260343ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105b48383610ec8565b600061090a610ee7565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b610937610cea565b6001600160a01b038216600081815260056020908152604091829020805460ff19168515159081179091558251938452908301527ff1614ee46d8d6e4ff24d957aa18127a86394bb2a6d61927e9ccd5015f1103ad09101610619565b61099b610cea565b600280547fffffffff0000000000000000000000000000000000000000ffffffffffffffff16600160401b6001600160a01b038416908102919091179091556040519081527f7a42ad327f7dc8771c3fe49beac52d4d1bf2934976245d9d763d40c660852ed39060200161058d565b610a12610cea565b610a1c6000610f30565b565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff16600081158015610a645750825b905060008267ffffffffffffffff166001148015610a815750303b155b905081158015610a8f575080155b15610ac6576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610af557845468ff00000000000000001916600160401b1785555b610b028a8a8a8a8a610fa1565b8315610b4d57845468ff000000000000000019168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050565b6001600160a01b03861660009081526005602052604090205460ff16610bc15760405162461bcd60e51b815260206004820152601b60248201527f494e56414c49445f544f4b454e5f464f525f52454445454d494e4700000000006044820152606401610689565b610bcc603b82611936565b421115610c1b5760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f54494d455354414d500000000000000000000000000000006044820152606401610689565b600354610c37906001600160a01b038881169133911687610dd2565b600354604080516001600160a01b0392831681526020810187905290810185905260608101849052339187811691908916907f53e6e6870c33449d075d7cd0d3865a02ab4cda802e8787d2da8160ba94e2c7fb9060800161076e565b610c9b610cea565b6001600160a01b038116610cde576040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260006004820152602401610689565b610ce781610f30565b50565b33610d1c7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610a1c576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610689565b6040516001600160a01b038381166024830152604482018390526105b491859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506110cf565b6040516001600160a01b038481166024830152838116604483015260648201839052610e0b9186918216906323b872dd90608401610d8b565b50505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610eaa57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610e9e7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b031614155b15610a1c5760405163703e46dd60e11b815260040160405180910390fd5b610ed0610e11565b610ed98261114b565b610ee38282611153565b5050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a1c5760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b610fa961123b565b610fb28561129d565b600280547fffffffff0000000000000000000000000000000000000000ffffffffffffffff16600160401b6001600160a01b038781169190910291909117909155600380546001600160a01b03191691851691909117905560005b82518110156110685760016004600085848151811061102e5761102e61199b565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905560010161100d565b5060005b81518110156110c75760016005600084848151811061108d5761108d61199b565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905560010161106c565b505050505050565b60006110e46001600160a01b038416836112a5565b9050805160001415801561110957508080602001905181019061110791906119b1565b155b156105b4576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602401610689565b610ce7610cea565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156111ad575060408051601f3d908101601f191682019092526111aa918101906119ce565b60015b6111d557604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610689565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114611231576040517faa1d49a400000000000000000000000000000000000000000000000000000000815260048101829052602401610689565b6105b483836112bc565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610a1c576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c9b61123b565b60606112b383836000611312565b90505b92915050565b6112c5826113ca565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561130a576105b48282611441565b610ee36114b7565b606081471015611350576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401610689565b600080856001600160a01b0316848660405161136c91906119e7565b60006040518083038185875af1925050503d80600081146113a9576040519150601f19603f3d011682016040523d82523d6000602084013e6113ae565b606091505b50915091506113be8683836114ef565b925050505b9392505050565b806001600160a01b03163b60000361140057604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610689565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b03168460405161145e91906119e7565b600060405180830381855af49150503d8060008114611499576040519150601f19603f3d011682016040523d82523d6000602084013e61149e565b606091505b50915091506114ae8583836114ef565b95945050505050565b3415610a1c576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606082611504576114ff82611564565b6113c3565b815115801561151b57506001600160a01b0384163b155b1561155d576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610689565b50806113c3565b8051156115745780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80356001600160a01b03811681146115bd57600080fd5b919050565b6000602082840312156115d457600080fd5b6112b3826115a6565b6000806000606084860312156115f257600080fd5b6115fb846115a6565b9250611609602085016115a6565b9150604084013590509250925092565b8015158114610ce757600080fd5b6000806040838503121561163a57600080fd5b611643836115a6565b9150602083013561165381611619565b809150509250929050565b60008060008060008060c0878903121561167757600080fd5b611680876115a6565b955061168e602088016115a6565b95989597505050506040840135936060810135936080820135935060a0909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156116f2576116f26116b3565b604052919050565b6000806040838503121561170d57600080fd5b611716836115a6565b915060208084013567ffffffffffffffff8082111561173457600080fd5b818601915086601f83011261174857600080fd5b81358181111561175a5761175a6116b3565b61176c601f8201601f191685016116c9565b9150808252878482850101111561178257600080fd5b80848401858401376000848284010152508093505050509250929050565b600082601f8301126117b157600080fd5b8135602067ffffffffffffffff8211156117cd576117cd6116b3565b8160051b6117dc8282016116c9565b92835284810182019282810190878511156117f657600080fd5b83870192505b8483101561181c5761180d836115a6565b825291830191908301906117fc565b979650505050505050565b600080600080600060a0868803121561183f57600080fd5b611848866115a6565b9450611856602087016115a6565b9350611864604087016115a6565b9250606086013567ffffffffffffffff8082111561188157600080fd5b61188d89838a016117a0565b935060808801359150808211156118a357600080fd5b506118b0888289016117a0565b9150509295509295909350565b60005b838110156118d85781810151838201526020016118c0565b50506000910152565b600081518084526118f98160208601602086016118bd565b601f01601f19169290920160200192915050565b6020815260006112b360208301846118e1565b634e487b7160e01b600052601160045260246000fd5b808201808211156112b6576112b6611920565b67ffffffffffffffff81811683821601908082111561196a5761196a611920565b5092915050565b6001600160a01b038316815260406020820152600061199360408301846118e1565b949350505050565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156119c357600080fd5b81516113c381611619565b6000602082840312156119e057600080fd5b5051919050565b600082516119f98184602087016118bd565b919091019291505056fea2646970667358221220983afbc0e4bad3b487c7452eacd9b25dba74f978cd4e2e9002a3d22846c3349564736f6c63430008180033