0x60806040523480156200001157600080fd5b506040516200295a3803806200295a8339818101604052810190620000379190620002c2565b818181600090805190602001906200005192919062000075565b5080600190805190602001906200006a92919062000075565b5050505050620003ab565b828054620000839062000376565b90600052602060002090601f016020900481019282620000a75760008555620000f3565b82601f10620000c257805160ff1916838001178555620000f3565b82800160010185558215620000f3579182015b82811115620000f2578251825591602001919060010190620000d5565b5b50905062000102919062000106565b5090565b5b808211156200012157600081600090555060010162000107565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200018e8262000143565b810181811067ffffffffffffffff82111715620001b057620001af62000154565b5b80604052505050565b6000620001c562000125565b9050620001d3828262000183565b919050565b600067ffffffffffffffff821115620001f657620001f562000154565b5b620002018262000143565b9050602081019050919050565b60005b838110156200022e57808201518184015260208101905062000211565b838111156200023e576000848401525b50505050565b60006200025b6200025584620001d8565b620001b9565b9050828152602081018484840111156200027a57620002796200013e565b5b620002878482856200020e565b509392505050565b600082601f830112620002a757620002a662000139565b5b8151620002b984826020860162000244565b91505092915050565b60008060408385031215620002dc57620002db6200012f565b5b600083015167ffffffffffffffff811115620002fd57620002fc62000134565b5b6200030b858286016200028f565b925050602083015167ffffffffffffffff8111156200032f576200032e62000134565b5b6200033d858286016200028f565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200038f57607f821691505b602082108103620003a557620003a462000347565b5b50919050565b61259f80620003bb6000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c806369f90b6111610097578063a22cb46511610066578063a22cb46514610298578063b88d4fde146102b4578063c87b56dd146102d0578063e985e9c514610300576100f5565b806369f90b61146101fc5780636a6278421461021a57806370a082311461024a57806395d89b411461027a576100f5565b8063095ea7b3116100d3578063095ea7b31461017857806323b872dd1461019457806342842e0e146101b05780636352211e146101cc576100f5565b806301ffc9a7146100fa57806306fdde031461012a578063081812fc14610148575b600080fd5b610114600480360381019061010f9190611892565b610330565b60405161012191906118da565b60405180910390f35b610132610412565b60405161013f919061198e565b60405180910390f35b610162600480360381019061015d91906119e6565b6104a4565b60405161016f9190611a54565b60405180910390f35b610192600480360381019061018d9190611a9b565b6104ea565b005b6101ae60048036038101906101a99190611adb565b610601565b005b6101ca60048036038101906101c59190611adb565b610661565b005b6101e660048036038101906101e191906119e6565b610681565b6040516101f39190611a54565b60405180910390f35b610204610707565b604051610211919061198e565b60405180910390f35b610234600480360381019061022f9190611b2e565b61074a565b6040516102419190611b6a565b60405180910390f35b610264600480360381019061025f9190611b2e565b610777565b6040516102719190611b6a565b60405180910390f35b61028261082e565b60405161028f919061198e565b60405180910390f35b6102b260048036038101906102ad9190611bb1565b6108c0565b005b6102ce60048036038101906102c99190611d26565b6108d6565b005b6102ea60048036038101906102e591906119e6565b610938565b6040516102f7919061198e565b60405180910390f35b61031a60048036038101906103159190611da9565b6109a0565b60405161032791906118da565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806103fb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061040b575061040a82610a34565b5b9050919050565b60606000805461042190611e18565b80601f016020809104026020016040519081016040528092919081815260200182805461044d90611e18565b801561049a5780601f1061046f5761010080835404028352916020019161049a565b820191906000526020600020905b81548152906001019060200180831161047d57829003601f168201915b5050505050905090565b60006104af82610a9e565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006104f582610681565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610565576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161055c90611ebb565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610584610ae9565b73ffffffffffffffffffffffffffffffffffffffff1614806105b357506105b2816105ad610ae9565b6109a0565b5b6105f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e990611f4d565b60405180910390fd5b6105fc8383610af1565b505050565b61061261060c610ae9565b82610baa565b610651576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064890611fdf565b60405180910390fd5b61065c838383610c3f565b505050565b61067c838383604051806020016040528060008152506108d6565b505050565b60008061068d83610f38565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036106fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106f59061204b565b60405180910390fd5b80915050919050565b606060006040518060400160405280600581526020017f323437373600000000000000000000000000000000000000000000000000000081525090508091505090565b60006107566006610f75565b60006107626006610f8b565b905061076e8382610f99565b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036107e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107de906120dd565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60606001805461083d90611e18565b80601f016020809104026020016040519081016040528092919081815260200182805461086990611e18565b80156108b65780601f1061088b576101008083540402835291602001916108b6565b820191906000526020600020905b81548152906001019060200180831161089957829003601f168201915b5050505050905090565b6108d26108cb610ae9565b8383610fb7565b5050565b6108e76108e1610ae9565b83610baa565b610926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091d90611fdf565b60405180910390fd5b61093284848484611123565b50505050565b606061094382610a9e565b600061094d61117f565b9050600081511161096d5760405180602001604052806000815250610998565b8061097784611196565b604051602001610988929190612139565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610aa781611264565b610ae6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610add9061204b565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610b6483610681565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610bb683610681565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610bf85750610bf781856109a0565b5b80610c3657508373ffffffffffffffffffffffffffffffffffffffff16610c1e846104a4565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610c5f82610681565b73ffffffffffffffffffffffffffffffffffffffff1614610cb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cac906121cf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1b90612261565b60405180910390fd5b610d3183838360016112a5565b8273ffffffffffffffffffffffffffffffffffffffff16610d5182610681565b73ffffffffffffffffffffffffffffffffffffffff1614610da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9e906121cf565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610f3383838360016112ab565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6001816000016000828254019250508190555050565b600081600001549050919050565b610fb38282604051806020016040528060008152506112b1565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611025576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101c906122cd565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161111691906118da565b60405180910390a3505050565b61112e848484610c3f565b61113a8484848461130c565b611179576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111709061235f565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b6060600060016111a584611493565b01905060008167ffffffffffffffff8111156111c4576111c3611bfb565b5b6040519080825280601f01601f1916602001820160405280156111f65781602001600182028036833780820191505090505b509050600082602001820190505b600115611259578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161124d5761124c61237f565b5b04945060008503611204575b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff1661128683610f38565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b50505050565b50505050565b6112bb83836115e6565b6112c8600084848461130c565b611307576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fe9061235f565b60405180910390fd5b505050565b600061132d8473ffffffffffffffffffffffffffffffffffffffff16611803565b15611486578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611356610ae9565b8786866040518563ffffffff1660e01b81526004016113789493929190612403565b6020604051808303816000875af19250505080156113b457506040513d601f19601f820116820180604052508101906113b19190612464565b60015b611436573d80600081146113e4576040519150601f19603f3d011682016040523d82523d6000602084013e6113e9565b606091505b50600081510361142e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114259061235f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061148b565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106114f1577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816114e7576114e661237f565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061152e576d04ee2d6d415b85acef810000000083816115245761152361237f565b5b0492506020810190505b662386f26fc10000831061155d57662386f26fc1000083816115535761155261237f565b5b0492506010810190505b6305f5e1008310611586576305f5e100838161157c5761157b61237f565b5b0492506008810190505b61271083106115ab5761271083816115a1576115a061237f565b5b0492506004810190505b606483106115ce57606483816115c4576115c361237f565b5b0492506002810190505b600a83106115dd576001810190505b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611655576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164c906124dd565b60405180910390fd5b61165e81611264565b1561169e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169590612549565b60405180910390fd5b6116ac6000838360016112a5565b6116b581611264565b156116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec90612549565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46117ff6000838360016112ab565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61186f8161183a565b811461187a57600080fd5b50565b60008135905061188c81611866565b92915050565b6000602082840312156118a8576118a7611830565b5b60006118b68482850161187d565b91505092915050565b60008115159050919050565b6118d4816118bf565b82525050565b60006020820190506118ef60008301846118cb565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561192f578082015181840152602081019050611914565b8381111561193e576000848401525b50505050565b6000601f19601f8301169050919050565b6000611960826118f5565b61196a8185611900565b935061197a818560208601611911565b61198381611944565b840191505092915050565b600060208201905081810360008301526119a88184611955565b905092915050565b6000819050919050565b6119c3816119b0565b81146119ce57600080fd5b50565b6000813590506119e0816119ba565b92915050565b6000602082840312156119fc576119fb611830565b5b6000611a0a848285016119d1565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611a3e82611a13565b9050919050565b611a4e81611a33565b82525050565b6000602082019050611a696000830184611a45565b92915050565b611a7881611a33565b8114611a8357600080fd5b50565b600081359050611a9581611a6f565b92915050565b60008060408385031215611ab257611ab1611830565b5b6000611ac085828601611a86565b9250506020611ad1858286016119d1565b9150509250929050565b600080600060608486031215611af457611af3611830565b5b6000611b0286828701611a86565b9350506020611b1386828701611a86565b9250506040611b24868287016119d1565b9150509250925092565b600060208284031215611b4457611b43611830565b5b6000611b5284828501611a86565b91505092915050565b611b64816119b0565b82525050565b6000602082019050611b7f6000830184611b5b565b92915050565b611b8e816118bf565b8114611b9957600080fd5b50565b600081359050611bab81611b85565b92915050565b60008060408385031215611bc857611bc7611830565b5b6000611bd685828601611a86565b9250506020611be785828601611b9c565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611c3382611944565b810181811067ffffffffffffffff82111715611c5257611c51611bfb565b5b80604052505050565b6000611c65611826565b9050611c718282611c2a565b919050565b600067ffffffffffffffff821115611c9157611c90611bfb565b5b611c9a82611944565b9050602081019050919050565b82818337600083830152505050565b6000611cc9611cc484611c76565b611c5b565b905082815260208101848484011115611ce557611ce4611bf6565b5b611cf0848285611ca7565b509392505050565b600082601f830112611d0d57611d0c611bf1565b5b8135611d1d848260208601611cb6565b91505092915050565b60008060008060808587031215611d4057611d3f611830565b5b6000611d4e87828801611a86565b9450506020611d5f87828801611a86565b9350506040611d70878288016119d1565b925050606085013567ffffffffffffffff811115611d9157611d90611835565b5b611d9d87828801611cf8565b91505092959194509250565b60008060408385031215611dc057611dbf611830565b5b6000611dce85828601611a86565b9250506020611ddf85828601611a86565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611e3057607f821691505b602082108103611e4357611e42611de9565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000611ea5602183611900565b9150611eb082611e49565b604082019050919050565b60006020820190508181036000830152611ed481611e98565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000611f37603d83611900565b9150611f4282611edb565b604082019050919050565b60006020820190508181036000830152611f6681611f2a565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000611fc9602d83611900565b9150611fd482611f6d565b604082019050919050565b60006020820190508181036000830152611ff881611fbc565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000612035601883611900565b915061204082611fff565b602082019050919050565b6000602082019050818103600083015261206481612028565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006120c7602983611900565b91506120d28261206b565b604082019050919050565b600060208201905081810360008301526120f6816120ba565b9050919050565b600081905092915050565b6000612113826118f5565b61211d81856120fd565b935061212d818560208601611911565b80840191505092915050565b60006121458285612108565b91506121518284612108565b91508190509392505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006121b9602583611900565b91506121c48261215d565b604082019050919050565b600060208201905081810360008301526121e8816121ac565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061224b602483611900565b9150612256826121ef565b604082019050919050565b6000602082019050818103600083015261227a8161223e565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006122b7601983611900565b91506122c282612281565b602082019050919050565b600060208201905081810360008301526122e6816122aa565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000612349603283611900565b9150612354826122ed565b604082019050919050565b600060208201905081810360008301526123788161233c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006123d5826123ae565b6123df81856123b9565b93506123ef818560208601611911565b6123f881611944565b840191505092915050565b60006080820190506124186000830187611a45565b6124256020830186611a45565b6124326040830185611b5b565b818103606083015261244481846123ca565b905095945050505050565b60008151905061245e81611866565b92915050565b60006020828403121561247a57612479611830565b5b60006124888482850161244f565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006124c7602083611900565b91506124d282612491565b602082019050919050565b600060208201905081810360008301526124f6816124ba565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000612533601c83611900565b915061253e826124fd565b602082019050919050565b6000602082019050818103600083015261256281612526565b905091905056fea2646970667358221220ee76646b464c7e57101be1a7b26bda08acb0116182bc35539a48e854e01a359b64736f6c634300080e00330000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000047a754f7a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055a68614271000000000000000000000000000000000000000000000000000000