60806040525f60065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f6008555f60095f6101000a81548160ff02191690831515021790555034801561006c575f80fd5b50336040518060400160405280600781526020017f2453616c757465000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f2453616c7574650000000000000000000000000000000000000000000000000081525081600390816100e99190610739565b5080600490816100f99190610739565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361016c575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016101639190610847565b60405180910390fd5b61017b8161019e60201b60201c565b50610199306c0c9f2c9cd04674edea4000000061026160201b60201c565b61091d565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036102d1575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016102c89190610847565b60405180910390fd5b6102e25f83836102e660201b60201c565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610336578060025f82825461032a919061088d565b92505081905550610404565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156103bf578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016103b6939291906108cf565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361044b578060025f8282540392505081905550610495565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516104f29190610904565b60405180910390a3505050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061057a57607f821691505b60208210810361058d5761058c610536565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026105ef7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826105b4565b6105f986836105b4565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61063d61063861063384610611565b61061a565b610611565b9050919050565b5f819050919050565b61065683610623565b61066a61066282610644565b8484546105c0565b825550505050565b5f90565b61067e610672565b61068981848461064d565b505050565b5b818110156106ac576106a15f82610676565b60018101905061068f565b5050565b601f8211156106f1576106c281610593565b6106cb846105a5565b810160208510156106da578190505b6106ee6106e6856105a5565b83018261068e565b50505b505050565b5f82821c905092915050565b5f6107115f19846008026106f6565b1980831691505092915050565b5f6107298383610702565b9150826002028217905092915050565b610742826104ff565b67ffffffffffffffff81111561075b5761075a610509565b5b6107658254610563565b6107708282856106b0565b5f60209050601f8311600181146107a1575f841561078f578287015190505b610799858261071e565b865550610800565b601f1984166107af86610593565b5f5b828110156107d6578489015182556001820191506020850194506020810190506107b1565b868310156107f357848901516107ef601f891682610702565b8355505b6001600288020188555050505b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61083182610808565b9050919050565b61084181610827565b82525050565b5f60208201905061085a5f830184610838565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61089782610611565b91506108a283610611565b92508282019050808211156108ba576108b9610860565b5b92915050565b6108c981610611565b82525050565b5f6060820190506108e25f830186610838565b6108ef60208301856108c0565b6108fc60408301846108c0565b949350505050565b5f6020820190506109175f8301846108c0565b92915050565b611cdb8061092a5f395ff3fe608060405234801561000f575f80fd5b506004361061018c575f3560e01c80638da5cb5b116100dc5780639e90f9aa11610095578063dd62ed3e1161006f578063dd62ed3e14610442578063ddf731f314610472578063ee3def0e1461048e578063f2fde38b146104ac5761018c565b80639e90f9aa146103d6578063a9059cbb146103f4578063ac724d6e146104245761018c565b80638da5cb5b1461031057806390118fb41461032e578063902d55a51461035e57806395d89b411461037c5780639ab4a4451461039a5780639b4dc8cc146103b85761018c565b8063341038b5116101495780636466739711610123578063646673971461029a57806370a08231146102b8578063715018a6146102e85780637f205a74146102f25761018c565b8063341038b514610254578063362e496b146102725780634581f2b71461027c5761018c565b806306fdde0314610190578063095ea7b3146101ae57806318160ddd146101de57806323b872dd146101fc578063313ce5671461022c5780633290ce291461024a575b5f80fd5b6101986104c8565b6040516101a5919061158b565b60405180910390f35b6101c860048036038101906101c3919061163c565b610558565b6040516101d59190611694565b60405180910390f35b6101e661057a565b6040516101f391906116bc565b60405180910390f35b610216600480360381019061021191906116d5565b610583565b6040516102239190611694565b60405180910390f35b610234610652565b6040516102419190611740565b60405180910390f35b61025261065a565b005b61025c6108de565b6040516102699190611694565b60405180910390f35b61027a6108f0565b005b610284610a5f565b60405161029191906116bc565b60405180910390f35b6102a2610a70565b6040516102af91906116bc565b60405180910390f35b6102d260048036038101906102cd9190611759565b610a76565b6040516102df91906116bc565b60405180910390f35b6102f0610abb565b005b6102fa610ace565b60405161030791906116bc565b60405180910390f35b610318610ad7565b6040516103259190611793565b60405180910390f35b61034860048036038101906103439190611759565b610aff565b6040516103559190611694565b60405180910390f35b610366610b1c565b60405161037391906116bc565b60405180910390f35b610384610b2d565b604051610391919061158b565b60405180910390f35b6103a2610bbd565b6040516103af9190611793565b60405180910390f35b6103c0610bd5565b6040516103cd9190611793565b60405180910390f35b6103de610bfa565b6040516103eb9190611793565b60405180910390f35b61040e6004803603810190610409919061163c565b610c1f565b60405161041b9190611694565b60405180910390f35b61042c610cc0565b60405161043991906116bc565b60405180910390f35b61045c600480360381019061045791906117ac565b610ccf565b60405161046991906116bc565b60405180910390f35b61048c60048036038101906104879190611759565b610d51565b005b610496610ded565b6040516104a391906116bc565b60405180910390f35b6104c660048036038101906104c19190611759565b610df3565b005b6060600380546104d790611817565b80601f016020809104026020016040519081016040528092919081815260200182805461050390611817565b801561054e5780601f106105255761010080835404028352916020019161054e565b820191905f5260205f20905b81548152906001019060200180831161053157829003601f168201915b5050505050905090565b5f80610562610e77565b905061056f818585610e7e565b600191505092915050565b5f600254905090565b5f60095f9054906101000a900460ff16806105d057506105a1610ad7565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b61060f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060690611891565b60405180910390fd5b61061a848484610e90565b61064784610626610e77565b8461063888610633610e77565b610ccf565b61064291906118dc565b610e7e565b600190509392505050565b5f6012905090565b6107d0600854106106a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069790611959565b60405180910390fd5b600a5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161561072a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610721906119c1565b60405180910390fd5b73dbc836c3cb158197e96228fc5b205f91b65e677973ffffffffffffffffffffffffffffffffffffffff166323b872dd3330640dbcac8e006040518463ffffffff1660e01b8152600401610780939291906119df565b6020604051808303815f875af115801561079c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107c09190611a3e565b6107ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f690611ab3565b60405180910390fd5b6001600a5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160085f8282546108669190611ad1565b9250508190555061088330336a14adf4b7320334b9000000610ef9565b3373ffffffffffffffffffffffffffffffffffffffff167f8f28852646c20cc973d3a8218f7eefed58c25c909f78f0265af4818c3d4dc2716a14adf4b7320334b90000006040516108d491906116bc565b60405180910390a2565b60095f9054906101000a900460ff1681565b6108f8610fe9565b5f73dbc836c3cb158197e96228fc5b205f91b65e677973ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016109469190611793565b602060405180830381865afa158015610961573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109859190611b18565b905073dbc836c3cb158197e96228fc5b205f91b65e677973ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6109bf610ad7565b836040518363ffffffff1660e01b81526004016109dd929190611b43565b6020604051808303815f875af11580156109f9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a1d9190611a3e565b610a5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5390611bb4565b60405180910390fd5b50565b6c064f964e68233a76f52000000081565b6107d081565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610ac3610fe9565b610acc5f611070565b565b640dbcac8e0081565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600a602052805f5260405f205f915054906101000a900460ff1681565b6c0c9f2c9cd04674edea4000000081565b606060048054610b3c90611817565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6890611817565b8015610bb35780601f10610b8a57610100808354040283529160200191610bb3565b820191905f5260205f20905b815481529060010190602001808311610b9657829003601f168201915b5050505050905090565b73dbc836c3cb158197e96228fc5b205f91b65e677981565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60095f9054906101000a900460ff1680610c6c5750610c3d610ad7565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610cab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca290611891565b60405180910390fd5b610cb6338484610e90565b6001905092915050565b6a14adf4b7320334b900000081565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b610d59610fe9565b8060075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160095f6101000a81548160ff0219169083151502179055507fc852021e30b95510f55086d8cc9bc5d15d20f2cb411766a7da04804f4ad2fba281604051610de29190611793565b60405180910390a150565b60085481565b610dfb610fe9565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e6b575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610e629190611793565b60405180910390fd5b610e7481611070565b50565b5f33905090565b610e8b8383836001611133565b505050565b5f6064600283610ea09190611bd2565b610eaa9190611c40565b90505f8183610eb991906118dc565b9050610ec6858583610ef9565b610ef28560065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684610ef9565b5050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f69575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610f609190611793565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610fd9575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610fd09190611793565b60405180910390fd5b610fe4838383611302565b505050565b610ff1610e77565b73ffffffffffffffffffffffffffffffffffffffff1661100f610ad7565b73ffffffffffffffffffffffffffffffffffffffff161461106e57611032610e77565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016110659190611793565b60405180910390fd5b565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036111a3575f6040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161119a9190611793565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611213575f6040517f94280d6200000000000000000000000000000000000000000000000000000000815260040161120a9190611793565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555080156112fc578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516112f391906116bc565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611352578060025f8282546113469190611ad1565b92505081905550611420565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156113db578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016113d293929190611c70565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611467578060025f82825403925050819055506114b1565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161150e91906116bc565b60405180910390a3505050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61155d8261151b565b6115678185611525565b9350611577818560208601611535565b61158081611543565b840191505092915050565b5f6020820190508181035f8301526115a38184611553565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6115d8826115af565b9050919050565b6115e8816115ce565b81146115f2575f80fd5b50565b5f81359050611603816115df565b92915050565b5f819050919050565b61161b81611609565b8114611625575f80fd5b50565b5f8135905061163681611612565b92915050565b5f8060408385031215611652576116516115ab565b5b5f61165f858286016115f5565b925050602061167085828601611628565b9150509250929050565b5f8115159050919050565b61168e8161167a565b82525050565b5f6020820190506116a75f830184611685565b92915050565b6116b681611609565b82525050565b5f6020820190506116cf5f8301846116ad565b92915050565b5f805f606084860312156116ec576116eb6115ab565b5b5f6116f9868287016115f5565b935050602061170a868287016115f5565b925050604061171b86828701611628565b9150509250925092565b5f60ff82169050919050565b61173a81611725565b82525050565b5f6020820190506117535f830184611731565b92915050565b5f6020828403121561176e5761176d6115ab565b5b5f61177b848285016115f5565b91505092915050565b61178d816115ce565b82525050565b5f6020820190506117a65f830184611784565b92915050565b5f80604083850312156117c2576117c16115ab565b5b5f6117cf858286016115f5565b92505060206117e0858286016115f5565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061182e57607f821691505b602082108103611841576118406117ea565b5b50919050565b7f4c50206e6f7420616464656420796574000000000000000000000000000000005f82015250565b5f61187b601083611525565b915061188682611847565b602082019050919050565b5f6020820190508181035f8301526118a88161186f565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6118e682611609565b91506118f183611609565b9250828203905081811115611909576119086118af565b5b92915050565b7f416c6c20746f6b656e7320666f722073616c652061726520736f6c64206f75745f82015250565b5f611943602083611525565b915061194e8261190f565b602082019050919050565b5f6020820190508181035f83015261197081611937565b9050919050565b7f416464726573732068617320616c7265616479207075726368617365640000005f82015250565b5f6119ab601d83611525565b91506119b682611977565b602082019050919050565b5f6020820190508181035f8301526119d88161199f565b9050919050565b5f6060820190506119f25f830186611784565b6119ff6020830185611784565b611a0c60408301846116ad565b949350505050565b611a1d8161167a565b8114611a27575f80fd5b50565b5f81519050611a3881611a14565b92915050565b5f60208284031215611a5357611a526115ab565b5b5f611a6084828501611a2a565b91505092915050565b7f496e73756666696369656e7420555344540000000000000000000000000000005f82015250565b5f611a9d601183611525565b9150611aa882611a69565b602082019050919050565b5f6020820190508181035f830152611aca81611a91565b9050919050565b5f611adb82611609565b9150611ae683611609565b9250828201905080821115611afe57611afd6118af565b5b92915050565b5f81519050611b1281611612565b92915050565b5f60208284031215611b2d57611b2c6115ab565b5b5f611b3a84828501611b04565b91505092915050565b5f604082019050611b565f830185611784565b611b6360208301846116ad565b9392505050565b7f55534454207769746864726177616c206661696c6564000000000000000000005f82015250565b5f611b9e601683611525565b9150611ba982611b6a565b602082019050919050565b5f6020820190508181035f830152611bcb81611b92565b9050919050565b5f611bdc82611609565b9150611be783611609565b9250828202611bf581611609565b91508282048414831517611c0c57611c0b6118af565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f611c4a82611609565b9150611c5583611609565b925082611c6557611c64611c13565b5b828204905092915050565b5f606082019050611c835f830186611784565b611c9060208301856116ad565b611c9d60408301846116ad565b94935050505056fea2646970667358221220e5ed71ecbe897aedd83824f4e4f02d0e58b4cf2694b8774c4b04658a2c1f7fee64736f6c63430008190033