60806040525f600b5f6101000a81548160ff021916908315150217905550348015610028575f80fd5b50604051612893380380612893833981810160405281019061004a9190610742565b338a8a816003908161005c9190610a57565b50806004908161006c9190610a57565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036100df575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016100d69190610b35565b60405180910390fd5b6100ee8161020760201b60201c565b508760068190555085600781905550846008819055508360098190555082600a8190555081600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600c5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506101f833886102ca60201b60201c565b50505050505050505050610c0b565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361033a575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016103319190610b35565b60405180910390fd5b61034b5f838361034f60201b60201c565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361039f578060025f8282546103939190610b7b565b9250508190555061046d565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015610428578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161041f93929190610bbd565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036104b4578060025f82825403925050819055506104fe565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161055b9190610bf2565b60405180910390a3505050565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6105c782610581565b810181811067ffffffffffffffff821117156105e6576105e5610591565b5b80604052505050565b5f6105f8610568565b905061060482826105be565b919050565b5f67ffffffffffffffff82111561062357610622610591565b5b61062c82610581565b9050602081019050919050565b8281835e5f83830152505050565b5f61065961065484610609565b6105ef565b9050828152602081018484840111156106755761067461057d565b5b610680848285610639565b509392505050565b5f82601f83011261069c5761069b610579565b5b81516106ac848260208601610647565b91505092915050565b5f819050919050565b6106c7816106b5565b81146106d1575f80fd5b50565b5f815190506106e2816106be565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610711826106e8565b9050919050565b61072181610707565b811461072b575f80fd5b50565b5f8151905061073c81610718565b92915050565b5f805f805f805f805f806101408b8d03121561076157610760610571565b5b5f8b015167ffffffffffffffff81111561077e5761077d610575565b5b61078a8d828e01610688565b9a505060208b015167ffffffffffffffff8111156107ab576107aa610575565b5b6107b78d828e01610688565b99505060406107c88d828e016106d4565b98505060606107d98d828e016106d4565b97505060806107ea8d828e016106d4565b96505060a06107fb8d828e016106d4565b95505060c061080c8d828e016106d4565b94505060e061081d8d828e016106d4565b93505061010061082f8d828e0161072e565b9250506101206108418d828e0161072e565b9150509295989b9194979a5092959850565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806108a157607f821691505b6020821081036108b4576108b361085d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026109167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826108db565b61092086836108db565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61095b610956610951846106b5565b610938565b6106b5565b9050919050565b5f819050919050565b61097483610941565b61098861098082610962565b8484546108e7565b825550505050565b5f90565b61099c610990565b6109a781848461096b565b505050565b5b818110156109ca576109bf5f82610994565b6001810190506109ad565b5050565b601f821115610a0f576109e0816108ba565b6109e9846108cc565b810160208510156109f8578190505b610a0c610a04856108cc565b8301826109ac565b50505b505050565b5f82821c905092915050565b5f610a2f5f1984600802610a14565b1980831691505092915050565b5f610a478383610a20565b9150826002028217905092915050565b610a6082610853565b67ffffffffffffffff811115610a7957610a78610591565b5b610a83825461088a565b610a8e8282856109ce565b5f60209050601f831160018114610abf575f8415610aad578287015190505b610ab78582610a3c565b865550610b1e565b601f198416610acd866108ba565b5f5b82811015610af457848901518255600182019150602085019450602081019050610acf565b86831015610b115784890151610b0d601f891682610a20565b8355505b6001600288020188555050505b505050505050565b610b2f81610707565b82525050565b5f602082019050610b485f830184610b26565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610b85826106b5565b9150610b90836106b5565b9250828201905080821115610ba857610ba7610b4e565b5b92915050565b610bb7816106b5565b82525050565b5f606082019050610bd05f830186610b26565b610bdd6020830185610bae565b610bea6040830184610bae565b949350505050565b5f602082019050610c055f830184610bae565b92915050565b611c7b80610c185f395ff3fe608060405234801561000f575f80fd5b50600436106101ee575f3560e01c806370a082311161010d578063a9059cbb116100a0578063d4f2d8781161006f578063d4f2d8781461056e578063d4fbfdfc1461058a578063dd62ed3e146105a8578063f2fde38b146105d8576101ee565b8063a9059cbb146104ea578063b7de6fb51461051a578063b92ebd5f14610536578063c024666814610552576101ee565b80638a8c523c116100dc5780638a8c523c146104725780638da5cb5b146104905780638ea5220f146104ae57806395d89b41146104cc576101ee565b806370a08231146103fe578063715018a61461042e57806373a432bb1461043857806375f0a87414610454576101ee565b806326991cc8116101855780634fbee193116101545780634fbee193146103765780635d098b38146103a657806361e0c0f7146103c25780636c7e15c9146103e0576101ee565b806326991cc814610300578063313ce5671461031e57806340c10f191461033c5780634c0f38c214610358576101ee565b806318160ddd116101c157806318160ddd146102785780631f53ac021461029657806322eb6631146102b257806323b872dd146102d0576101ee565b806306fdde03146101f2578063095ea7b31461021057806316fc22a61461024057806317c06e741461025c575b5f80fd5b6101fa6105f4565b60405161020791906116fd565b60405180910390f35b61022a600480360381019061022591906117ae565b610684565b6040516102379190611806565b60405180910390f35b61025a6004803603810190610255919061181f565b6106a6565b005b6102766004803603810190610271919061181f565b6106b8565b005b6102806106ca565b60405161028d9190611859565b60405180910390f35b6102b060048036038101906102ab9190611872565b6106d3565b005b6102ba61071f565b6040516102c79190611859565b60405180910390f35b6102ea60048036038101906102e5919061189d565b610725565b6040516102f79190611806565b60405180910390f35b610308610753565b60405161031591906118fc565b60405180910390f35b610326610778565b6040516103339190611930565b60405180910390f35b610356600480360381019061035191906117ae565b610780565b005b6103606107f2565b60405161036d9190611859565b60405180910390f35b610390600480360381019061038b9190611872565b6107fb565b60405161039d9190611806565b60405180910390f35b6103c060048036038101906103bb9190611872565b61084d565b005b6103ca610898565b6040516103d79190611859565b60405180910390f35b6103e861089e565b6040516103f59190611859565b60405180910390f35b61041860048036038101906104139190611872565b6108a4565b6040516104259190611859565b60405180910390f35b6104366108e9565b005b610452600480360381019061044d9190611872565b6108fc565b005b61045c610947565b60405161046991906118fc565b60405180910390f35b61047a61096c565b6040516104879190611806565b60405180910390f35b61049861097e565b6040516104a591906118fc565b60405180910390f35b6104b66109a6565b6040516104c391906118fc565b60405180910390f35b6104d46109cc565b6040516104e191906116fd565b60405180910390f35b61050460048036038101906104ff91906117ae565b610a5c565b6040516105119190611806565b60405180910390f35b610534600480360381019061052f919061181f565b610a7e565b005b610550600480360381019061054b9190611973565b610a90565b005b61056c6004803603810190610567919061199e565b610ab4565b005b6105886004803603810190610583919061181f565b610b14565b005b610592610b26565b60405161059f9190611859565b60405180910390f35b6105c260048036038101906105bd91906119dc565b610b2c565b6040516105cf9190611859565b60405180910390f35b6105f260048036038101906105ed9190611872565b610bae565b005b60606003805461060390611a47565b80601f016020809104026020016040519081016040528092919081815260200182805461062f90611a47565b801561067a5780601f106106515761010080835404028352916020019161067a565b820191905f5260205f20905b81548152906001019060200180831161065d57829003601f168201915b5050505050905090565b5f8061068e610c32565b905061069b818585610c39565b600191505092915050565b6106ae610c4b565b8060088190555050565b6106c0610c4b565b80600a8190555050565b5f600254905090565b6106db610c4b565b80600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60085481565b5f8061072f610c32565b905061073c858285610cd2565b610747858585610d64565b60019150509392505050565b600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f6012905090565b610788610c4b565b6107906107f2565b816107996106ca565b6107a39190611aa4565b11156107e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107db90611b21565b60405180910390fd5b6107ee8282611073565b5050565b5f600654905090565b5f600e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b610855610c4b565b80600c5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60095481565b60075481565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6108f1610c4b565b6108fa5f6110f2565b565b610904610c4b565b80600d5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b5f9054906101000a900460ff1681565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600480546109db90611a47565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0790611a47565b8015610a525780601f10610a2957610100808354040283529160200191610a52565b820191905f5260205f20905b815481529060010190602001808311610a3557829003601f168201915b5050505050905090565b5f80610a66610c32565b9050610a73818585610d64565b600191505092915050565b610a86610c4b565b8060098190555050565b610a98610c4b565b80600b5f6101000a81548160ff02191690831515021790555050565b610abc610c4b565b80600e5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b610b1c610c4b565b8060078190555050565b600a5481565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b610bb6610c4b565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c26575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610c1d91906118fc565b60405180910390fd5b610c2f816110f2565b50565b5f33905090565b610c4683838360016111b5565b505050565b610c53610c32565b73ffffffffffffffffffffffffffffffffffffffff16610c7161097e565b73ffffffffffffffffffffffffffffffffffffffff1614610cd057610c94610c32565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610cc791906118fc565b60405180910390fd5b565b5f610cdd8484610b2c565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610d5e5781811015610d4f578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401610d4693929190611b3f565b60405180910390fd5b610d5d84848484035f6111b5565b5b50505050565b5f819050600b5f9054906101000a900460ff161561106d57600e5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16158015610e1a5750600e5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561106157600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148015610e8957505f600954600754610e879190611aa4565b115b15610f41575f606460075484610e9f9190611b74565b610ea99190611be2565b90505f606460095485610ebc9190611b74565b610ec69190611be2565b9050808285610ed59190611c12565b610edf9190611c12565b9250610f0e86600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611384565b610f3a86600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683611384565b5050611060565b600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148015610fab57505f600a54600854610fa99190611aa4565b115b1561105f575f606460085484610fc19190611b74565b610fcb9190611be2565b90505f6064600a5485610fde9190611b74565b610fe89190611be2565b9050808285610ff79190611c12565b6110019190611c12565b925061103086600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611384565b61105c86600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683611384565b50505b5b5b61106c848483611384565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110e3575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016110da91906118fc565b60405180910390fd5b6110ee5f8383611474565b5050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611225575f6040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161121c91906118fc565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611295575f6040517f94280d6200000000000000000000000000000000000000000000000000000000815260040161128c91906118fc565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550801561137e578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516113759190611859565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036113f4575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016113eb91906118fc565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611464575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161145b91906118fc565b60405180910390fd5b61146f838383611474565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036114c4578060025f8282546114b89190611aa4565b92505081905550611592565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508181101561154d578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161154493929190611b3f565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115d9578060025f8282540392505081905550611623565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516116809190611859565b60405180910390a3505050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6116cf8261168d565b6116d98185611697565b93506116e98185602086016116a7565b6116f2816116b5565b840191505092915050565b5f6020820190508181035f83015261171581846116c5565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61174a82611721565b9050919050565b61175a81611740565b8114611764575f80fd5b50565b5f8135905061177581611751565b92915050565b5f819050919050565b61178d8161177b565b8114611797575f80fd5b50565b5f813590506117a881611784565b92915050565b5f80604083850312156117c4576117c361171d565b5b5f6117d185828601611767565b92505060206117e28582860161179a565b9150509250929050565b5f8115159050919050565b611800816117ec565b82525050565b5f6020820190506118195f8301846117f7565b92915050565b5f602082840312156118345761183361171d565b5b5f6118418482850161179a565b91505092915050565b6118538161177b565b82525050565b5f60208201905061186c5f83018461184a565b92915050565b5f602082840312156118875761188661171d565b5b5f61189484828501611767565b91505092915050565b5f805f606084860312156118b4576118b361171d565b5b5f6118c186828701611767565b93505060206118d286828701611767565b92505060406118e38682870161179a565b9150509250925092565b6118f681611740565b82525050565b5f60208201905061190f5f8301846118ed565b92915050565b5f60ff82169050919050565b61192a81611915565b82525050565b5f6020820190506119435f830184611921565b92915050565b611952816117ec565b811461195c575f80fd5b50565b5f8135905061196d81611949565b92915050565b5f602082840312156119885761198761171d565b5b5f6119958482850161195f565b91505092915050565b5f80604083850312156119b4576119b361171d565b5b5f6119c185828601611767565b92505060206119d28582860161195f565b9150509250929050565b5f80604083850312156119f2576119f161171d565b5b5f6119ff85828601611767565b9250506020611a1085828601611767565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611a5e57607f821691505b602082108103611a7157611a70611a1a565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611aae8261177b565b9150611ab98361177b565b9250828201905080821115611ad157611ad0611a77565b5b92915050565b7f4d617820537570706c79204578636565646564000000000000000000000000005f82015250565b5f611b0b601383611697565b9150611b1682611ad7565b602082019050919050565b5f6020820190508181035f830152611b3881611aff565b9050919050565b5f606082019050611b525f8301866118ed565b611b5f602083018561184a565b611b6c604083018461184a565b949350505050565b5f611b7e8261177b565b9150611b898361177b565b9250828202611b978161177b565b91508282048414831517611bae57611bad611a77565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f611bec8261177b565b9150611bf78361177b565b925082611c0757611c06611bb5565b5b828204905092915050565b5f611c1c8261177b565b9150611c278361177b565b9250828203905081811115611c3f57611c3e611a77565b5b9291505056fea26469706673582212201f1e47a8317fdb941e2bf4baae353286d3d670fd1fea96caa716918b03a55e4d64736f6c634300081a0033000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000204fce5e3e250261100000000000000000000000000000000000000000000000000000000000000005f5e1000000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000005000000000000000000000000694a967a60b61cb23daa46571a137e4fb0656076000000000000000000000000f4c4795c309a8e4a1ad548d82a875193980e82ff000000000000000000000000000000000000000000000000000000000000000954657374546f6b656e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025454000000000000000000000000000000000000000000000000000000000000