0x608060405234801561000f575f80fd5b506040516129cd3803806129cd8339818101604052810190610031919061020b565b8060405180602001604052805f815250610050816100d760201b60201c565b505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036100c1575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016100b89190610245565b60405180910390fd5b6100d0816100ea60201b60201c565b5050610567565b80600290816100e69190610498565b5050565b5f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101da826101b1565b9050919050565b6101ea816101d0565b81146101f4575f80fd5b50565b5f81519050610205816101e1565b92915050565b5f602082840312156102205761021f6101ad565b5b5f61022d848285016101f7565b91505092915050565b61023f816101d0565b82525050565b5f6020820190506102585f830184610236565b92915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806102d957607f821691505b6020821081036102ec576102eb610295565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261034e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610313565b6103588683610313565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61039c61039761039284610370565b610379565b610370565b9050919050565b5f819050919050565b6103b583610382565b6103c96103c1826103a3565b84845461031f565b825550505050565b5f90565b6103dd6103d1565b6103e88184846103ac565b505050565b5b8181101561040b576104005f826103d5565b6001810190506103ee565b5050565b601f82111561045057610421816102f2565b61042a84610304565b81016020851015610439578190505b61044d61044585610304565b8301826103ed565b50505b505050565b5f82821c905092915050565b5f6104705f1984600802610455565b1980831691505092915050565b5f6104888383610461565b9150826002028217905092915050565b6104a18261025e565b67ffffffffffffffff8111156104ba576104b9610268565b5b6104c482546102c2565b6104cf82828561040f565b5f60209050601f831160018114610500575f84156104ee578287015190505b6104f8858261047d565b86555061055f565b601f19841661050e866102f2565b5f5b8281101561053557848901518255600182019150602085019450602081019050610510565b86831015610552578489015161054e601f891682610461565b8355505b6001600288020188555050505b505050505050565b612459806105745f395ff3fe608060405234801561000f575f80fd5b50600436106100b1575f3560e01c8063715018a61161006f578063715018a6146101ad5780638da5cb5b146101b7578063a22cb465146101d5578063e985e9c5146101f1578063f242432a14610221578063f2fde38b1461023d576100b1565b8062fdd58e146100b557806301ffc9a7146100e557806302fe5305146101155780630e89341c146101315780632eb2c2d6146101615780634e1273f41461017d575b5f80fd5b6100cf60048036038101906100ca91906115ab565b610259565b6040516100dc91906115f8565b60405180910390f35b6100ff60048036038101906100fa9190611666565b6102ae565b60405161010c91906116ab565b60405180910390f35b61012f600480360381019061012a9190611800565b61038f565b005b61014b60048036038101906101469190611847565b6103a3565b60405161015891906118d2565b60405180910390f35b61017b60048036038101906101769190611a54565b610435565b005b61019760048036038101906101929190611bdf565b6104dc565b6040516101a49190611d0c565b60405180910390f35b6101b56105e3565b005b6101bf6105f6565b6040516101cc9190611d3b565b60405180910390f35b6101ef60048036038101906101ea9190611d7e565b61061e565b005b61020b60048036038101906102069190611dbc565b610634565b60405161021891906116ab565b60405180910390f35b61023b60048036038101906102369190611dfa565b6106c2565b005b61025760048036038101906102529190611e8d565b610769565b005b5f805f8381526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b5f7fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061037857507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806103885750610387826107ed565b5b9050919050565b610397610856565b6103a0816108dd565b50565b6060600280546103b290611ee5565b80601f01602080910402602001604051908101604052809291908181526020018280546103de90611ee5565b80156104295780601f1061040057610100808354040283529160200191610429565b820191905f5260205f20905b81548152906001019060200180831161040c57829003601f168201915b50505050509050919050565b5f61043e6108f0565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415801561048357506104818682610634565b155b156104c75780866040517fe237d9220000000000000000000000000000000000000000000000000000000081526004016104be929190611f15565b60405180910390fd5b6104d486868686866108f7565b505050505050565b6060815183511461052857815183516040517f5b05999100000000000000000000000000000000000000000000000000000000815260040161051f929190611f3c565b60405180910390fd5b5f835167ffffffffffffffff811115610544576105436116dc565b5b6040519080825280602002602001820160405280156105725781602001602082028036833780820191505090505b5090505f5b84518110156105d8576105ae61059682876109eb90919063ffffffff16565b6105a983876109fe90919063ffffffff16565b610259565b8282815181106105c1576105c0611f63565b5b602002602001018181525050806001019050610577565b508091505092915050565b6105eb610856565b6105f45f610a11565b565b5f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6106306106296108f0565b8383610ad4565b5050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f6106cb6108f0565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614158015610710575061070e8682610634565b155b156107545780866040517fe237d92200000000000000000000000000000000000000000000000000000000815260040161074b929190611f15565b60405180910390fd5b6107618686868686610c3d565b505050505050565b610771610856565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036107e1575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016107d89190611d3b565b60405180910390fd5b6107ea81610a11565b50565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61085e6108f0565b73ffffffffffffffffffffffffffffffffffffffff1661087c6105f6565b73ffffffffffffffffffffffffffffffffffffffff16146108db5761089f6108f0565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016108d29190611d3b565b60405180910390fd5b565b80600290816108ec919061212d565b5050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610967575f6040517f57f447ce00000000000000000000000000000000000000000000000000000000815260040161095e9190611d3b565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036109d7575f6040517f01a835140000000000000000000000000000000000000000000000000000000081526004016109ce9190611d3b565b60405180910390fd5b6109e48585858585610d43565b5050505050565b5f60208202602084010151905092915050565b5f60208202602084010151905092915050565b5f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b44575f6040517fced3e100000000000000000000000000000000000000000000000000000000008152600401610b3b9190611d3b565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610c3091906116ab565b60405180910390a3505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610cad575f6040517f57f447ce000000000000000000000000000000000000000000000000000000008152600401610ca49190611d3b565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610d1d575f6040517f01a83514000000000000000000000000000000000000000000000000000000008152600401610d149190611d3b565b60405180910390fd5b5f80610d298585610def565b91509150610d3a8787848487610d43565b50505050505050565b610d4f85858585610e1f565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614610de8575f610d8b6108f0565b90506001845103610dd7575f610daa5f866109fe90919063ffffffff16565b90505f610dc05f866109fe90919063ffffffff16565b9050610dd08389898585896111af565b5050610de6565b610de581878787878761135e565b5b505b5050505050565b60608060405191506001825283602083015260408201905060018152826020820152604081016040529250929050565b8051825114610e6957815181516040517f5b059991000000000000000000000000000000000000000000000000000000008152600401610e60929190611f3c565b60405180910390fd5b5f610e726108f0565b90505f5b835181101561106e575f610e9382866109fe90919063ffffffff16565b90505f610ea983866109fe90919063ffffffff16565b90505f73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614610fcc575f805f8481526020019081526020015f205f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015610f7857888183856040517f03dee4c5000000000000000000000000000000000000000000000000000000008152600401610f6f94939291906121fc565b60405180910390fd5b8181035f808581526020019081526020015f205f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161461106157805f808481526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611059919061226c565b925050819055505b5050806001019050610e76565b506001835103611129575f61108c5f856109fe90919063ffffffff16565b90505f6110a25f856109fe90919063ffffffff16565b90508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62858560405161111a929190611f3c565b60405180910390a450506111a8565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868660405161119f92919061229f565b60405180910390a45b5050505050565b5f8473ffffffffffffffffffffffffffffffffffffffff163b1115611356578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b815260040161120f959493929190612326565b6020604051808303815f875af192505050801561124a57506040513d601f19601f820116820180604052508101906112479190612392565b60015b6112cb573d805f8114611278576040519150601f19603f3d011682016040523d82523d5f602084013e61127d565b606091505b505f8151036112c357846040517f57f447ce0000000000000000000000000000000000000000000000000000000081526004016112ba9190611d3b565b60405180910390fd5b805181602001fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461135457846040517f57f447ce00000000000000000000000000000000000000000000000000000000815260040161134b9190611d3b565b60405180910390fd5b505b505050505050565b5f8473ffffffffffffffffffffffffffffffffffffffff163b1115611505578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b81526004016113be9594939291906123bd565b6020604051808303815f875af19250505080156113f957506040513d601f19601f820116820180604052508101906113f69190612392565b60015b61147a573d805f8114611427576040519150601f19603f3d011682016040523d82523d5f602084013e61142c565b606091505b505f81510361147257846040517f57f447ce0000000000000000000000000000000000000000000000000000000081526004016114699190611d3b565b60405180910390fd5b805181602001fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461150357846040517f57f447ce0000000000000000000000000000000000000000000000000000000081526004016114fa9190611d3b565b60405180910390fd5b505b505050505050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6115478261151e565b9050919050565b6115578161153d565b8114611561575f80fd5b50565b5f813590506115728161154e565b92915050565b5f819050919050565b61158a81611578565b8114611594575f80fd5b50565b5f813590506115a581611581565b92915050565b5f80604083850312156115c1576115c0611516565b5b5f6115ce85828601611564565b92505060206115df85828601611597565b9150509250929050565b6115f281611578565b82525050565b5f60208201905061160b5f8301846115e9565b92915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61164581611611565b811461164f575f80fd5b50565b5f813590506116608161163c565b92915050565b5f6020828403121561167b5761167a611516565b5b5f61168884828501611652565b91505092915050565b5f8115159050919050565b6116a581611691565b82525050565b5f6020820190506116be5f83018461169c565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611712826116cc565b810181811067ffffffffffffffff82111715611731576117306116dc565b5b80604052505050565b5f61174361150d565b905061174f8282611709565b919050565b5f67ffffffffffffffff82111561176e5761176d6116dc565b5b611777826116cc565b9050602081019050919050565b828183375f83830152505050565b5f6117a461179f84611754565b61173a565b9050828152602081018484840111156117c0576117bf6116c8565b5b6117cb848285611784565b509392505050565b5f82601f8301126117e7576117e66116c4565b5b81356117f7848260208601611792565b91505092915050565b5f6020828403121561181557611814611516565b5b5f82013567ffffffffffffffff8111156118325761183161151a565b5b61183e848285016117d3565b91505092915050565b5f6020828403121561185c5761185b611516565b5b5f61186984828501611597565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f6118a482611872565b6118ae818561187c565b93506118be81856020860161188c565b6118c7816116cc565b840191505092915050565b5f6020820190508181035f8301526118ea818461189a565b905092915050565b5f67ffffffffffffffff82111561190c5761190b6116dc565b5b602082029050602081019050919050565b5f80fd5b5f61193361192e846118f2565b61173a565b905080838252602082019050602084028301858111156119565761195561191d565b5b835b8181101561197f578061196b8882611597565b845260208401935050602081019050611958565b5050509392505050565b5f82601f83011261199d5761199c6116c4565b5b81356119ad848260208601611921565b91505092915050565b5f67ffffffffffffffff8211156119d0576119cf6116dc565b5b6119d9826116cc565b9050602081019050919050565b5f6119f86119f3846119b6565b61173a565b905082815260208101848484011115611a1457611a136116c8565b5b611a1f848285611784565b509392505050565b5f82601f830112611a3b57611a3a6116c4565b5b8135611a4b8482602086016119e6565b91505092915050565b5f805f805f60a08688031215611a6d57611a6c611516565b5b5f611a7a88828901611564565b9550506020611a8b88828901611564565b945050604086013567ffffffffffffffff811115611aac57611aab61151a565b5b611ab888828901611989565b935050606086013567ffffffffffffffff811115611ad957611ad861151a565b5b611ae588828901611989565b925050608086013567ffffffffffffffff811115611b0657611b0561151a565b5b611b1288828901611a27565b9150509295509295909350565b5f67ffffffffffffffff821115611b3957611b386116dc565b5b602082029050602081019050919050565b5f611b5c611b5784611b1f565b61173a565b90508083825260208201905060208402830185811115611b7f57611b7e61191d565b5b835b81811015611ba85780611b948882611564565b845260208401935050602081019050611b81565b5050509392505050565b5f82601f830112611bc657611bc56116c4565b5b8135611bd6848260208601611b4a565b91505092915050565b5f8060408385031215611bf557611bf4611516565b5b5f83013567ffffffffffffffff811115611c1257611c1161151a565b5b611c1e85828601611bb2565b925050602083013567ffffffffffffffff811115611c3f57611c3e61151a565b5b611c4b85828601611989565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b611c8781611578565b82525050565b5f611c988383611c7e565b60208301905092915050565b5f602082019050919050565b5f611cba82611c55565b611cc48185611c5f565b9350611ccf83611c6f565b805f5b83811015611cff578151611ce68882611c8d565b9750611cf183611ca4565b925050600181019050611cd2565b5085935050505092915050565b5f6020820190508181035f830152611d248184611cb0565b905092915050565b611d358161153d565b82525050565b5f602082019050611d4e5f830184611d2c565b92915050565b611d5d81611691565b8114611d67575f80fd5b50565b5f81359050611d7881611d54565b92915050565b5f8060408385031215611d9457611d93611516565b5b5f611da185828601611564565b9250506020611db285828601611d6a565b9150509250929050565b5f8060408385031215611dd257611dd1611516565b5b5f611ddf85828601611564565b9250506020611df085828601611564565b9150509250929050565b5f805f805f60a08688031215611e1357611e12611516565b5b5f611e2088828901611564565b9550506020611e3188828901611564565b9450506040611e4288828901611597565b9350506060611e5388828901611597565b925050608086013567ffffffffffffffff811115611e7457611e7361151a565b5b611e8088828901611a27565b9150509295509295909350565b5f60208284031215611ea257611ea1611516565b5b5f611eaf84828501611564565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611efc57607f821691505b602082108103611f0f57611f0e611eb8565b5b50919050565b5f604082019050611f285f830185611d2c565b611f356020830184611d2c565b9392505050565b5f604082019050611f4f5f8301856115e9565b611f5c60208301846115e9565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302611fec7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611fb1565b611ff68683611fb1565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61203161202c61202784611578565b61200e565b611578565b9050919050565b5f819050919050565b61204a83612017565b61205e61205682612038565b848454611fbd565b825550505050565b5f90565b612072612066565b61207d818484612041565b505050565b5b818110156120a0576120955f8261206a565b600181019050612083565b5050565b601f8211156120e5576120b681611f90565b6120bf84611fa2565b810160208510156120ce578190505b6120e26120da85611fa2565b830182612082565b50505b505050565b5f82821c905092915050565b5f6121055f19846008026120ea565b1980831691505092915050565b5f61211d83836120f6565b9150826002028217905092915050565b61213682611872565b67ffffffffffffffff81111561214f5761214e6116dc565b5b6121598254611ee5565b6121648282856120a4565b5f60209050601f831160018114612195575f8415612183578287015190505b61218d8582612112565b8655506121f4565b601f1984166121a386611f90565b5f5b828110156121ca578489015182556001820191506020850194506020810190506121a5565b868310156121e757848901516121e3601f8916826120f6565b8355505b6001600288020188555050505b505050505050565b5f60808201905061220f5f830187611d2c565b61221c60208301866115e9565b61222960408301856115e9565b61223660608301846115e9565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61227682611578565b915061228183611578565b92508282019050808211156122995761229861223f565b5b92915050565b5f6040820190508181035f8301526122b78185611cb0565b905081810360208301526122cb8184611cb0565b90509392505050565b5f81519050919050565b5f82825260208201905092915050565b5f6122f8826122d4565b61230281856122de565b935061231281856020860161188c565b61231b816116cc565b840191505092915050565b5f60a0820190506123395f830188611d2c565b6123466020830187611d2c565b61235360408301866115e9565b61236060608301856115e9565b818103608083015261237281846122ee565b90509695505050505050565b5f8151905061238c8161163c565b92915050565b5f602082840312156123a7576123a6611516565b5b5f6123b48482850161237e565b91505092915050565b5f60a0820190506123d05f830188611d2c565b6123dd6020830187611d2c565b81810360408301526123ef8186611cb0565b905081810360608301526124038185611cb0565b9050818103608083015261241781846122ee565b9050969550505050505056fea26469706673582212209d741181ece6a9c46d5824b4a8cdb46f07cf6506bea0734ee54ec1e570632e9f64736f6c634300081a0033000000000000000000000000066bf3a963385bc295b8eb741dba54c23d8aaaaa