60806040523480156200001157600080fd5b506040518060400160405280600681526020017f4e465461736b00000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4e46544b0000000000000000000000000000000000000000000000000000000081525081600090816200008f919062000324565b508060019081620000a1919062000324565b5050506200040b565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200012c57607f821691505b602082108103620001425762000141620000e4565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620001ac7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200016d565b620001b886836200016d565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000205620001ff620001f984620001d0565b620001da565b620001d0565b9050919050565b6000819050919050565b6200022183620001e4565b6200023962000230826200020c565b8484546200017a565b825550505050565b600090565b6200025062000241565b6200025d81848462000216565b505050565b5b8181101562000285576200027960008262000246565b60018101905062000263565b5050565b601f821115620002d4576200029e8162000148565b620002a9846200015d565b81016020851015620002b9578190505b620002d1620002c8856200015d565b83018262000262565b50505b505050565b600082821c905092915050565b6000620002f960001984600802620002d9565b1980831691505092915050565b6000620003148383620002e6565b9150826002028217905092915050565b6200032f82620000aa565b67ffffffffffffffff8111156200034b576200034a620000b5565b5b62000357825462000113565b6200036482828562000289565b600060209050601f8311600181146200039c576000841562000387578287015190505b62000393858262000306565b86555062000403565b601f198416620003ac8662000148565b60005b82811015620003d657848901518255600182019150602085019450602081019050620003af565b86831015620003f65784890151620003f2601f891682620002e6565b8355505b6001600288020188555050505b505050505050565b612400806200041b6000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c806370a082311161008c578063b88d4fde11610066578063b88d4fde1461025b578063c87b56dd14610277578063d204c45e146102a7578063e985e9c5146102c3576100ea565b806370a08231146101f157806395d89b4114610221578063a22cb4651461023f576100ea565b8063095ea7b3116100c8578063095ea7b31461016d57806323b872dd1461018957806342842e0e146101a55780636352211e146101c1576100ea565b806301ffc9a7146100ef57806306fdde031461011f578063081812fc1461013d575b600080fd5b61010960048036038101906101049190611858565b6102f3565b60405161011691906118a0565b60405180910390f35b610127610305565b604051610134919061194b565b60405180910390f35b610157600480360381019061015291906119a3565b610397565b6040516101649190611a11565b60405180910390f35b61018760048036038101906101829190611a58565b6103b3565b005b6101a3600480360381019061019e9190611a98565b6103c9565b005b6101bf60048036038101906101ba9190611a98565b6104cb565b005b6101db60048036038101906101d691906119a3565b6104eb565b6040516101e89190611a11565b60405180910390f35b61020b60048036038101906102069190611aeb565b6104fd565b6040516102189190611b27565b60405180910390f35b6102296105b7565b604051610236919061194b565b60405180910390f35b61025960048036038101906102549190611b6e565b610649565b005b61027560048036038101906102709190611ce3565b61065f565b005b610291600480360381019061028c91906119a3565b61067c565b60405161029e919061194b565b60405180910390f35b6102c160048036038101906102bc9190611e07565b61068e565b005b6102dd60048036038101906102d89190611e63565b6106c2565b6040516102ea91906118a0565b60405180910390f35b60006102fe82610756565b9050919050565b60606000805461031490611ed2565b80601f016020809104026020016040519081016040528092919081815260200182805461034090611ed2565b801561038d5780601f106103625761010080835404028352916020019161038d565b820191906000526020600020905b81548152906001019060200180831161037057829003601f168201915b5050505050905090565b60006103a2826107b7565b506103ac8261083f565b9050919050565b6103c582826103c061087c565b610884565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361043b5760006040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016104329190611a11565b60405180910390fd5b600061044f838361044a61087c565b610896565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146104c5578382826040517f64283d7b0000000000000000000000000000000000000000000000000000000081526004016104bc93929190611f03565b60405180910390fd5b50505050565b6104e68383836040518060200160405280600081525061065f565b505050565b60006104f6826107b7565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036105705760006040517f89c62b640000000000000000000000000000000000000000000000000000000081526004016105679190611a11565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600180546105c690611ed2565b80601f01602080910402602001604051908101604052809291908181526020018280546105f290611ed2565b801561063f5780601f106106145761010080835404028352916020019161063f565b820191906000526020600020905b81548152906001019060200180831161062257829003601f168201915b5050505050905090565b61065b61065461087c565b8383610ab0565b5050565b61066a8484846103c9565b61067684848484610c1f565b50505050565b606061068782610dd6565b9050919050565b6000600760008154809291906106a390611f69565b9190505590506106b38382610ee9565b6106bd8183610f07565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000634906490660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107b057506107af82610f63565b5b9050919050565b6000806107c383611045565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361083657826040517f7e27328900000000000000000000000000000000000000000000000000000000815260040161082d9190611b27565b60405180910390fd5b80915050919050565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600033905090565b6108918383836001611082565b505050565b6000806108a284611045565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146108e4576108e3818486611247565b5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461097557610926600085600080611082565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146109f8576001600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b846002600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4809150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b2157816040517f5b08ba18000000000000000000000000000000000000000000000000000000008152600401610b189190611a11565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610c1291906118a0565b60405180910390a3505050565b60008373ffffffffffffffffffffffffffffffffffffffff163b1115610dd0578273ffffffffffffffffffffffffffffffffffffffff1663150b7a02610c6361087c565b8685856040518563ffffffff1660e01b8152600401610c859493929190612006565b6020604051808303816000875af1925050508015610cc157506040513d601f19601f82011682018060405250810190610cbe9190612067565b60015b610d45573d8060008114610cf1576040519150601f19603f3d011682016040523d82523d6000602084013e610cf6565b606091505b506000815103610d3d57836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401610d349190611a11565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610dce57836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401610dc59190611a11565b60405180910390fd5b505b50505050565b6060610de1826107b7565b506000600660008481526020019081526020016000208054610e0290611ed2565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2e90611ed2565b8015610e7b5780601f10610e5057610100808354040283529160200191610e7b565b820191906000526020600020905b815481529060010190602001808311610e5e57829003601f168201915b505050505090506000610e8c61130b565b90506000815103610ea1578192505050610ee4565b600082511115610ed6578082604051602001610ebe9291906120d0565b60405160208183030381529060405292505050610ee4565b610edf84611322565b925050505b919050565b610f0382826040518060200160405280600081525061138b565b5050565b80600660008481526020019081526020016000209081610f2791906122a0565b507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce782604051610f579190611b27565b60405180910390a15050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061102e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061103e575061103d826113a7565b5b9050919050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b80806110bb5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156111ef5760006110cb846107b7565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561113657508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b8015611149575061114781846106c2565b155b1561118b57826040517fa9fbf51f0000000000000000000000000000000000000000000000000000000081526004016111829190611a11565b60405180910390fd5b81156111ed57838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b836004600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b611252838383611411565b61130657600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036112c757806040517f7e2732890000000000000000000000000000000000000000000000000000000081526004016112be9190611b27565b60405180910390fd5b81816040517f177e802f0000000000000000000000000000000000000000000000000000000081526004016112fd929190612372565b60405180910390fd5b505050565b606060405180602001604052806000815250905090565b606061132d826107b7565b50600061133861130b565b905060008151116113585760405180602001604052806000815250611383565b80611362846114d2565b6040516020016113739291906120d0565b6040516020818303038152906040525b915050919050565b61139583836115a0565b6113a26000848484610c1f565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156114c957508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061148a575061148984846106c2565b5b806114c857508273ffffffffffffffffffffffffffffffffffffffff166114b08361083f565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b6060600060016114e184611699565b01905060008167ffffffffffffffff811115611500576114ff611bb8565b5b6040519080825280601f01601f1916602001820160405280156115325781602001600182028036833780820191505090505b509050600082602001820190505b600115611595578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816115895761158861239b565b5b04945060008503611540575b819350505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116125760006040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016116099190611a11565b60405180910390fd5b600061162083836000610896565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146116945760006040517f73c6ac6e00000000000000000000000000000000000000000000000000000000815260040161168b9190611a11565b60405180910390fd5b505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106116f7577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816116ed576116ec61239b565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611734576d04ee2d6d415b85acef8100000000838161172a5761172961239b565b5b0492506020810190505b662386f26fc10000831061176357662386f26fc1000083816117595761175861239b565b5b0492506010810190505b6305f5e100831061178c576305f5e10083816117825761178161239b565b5b0492506008810190505b61271083106117b15761271083816117a7576117a661239b565b5b0492506004810190505b606483106117d457606483816117ca576117c961239b565b5b0492506002810190505b600a83106117e3576001810190505b80915050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61183581611800565b811461184057600080fd5b50565b6000813590506118528161182c565b92915050565b60006020828403121561186e5761186d6117f6565b5b600061187c84828501611843565b91505092915050565b60008115159050919050565b61189a81611885565b82525050565b60006020820190506118b56000830184611891565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156118f55780820151818401526020810190506118da565b60008484015250505050565b6000601f19601f8301169050919050565b600061191d826118bb565b61192781856118c6565b93506119378185602086016118d7565b61194081611901565b840191505092915050565b600060208201905081810360008301526119658184611912565b905092915050565b6000819050919050565b6119808161196d565b811461198b57600080fd5b50565b60008135905061199d81611977565b92915050565b6000602082840312156119b9576119b86117f6565b5b60006119c78482850161198e565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006119fb826119d0565b9050919050565b611a0b816119f0565b82525050565b6000602082019050611a266000830184611a02565b92915050565b611a35816119f0565b8114611a4057600080fd5b50565b600081359050611a5281611a2c565b92915050565b60008060408385031215611a6f57611a6e6117f6565b5b6000611a7d85828601611a43565b9250506020611a8e8582860161198e565b9150509250929050565b600080600060608486031215611ab157611ab06117f6565b5b6000611abf86828701611a43565b9350506020611ad086828701611a43565b9250506040611ae18682870161198e565b9150509250925092565b600060208284031215611b0157611b006117f6565b5b6000611b0f84828501611a43565b91505092915050565b611b218161196d565b82525050565b6000602082019050611b3c6000830184611b18565b92915050565b611b4b81611885565b8114611b5657600080fd5b50565b600081359050611b6881611b42565b92915050565b60008060408385031215611b8557611b846117f6565b5b6000611b9385828601611a43565b9250506020611ba485828601611b59565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611bf082611901565b810181811067ffffffffffffffff82111715611c0f57611c0e611bb8565b5b80604052505050565b6000611c226117ec565b9050611c2e8282611be7565b919050565b600067ffffffffffffffff821115611c4e57611c4d611bb8565b5b611c5782611901565b9050602081019050919050565b82818337600083830152505050565b6000611c86611c8184611c33565b611c18565b905082815260208101848484011115611ca257611ca1611bb3565b5b611cad848285611c64565b509392505050565b600082601f830112611cca57611cc9611bae565b5b8135611cda848260208601611c73565b91505092915050565b60008060008060808587031215611cfd57611cfc6117f6565b5b6000611d0b87828801611a43565b9450506020611d1c87828801611a43565b9350506040611d2d8782880161198e565b925050606085013567ffffffffffffffff811115611d4e57611d4d6117fb565b5b611d5a87828801611cb5565b91505092959194509250565b600067ffffffffffffffff821115611d8157611d80611bb8565b5b611d8a82611901565b9050602081019050919050565b6000611daa611da584611d66565b611c18565b905082815260208101848484011115611dc657611dc5611bb3565b5b611dd1848285611c64565b509392505050565b600082601f830112611dee57611ded611bae565b5b8135611dfe848260208601611d97565b91505092915050565b60008060408385031215611e1e57611e1d6117f6565b5b6000611e2c85828601611a43565b925050602083013567ffffffffffffffff811115611e4d57611e4c6117fb565b5b611e5985828601611dd9565b9150509250929050565b60008060408385031215611e7a57611e796117f6565b5b6000611e8885828601611a43565b9250506020611e9985828601611a43565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611eea57607f821691505b602082108103611efd57611efc611ea3565b5b50919050565b6000606082019050611f186000830186611a02565b611f256020830185611b18565b611f326040830184611a02565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611f748261196d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611fa657611fa5611f3a565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b6000611fd882611fb1565b611fe28185611fbc565b9350611ff28185602086016118d7565b611ffb81611901565b840191505092915050565b600060808201905061201b6000830187611a02565b6120286020830186611a02565b6120356040830185611b18565b81810360608301526120478184611fcd565b905095945050505050565b6000815190506120618161182c565b92915050565b60006020828403121561207d5761207c6117f6565b5b600061208b84828501612052565b91505092915050565b600081905092915050565b60006120aa826118bb565b6120b48185612094565b93506120c48185602086016118d7565b80840191505092915050565b60006120dc828561209f565b91506120e8828461209f565b91508190509392505050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026121567fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612119565b6121608683612119565b95508019841693508086168417925050509392505050565b6000819050919050565b600061219d6121986121938461196d565b612178565b61196d565b9050919050565b6000819050919050565b6121b783612182565b6121cb6121c3826121a4565b848454612126565b825550505050565b600090565b6121e06121d3565b6121eb8184846121ae565b505050565b5b8181101561220f576122046000826121d8565b6001810190506121f1565b5050565b601f82111561225457612225816120f4565b61222e84612109565b8101602085101561223d578190505b61225161224985612109565b8301826121f0565b50505b505050565b600082821c905092915050565b600061227760001984600802612259565b1980831691505092915050565b60006122908383612266565b9150826002028217905092915050565b6122a9826118bb565b67ffffffffffffffff8111156122c2576122c1611bb8565b5b6122cc8254611ed2565b6122d7828285612213565b600060209050601f83116001811461230a57600084156122f8578287015190505b6123028582612284565b86555061236a565b601f198416612318866120f4565b60005b828110156123405784890151825560018201915060208501945060208101905061231b565b8683101561235d5784890151612359601f891682612266565b8355505b6001600288020188555050505b505050505050565b60006040820190506123876000830185611a02565b6123946020830184611b18565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fdfea2646970667358221220d36757a2f934538b885f5024cd81aad214eed0e1d2e9a5310a5c8e01f545ed7d64736f6c63430008180033