60806040523480156200001157600080fd5b50604051620020db380380620020db833981016040819052620000349162000140565b60408051808201825260078152661391951554d11560ca1b602080830191909152825180840190935260038352622aa72360e91b908301529033806200009457604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b6200009f81620000f0565b506001620000ae83826200022c565b506002620000bd82826200022c565b5050600780546001600160a01b0319166001600160a01b03959095169490941790935560089190915560095550620002f8565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000806000606084860312156200015657600080fd5b83516001600160a01b03811681146200016e57600080fd5b602085015160409095015190969495509392505050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620001b057607f821691505b602082108103620001d157634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000227576000816000526020600020601f850160051c81016020861015620002025750805b601f850160051c820191505b8181101562000223578281556001016200020e565b5050505b505050565b81516001600160401b0381111562000248576200024862000185565b62000260816200025984546200019b565b84620001d7565b602080601f8311600181146200029857600084156200027f5750858301515b600019600386901b1c1916600185901b17855562000223565b600085815260208120601f198616915b82811015620002c957888601518255948401946001909101908401620002a8565b5085821015620002e85787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b611dd380620003086000396000f3fe60806040526004361061018b5760003560e01c806395d89b41116100d6578063e086e5ec1161007f578063ee259ff211610059578063ee259ff214610494578063f2fde38b1461049c578063ff186b2e146104bc57600080fd5b8063e086e5ec14610413578063e136f65f14610428578063e985e9c51461043e57600080fd5b8063a7c60160116100b0578063a7c60160146103b3578063b88d4fde146103d3578063c87b56dd146103f357600080fd5b806395d89b41146103515780639d741e5d14610366578063a22cb4651461039357600080fd5b806342842e0e1161013857806370a082311161011257806370a08231146102f1578063715018a6146103115780638da5cb5b1461032657600080fd5b806342842e0e1461028e578063626be567146102ae5780636352211e146102d157600080fd5b8063095ea7b311610169578063095ea7b31461022c57806323b872dd1461024e5780633ea521ef1461026e57600080fd5b806301ffc9a71461019057806306fdde03146101c5578063081812fc146101e7575b600080fd5b34801561019c57600080fd5b506101b06101ab366004611909565b6104d2565b60405190151581526020015b60405180910390f35b3480156101d157600080fd5b506101da6105b7565b6040516101bc9190611994565b3480156101f357600080fd5b506102076102023660046119a7565b610649565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bc565b34801561023857600080fd5b5061024c6102473660046119e9565b61067f565b005b34801561025a57600080fd5b5061024c610269366004611a13565b61068e565b34801561027a57600080fd5b5061024c6102893660046119a7565b610784565b34801561029a57600080fd5b5061024c6102a9366004611a13565b610906565b3480156102ba57600080fd5b506102c3610921565b6040519081526020016101bc565b3480156102dd57600080fd5b506102076102ec3660046119a7565b610964565b3480156102fd57600080fd5b506102c361030c366004611a4f565b61096f565b34801561031d57600080fd5b5061024c6109ea565b34801561033257600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610207565b34801561035d57600080fd5b506101da6109fe565b34801561037257600080fd5b506007546102079073ffffffffffffffffffffffffffffffffffffffff1681565b34801561039f57600080fd5b5061024c6103ae366004611a78565b610a0d565b3480156103bf57600080fd5b5061024c6103ce3660046119a7565b610a18565b3480156103df57600080fd5b5061024c6103ee366004611ade565b610c2a565b3480156103ff57600080fd5b506101da61040e3660046119a7565b610c41565b34801561041f57600080fd5b5061024c610cb6565b34801561043457600080fd5b506102c360095481565b34801561044a57600080fd5b506101b0610459366004611bd8565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260066020908152604080832093909416825291909152205460ff1690565b61024c610d0f565b3480156104a857600080fd5b5061024c6104b7366004611a4f565b610d42565b3480156104c857600080fd5b506102c360085481565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061056557507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806105b157507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060600180546105c690611c0b565b80601f01602080910402602001604051908101604052809291908181526020018280546105f290611c0b565b801561063f5780601f106106145761010080835404028352916020019161063f565b820191906000526020600020905b81548152906001019060200180831161062257829003601f168201915b5050505050905090565b600061065482610da3565b5060008281526005602052604090205473ffffffffffffffffffffffffffffffffffffffff166105b1565b61068a828233610e02565b5050565b73ffffffffffffffffffffffffffffffffffffffff82166106e3576040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600060048201526024015b60405180910390fd5b60006106f0838333610e0f565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461077e576040517f64283d7b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808616600483015260248201849052821660448201526064016106da565b50505050565b61078c610f8c565b6007546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156107fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081f9190611c58565b90508181101561082e57600080fd5b60075473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61086b60005473ffffffffffffffffffffffffffffffffffffffff1690565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018590526044016020604051808303816000875af11580156108dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109019190611c71565b505050565b61090183838360405180602001604052806000815250610c2a565b60008060015b6000818152600a602052604090205460ff161561095e578161094881611cbd565b925050808061095690611cbd565b915050610927565b50919050565b60006105b182610da3565b600073ffffffffffffffffffffffffffffffffffffffff82166109c1576040517f89c62b64000000000000000000000000000000000000000000000000000000008152600060048201526024016106da565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526004602052604090205490565b6109f2610f8c565b6109fc6000610fdf565b565b6060600280546105c690611c0b565b61068a338383611054565b600954811015610a2757600080fd5b6007546040517fdd62ed3e000000000000000000000000000000000000000000000000000000008152336004820152306024820152829173ffffffffffffffffffffffffffffffffffffffff169063dd62ed3e90604401602060405180830381865afa158015610a9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abf9190611c58565b1015610aca57600080fd5b6007546040517f70a08231000000000000000000000000000000000000000000000000000000008152336004820152829173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610b38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5c9190611c58565b1015610b6757600080fd5b6007546040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810183905273ffffffffffffffffffffffffffffffffffffffff909116906323b872dd906064016020604051808303816000875af1158015610be4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c089190611c71565b506000610c13610921565b610c1e906001611cf5565b905061068a3382611151565b610c3584848461068e565b61077e84848484611202565b6060610c4c82610da3565b506000610c6460408051602081019091526000815290565b90506000815111610c845760405180602001604052806000815250610caf565b80610c8e846113f9565b604051602001610c9f929190611d08565b6040516020818303038152906040525b9392505050565b610cbe610f8c565b4780610cc957600080fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff9091169183156108fc02918491818181858888f1935050505015801561068a573d6000803e3d6000fd5b600854341015610d1e57600080fd5b6000610d28610921565b610d33906001611cf5565b9050610d3f3382611151565b50565b610d4a610f8c565b73ffffffffffffffffffffffffffffffffffffffff8116610d9a576040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600060048201526024016106da565b610d3f81610fdf565b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff16806105b1576040517f7e273289000000000000000000000000000000000000000000000000000000008152600481018490526024016106da565b61090183838360016114b7565b60008281526003602052604081205473ffffffffffffffffffffffffffffffffffffffff90811690831615610e4957610e49818486611682565b73ffffffffffffffffffffffffffffffffffffffff811615610ebf57610e736000856000806114b7565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260046020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190555b73ffffffffffffffffffffffffffffffffffffffff851615610f085773ffffffffffffffffffffffffffffffffffffffff85166000908152600460205260409020805460010190555b60008481526003602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146109fc576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016106da565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff82166110b9576040517f5b08ba1800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024016106da565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526006602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff82166111a1576040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600060048201526024016106da565b60006111af83836000610e0f565b905073ffffffffffffffffffffffffffffffffffffffff811615610901576040517f73c6ac6e000000000000000000000000000000000000000000000000000000008152600060048201526024016106da565b73ffffffffffffffffffffffffffffffffffffffff83163b1561077e576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063150b7a0290611277903390889087908790600401611d37565b6020604051808303816000875af19250505080156112d0575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526112cd91810190611d80565b60015b61135f573d8080156112fe576040519150601f19603f3d011682016040523d82523d6000602084013e611303565b606091505b508051600003611357576040517f64a0ae9200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024016106da565b805181602001fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081167f150b7a0200000000000000000000000000000000000000000000000000000000146113f2576040517f64a0ae9200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024016106da565b5050505050565b6060600061140683611732565b600101905060008167ffffffffffffffff81111561142657611426611aaf565b6040519080825280601f01601f191660200182016040528015611450576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a850494508461145a57509392505050565b80806114d8575073ffffffffffffffffffffffffffffffffffffffff821615155b1561162d5760006114e884610da3565b905073ffffffffffffffffffffffffffffffffffffffff83161580159061153b57508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561157a575073ffffffffffffffffffffffffffffffffffffffff80821660009081526006602090815260408083209387168352929052205460ff16155b156115c9576040517fa9fbf51f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024016106da565b811561162b57838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b5050600090815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b61168d838383611814565b6109015773ffffffffffffffffffffffffffffffffffffffff83166116e1576040517f7e273289000000000000000000000000000000000000000000000000000000008152600481018290526024016106da565b6040517f177e802f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602481018290526044016106da565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061177b577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef810000000083106117a7576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106117c557662386f26fc10000830492506010015b6305f5e10083106117dd576305f5e100830492506008015b61271083106117f157612710830492506004015b60648310611803576064830492506002015b600a83106105b15760010192915050565b600073ffffffffffffffffffffffffffffffffffffffff8316158015906118d357508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806118a2575073ffffffffffffffffffffffffffffffffffffffff80851660009081526006602090815260408083209387168352929052205460ff165b806118d3575060008281526005602052604090205473ffffffffffffffffffffffffffffffffffffffff8481169116145b949350505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610d3f57600080fd5b60006020828403121561191b57600080fd5b8135610caf816118db565b60005b83811015611941578181015183820152602001611929565b50506000910152565b60008151808452611962816020860160208601611926565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610caf602083018461194a565b6000602082840312156119b957600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff811681146119e457600080fd5b919050565b600080604083850312156119fc57600080fd5b611a05836119c0565b946020939093013593505050565b600080600060608486031215611a2857600080fd5b611a31846119c0565b9250611a3f602085016119c0565b9150604084013590509250925092565b600060208284031215611a6157600080fd5b610caf826119c0565b8015158114610d3f57600080fd5b60008060408385031215611a8b57600080fd5b611a94836119c0565b91506020830135611aa481611a6a565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008060008060808587031215611af457600080fd5b611afd856119c0565b9350611b0b602086016119c0565b925060408501359150606085013567ffffffffffffffff80821115611b2f57600080fd5b818701915087601f830112611b4357600080fd5b813581811115611b5557611b55611aaf565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611b9b57611b9b611aaf565b816040528281528a6020848701011115611bb457600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215611beb57600080fd5b611bf4836119c0565b9150611c02602084016119c0565b90509250929050565b600181811c90821680611c1f57607f821691505b60208210810361095e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060208284031215611c6a57600080fd5b5051919050565b600060208284031215611c8357600080fd5b8151610caf81611a6a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611cee57611cee611c8e565b5060010190565b808201808211156105b1576105b1611c8e565b60008351611d1a818460208801611926565b835190830190611d2e818360208801611926565b01949350505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152611d76608083018461194a565b9695505050505050565b600060208284031215611d9257600080fd5b8151610caf816118db56fea2646970667358221220cb8b1065fbd2bb666e726d9ddef961318f72d99683b04bfcce245d0282e7688f64736f6c6343000818003300000000000000000000000012ef0f1c99d8fd50ffd37ccd12b09ef7f121326900000000000000000000000000000000000000000000000000000000000006a400000000000000000000000000000000000000000000000000000000000006a4