610160604052348015610010575f80fd5b506040518060400160405280600781526020017f4e6f74636f696e00000000000000000000000000000000000000000000000000815250806040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f4e6f74636f696e000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f4e4f54000000000000000000000000000000000000000000000000000000000081525081600390816100f991906107ea565b50806004908161010991906107ea565b5050506101206005836101f560201b90919060201c565b610120818152505061013c6006826101f560201b90919060201c565b6101408181525050818051906020012060e08181525050808051906020012061010081815250504660a0818152505061017961024260201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250505050506101f0336101c961029c60201b60201c565b600a6101d59190610a21565b6417ea8aefd26101e59190610a6b565b6102a460201b60201c565b610d16565b5f6020835110156102165761020f8361032960201b60201c565b905061023c565b826102268361038e60201b60201c565b5f01908161023491906107ea565b5060ff5f1b90505b92915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60e051610100514630604051602001610281959493929190610b12565b60405160208183030381529060405280519060200120905090565b5f6012905090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610314575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161030b9190610b63565b60405180910390fd5b6103255f838361039760201b60201c565b5050565b5f80829050601f8151111561037557826040517f305a27a900000000000000000000000000000000000000000000000000000000815260040161036c9190610be2565b60405180910390fd5b80518161038190610c2f565b5f1c175f1b915050919050565b5f819050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036103e7578060025f8282546103db9190610c95565b925050819055506104b5565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015610470578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161046793929190610cc8565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036104fc578060025f8282540392505081905550610546565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516105a39190610cfd565b60405180910390a3505050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061062b57607f821691505b60208210810361063e5761063d6105e7565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026106a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610665565b6106aa8683610665565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6106ee6106e96106e4846106c2565b6106cb565b6106c2565b9050919050565b5f819050919050565b610707836106d4565b61071b610713826106f5565b848454610671565b825550505050565b5f90565b61072f610723565b61073a8184846106fe565b505050565b5b8181101561075d576107525f82610727565b600181019050610740565b5050565b601f8211156107a25761077381610644565b61077c84610656565b8101602085101561078b578190505b61079f61079785610656565b83018261073f565b50505b505050565b5f82821c905092915050565b5f6107c25f19846008026107a7565b1980831691505092915050565b5f6107da83836107b3565b9150826002028217905092915050565b6107f3826105b0565b67ffffffffffffffff81111561080c5761080b6105ba565b5b6108168254610614565b610821828285610761565b5f60209050601f831160018114610852575f8415610840578287015190505b61084a85826107cf565b8655506108b1565b601f19841661086086610644565b5f5b8281101561088757848901518255600182019150602085019450602081019050610862565b868310156108a457848901516108a0601f8916826107b3565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b600185111561093b57808604811115610917576109166108b9565b5b60018516156109265780820291505b8081029050610934856108e6565b94506108fb565b94509492505050565b5f826109535760019050610a0e565b81610960575f9050610a0e565b81600181146109765760028114610980576109af565b6001915050610a0e565b60ff841115610992576109916108b9565b5b8360020a9150848211156109a9576109a86108b9565b5b50610a0e565b5060208310610133831016604e8410600b84101617156109e45782820a9050838111156109df576109de6108b9565b5b610a0e565b6109f184848460016108f2565b92509050818404811115610a0857610a076108b9565b5b81810290505b9392505050565b5f60ff82169050919050565b5f610a2b826106c2565b9150610a3683610a15565b9250610a637fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484610944565b905092915050565b5f610a75826106c2565b9150610a80836106c2565b9250828202610a8e816106c2565b91508282048414831517610aa557610aa46108b9565b5b5092915050565b5f819050919050565b610abe81610aac565b82525050565b610acd816106c2565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610afc82610ad3565b9050919050565b610b0c81610af2565b82525050565b5f60a082019050610b255f830188610ab5565b610b326020830187610ab5565b610b3f6040830186610ab5565b610b4c6060830185610ac4565b610b596080830184610b03565b9695505050505050565b5f602082019050610b765f830184610b03565b92915050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f610bb4826105b0565b610bbe8185610b7c565b9350610bce818560208601610b8c565b610bd781610b9a565b840191505092915050565b5f6020820190508181035f830152610bfa8184610baa565b905092915050565b5f81519050919050565b5f819050602082019050919050565b5f610c268251610aac565b80915050919050565b5f610c3982610c02565b82610c4384610c0c565b9050610c4e81610c1b565b92506020821015610c8e57610c897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802610665565b831692505b5050919050565b5f610c9f826106c2565b9150610caa836106c2565b9250828201905080821115610cc257610cc16108b9565b5b92915050565b5f606082019050610cdb5f830186610b03565b610ce86020830185610ac4565b610cf56040830184610ac4565b949350505050565b5f602082019050610d105f830184610ac4565b92915050565b60805160a05160c05160e051610100516101205161014051611b54610d675f395f610a1501525f6109da01525f610f0e01525f610eed01525f6108d801525f61092e01525f6109570152611b545ff3fe608060405234801561000f575f80fd5b50600436106100cd575f3560e01c806370a082311161008a57806395d89b411161006457806395d89b411461022d578063a9059cbb1461024b578063d505accf1461027b578063dd62ed3e14610297576100cd565b806370a08231146101a95780637ecebe00146101d957806384b0196e14610209576100cd565b806306fdde03146100d1578063095ea7b3146100ef57806318160ddd1461011f57806323b872dd1461013d578063313ce5671461016d5780633644e5151461018b575b5f80fd5b6100d96102c7565b6040516100e691906113c4565b60405180910390f35b61010960048036038101906101049190611475565b610357565b60405161011691906114cd565b60405180910390f35b610127610379565b60405161013491906114f5565b60405180910390f35b6101576004803603810190610152919061150e565b610382565b60405161016491906114cd565b60405180910390f35b6101756103b0565b6040516101829190611579565b60405180910390f35b6101936103b8565b6040516101a091906115aa565b60405180910390f35b6101c360048036038101906101be91906115c3565b6103c6565b6040516101d091906114f5565b60405180910390f35b6101f360048036038101906101ee91906115c3565b61040b565b60405161020091906114f5565b60405180910390f35b61021161041c565b60405161022497969594939291906116ee565b60405180910390f35b6102356104c1565b60405161024291906113c4565b60405180910390f35b61026560048036038101906102609190611475565b610551565b60405161027291906114cd565b60405180910390f35b610295600480360381019061029091906117c4565b610573565b005b6102b160048036038101906102ac9190611861565b6106b8565b6040516102be91906114f5565b60405180910390f35b6060600380546102d6906118cc565b80601f0160208091040260200160405190810160405280929190818152602001828054610302906118cc565b801561034d5780601f106103245761010080835404028352916020019161034d565b820191905f5260205f20905b81548152906001019060200180831161033057829003601f168201915b5050505050905090565b5f8061036161073a565b905061036e818585610741565b600191505092915050565b5f600254905090565b5f8061038c61073a565b9050610399858285610753565b6103a48585856107e5565b60019150509392505050565b5f6012905090565b5f6103c16108d5565b905090565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f6104158261098b565b9050919050565b5f6060805f805f606061042d6109d1565b610435610a0c565b46305f801b5f67ffffffffffffffff811115610454576104536118fc565b5b6040519080825280602002602001820160405280156104825781602001602082028036833780820191505090505b507f0f00000000000000000000000000000000000000000000000000000000000000959493929190965096509650965096509650965090919293949596565b6060600480546104d0906118cc565b80601f01602080910402602001604051908101604052809291908181526020018280546104fc906118cc565b80156105475780601f1061051e57610100808354040283529160200191610547565b820191905f5260205f20905b81548152906001019060200180831161052a57829003601f168201915b5050505050905090565b5f8061055b61073a565b90506105688185856107e5565b600191505092915050565b834211156105b857836040517f627913020000000000000000000000000000000000000000000000000000000081526004016105af91906114f5565b60405180910390fd5b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886105e68c610a47565b896040516020016105fc96959493929190611929565b6040516020818303038152906040528051906020012090505f61061e82610a9a565b90505f61062d82878787610ab3565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146106a157808a6040517f4b800e46000000000000000000000000000000000000000000000000000000008152600401610698929190611988565b60405180910390fd5b6106ac8a8a8a610741565b50505050505050505050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b5f33905090565b61074e8383836001610ae1565b505050565b5f61075e84846106b8565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146107df57818110156107d0578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016107c7939291906119af565b60405180910390fd5b6107de84848484035f610ae1565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610855575f6040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260040161084c91906119e4565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108c5575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016108bc91906119e4565b60405180910390fd5b6108d0838383610cb0565b505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561095057507f000000000000000000000000000000000000000000000000000000000000000046145b1561097d577f00000000000000000000000000000000000000000000000000000000000000009050610988565b610985610ec9565b90505b90565b5f60075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6060610a0760057f0000000000000000000000000000000000000000000000000000000000000000610f5e90919063ffffffff16565b905090565b6060610a4260067f0000000000000000000000000000000000000000000000000000000000000000610f5e90919063ffffffff16565b905090565b5f60075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050559050919050565b5f610aac610aa66108d5565b8361100b565b9050919050565b5f805f80610ac38888888861104b565b925092509250610ad38282611132565b829350505050949350505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610b51575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401610b4891906119e4565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610bc1575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610bb891906119e4565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015610caa578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610ca191906114f5565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610d00578060025f828254610cf49190611a2a565b92505081905550610dce565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015610d89578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401610d80939291906119af565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e15578060025f8282540392505081905550610e5f565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610ebc91906114f5565b60405180910390a3505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000004630604051602001610f43959493929190611a5d565b60405160208183030381529060405280519060200120905090565b606060ff5f1b8314610f7a57610f7383611294565b9050611005565b818054610f86906118cc565b80601f0160208091040260200160405190810160405280929190818152602001828054610fb2906118cc565b8015610ffd5780601f10610fd457610100808354040283529160200191610ffd565b820191905f5260205f20905b815481529060010190602001808311610fe057829003601f168201915b505050505090505b92915050565b5f6040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b5f805f7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0845f1c1115611087575f600385925092509250611128565b5f6001888888886040515f81526020016040526040516110aa9493929190611aae565b6020604051602081039080840390855afa1580156110ca573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361111b575f60015f801b93509350935050611128565b805f805f1b935093509350505b9450945094915050565b5f600381111561114557611144611af1565b5b82600381111561115857611157611af1565b5b0315611290576001600381111561117257611171611af1565b5b82600381111561118557611184611af1565b5b036111bc576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600260038111156111d0576111cf611af1565b5b8260038111156111e3576111e2611af1565b5b0361122757805f1c6040517ffce698f700000000000000000000000000000000000000000000000000000000815260040161121e91906114f5565b60405180910390fd5b60038081111561123a57611239611af1565b5b82600381111561124d5761124c611af1565b5b0361128f57806040517fd78bce0c00000000000000000000000000000000000000000000000000000000815260040161128691906115aa565b60405180910390fd5b5b5050565b60605f6112a083611306565b90505f602067ffffffffffffffff8111156112be576112bd6118fc565b5b6040519080825280601f01601f1916602001820160405280156112f05781602001600182028036833780820191505090505b5090508181528360208201528092505050919050565b5f8060ff835f1c169050601f81111561134b576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80915050919050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61139682611354565b6113a0818561135e565b93506113b081856020860161136e565b6113b98161137c565b840191505092915050565b5f6020820190508181035f8301526113dc818461138c565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611411826113e8565b9050919050565b61142181611407565b811461142b575f80fd5b50565b5f8135905061143c81611418565b92915050565b5f819050919050565b61145481611442565b811461145e575f80fd5b50565b5f8135905061146f8161144b565b92915050565b5f806040838503121561148b5761148a6113e4565b5b5f6114988582860161142e565b92505060206114a985828601611461565b9150509250929050565b5f8115159050919050565b6114c7816114b3565b82525050565b5f6020820190506114e05f8301846114be565b92915050565b6114ef81611442565b82525050565b5f6020820190506115085f8301846114e6565b92915050565b5f805f60608486031215611525576115246113e4565b5b5f6115328682870161142e565b93505060206115438682870161142e565b925050604061155486828701611461565b9150509250925092565b5f60ff82169050919050565b6115738161155e565b82525050565b5f60208201905061158c5f83018461156a565b92915050565b5f819050919050565b6115a481611592565b82525050565b5f6020820190506115bd5f83018461159b565b92915050565b5f602082840312156115d8576115d76113e4565b5b5f6115e58482850161142e565b91505092915050565b5f7fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b611622816115ee565b82525050565b61163181611407565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61166981611442565b82525050565b5f61167a8383611660565b60208301905092915050565b5f602082019050919050565b5f61169c82611637565b6116a68185611641565b93506116b183611651565b805f5b838110156116e15781516116c8888261166f565b97506116d383611686565b9250506001810190506116b4565b5085935050505092915050565b5f60e0820190506117015f83018a611619565b8181036020830152611713818961138c565b90508181036040830152611727818861138c565b905061173660608301876114e6565b6117436080830186611628565b61175060a083018561159b565b81810360c08301526117628184611692565b905098975050505050505050565b6117798161155e565b8114611783575f80fd5b50565b5f8135905061179481611770565b92915050565b6117a381611592565b81146117ad575f80fd5b50565b5f813590506117be8161179a565b92915050565b5f805f805f805f60e0888a0312156117df576117de6113e4565b5b5f6117ec8a828b0161142e565b97505060206117fd8a828b0161142e565b965050604061180e8a828b01611461565b955050606061181f8a828b01611461565b94505060806118308a828b01611786565b93505060a06118418a828b016117b0565b92505060c06118528a828b016117b0565b91505092959891949750929550565b5f8060408385031215611877576118766113e4565b5b5f6118848582860161142e565b92505060206118958582860161142e565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806118e357607f821691505b6020821081036118f6576118f561189f565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60c08201905061193c5f83018961159b565b6119496020830188611628565b6119566040830187611628565b61196360608301866114e6565b61197060808301856114e6565b61197d60a08301846114e6565b979650505050505050565b5f60408201905061199b5f830185611628565b6119a86020830184611628565b9392505050565b5f6060820190506119c25f830186611628565b6119cf60208301856114e6565b6119dc60408301846114e6565b949350505050565b5f6020820190506119f75f830184611628565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611a3482611442565b9150611a3f83611442565b9250828201905080821115611a5757611a566119fd565b5b92915050565b5f60a082019050611a705f83018861159b565b611a7d602083018761159b565b611a8a604083018661159b565b611a9760608301856114e6565b611aa46080830184611628565b9695505050505050565b5f608082019050611ac15f83018761159b565b611ace602083018661156a565b611adb604083018561159b565b611ae8606083018461159b565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffdfea2646970667358221220fa4edb6e22304fa9baf1f2f9fa8246f3b14df9b39669e32b76454c1a43587fb264736f6c63430008190033