60806040526000600560006101000a81548160ff02191690831515021790555060006006553480156200003157600080fd5b5060405162002cab38038062002cab833981018060405260a08110156200005757600080fd5b8101908080516401000000008111156200007057600080fd5b828101905060208101848111156200008757600080fd5b8151856001820283011164010000000082111715620000a557600080fd5b50509291906020018051640100000000811115620000c257600080fd5b82810190506020810184811115620000d957600080fd5b8151856001820283011164010000000082111715620000f757600080fd5b50509291906020018051906020019092919080519060200190929190805190602001909291905050508460019080519060200190620001389291906200020d565b508360029080519060200190620001519291906200020d565b5082600360006101000a81548160ff021916908360ff1602179055508260ff16600a0a8202600481905550600454600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050620002bc565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200025057805160ff191683800117855562000281565b8280016001018555821562000281579182015b828111156200028057825182559160200191906001019062000263565b5b50905062000290919062000294565b5090565b620002b991905b80821115620002b55760008160009055506001016200029b565b5090565b90565b6129df80620002cc6000396000f3fe608060405234801561001057600080fd5b5060043610610190576000357c01000000000000000000000000000000000000000000000000000000009004806394a6b712116100fb578063c2fb97f8116100b4578063dd62ed3e1161008e578063dd62ed3e146108a4578063defcf51f1461091c578063f2fde38b14610a80578063fe0174bd14610adc57610190565b8063c2fb97f8146107a4578063cb9bd15a1461082a578063cddade791461088657610190565b806394a6b712146105ab57806395d89b41146106115780639b9843df14610694578063a02619e4146106b6578063a457c2d7146106d8578063a9059cbb1461073e57610190565b80633ec45d891161014d5780633ec45d89146103ac57806342966c681461041f5780636b180d691461044d57806370a08231146104955780637338e39d146104ed578063894f879e1461055357610190565b806306fdde0314610195578063095ea7b31461021857806318160ddd1461027e57806323b872dd1461029c578063313ce567146103225780633950935114610346575b600080fd5b61019d610b26565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101dd5780820151818401526020810190506101c2565b50505050905090810190601f16801561020a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102646004803603604081101561022e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610bc8565b604051808215151515815260200191505060405180910390f35b610286610bdf565b6040518082815260200191505060405180910390f35b610308600480360360608110156102b257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610be9565b604051808215151515815260200191505060405180910390f35b61032a610ec8565b604051808260ff1660ff16815260200191505060405180910390f35b6103926004803603604081101561035c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610edf565b604051808215151515815260200191505060405180910390f35b610405600480360360608110156103c257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803560ff169060200190929190505050610f84565b604051808215151515815260200191505060405180910390f35b61044b6004803603602081101561043557600080fd5b8101908080359060200190929190505050611074565b005b61047b6004803603602081101561046357600080fd5b810190808035151590602001909291905050506112a1565b604051808215151515815260200191505060405180910390f35b6104d7600480360360208110156104ab57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611325565b6040518082815260200191505060405180910390f35b6105396004803603604081101561050357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061136e565b604051808215151515815260200191505060405180910390f35b6105956004803603602081101561056957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611508565b6040518082815260200191505060405180910390f35b6105f7600480360360408110156105c157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611551565b604051808215151515815260200191505060405180910390f35b6106196116eb565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561065957808201518184015260208101905061063e565b50505050905090810190601f1680156106865780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61069c61178d565b604051808215151515815260200191505060405180910390f35b6106be6117a4565b604051808215151515815260200191505060405180910390f35b610724600480360360408110156106ee57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506117b7565b604051808215151515815260200191505060405180910390f35b61078a6004803603604081101561075457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061185c565b604051808215151515815260200191505060405180910390f35b610810600480360360608110156107ba57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611aa1565b604051808215151515815260200191505060405180910390f35b61086c6004803603602081101561084057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d78565b604051808215151515815260200191505060405180910390f35b61088e611dd4565b6040518082815260200191505060405180910390f35b610906600480360360408110156108ba57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611dda565b6040518082815260200191505060405180910390f35b610a666004803603604081101561093257600080fd5b810190808035906020019064010000000081111561094f57600080fd5b82018360208201111561096157600080fd5b8035906020019184602083028401116401000000008311171561098357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156109e357600080fd5b8201836020820111156109f557600080fd5b80359060200191846020830284011164010000000083111715610a1757600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050611e61565b604051808215151515815260200191505060405180910390f35b610ac260048036036020811015610a9657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061201a565b604051808215151515815260200191505060405180910390f35b610ae46120c4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b606060018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610bbe5780601f10610b9357610100808354040283529160200191610bbe565b820191906000526020600020905b815481529060010190602001808311610ba157829003601f168201915b5050505050905090565b6000610bd53384846120ed565b6001905092915050565b6000600454905090565b6000801515600560009054906101000a900460ff161515141515610c58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180612959602d913960400191505060405180910390fd5b8382600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054421015610d9e5780600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540310151515610d99576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f496e73756666696369656e7420756e6c6f636b65642062616c616e636500000081525060200191505060405180910390fd5b610e17565b600180141515610e16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f5472616e736665722063616e206e6f742062652070726f63657373656400000081525060200191505060405180910390fd5b5b610e22868686612322565b610ebb8633610eb687600860008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461255b90919063ffffffff16565b6120ed565b6001925050509392505050565b6000600360009054906101000a900460ff16905090565b6000610f7a3384610f7585600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546125e690919063ffffffff16565b6120ed565b6001905092915050565b6000801515600560009054906101000a900460ff161515141515610ff3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180612959602d913960400191505060405180910390fd5b610ffb612670565b1515611052576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180612986602e913960400191505060405180910390fd5b61105d8483856126c7565b50611069338585612322565b600190509392505050565b61107c612670565b15156110d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180612986602e913960400191505060405180910390fd5b3381600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020544210156112195780600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540310151515611214576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f496e73756666696369656e7420756e6c6f636b65642062616c616e636500000081525060200191505060405180910390fd5b611292565b600180141515611291576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f5472616e736665722063616e206e6f742062652070726f63657373656400000081525060200191505060405180910390fd5b5b61129c338461276b565b505050565b60006112ab612670565b1515611302576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180612986602e913960400191505060405180910390fd5b81600560006101000a81548160ff02191690831515021790555060019050919050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000611378612670565b15156113cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180612986602e913960400191505060405180910390fd5b60008211801561141d575042600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b1515611474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061292b602e913960400191505060405180910390fd5b620151808202600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205403600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001905092915050565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600061155b612670565b15156115b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180612986602e913960400191505060405180910390fd5b600082118015611600575042600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b1515611657576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061292b602e913960400191505060405180910390fd5b620151808202600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205401600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001905092915050565b606060028054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156117835780601f1061175857610100808354040283529160200191611783565b820191906000526020600020905b81548152906001019060200180831161176657829003601f168201915b5050505050905090565b6000600560009054906101000a900460ff16905090565b600560009054906101000a900460ff1681565b6000611852338461184d85600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461255b90919063ffffffff16565b6120ed565b6001905092915050565b6000801515600560009054906101000a900460ff1615151415156118cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180612959602d913960400191505060405180910390fd5b3382600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054421015611a115780600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540310151515611a0c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f496e73756666696369656e7420756e6c6f636b65642062616c616e636500000081525060200191505060405180910390fd5b611a8a565b600180141515611a89576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f5472616e736665722063616e206e6f742062652070726f63657373656400000081525060200191505060405180910390fd5b5b611a95338686612322565b60019250505092915050565b6000611aab612670565b1515611b02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180612986602e913960400191505060405180910390fd5b81600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410158015611b8f5750600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205442105b1515611c03576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f496e73756666696369656e7420756e6c6f636b65642062616c616e636500000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614158015611c6d5750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b1515611ce1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f496e76616c69642061646472657373000000000000000000000000000000000081525060200191505060405180910390fd5b81600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205403600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611d71848484612322565b9392505050565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054421015611dca5760019050611dcf565b600090505b919050565b60065481565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000801515600560009054906101000a900460ff161515141515611ed0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180612959602d913960400191505060405180910390fd5b611ed8612670565b1515611f2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180612986602e913960400191505060405180910390fd5b81518351141515611fa8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f496e76616c69642041727261790000000000000000000000000000000000000081525060200191505060405180910390fd5b60008351905060008090505b8181101561200e57611ff5338683815181101515611fce57fe5b906020019060200201518684815181101515611fe657fe5b90602001906020020151612322565b6001600654016006819055508080600101915050611fb4565b50600191505092915050565b6000612024612670565b151561207b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180612986602e913960400191505060405180910390fd5b816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f496e76616c69642061646472657373000000000000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515612237576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f496e76616c69642061646472657373000000000000000000000000000000000081525060200191505060405180910390fd5b80600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156123c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f496e76616c696420746f2061646472657373000000000000000000000000000081525060200191505060405180910390fd5b61241981600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461255b90919063ffffffff16565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506124ae81600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546125e690919063ffffffff16565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b60008282111515156125d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f496e76616c69642076616c75657300000000000000000000000000000000000081525060200191505060405180910390fd5b600082840390508091505092915050565b6000808284019050838110151515612666576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f496e76616c69642076616c75657300000000000000000000000000000000000081525060200191505060405180910390fd5b8091505092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b6000620151808360ff160262ffffff164201600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600190509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612810576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f496e76616c6964206163636f756e74000000000000000000000000000000000081525060200191505060405180910390fd5b6128258160045461255b90919063ffffffff16565b60048190555061287d81600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461255b90919063ffffffff16565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505056fe506c6561736520636865636b206164647265737320737461747573206f7220496e636f727265637420696e707574416c6c207472616e73616374696f6e7320617265206c6f636b656420666f72207468697320636f6e7472616374596f7520617265206e6f742061757468656e74696361746520746f206d616b652074686973207472616e73666572a165627a7a72305820755e01a1d8b66df60316579f690740382d9abb58e2aa55a20d6e450ed0d44622002900000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000003b9aca000000000000000000000000006241e4822100eb51e28b7784636037ed1c657bb9000000000000000000000000000000000000000000000000000000000000000e53796e6368726f426974636f696e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003534e420000000000000000000000000000000000000000000000000000000000