60806040526019600a556019600b556005600c55600f600d55600f600e556002600f55600260105560006011553480156200003957600080fd5b5060405162002721380380620027218339810160408190526200005c91620002f7565b3360405180604001604052806008815260200167222720aa37b5b2b760c11b81525060405180604001604052806003815260200162444e4160e81b8152508160039081620000ab9190620003b8565b506004620000ba8282620003b8565b5050506001600160a01b038116620000ed57604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b620000f88162000134565b50620001203060125b6200010e90600a62000599565b6200011a9084620005b1565b62000186565b6200012d33601262000101565b50620005e1565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620001b25760405163ec442f0560e01b815260006004820152602401620000e4565b620001c060008383620001c4565b5050565b6001600160a01b038316620001f3578060026000828254620001e79190620005cb565b90915550620002679050565b6001600160a01b03831660009081526020819052604090205481811015620002485760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620000e4565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b0382166200028557600280548290039055620002a4565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620002ea91815260200190565b60405180910390a3505050565b6000602082840312156200030a57600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200033c57607f821691505b6020821081036200035d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003b3576000816000526020600020601f850160051c810160208610156200038e5750805b601f850160051c820191505b81811015620003af578281556001016200039a565b5050505b505050565b81516001600160401b03811115620003d457620003d462000311565b620003ec81620003e5845462000327565b8462000363565b602080601f8311600181146200042457600084156200040b5750858301515b600019600386901b1c1916600185901b178555620003af565b600085815260208120601f198616915b82811015620004555788860151825594840194600190910190840162000434565b5085821015620004745787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620004db578160001904821115620004bf57620004bf62000484565b80851615620004cd57918102915b93841c93908002906200049f565b509250929050565b600082620004f45750600162000593565b81620005035750600062000593565b81600181146200051c5760028114620005275762000547565b600191505062000593565b60ff8411156200053b576200053b62000484565b50506001821b62000593565b5060208310610133831016604e8410600b84101617156200056c575081810a62000593565b6200057883836200049a565b80600019048211156200058f576200058f62000484565b0290505b92915050565b6000620005aa60ff841683620004e3565b9392505050565b808202811582820484141762000593576200059362000484565b8082018082111562000593576200059362000484565b61213080620005f16000396000f3fe6080604052600436106101e35760003560e01c806379cc679011610102578063d0d9f8ff11610095578063f2104e6111610064578063f2104e61146105a2578063f2fde38b146105b8578063fa8b70ae146105d8578063ffb54a99146105ed57600080fd5b8063d0d9f8ff146104ec578063dd62ed3e14610519578063e1b192581461056c578063e8545aff1461058257600080fd5b8063a9059cbb116100d1578063a9059cbb1461047e578063ab51332b1461049e578063c36956a0146104ce578063c9567bf9146104e457600080fd5b806379cc6790146104085780637b0cd18d146104285780638da5cb5b1461043e57806395d89b411461046957600080fd5b806327b1a8e91161017a578063474e4ebe11610149578063474e4ebe1461026757806349bd5a5e1461038357806370a08231146103b0578063715018a6146103f357600080fd5b806327b1a8e914610325578063313ce5671461033b5780633b7cdccd146103575780633ef947211461036d57600080fd5b8063153ee554116101b6578063153ee5541461027c5780631694505e1461029e57806318160ddd146102f057806323b872dd1461030557600080fd5b806306fdde03146101e8578063095ea7b3146102135780630c193045146102435780631103e5f814610267575b600080fd5b3480156101f457600080fd5b506101fd610607565b60405161020a9190611b62565b60405180910390f35b34801561021f57600080fd5b5061023361022e366004611bf1565b610699565b604051901515815260200161020a565b34801561024f57600080fd5b50610259600f5481565b60405190815260200161020a565b34801561027357600080fd5b50610259600f81565b34801561028857600080fd5b5061029c610297366004611c1d565b6106b3565b005b3480156102aa57600080fd5b506006546102cb9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161020a565b3480156102fc57600080fd5b50600254610259565b34801561031157600080fd5b50610233610320366004611c3a565b6107dc565b34801561033157600080fd5b5061025960115481565b34801561034757600080fd5b506040516012815260200161020a565b34801561036357600080fd5b50610259600a5481565b34801561037957600080fd5b50610259600e5481565b34801561038f57600080fd5b506007546102cb9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156103bc57600080fd5b506102596103cb366004611c1d565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b3480156103ff57600080fd5b5061029c610800565b34801561041457600080fd5b5061029c610423366004611bf1565b610814565b34801561043457600080fd5b50610259600c5481565b34801561044a57600080fd5b5060055473ffffffffffffffffffffffffffffffffffffffff166102cb565b34801561047557600080fd5b506101fd610822565b34801561048a57600080fd5b50610233610499366004611bf1565b610831565b3480156104aa57600080fd5b506102336104b9366004611c1d565b60136020526000908152604090205460ff1681565b3480156104da57600080fd5b5061025960105481565b61029c610847565b3480156104f857600080fd5b506012546102cb9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561052557600080fd5b50610259610534366004611c7b565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b34801561057857600080fd5b50610259600b5481565b34801561058e57600080fd5b5061029c61059d366004611ddc565b610d26565b3480156105ae57600080fd5b50610259600d5481565b3480156105c457600080fd5b5061029c6105d3366004611c1d565b610e78565b3480156105e457600080fd5b50610259600581565b3480156105f957600080fd5b506009546102339060ff1681565b60606003805461061690611e9e565b80601f016020809104026020016040519081016040528092919081815260200182805461064290611e9e565b801561068f5780601f106106645761010080835404028352916020019161068f565b820191906000526020600020905b81548152906001019060200180831161067257829003601f168201915b5050505050905090565b6000336106a7818585610edc565b60019150505b92915050565b6106bb610eee565b73ffffffffffffffffffffffffffffffffffffffff8116610763576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5b56616c69646174696f6e5d3a20496e76616c6964207265776172644d616e6760448201527f657220616464726573730000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b601280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f6a4d7f1f5689d8662af0cc48303b3bc0173bd9a3cf32917d38ddfed5aa0604359060200160405180910390a150565b6000336107ea858285610f41565b6107f5858585611010565b506001949350505050565b610808610eee565b6108126000611678565b565b61081e82826116ef565b5050565b60606004805461061690611e9e565b600061083e338484611010565b50600192915050565b61084f610eee565b60095460ff16156108bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f74726164696e6720697320616c7265616479206f70656e000000000000000000604482015260640161075a565b600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673a73ca83290eed32141fdb76045e583afdbe63cdd90811790915561091190309061090c60025490565b610edc565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561097e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a29190611ef1565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4f9190611ef1565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff9283166004820152911660248201526044016020604051808303816000875af1158015610ac1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae59190611ef1565b6007805473ffffffffffffffffffffffffffffffffffffffff9283167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161790556006541663f305d7194730610b5f8173ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b600080610b8160055473ffffffffffffffffffffffffffffffffffffffff1690565b60405160e088901b7fffffffff0000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015610c0e573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610c339190611f0e565b50506007546006546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60248201529116915063095ea7b3906044016020604051808303816000875af1158015610cd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf49190611f3c565b50600980547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905543600855565b610d2e610eee565b8051825114610d99576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4c656e677468204d69736d617463680000000000000000000000000000000000604482015260640161075a565b60005b8251811015610e3a57818181518110610db757610db7611f59565b602002602001015160136000858481518110610dd557610dd5611f59565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055600101610d9c565b507f099286861bfe895d4983f2127b9363bc2627a5679d94142bf6f07c36b808c4048282604051610e6c929190611f88565b60405180910390a15050565b610e80610eee565b73ffffffffffffffffffffffffffffffffffffffff8116610ed0576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526000600482015260240161075a565b610ed981611678565b50565b610ee9838383600161174b565b505050565b60055473ffffffffffffffffffffffffffffffffffffffff163314610812576040517f118cdaa700000000000000000000000000000000000000000000000000000000815233600482015260240161075a565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461100a5781811015610ffb576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602481018290526044810183905260640161075a565b61100a8484848403600061174b565b50505050565b73ffffffffffffffffffffffffffffffffffffffff83166110b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161075a565b73ffffffffffffffffffffffffffffffffffffffff8216611156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f6573730000000000000000000000000000000000000000000000000000000000606482015260840161075a565b600081116111e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f0000000000000000000000000000000000000000000000606482015260840161075a565b600061120760055473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415801561125d575060055473ffffffffffffffffffffffffffffffffffffffff848116911614155b156114855760075473ffffffffffffffffffffffffffffffffffffffff85811691161480156112a7575060065473ffffffffffffffffffffffffffffffffffffffff848116911614155b80156112c357503260009081526013602052604090205460ff16155b15611416574360085460036112d8919061204a565b11156113005773ffffffffffffffffffffffffffffffffffffffff83163b1561130057600080fd5b600f54601154116113325761132b6064611325600a548561189390919063ffffffff16565b906118cf565b9050611400565b6012546040517f163f752200000000000000000000000000000000000000000000000000000000815232600482015273ffffffffffffffffffffffffffffffffffffffff9091169063163f752290602401602060405180830381865afa1580156113a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c49190611f3c565b156113e35761132b6064611325600c548561189390919063ffffffff16565b6113fd6064611325600d548561189390919063ffffffff16565b90505b601180549060006114108361205d565b91905055505b60075473ffffffffffffffffffffffffffffffffffffffff8481169116148015611456575073ffffffffffffffffffffffffffffffffffffffff84163014155b15611485576114826064611325601054601154101561147757600b5461147b565b600e545b8590611893565b90505b8015611664576012546040517fb8d04f4e00000000000000000000000000000000000000000000000000000000815232600482015260009173ffffffffffffffffffffffffffffffffffffffff169063b8d04f4e90602401602060405180830381865afa1580156114fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151e9190611ef1565b60075490915073ffffffffffffffffffffffffffffffffffffffff8681169116148015611566575060065473ffffffffffffffffffffffffffffffffffffffff858116911614155b801561158257503260009081526013602052604090205460ff16155b80156115a3575073ffffffffffffffffffffffffffffffffffffffff811615155b156115b8576115b38582846118f1565b611662565b6012546115dd90869073ffffffffffffffffffffffffffffffffffffffff16846118f1565b6012546040517f59974e380000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff909116906359974e3890602401600060405180830381600087803b15801561164957600080fd5b505af115801561165d573d6000803e3d6000fd5b505050505b505b61100a8484611673858561199c565b6118f1565b6005805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b73ffffffffffffffffffffffffffffffffffffffff821661173f576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526000600482015260240161075a565b61081e826000836119b7565b73ffffffffffffffffffffffffffffffffffffffff841661179b576040517fe602df050000000000000000000000000000000000000000000000000000000081526000600482015260240161075a565b73ffffffffffffffffffffffffffffffffffffffff83166117eb576040517f94280d620000000000000000000000000000000000000000000000000000000081526000600482015260240161075a565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600160209081526040808320938716835292905220829055801561100a578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161188591815260200190565b60405180910390a350505050565b6000826000036118a5575060006106ad565b60006118b18385612095565b9050826118be85836120ac565b146118c857600080fd5b9392505050565b60008082116118dd57600080fd5b60006118e983856120ac565b949350505050565b73ffffffffffffffffffffffffffffffffffffffff8316611941576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526000600482015260240161075a565b73ffffffffffffffffffffffffffffffffffffffff8216611991576040517fec442f050000000000000000000000000000000000000000000000000000000081526000600482015260240161075a565b610ee98383836119b7565b6000828211156119ab57600080fd5b60006118e983856120e7565b73ffffffffffffffffffffffffffffffffffffffff83166119ef5780600260008282546119e4919061204a565b90915550611aa19050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015611a75576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602481018290526044810183905260640161075a565b73ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff8216611aca57600280548290039055611af6565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611b5591815260200190565b60405180910390a3505050565b60006020808352835180602085015260005b81811015611b9057858101830151858201604001528201611b74565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b73ffffffffffffffffffffffffffffffffffffffff81168114610ed957600080fd5b60008060408385031215611c0457600080fd5b8235611c0f81611bcf565b946020939093013593505050565b600060208284031215611c2f57600080fd5b81356118c881611bcf565b600080600060608486031215611c4f57600080fd5b8335611c5a81611bcf565b92506020840135611c6a81611bcf565b929592945050506040919091013590565b60008060408385031215611c8e57600080fd5b8235611c9981611bcf565b91506020830135611ca981611bcf565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d2a57611d2a611cb4565b604052919050565b600067ffffffffffffffff821115611d4c57611d4c611cb4565b5060051b60200190565b8015158114610ed957600080fd5b600082601f830112611d7557600080fd5b81356020611d8a611d8583611d32565b611ce3565b8083825260208201915060208460051b870101935086841115611dac57600080fd5b602086015b84811015611dd1578035611dc481611d56565b8352918301918301611db1565b509695505050505050565b60008060408385031215611def57600080fd5b823567ffffffffffffffff80821115611e0757600080fd5b818501915085601f830112611e1b57600080fd5b81356020611e2b611d8583611d32565b82815260059290921b84018101918181019089841115611e4a57600080fd5b948201945b83861015611e71578535611e6281611bcf565b82529482019490820190611e4f565b96505086013592505080821115611e8757600080fd5b50611e9485828601611d64565b9150509250929050565b600181811c90821680611eb257607f821691505b602082108103611eeb577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215611f0357600080fd5b81516118c881611bcf565b600080600060608486031215611f2357600080fd5b8351925060208401519150604084015190509250925092565b600060208284031215611f4e57600080fd5b81516118c881611d56565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b604080825283519082018190526000906020906060840190828701845b82811015611fd757815173ffffffffffffffffffffffffffffffffffffffff1684529284019290840190600101611fa5565b5050508381038285015284518082528583019183019060005b8181101561200e578351151583529284019291840191600101611ff0565b5090979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156106ad576106ad61201b565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361208e5761208e61201b565b5060010190565b80820281158282048414176106ad576106ad61201b565b6000826120e2577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b818103818111156106ad576106ad61201b56fea264697066735822122072bdf9d0adc9b2accaa61434bfdcb080bb0364b5eecc229b4394ece7eaa14f5564736f6c6343000818003300000000000000000000000000000000000000000000000000000000000f4240