610180604052348015610010575f80fd5b50604051614f54380380614f5483398181016040528101906100329190610599565b806040518060400160405280600a81526020017f5553445020546f6b656e00000000000000000000000000000000000000000000815250806040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506040518060400160405280600a81526020017f5553445020546f6b656e000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f5553445000000000000000000000000000000000000000000000000000000000815250816003908161011b91906107f5565b50806004908161012b91906107f5565b5050505f60055f6101000a81548160ff02191690831515021790555061015b6007836102ec60201b90919060201c565b61012081815250506101776008826102ec60201b90919060201c565b6101408181525050818051906020012060e08181525050808051906020012061010081815250504660a081815250506101b461033960201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250505050505f8103610236575f6040517f392e1e2700000000000000000000000000000000000000000000000000000000815260040161022d91906108fd565b60405180910390fd5b806101608181525050506102525f801b3361039360201b60201c565b506102837f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a3361039360201b60201c565b506102b47f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a63361039360201b60201c565b506102e57f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a8483361039360201b60201c565b5050610ae6565b5f60208351101561030d576103068361048960201b60201c565b9050610333565b8261031d836104ee60201b60201c565b5f01908161032b91906107f5565b5060ff5f1b90505b92915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60e05161010051463060405160200161037895949392919061097c565b60405160208183030381529060405280519060200120905090565b5f6103a483836104f760201b60201c565b61047f57600160065f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061041c61055b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019050610483565b5f90505b92915050565b5f80829050601f815111156104d557826040517f305a27a90000000000000000000000000000000000000000000000000000000081526004016104cc9190610a33565b60405180910390fd5b8051816104e190610a80565b5f1c175f1b915050919050565b5f819050919050565b5f60065f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f33905090565b5f80fd5b5f819050919050565b61057881610566565b8114610582575f80fd5b50565b5f815190506105938161056f565b92915050565b5f602082840312156105ae576105ad610562565b5b5f6105bb84828501610585565b91505092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061063f57607f821691505b602082108103610652576106516105fb565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026106b47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610679565b6106be8683610679565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6106f96106f46106ef84610566565b6106d6565b610566565b9050919050565b5f819050919050565b610712836106df565b61072661071e82610700565b848454610685565b825550505050565b5f90565b61073a61072e565b610745818484610709565b505050565b5b818110156107685761075d5f82610732565b60018101905061074b565b5050565b601f8211156107ad5761077e81610658565b6107878461066a565b81016020851015610796578190505b6107aa6107a28561066a565b83018261074a565b50505b505050565b5f82821c905092915050565b5f6107cd5f19846008026107b2565b1980831691505092915050565b5f6107e583836107be565b9150826002028217905092915050565b6107fe826105c4565b67ffffffffffffffff811115610817576108166105ce565b5b6108218254610628565b61082c82828561076c565b5f60209050601f83116001811461085d575f841561084b578287015190505b61085585826107da565b8655506108bc565b601f19841661086b86610658565b5f5b828110156108925784890151825560018201915060208501945060208101905061086d565b868310156108af57848901516108ab601f8916826107be565b8355505b6001600288020188555050505b505050505050565b5f819050919050565b5f6108e76108e26108dd846108c4565b6106d6565b610566565b9050919050565b6108f7816108cd565b82525050565b5f6020820190506109105f8301846108ee565b92915050565b5f819050919050565b61092881610916565b82525050565b61093781610566565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6109668261093d565b9050919050565b6109768161095c565b82525050565b5f60a08201905061098f5f83018861091f565b61099c602083018761091f565b6109a9604083018661091f565b6109b6606083018561092e565b6109c3608083018461096d565b9695505050505050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f610a05826105c4565b610a0f81856109cd565b9350610a1f8185602086016109dd565b610a28816109eb565b840191505092915050565b5f6020820190508181035f830152610a4b81846109fb565b905092915050565b5f81519050919050565b5f819050602082019050919050565b5f610a778251610916565b80915050919050565b5f610a8a82610a53565b82610a9484610a5d565b9050610a9f81610a6c565b92506020821015610adf57610ada7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802610679565b831692505b5050919050565b60805160a05160c05160e05161010051610120516101405161016051614413610b415f395f6109a401525f611d1701525f611cdc01525f61217001525f61214f01525f61169601525f6116ec01525f61171501526144135ff3fe608060405234801561000f575f80fd5b5060043610610246575f3560e01c80636fcfff45116101395780639ab24eb0116100b6578063d53913931161007a578063d53913931461071c578063d547741f1461073a578063dd62ed3e14610756578063e63ab1e914610786578063f1127ed8146107a457610246565b80639ab24eb014610666578063a217fddf14610696578063a9059cbb146106b4578063c3cda520146106e4578063d505accf1461070057610246565b806384b0196e116100fd57806384b0196e146105a65780638e539e8c146105ca57806391d14854146105fa57806391ddadf41461062a57806395d89b411461064857610246565b80636fcfff45146104f057806370a082311461052057806379cc6790146105505780637ecebe001461056c5780638456cb591461059c57610246565b80633644e515116101c757806342966c681161018b57806342966c681461044c5780634bf5d7e914610468578063587cde1e146104865780635c19a95c146104b65780635c975abb146104d257610246565b80633644e515146103bc57806336568abe146103da5780633a46b1a8146103f65780633f4ba83a1461042657806340c10f191461043057610246565b8063248a9ca31161020e578063248a9ca314610316578063282c51f3146103465780632f2ff15d14610364578063313ce56714610380578063355274ea1461039e57610246565b806301ffc9a71461024a57806306fdde031461027a578063095ea7b31461029857806318160ddd146102c857806323b872dd146102e6575b5f80fd5b610264600480360381019061025f919061360f565b6107d4565b6040516102719190613654565b60405180910390f35b61028261084d565b60405161028f91906136dd565b60405180910390f35b6102b260048036038101906102ad919061378a565b6108dd565b6040516102bf9190613654565b60405180910390f35b6102d06108ff565b6040516102dd91906137d7565b60405180910390f35b61030060048036038101906102fb91906137f0565b610908565b60405161030d9190613654565b60405180910390f35b610330600480360381019061032b9190613873565b610936565b60405161033d91906138ad565b60405180910390f35b61034e610953565b60405161035b91906138ad565b60405180910390f35b61037e600480360381019061037991906138c6565b610977565b005b610388610999565b604051610395919061391f565b60405180910390f35b6103a66109a1565b6040516103b391906137d7565b60405180910390f35b6103c46109c8565b6040516103d191906138ad565b60405180910390f35b6103f460048036038101906103ef91906138c6565b6109d6565b005b610410600480360381019061040b919061378a565b610a51565b60405161041d91906137d7565b60405180910390f35b61042e610b27565b005b61044a6004803603810190610445919061378a565b610b5c565b005b61046660048036038101906104619190613938565b610b95565b005b610470610bcc565b60405161047d91906136dd565b60405180910390f35b6104a0600480360381019061049b9190613963565b610c60565b6040516104ad919061399d565b60405180910390f35b6104d060048036038101906104cb9190613963565b610cc5565b005b6104da610cde565b6040516104e79190613654565b60405180910390f35b61050a60048036038101906105059190613963565b610cf3565b60405161051791906139d4565b60405180910390f35b61053a60048036038101906105359190613963565b610d04565b60405161054791906137d7565b60405180910390f35b61056a6004803603810190610565919061378a565b610d49565b005b61058660048036038101906105819190613963565b610d69565b60405161059391906137d7565b60405180910390f35b6105a4610d7a565b005b6105ae610daf565b6040516105c19796959493929190613ade565b60405180910390f35b6105e460048036038101906105df9190613938565b610e54565b6040516105f191906137d7565b60405180910390f35b610614600480360381019061060f91906138c6565b610eee565b6040516106219190613654565b60405180910390f35b610632610f52565b60405161063f9190613b80565b60405180910390f35b610650610f60565b60405161065d91906136dd565b60405180910390f35b610680600480360381019061067b9190613963565b610ff0565b60405161068d91906137d7565b60405180910390f35b61069e611059565b6040516106ab91906138ad565b60405180910390f35b6106ce60048036038101906106c9919061378a565b61105f565b6040516106db9190613654565b60405180910390f35b6106fe60048036038101906106f99190613bc3565b611081565b005b61071a60048036038101906107159190613c4c565b611146565b005b61072461128b565b60405161073191906138ad565b60405180910390f35b610754600480360381019061074f91906138c6565b6112af565b005b610770600480360381019061076b9190613ce9565b6112d1565b60405161077d91906137d7565b60405180910390f35b61078e611353565b60405161079b91906138ad565b60405180910390f35b6107be60048036038101906107b99190613d51565b611377565b6040516107cb9190613dff565b60405180910390f35b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610846575061084582611391565b5b9050919050565b60606003805461085c90613e45565b80601f016020809104026020016040519081016040528092919081815260200182805461088890613e45565b80156108d35780601f106108aa576101008083540402835291602001916108d3565b820191905f5260205f20905b8154815290600101906020018083116108b657829003601f168201915b5050505050905090565b5f806108e76113fa565b90506108f4818585611401565b600191505092915050565b5f600254905090565b5f806109126113fa565b905061091f858285611413565b61092a8585856114a5565b60019150509392505050565b5f60065f8381526020019081526020015f20600101549050919050565b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84881565b61098082610936565b61098981611595565b61099383836115a9565b50505050565b5f6012905090565b5f7f0000000000000000000000000000000000000000000000000000000000000000905090565b5f6109d1611693565b905090565b6109de6113fa565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a42576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a4c8282611749565b505050565b5f80610a5b610f52565b90508065ffffffffffff168310610aab5782816040517fecd3f81e000000000000000000000000000000000000000000000000000000008152600401610aa2929190613e75565b60405180910390fd5b610b02610ab784611833565b600b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061188c90919063ffffffff16565b79ffffffffffffffffffffffffffffffffffffffffffffffffffff1691505092915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610b5181611595565b610b59611979565b50565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610b8681611595565b610b9083836119da565b505050565b7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a848610bbf81611595565b610bc882611a59565b5050565b6060610bd6611a6d565b65ffffffffffff16610be6610f52565b65ffffffffffff1614610c25576040517f6ff0714000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040518060400160405280601d81526020017f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000815250905090565b5f600a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f610cce6113fa565b9050610cda8183611a7c565b5050565b5f60055f9054906101000a900460ff16905090565b5f610cfd82611b8c565b9050919050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610d5b82610d556113fa565b83611413565b610d658282611be1565b5050565b5f610d7382611c60565b9050919050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610da481611595565b610dac611c71565b50565b5f6060805f805f6060610dc0611cd3565b610dc8611d0e565b46305f801b5f67ffffffffffffffff811115610de757610de6613e9c565b5b604051908082528060200260200182016040528015610e155781602001602082028036833780820191505090505b507f0f00000000000000000000000000000000000000000000000000000000000000959493929190965096509650965096509650965090919293949596565b5f80610e5e610f52565b90508065ffffffffffff168310610eae5782816040517fecd3f81e000000000000000000000000000000000000000000000000000000008152600401610ea5929190613e75565b60405180910390fd5b610eca610eba84611833565b600c61188c90919063ffffffff16565b79ffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b5f60065f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f610f5b611a6d565b905090565b606060048054610f6f90613e45565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9b90613e45565b8015610fe65780601f10610fbd57610100808354040283529160200191610fe6565b820191905f5260205f20905b815481529060010190602001808311610fc957829003601f168201915b5050505050905090565b5f611036600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20611d49565b79ffffffffffffffffffffffffffffffffffffffffffffffffffff169050919050565b5f801b81565b5f806110696113fa565b90506110768185856114a5565b600191505092915050565b834211156110c657836040517f4683af0e0000000000000000000000000000000000000000000000000000000081526004016110bd91906137d7565b60405180910390fd5b5f61112761111f7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf8989896040516020016111049493929190613ec9565b60405160208183030381529060405280519060200120611dab565b858585611dc4565b90506111338187611df2565b61113d8188611a7c565b50505050505050565b8342111561118b57836040517f6279130200000000000000000000000000000000000000000000000000000000815260040161118291906137d7565b60405180910390fd5b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886111b98c611e49565b896040516020016111cf96959493929190613f0c565b6040516020818303038152906040528051906020012090505f6111f182611dab565b90505f61120082878787611dc4565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461127457808a6040517f4b800e4600000000000000000000000000000000000000000000000000000000815260040161126b929190613f6b565b60405180910390fd5b61127f8a8a8a611401565b50505050505050505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6112b882610936565b6112c181611595565b6112cb8383611749565b50505050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b61137f61357a565b6113898383611e9c565b905092915050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f33905090565b61140e8383836001611efb565b505050565b5f61141e84846112d1565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461149f5781811015611490578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161148793929190613f92565b60405180910390fd5b61149e84848484035f611efb565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611515575f6040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260040161150c919061399d565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611585575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161157c919061399d565b60405180910390fd5b6115908383836120ca565b505050565b6115a6816115a16113fa565b6120da565b50565b5f6115b48383610eee565b61168957600160065f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506116266113fa565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001905061168d565b5f90505b92915050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561170e57507f000000000000000000000000000000000000000000000000000000000000000046145b1561173b577f00000000000000000000000000000000000000000000000000000000000000009050611746565b61174361212b565b90505b90565b5f6117548383610eee565b15611829575f60065f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506117c66113fa565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a46001905061182d565b5f90505b92915050565b5f65ffffffffffff8016821115611884576030826040517f6dfcc65000000000000000000000000000000000000000000000000000000000815260040161187b929190614009565b60405180910390fd5b819050919050565b5f80835f018054905090505f80829050600583111561190d575f6118af846121c0565b846118ba919061405d565b90506118c8875f01826122b6565b5f015f9054906101000a900465ffffffffffff1665ffffffffffff168665ffffffffffff1610156118fb5780915061190b565b6001816119089190614090565b92505b505b5f61191c875f018785856122c8565b90505f811461196b5761193d875f01600183611938919061405d565b6122b6565b5f0160069054906101000a900479ffffffffffffffffffffffffffffffffffffffffffffffffffff1661196d565b5f5b94505050505092915050565b61198161233d565b5f60055f6101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6119c36113fa565b6040516119d0919061399d565b60405180910390a1565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a4a575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401611a41919061399d565b60405180910390fd5b611a555f83836120ca565b5050565b611a6a611a646113fa565b82611be1565b50565b5f611a7743611833565b905090565b5f611a8683610c60565b905081600a5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4611b878183611b828661237d565b61238e565b505050565b5f611bda611bd5600b5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206125fe565b61260d565b9050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c51575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611c48919061399d565b60405180910390fd5b611c5c825f836120ca565b5050565b5f611c6a82612664565b9050919050565b611c796126aa565b600160055f6101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611cbc6113fa565b604051611cc9919061399d565b60405180910390a1565b6060611d0960077f00000000000000000000000000000000000000000000000000000000000000006126eb90919063ffffffff16565b905090565b6060611d4460087f00000000000000000000000000000000000000000000000000000000000000006126eb90919063ffffffff16565b905090565b5f80825f018054905090505f8114611da157611d73835f01600183611d6e919061405d565b6122b6565b5f0160069054906101000a900479ffffffffffffffffffffffffffffffffffffffffffffffffffff16611da3565b5f5b915050919050565b5f611dbd611db7611693565b83612798565b9050919050565b5f805f80611dd4888888886127d8565b925092509250611de482826128bf565b829350505050949350505050565b5f611dfc83611e49565b9050808214611e445782816040517f752d88c0000000000000000000000000000000000000000000000000000000008152600401611e3b9291906140c3565b60405180910390fd5b505050565b5f60095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050559050919050565b611ea461357a565b611ef382600b5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20612a2190919063ffffffff16565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611f6b575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401611f62919061399d565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611fdb575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401611fd2919061399d565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555080156120c4578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516120bb91906137d7565b60405180910390a35b50505050565b6120d5838383612af0565b505050565b6120e48282610eee565b6121275780826040517fe2517d3f00000000000000000000000000000000000000000000000000000000815260040161211e9291906140ea565b60405180910390fd5b5050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000046306040516020016121a5959493929190614111565b60405160208183030381529060405280519060200120905090565b5f8082036121d0575f90506122b1565b5f60016121dc84612b93565b901c6001901b905060018184816121f6576121f5614162565b5b048201901c9050600181848161220f5761220e614162565b5b048201901c9050600181848161222857612227614162565b5b048201901c9050600181848161224157612240614162565b5b048201901c9050600181848161225a57612259614162565b5b048201901c9050600181848161227357612272614162565b5b048201901c9050600181848161228c5761228b614162565b5b048201901c90506122ad818285816122a7576122a6614162565b5b04612c6a565b9150505b919050565b5f825f528160205f2001905092915050565b5f5b81831015612332575f6122dd8484612c82565b90508465ffffffffffff166122f287836122b6565b5f015f9054906101000a900465ffffffffffff1665ffffffffffff16111561231c5780925061232c565b6001816123299190614090565b93505b506122ca565b819050949350505050565b612345610cde565b61237b576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f61238782610d04565b9050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156123c957505f81115b156125f9575f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146124e3575f80612454600b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20612ca761244f86612cbc565b612d29565b79ffffffffffffffffffffffffffffffffffffffffffffffffffff16915079ffffffffffffffffffffffffffffffffffffffffffffffffffff1691508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516124d892919061418f565b60405180910390a250505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146125f8575f80612569600b5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20612d6861256486612cbc565b612d29565b79ffffffffffffffffffffffffffffffffffffffffffffffffffff16915079ffffffffffffffffffffffffffffffffffffffffffffffffffff1691508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516125ed92919061418f565b60405180910390a250505b5b505050565b5f815f01805490509050919050565b5f63ffffffff801682111561265c576020826040517f6dfcc6500000000000000000000000000000000000000000000000000000000081526004016126539291906141ef565b60405180910390fd5b819050919050565b5f60095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6126b2610cde565b156126e9576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b606060ff5f1b83146127075761270083612d7d565b9050612792565b81805461271390613e45565b80601f016020809104026020016040519081016040528092919081815260200182805461273f90613e45565b801561278a5780601f106127615761010080835404028352916020019161278a565b820191905f5260205f20905b81548152906001019060200180831161276d57829003601f168201915b505050505090505b92915050565b5f6040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b5f805f7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0845f1c1115612814575f6003859250925092506128b5565b5f6001888888886040515f81526020016040526040516128379493929190614216565b6020604051602081039080840390855afa158015612857573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036128a8575f60015f801b935093509350506128b5565b805f805f1b935093509350505b9450945094915050565b5f60038111156128d2576128d1614259565b5b8260038111156128e5576128e4614259565b5b0315612a1d57600160038111156128ff576128fe614259565b5b82600381111561291257612911614259565b5b03612949576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600381111561295d5761295c614259565b5b8260038111156129705761296f614259565b5b036129b457805f1c6040517ffce698f70000000000000000000000000000000000000000000000000000000081526004016129ab91906137d7565b60405180910390fd5b6003808111156129c7576129c6614259565b5b8260038111156129da576129d9614259565b5b03612a1c57806040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600401612a1391906138ad565b60405180910390fd5b5b5050565b612a2961357a565b825f018263ffffffff1681548110612a4457612a43614286565b5b905f5260205f20016040518060400160405290815f82015f9054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff1681526020015f820160069054906101000a900479ffffffffffffffffffffffffffffffffffffffffffffffffffff1679ffffffffffffffffffffffffffffffffffffffffffffffffffff1679ffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905092915050565b612afb838383612def565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612b8e575f612b376109a1565b90505f612b426108ff565b905081811115612b8b5780826040517f9e79f854000000000000000000000000000000000000000000000000000000008152600401612b8292919061418f565b60405180910390fd5b50505b505050565b5f805f90505f608084901c1115612bb257608083901c92506080810190505b5f604084901c1115612bcc57604083901c92506040810190505b5f602084901c1115612be657602083901c92506020810190505b5f601084901c1115612c0057601083901c92506010810190505b5f600884901c1115612c1a57600883901c92506008810190505b5f600484901c1115612c3457600483901c92506004810190505b5f600284901c1115612c4e57600283901c92506002810190505b5f600184901c1115612c61576001810190505b80915050919050565b5f818310612c785781612c7a565b825b905092915050565b5f6002828418612c9291906142b3565b828416612c9f9190614090565b905092915050565b5f8183612cb491906142e3565b905092915050565b5f79ffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115612d215760d0826040517f6dfcc650000000000000000000000000000000000000000000000000000000008152600401612d18929190614369565b60405180910390fd5b819050919050565b5f80612d5c612d36610f52565b612d4c612d4288611d49565b868863ffffffff16565b87612e9d9092919063ffffffff16565b91509150935093915050565b5f8183612d759190614390565b905092915050565b60605f612d8983612eb8565b90505f602067ffffffffffffffff811115612da757612da6613e9c565b5b6040519080825280601f01601f191660200182016040528015612dd95781602001600182028036833780820191505090505b5090508181528360208201528092505050919050565b612dfa838383612f06565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612e8d575f612e366108ff565b90505f612e41612f1e565b905080821115612e8a5781816040517f1cb15d26000000000000000000000000000000000000000000000000000000008152600401612e8192919061418f565b60405180910390fd5b50505b612e98838383612f41565b505050565b5f80612eac855f018585612ff9565b91509150935093915050565b5f8060ff835f1c169050601f811115612efd576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80915050919050565b612f0e6126aa565b612f19838383613361565b505050565b5f79ffffffffffffffffffffffffffffffffffffffffffffffffffff8016905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612f8d57612f8a600c612d68612f8584612cbc565b612d29565b50505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612fd957612fd6600c612ca7612fd184612cbc565b612d29565b50505b612ff4612fe584610c60565b612fee84610c60565b8361238e565b505050565b5f805f858054905090505f811115613279575f6130228760018461301d919061405d565b6122b6565b6040518060400160405290815f82015f9054906101000a900465ffffffffffff1665ffffffffffff1665ffffffffffff1681526020015f820160069054906101000a900479ffffffffffffffffffffffffffffffffffffffffffffffffffff1679ffffffffffffffffffffffffffffffffffffffffffffffffffff1679ffffffffffffffffffffffffffffffffffffffffffffffffffff168152505090508565ffffffffffff16815f015165ffffffffffff16111561310d576040517f2520601d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8565ffffffffffff16815f015165ffffffffffff160361318f578461313e88600185613139919061405d565b6122b6565b5f0160066101000a81548179ffffffffffffffffffffffffffffffffffffffffffffffffffff021916908379ffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550613268565b8660405180604001604052808865ffffffffffff1681526020018779ffffffffffffffffffffffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003905f5260205f20015f909190919091505f820151815f015f6101000a81548165ffffffffffff021916908365ffffffffffff1602179055506020820151815f0160066101000a81548179ffffffffffffffffffffffffffffffffffffffffffffffffffff021916908379ffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b806020015185935093505050613359565b8560405180604001604052808765ffffffffffff1681526020018679ffffffffffffffffffffffffffffffffffffffffffffffffffff16815250908060018154018082558091505060019003905f5260205f20015f909190919091505f820151815f015f6101000a81548165ffffffffffff021916908365ffffffffffff1602179055506020820151815f0160066101000a81548179ffffffffffffffffffffffffffffffffffffffffffffffffffff021916908379ffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505f8492509250505b935093915050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036133b1578060025f8282546133a59190614090565b9250508190555061347f565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508181101561343a578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161343193929190613f92565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036134c6578060025f8282540392505081905550613510565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161356d91906137d7565b60405180910390a3505050565b60405180604001604052805f65ffffffffffff1681526020015f79ffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090565b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6135ee816135ba565b81146135f8575f80fd5b50565b5f81359050613609816135e5565b92915050565b5f60208284031215613624576136236135b6565b5b5f613631848285016135fb565b91505092915050565b5f8115159050919050565b61364e8161363a565b82525050565b5f6020820190506136675f830184613645565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6136af8261366d565b6136b98185613677565b93506136c9818560208601613687565b6136d281613695565b840191505092915050565b5f6020820190508181035f8301526136f581846136a5565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613726826136fd565b9050919050565b6137368161371c565b8114613740575f80fd5b50565b5f813590506137518161372d565b92915050565b5f819050919050565b61376981613757565b8114613773575f80fd5b50565b5f8135905061378481613760565b92915050565b5f80604083850312156137a05761379f6135b6565b5b5f6137ad85828601613743565b92505060206137be85828601613776565b9150509250929050565b6137d181613757565b82525050565b5f6020820190506137ea5f8301846137c8565b92915050565b5f805f60608486031215613807576138066135b6565b5b5f61381486828701613743565b935050602061382586828701613743565b925050604061383686828701613776565b9150509250925092565b5f819050919050565b61385281613840565b811461385c575f80fd5b50565b5f8135905061386d81613849565b92915050565b5f60208284031215613888576138876135b6565b5b5f6138958482850161385f565b91505092915050565b6138a781613840565b82525050565b5f6020820190506138c05f83018461389e565b92915050565b5f80604083850312156138dc576138db6135b6565b5b5f6138e98582860161385f565b92505060206138fa85828601613743565b9150509250929050565b5f60ff82169050919050565b61391981613904565b82525050565b5f6020820190506139325f830184613910565b92915050565b5f6020828403121561394d5761394c6135b6565b5b5f61395a84828501613776565b91505092915050565b5f60208284031215613978576139776135b6565b5b5f61398584828501613743565b91505092915050565b6139978161371c565b82525050565b5f6020820190506139b05f83018461398e565b92915050565b5f63ffffffff82169050919050565b6139ce816139b6565b82525050565b5f6020820190506139e75f8301846139c5565b92915050565b5f7fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b613a21816139ed565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b613a5981613757565b82525050565b5f613a6a8383613a50565b60208301905092915050565b5f602082019050919050565b5f613a8c82613a27565b613a968185613a31565b9350613aa183613a41565b805f5b83811015613ad1578151613ab88882613a5f565b9750613ac383613a76565b925050600181019050613aa4565b5085935050505092915050565b5f60e082019050613af15f83018a613a18565b8181036020830152613b0381896136a5565b90508181036040830152613b1781886136a5565b9050613b2660608301876137c8565b613b33608083018661398e565b613b4060a083018561389e565b81810360c0830152613b528184613a82565b905098975050505050505050565b5f65ffffffffffff82169050919050565b613b7a81613b60565b82525050565b5f602082019050613b935f830184613b71565b92915050565b613ba281613904565b8114613bac575f80fd5b50565b5f81359050613bbd81613b99565b92915050565b5f805f805f8060c08789031215613bdd57613bdc6135b6565b5b5f613bea89828a01613743565b9650506020613bfb89828a01613776565b9550506040613c0c89828a01613776565b9450506060613c1d89828a01613baf565b9350506080613c2e89828a0161385f565b92505060a0613c3f89828a0161385f565b9150509295509295509295565b5f805f805f805f60e0888a031215613c6757613c666135b6565b5b5f613c748a828b01613743565b9750506020613c858a828b01613743565b9650506040613c968a828b01613776565b9550506060613ca78a828b01613776565b9450506080613cb88a828b01613baf565b93505060a0613cc98a828b0161385f565b92505060c0613cda8a828b0161385f565b91505092959891949750929550565b5f8060408385031215613cff57613cfe6135b6565b5b5f613d0c85828601613743565b9250506020613d1d85828601613743565b9150509250929050565b613d30816139b6565b8114613d3a575f80fd5b50565b5f81359050613d4b81613d27565b92915050565b5f8060408385031215613d6757613d666135b6565b5b5f613d7485828601613743565b9250506020613d8585828601613d3d565b9150509250929050565b613d9881613b60565b82525050565b5f79ffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b613dcc81613d9e565b82525050565b604082015f820151613de65f850182613d8f565b506020820151613df96020850182613dc3565b50505050565b5f604082019050613e125f830184613dd2565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680613e5c57607f821691505b602082108103613e6f57613e6e613e18565b5b50919050565b5f604082019050613e885f8301856137c8565b613e956020830184613b71565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f608082019050613edc5f83018761389e565b613ee9602083018661398e565b613ef660408301856137c8565b613f0360608301846137c8565b95945050505050565b5f60c082019050613f1f5f83018961389e565b613f2c602083018861398e565b613f39604083018761398e565b613f4660608301866137c8565b613f5360808301856137c8565b613f6060a08301846137c8565b979650505050505050565b5f604082019050613f7e5f83018561398e565b613f8b602083018461398e565b9392505050565b5f606082019050613fa55f83018661398e565b613fb260208301856137c8565b613fbf60408301846137c8565b949350505050565b5f819050919050565b5f819050919050565b5f613ff3613fee613fe984613fc7565b613fd0565b613904565b9050919050565b61400381613fd9565b82525050565b5f60408201905061401c5f830185613ffa565b61402960208301846137c8565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61406782613757565b915061407283613757565b925082820390508181111561408a57614089614030565b5b92915050565b5f61409a82613757565b91506140a583613757565b92508282019050808211156140bd576140bc614030565b5b92915050565b5f6040820190506140d65f83018561398e565b6140e360208301846137c8565b9392505050565b5f6040820190506140fd5f83018561398e565b61410a602083018461389e565b9392505050565b5f60a0820190506141245f83018861389e565b614131602083018761389e565b61413e604083018661389e565b61414b60608301856137c8565b614158608083018461398e565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6040820190506141a25f8301856137c8565b6141af60208301846137c8565b9392505050565b5f819050919050565b5f6141d96141d46141cf846141b6565b613fd0565b613904565b9050919050565b6141e9816141bf565b82525050565b5f6040820190506142025f8301856141e0565b61420f60208301846137c8565b9392505050565b5f6080820190506142295f83018761389e565b6142366020830186613910565b614243604083018561389e565b614250606083018461389e565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6142bd82613757565b91506142c883613757565b9250826142d8576142d7614162565b5b828204905092915050565b5f6142ed82613d9e565b91506142f883613d9e565b9250828203905079ffffffffffffffffffffffffffffffffffffffffffffffffffff81111561432a57614329614030565b5b92915050565b5f819050919050565b5f61435361434e61434984614330565b613fd0565b613904565b9050919050565b61436381614339565b82525050565b5f60408201905061437c5f83018561435a565b61438960208301846137c8565b9392505050565b5f61439a82613d9e565b91506143a583613d9e565b9250828201905079ffffffffffffffffffffffffffffffffffffffffffffffffffff8111156143d7576143d6614030565b5b9291505056fea2646970667358221220e36d2c7089a78586f0d642e6e93e8fe783cdde128228eb25d19b6378bfe2788864736f6c634300081a003300000000000000000000000000000000000000000000152d02c7e14af6800000