0x6080604052348015600e575f5ffd5b50614ada8061001c5f395ff3fe6080604052600436106100e0575f3560e01c80638da5cb5b1161007e578063c5466a6611610058578063c5466a66146102e0578063cd806f3b146102ff578063f04f27071461031e578063f2fde38b1461033d576100e7565b80638da5cb5b1461025a5780639551ae44146102a0578063bd5dec98146102c1576100e7565b80635b6333eb116100ba5780635b6333eb146101da5780636386c1c714610206578063715018a6146102325780638129fc1c14610246576100e7565b80631b11d0ff1461014d57806328e2fdac14610181578063363ec22c146101ae576100e7565b366100e757005b36601d0361014b575f5f5f5f6101315f368080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061035c92505050565b935093509350935061014584848484610386565b50505050505b005b348015610158575f5ffd5b5061016c610167366004613085565b61046b565b60405190151581526020015b60405180910390f35b34801561018c575f5ffd5b506101a061019b366004613147565b610386565b604051908152602001610178565b3480156101b9575f5ffd5b506101cd6101c83660046131a0565b6105d3565b604051610178919061333f565b3480156101e5575f5ffd5b506101f96101f43660046133c0565b6106ab565b60405161017891906135f3565b348015610211575f5ffd5b506102256102203660046133c0565b6107b3565b6040516101789190613602565b34801561023d575f5ffd5b5061014b610ffe565b348015610251575f5ffd5b5061014b611011565b348015610265575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546040516001600160a01b039091168152602001610178565b3480156102ab575f5ffd5b506102b4611185565b6040516101789190613741565b3480156102cc575f5ffd5b5061014b6102db3660046131a0565b611418565b3480156102eb575f5ffd5b5061014b6102fa3660046137d8565b6115fc565b34801561030a575f5ffd5b506101a06103193660046138e7565b611718565b348015610329575f5ffd5b5061014b610338366004613a72565b61180e565b348015610348575f5ffd5b5061014b6103573660046133c0565b61195e565b60208101516024820151602883015160299093015160e092831c949190921c9260f81c9160601c90565b5f5f610391836119b4565b9050670de0b6b3a76400008111156103ed578360018111156103b5576103b5613b8b565b6040516001600160a01b038516907f6218727b640e789cac2d5a71fb103b3772a59ff030e58f17e1032b8d6f2011ca905f90a3610462565b5f6103f88685611a54565b90508563ffffffff168763ffffffff161461041f5761041a8787878785611b2a565b610455565b5f8787868885604051602001610439959493929190613bb8565b604051602081830303815290604052905061045381611b92565b505b61045e86611e9b565b9250505b50949350505050565b5f3373a238dd80c259a72e81d7e4664a9801593f98d1c5146104ee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f6e6f7420617574686f72697a656400000000000000000000000000000000000060448201526064015b60405180910390fd5b6001600160a01b0384163014610560576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f696e76616c696420696e69746961746f7200000000000000000000000000000060448201526064016104e5565b61059e83838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250611b9292505050565b6105c68773a238dd80c259a72e81d7e4664a9801593f98d1c56105c189896126bd565b6126cc565b5060019695505050505050565b60605f8267ffffffffffffffff8111156105ef576105ef61383c565b60405190808252806020026020018201604052801561064557816020015b6040805160a0810182525f8082526020808301829052928201526060808201819052608082015282525f1990920191018161060d5790505b5090505f5b838110156106a15761067c85858381811061066757610667613c24565b905060200201602081019061022091906133c0565b82828151811061068e5761068e613c24565b602090810291909101015260010161064a565b5090505b92915050565b6106b3612fa1565b6040517f35ea6a750000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015273a238dd80c259a72e81d7e4664a9801593f98d1c5906335ea6a75906024016101e060405180830381865afa158015610723573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107479190613ce5565b808252516020820151610787825161ffff80821692601083901c821692602081901c831692603082901c60ff90811693604084901c9092169260a81c1690565b6080870152506060850152604084015260208301528152815160981c61ffff1660a09091015250919050565b6040805160a0810182525f8082526020820181905291810191909152606080820181905260808201526040517f4417a5830000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201525f9073a238dd80c259a72e81d7e4664a9801593f98d1c590634417a58390602401602060405180830381865afa15801561084d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108719190613e0f565b905061087c81511590565b1515808352610feb576040517feddf1b790000000000000000000000000000000000000000000000000000000081526001600160a01b038416600482015273a238dd80c259a72e81d7e4664a9801593f98d1c59063eddf1b7990602401602060405180830381865afa1580156108f4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109189190613e29565b826040019060ff16908160ff16815250505f73a238dd80c259a72e81d7e4664a9801593f98d1c56001600160a01b031663d1946dbc6040518163ffffffff1660e01b81526004015f60405180830381865afa158015610979573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526109a09190810190613e40565b80519091508067ffffffffffffffff8111156109be576109be61383c565b604051908082528060200260200182016040528015610a3357816020015b610a206040518060e001604052805f6001600160a01b031681526020015f81526020015f151581526020015f81526020015f81526020015f81526020015f81525090565b8152602001906001900390816109dc5790505b5060608501528067ffffffffffffffff811115610a5257610a5261383c565b604051908082528060200260200182016040528015610a9b57816020015b604080516060810182525f80825260208083018290529282015282525f19909201910181610a705790505b5060808501525f5b81811015610fe7575f610ab68583612949565b90505f610ac386846129ca565b90505f610ad08785612a4d565b905060405180606001604052808215158152602001831515815260200184151581525088608001518581518110610b0957610b09613c24565b60200260200101819052505f73a238dd80c259a72e81d7e4664a9801593f98d1c56001600160a01b03166335ea6a75888781518110610b4a57610b4a613c24565b60200260200101516040518263ffffffff1660e01b8152600401610b7d91906001600160a01b0391909116815260200190565b6101e060405180830381865afa158015610b99573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bbd9190613ce5565b9050868581518110610bd157610bd1613c24565b602002602001015189606001518681518110610bef57610bef613c24565b60209081029190910101516001600160a01b0391821690526101008201516040517f1da24f3e0000000000000000000000000000000000000000000000000000000081528c83166004820152911690631da24f3e90602401602060405180830381865afa158015610c62573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c869190613e29565b89606001518681518110610c9c57610c9c613c24565b602002602001015160200181815250508289606001518681518110610cc357610cc3613c24565b60209081029190910101519015156040909101528315610fd7576101408101516040517f1da24f3e0000000000000000000000000000000000000000000000000000000081526001600160a01b038c8116600483015290911690631da24f3e90602401602060405180830381865afa158015610d41573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d659190613e29565b89606001518681518110610d7b57610d7b613c24565b6020908102919091010151608001526101208101516001600160a01b031615610fd7576101208101516040517fc634dfaa0000000000000000000000000000000000000000000000000000000081526001600160a01b038c811660048301529091169063c634dfaa90602401602060405180830381865afa158015610e02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e269190613e29565b89606001518681518110610e3c57610e3c613c24565b602002602001015160a001818152505088606001518581518110610e6257610e62613c24565b602002602001015160a001515f14610fd7576101208101516040517fe78c9b3b0000000000000000000000000000000000000000000000000000000081526001600160a01b038c811660048301529091169063e78c9b3b90602401602060405180830381865afa158015610ed8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610efc9190613e29565b89606001518681518110610f1257610f12613c24565b6020908102919091010151606001526101208101516040517f79ce6b8c0000000000000000000000000000000000000000000000000000000081526001600160a01b038c81166004830152909116906379ce6b8c90602401602060405180830381865afa158015610f85573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fa99190613ed0565b64ffffffffff1689606001518681518110610fc657610fc6613c24565b602002602001015160c00181815250505b505060019092019150610aa39050565b5050505b5064ffffffffff42166020820152919050565b611006612ad1565b61100f5f612b45565b565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff165f8115801561105b5750825b90505f8267ffffffffffffffff1660011480156110775750303b155b905081158015611085575080155b156110bc576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000166001178555831561111d5784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b831561117e5784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050565b6111a960405180606001604052806060815260200160608152602001606081525090565b73a238dd80c259a72e81d7e4664a9801593f98d1c56001600160a01b031663d1946dbc6040518163ffffffff1660e01b81526004015f60405180830381865afa1580156111f8573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261121f9190810190613e40565b808252515f8167ffffffffffffffff81111561123d5761123d61383c565b60405190808252806020026020018201604052801561127657816020015b611263612fa1565b81526020019060019003908161125b5790505b5090505f8267ffffffffffffffff8111156112935761129361383c565b6040519080825280602002602001820160405280156112ec57816020015b6040805160a0810182525f8082526020808301829052928201819052606080830191909152608082015282525f199092019101816112b15790505b5090505f5b838160ff16101561140657611324855f01518260ff168151811061131757611317613c24565b60200260200101516106ab565b838260ff168151811061133957611339613c24565b60209081029190910101526040517f6c6f6ae100000000000000000000000000000000000000000000000000000000815260ff8216600482015273a238dd80c259a72e81d7e4664a9801593f98d1c590636c6f6ae1906024015f60405180830381865afa1580156113ac573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526113d39190810190613f17565b828260ff16815181106113e8576113e8613c24565b602002602001018190525080806113fe90613fdf565b9150506112f1565b50602084019190915260408301525090565b611420612ad1565b5f5b818110156115a1575f83838381811061143d5761143d613c24565b905060200201602081019061145291906133c0565b9050806001600160a01b031663a9059cbb6114947f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa1580156114ef573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115139190613e29565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af1158015611573573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115979190614031565b5050600101611422565b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546040516001600160a01b03909116904780156108fc02915f818181858888f193505050501580156115f7573d5f5f3e3d5ffd5b505050565b5f42433360405160200161164893929190928352602083019190915260601b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016604082015260540190565b6040516020818303038152906040528051906020012090505f8187878787873060405161167490613064565b95865263ffffffff94851660208701529390921660408501526001600160a01b03908116606085015290811660808401521660a082015260c0018190604051809103905ff59050801580156116cb573d5f5f3e3d5ffd5b50905086816001600160a01b0316856001600160a01b03167f18303525de15a98e4d507549d494cb0933ccc4ef7cda4926728a19114e2e00e160405160405180910390a450505050505050565b604080517fe8eba313000000000000000000000000000000000000000000000000000000008152825163ffffffff9081166004830152602084015160ff16602483015291830151909116604482015260608201516001600160a01b0316606482015273a238dd80c259a72e81d7e4664a9801593f98d1c56084820152732cc0fc26ed4563a5ce5e8bdcfe1a2878676ae15660a48201525f9073f03a74cd7ed752526e3be0f26f2a38b05d44ac079063e8eba3139060c401602060405180830381865afa1580156117ea573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106a59190613e29565b61181781611b92565b5f845f8151811061182a5761182a613c24565b602002602001015190505f845f8151811061184757611847613c24565b60209081029190910101516040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ba12222222228d8ba445958a75a0704d566bf2c86004820152602481018290529091506001600160a01b0383169063a9059cbb906044016020604051808303815f875af11580156118cc573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118f09190614031565b611956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600360248201527f2e2e2e000000000000000000000000000000000000000000000000000000000060448201526064016104e5565b505050505050565b611966612ad1565b6001600160a01b0381166119a8576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024016104e5565b6119b181612b45565b50565b6040517fbf92857c0000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201525f9073a238dd80c259a72e81d7e4664a9801593f98d1c59063bf92857c9060240160c060405180830381865afa158015611a25573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a49919061404a565b979650505050505050565b5f5f611a5f84612bcd565b6040517f28dd2d010000000000000000000000000000000000000000000000000000000081526001600160a01b038083166004830152851660248201529091505f90819073d82a47fdebb5bf5329b09441c3dab4b5df2153ad906328dd2d019060440161012060405180830381865afa158015611ade573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b029190614090565b5050505050509250925050611b2081836126bd90919063ffffffff16565b9695505050505050565b5f8585848685604051602001611b44959493929190613bb8565b60408051601f1981840301815291905290505f611b618684612cf3565b6001811115611b7257611b72613b8b565b14611b8757611b82858383612db4565b611956565b611956858383612ecf565b5f5f5f5f84806020019051810190611baa9190614124565b9450509350935093505f611bbd85612bcd565b90505f611bc985612bcd565b9050611bea8173a238dd80c259a72e81d7e4664a9801593f98d1c5856126cc565b6040517ea718a90000000000000000000000000000000000000000000000000000000081526001600160a01b0380841660048301528083166024830152851660448201525f1960648201525f608482015273a238dd80c259a72e81d7e4664a9801593f98d1c59062a718a99060a4015f604051808303815f87803b158015611c70575f5ffd5b505af1158015611c82573d5f5f3e3d5ffd5b50505050806001600160a01b0316826001600160a01b031614611e92576040517f8af2f60000000000000000000000000000000000000000000000000000000000815263ffffffff8088166004830152861660248201525f9073367abf6e6fae8650883f389ef097404ab5d025f590638af2f600906044015f604051808303815f875af1158015611d15573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d3c919081019061418b565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529091505f906001600160a01b038516906370a0823190602401602060405180830381865afa158015611d9c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dc09190613e29565b9050611de184732626664c2603336e57b271c5c0b26f421741e481836126cc565b604080516080810182528381523060208201528082018390525f606082015290517fb858183f000000000000000000000000000000000000000000000000000000008152732626664c2603336e57b271c5c0b26f421741e4819163b858183f91611e4e91906004016141d8565b6020604051808303815f875af1158015611e6a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e8e9190613e29565b5050505b50505050505050565b5f5f611ea683612bcd565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529091505f906001600160a01b038316906370a0823190602401602060405180830381865afa158015611f06573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f2a9190613e29565b9050805f03611f3c57505f9392505050565b6040517fb3596f0700000000000000000000000000000000000000000000000000000000815273420000000000000000000000000000000000000660048201525f90732cc0fc26ed4563a5ce5e8bdcfe1a2878676ae1569063b3596f0790602401602060405180830381865afa158015611fb8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fdc9190613e29565b90507fffffffffffffffffffffffffbdfffffffffffffffffffffffffffffffffffffa6001600160a01b038416016120d95761202a670de0b6b3a76400006120248484612f67565b90612f8f565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ac9a947463c870e6b5c0cd6fa9cd1de358ef91d66004820152602481018490529094507342000000000000000000000000000000000000069063a9059cbb906044016020604051808303815f875af11580156120af573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120d39190614031565b506126b5565b60646101f460607fffffffffffffffffffffffff7cca76032912491f70b383cd2b08e4ab425fd6ed6001600160a01b038716016121a5576040517f833589fcd6edb6e08f4c7c32d4f71b54bda0291300000000000000000000000060208201527fffffff000000000000000000000000000000000000000000000000000000000060e884901b1660348201527f42000000000000000000000000000000000000060000000000000000000000006037820152604b015b6040516020818303038152906040529050612561565b7fffffffffffffffffffffffff3e345c0315cbb06d26dc63f73fa97090d0f11bae6001600160a01b03871601612258576040517fc1cba3fcea344f92d9239c08c0568f6f2f0ee45200000000000000000000000060208201527fffffff000000000000000000000000000000000000000000000000000000000060e885901b1660348201527f42000000000000000000000000000000000000060000000000000000000000006037820152604b0161218f565b7fffffffffffffffffffffffffd51c0e1380e0afed30154fe7a403855c30f213de6001600160a01b0387160161230b576040517f2ae3f1ec7f1f5012cfeab0185bfc7aa3cf0dec2200000000000000000000000060208201527fffffff000000000000000000000000000000000000000000000000000000000060e884901b1660348201527f42000000000000000000000000000000000000060000000000000000000000006037820152604b0161218f565b7fffffffffffffffffffffffff2655137949a27909584a4e4f3bd005ace8ef49366001600160a01b038716016123ee576040517fd9aaec86b65d86f6a7b5b1b0c42ffa531710b6ca00000000000000000000000060208201527fffffff000000000000000000000000000000000000000000000000000000000060e885811b821660348401527f833589fcd6edb6e08f4c7c32d4f71b54bda02913000000000000000000000000603784015284901b16604b8201527f4200000000000000000000000000000000000006000000000000000000000000604e82015260620161218f565b7ffffffffffffffffffffffffffb3fa6651a5bb8a83f5090613c46c2576893eaf66001600160a01b038716016124a1576040517f04c0599ae5a44757c0af6f9ec3b93da8976c150a00000000000000000000000060208201527fffffff000000000000000000000000000000000000000000000000000000000060e885901b1660348201527f42000000000000000000000000000000000000060000000000000000000000006037820152604b0161218f565b7fffffffffffffffffffffffff34483ffff54774b8c4e0a5026107f7bbf112cc416001600160a01b03871601612561576040517fcbb7c0000ab88b473b1f5afd9ef808440eed33bf00000000000000000000000060208201527fffffff000000000000000000000000000000000000000000000000000000000060e884901b1660348201527f42000000000000000000000000000000000000060000000000000000000000006037820152604b0160405160208183030381529060405290505b61258086732626664c2603336e57b271c5c0b26f421741e481876126cc565b6040805160808101825282815273ac9a947463c870e6b5c0cd6fa9cd1de358ef91d660208201528082018790525f6060820181905291517fb858183f000000000000000000000000000000000000000000000000000000008152732626664c2603336e57b271c5c0b26f421741e4819163b858183f9161260391906004016141d8565b6020604051808303815f875af115801561261f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126439190613e29565b905080156126b057612661670de0b6b3a76400006120248388612f67565b60405182815290985073ac9a947463c870e6b5c0cd6fa9cd1de358ef91d69030907f5f944108a366d1ddf0f761b156f6da4cbee5a21d43e3ae2a90ca405b02fa75fb9060200160405180910390a35b505050505b505050919050565b808201828110156106a5575f5ffd5b6040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b0383811660248301525f919085169063dd62ed3e90604401602060405180830381865afa158015612732573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127569190613e29565b905081811015612943578015612854576040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301525f602483015285169063095ea7b3906044016020604051808303815f875af11580156127ca573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127ee9190614031565b612854576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f726573657420616c6c6f77616e6365206661696c65640000000000000000000060448201526064016104e5565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301525f19602483015285169063095ea7b3906044016020604051808303815f875af11580156128b9573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128dd9190614031565b612943576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f617070726f7665206661696c656400000000000000000000000000000000000060448201526064016104e5565b50505050565b60408051808201909152600281527f373400000000000000000000000000000000000000000000000000000000000060208201525f90608083106129ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104e59190614226565b50509051600191821b1c16151590565b60408051808201909152600281527f373400000000000000000000000000000000000000000000000000000000000060208201525f9060808310612a3b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104e59190614226565b50509051600191821b82011c16151590565b60408051808201909152600281527f373400000000000000000000000000000000000000000000000000000000000060208201525f9060808310612abe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104e59190614226565b5050905160019190911b1c600316151590565b33612b037f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461100f576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016104e5565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080547fffffffffffffffffffffffff000000000000000000000000000000000000000081166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8163ffffffff165f03612bf65750734200000000000000000000000000000000000006919050565b8163ffffffff16600103612c1f5750732ae3f1ec7f1f5012cfeab0185bfc7aa3cf0dec22919050565b8163ffffffff16600203612c48575073d9aaec86b65d86f6a7b5b1b0c42ffa531710b6ca919050565b8163ffffffff16600303612c71575073c1cba3fcea344f92d9239c08c0568f6f2f0ee452919050565b8163ffffffff16600403612c9a575073833589fcd6edb6e08f4c7c32d4f71b54bda02913919050565b8163ffffffff16600503612cc357507304c0599ae5a44757c0af6f9ec3b93da8976c150a919050565b8163ffffffff16600603612cec575073cbb7c0000ab88b473b1f5afd9ef808440eed33bf919050565b505f919050565b5f5f612cfe84612bcd565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ba12222222228d8ba445958a75a0704d566bf2c860048201529091505f906001600160a01b038316906370a0823190602401602060405180830381865afa158015612d72573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d969190613e29565b9050838110612daa576001925050506106a5565b505f949350505050565b5f612dbe84612bcd565b6040805160018082528183019092529192505f91906020808301908036833701905050905081815f81518110612df657612df6613c24565b6001600160a01b0392909216602092830291909101909101526040805160018082528183019092525f9181602001602082028036833701905050905084815f81518110612e4557612e45613c24565b60209081029190910101526040517f5c38449e00000000000000000000000000000000000000000000000000000000815273ba12222222228d8ba445958a75a0704d566bf2c890635c38449e90612ea6903090869086908a90600401614238565b5f604051808303815f87803b158015612ebd575f5ffd5b505af1158015611e8e573d5f5f3e3d5ffd5b5f612ed984612bcd565b6040517f42b0b77c00000000000000000000000000000000000000000000000000000000815290915073a238dd80c259a72e81d7e4664a9801593f98d1c5906342b0b77c90612f349030908590889088905f906004016142dd565b5f604051808303815f87803b158015612f4b575f5ffd5b505af1158015612f5d573d5f5f3e3d5ffd5b5050505050505050565b5f821580612f8757505081810281838281612f8457612f84614329565b04145b6106a5575f5ffd5b5f612f9a8284614356565b9392505050565b60408051610240810182525f6102208201818152928201928352606082018190526080820181905260a0820181905260c0820181905260e08201819052610100820181905261012082018190526101408201819052610160820181905261018082018190526101a082018190526101c082018190526101e08201819052610200820152908190815260200161305f6040518060c001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b905290565b6107168061438f83390190565b6001600160a01b03811681146119b1575f5ffd5b5f5f5f5f5f5f60a0878903121561309a575f5ffd5b86356130a581613071565b9550602087013594506040870135935060608701356130c381613071565b9250608087013567ffffffffffffffff8111156130de575f5ffd5b8701601f810189136130ee575f5ffd5b803567ffffffffffffffff811115613104575f5ffd5b896020828401011115613115575f5ffd5b60208201935080925050509295509295509295565b63ffffffff811681146119b1575f5ffd5b600281106119b1575f5ffd5b5f5f5f5f6080858703121561315a575f5ffd5b84356131658161312a565b935060208501356131758161312a565b925060408501356131858161313b565b9150606085013561319581613071565b939692955090935050565b5f5f602083850312156131b1575f5ffd5b823567ffffffffffffffff8111156131c7575f5ffd5b8301601f810185136131d7575f5ffd5b803567ffffffffffffffff8111156131ed575f5ffd5b8560208260051b8401011115613201575f5ffd5b6020919091019590945092505050565b5f8151808452602084019350602083015f5b8281101561326357815180511515875260208101511515602088015260408101511515604088015250606086019550602082019150600181019050613223565b5093949350505050565b5f60a0830182511515845264ffffffffff602084015116602085015260ff6040840151166040850152606083015160a0606086015281815180845260c0870191506020830193505f92505b808310156133255783516001600160a01b03815116835260208101516020840152604081015115156040840152606081015160608401526080810151608084015260a081015160a084015260c081015160c08401525060e0820191506020840193506001830192506132b8565b50608085015192508581036080870152611b208184613211565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b828110156133b4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc087860301845261339f85835161326d565b94506020938401939190910190600101613365565b50929695505050505050565b5f602082840312156133d0575f5ffd5b8135612f9a81613071565b80518051518352602081015161340560208501826fffffffffffffffffffffffffffffffff169052565b50604081015161342960408501826fffffffffffffffffffffffffffffffff169052565b50606081015161344d60608501826fffffffffffffffffffffffffffffffff169052565b50608081015161347160808501826fffffffffffffffffffffffffffffffff169052565b5060a081015161349560a08501826fffffffffffffffffffffffffffffffff169052565b5060c08101516134ae60c085018264ffffffffff169052565b5060e08101516134c460e085018261ffff169052565b506101008101516134e16101008501826001600160a01b03169052565b506101208101516134fe6101208501826001600160a01b03169052565b5061014081015161351b6101408501826001600160a01b03169052565b506101608101516135386101608501826001600160a01b03169052565b5061018081015161355e6101808501826fffffffffffffffffffffffffffffffff169052565b506101a08101516135846101a08501826fffffffffffffffffffffffffffffffff169052565b506101c081015190506135ac6101c08401826fffffffffffffffffffffffffffffffff169052565b5060209081015180516101e08401529081015161020083015260408101516102208301526060810151610240830152608081015161026083015260a0015161028090910152565b6102a081016106a582846133db565b602081525f612f9a602083018461326d565b5f8151808452602084019350602083015f5b82811015613263576136398683516133db565b6102a0959095019460209190910190600101613626565b5f5b8381101561366a578181015183820152602001613652565b50505f910152565b5f8151808452613689816020860160208601613650565b601f01601f19169290920160200192915050565b5f82825180855260208501945060208160051b830101602085015f5b8381101561373557601f19858403018852815161ffff815116845261ffff602082015116602085015261ffff60408201511660408501526001600160a01b0360608201511660608501526080810151905060a0608085015261371e60a0850182613672565b6020998a01999094509290920191506001016136b9565b50909695505050505050565b602080825282516060838301528051608084018190525f929190910190829060a08501905b80831015613792576001600160a01b038451168252602082019150602084019350600183019250613766565b5060208601519250601f198582030160408601526137b08184613614565b925050506040840151601f198483030160608501526137cf828261369d565b95945050505050565b5f5f5f5f5f60a086880312156137ec575f5ffd5b8535945060208601356137fe8161312a565b9350604086013561380e8161312a565b9250606086013561381e81613071565b9150608086013561382e81613071565b809150509295509295909350565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516101e0810167ffffffffffffffff8111828210171561388d5761388d61383c565b60405290565b60405160a0810167ffffffffffffffff8111828210171561388d5761388d61383c565b604051601f8201601f1916810167ffffffffffffffff811182821017156138df576138df61383c565b604052919050565b5f60808284031280156138f8575f5ffd5b506040516080810167ffffffffffffffff8111828210171561391c5761391c61383c565b604052823561392a8161312a565b8152602083013560ff8116811461393f575f5ffd5b602082015260408301356139528161312a565b6040820152606083013561396581613071565b60608201529392505050565b5f67ffffffffffffffff82111561398a5761398a61383c565b5060051b60200190565b5f82601f8301126139a3575f5ffd5b81356139b66139b182613971565b6138b6565b8082825260208201915060208360051b8601019250858311156139d7575f5ffd5b602085015b838110156139f45780358352602092830192016139dc565b5095945050505050565b5f67ffffffffffffffff821115613a1757613a1761383c565b50601f01601f191660200190565b5f82601f830112613a34575f5ffd5b8135613a426139b1826139fe565b818152846020838601011115613a56575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f5f5f60808587031215613a85575f5ffd5b843567ffffffffffffffff811115613a9b575f5ffd5b8501601f81018713613aab575f5ffd5b8035613ab96139b182613971565b8082825260208201915060208360051b850101925089831115613ada575f5ffd5b6020840193505b82841015613b05578335613af481613071565b825260209384019390910190613ae1565b9650505050602085013567ffffffffffffffff811115613b23575f5ffd5b613b2f87828801613994565b935050604085013567ffffffffffffffff811115613b4b575f5ffd5b613b5787828801613994565b925050606085013567ffffffffffffffff811115613b73575f5ffd5b613b7f87828801613a25565b91505092959194509250565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b63ffffffff8681168252851660208201526001600160a01b038416604082015260a0810160028410613c11577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6060820193909352608001529392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215613c61575f5ffd5b6040516020810167ffffffffffffffff81118282101715613c8457613c8461383c565b6040529151825250919050565b80516fffffffffffffffffffffffffffffffff81168114613cb0575f5ffd5b919050565b805164ffffffffff81168114613cb0575f5ffd5b805161ffff81168114613cb0575f5ffd5b8051613cb081613071565b5f6101e0828403128015613cf7575f5ffd5b50613d00613869565b613d0a8484613c51565b8152613d1860208401613c91565b6020820152613d2960408401613c91565b6040820152613d3a60608401613c91565b6060820152613d4b60808401613c91565b6080820152613d5c60a08401613c91565b60a0820152613d6d60c08401613cb5565b60c0820152613d7e60e08401613cc9565b60e0820152613d906101008401613cda565b610100820152613da36101208401613cda565b610120820152613db66101408401613cda565b610140820152613dc96101608401613cda565b610160820152613ddc6101808401613c91565b610180820152613def6101a08401613c91565b6101a0820152613e026101c08401613c91565b6101c08201529392505050565b5f60208284031215613e1f575f5ffd5b612f9a8383613c51565b5f60208284031215613e39575f5ffd5b5051919050565b5f60208284031215613e50575f5ffd5b815167ffffffffffffffff811115613e66575f5ffd5b8201601f81018413613e76575f5ffd5b8051613e846139b182613971565b8082825260208201915060208360051b850101925086831115613ea5575f5ffd5b6020840193505b82841015611b20578351613ebf81613071565b825260209384019390910190613eac565b5f60208284031215613ee0575f5ffd5b612f9a82613cb5565b5f613ef66139b1846139fe565b9050828152838383011115613f09575f5ffd5b612f9a836020830184613650565b5f60208284031215613f27575f5ffd5b815167ffffffffffffffff811115613f3d575f5ffd5b820160a08185031215613f4e575f5ffd5b613f56613893565b613f5f82613cc9565b8152613f6d60208301613cc9565b6020820152613f7e60408301613cc9565b60408201526060820151613f9181613071565b6060820152608082015167ffffffffffffffff811115613faf575f5ffd5b80830192505084601f830112613fc3575f5ffd5b613fd285835160208501613ee9565b6080820152949350505050565b5f60ff821660ff8103614019577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b60010192915050565b80518015158114613cb0575f5ffd5b5f60208284031215614041575f5ffd5b612f9a82614022565b5f5f5f5f5f5f60c0878903121561405f575f5ffd5b50508451602086015160408701516060880151608089015160a090990151939a929950909790965094509092509050565b5f5f5f5f5f5f5f5f5f6101208a8c0312156140a9575f5ffd5b5f8a519050809950505f60208b01519050809850505f60408b01519050809750505f60608b01519050809650505f60808b01519050809550505f60a08b01519050809450505f60c08b015190508093505061410660e08b01613cb5565b91506141156101008b01614022565b90509295985092959850929598565b5f5f5f5f5f60a08688031215614138575f5ffd5b85516141438161312a565b60208701519095506141548161312a565b604087015190945061416581613071565b60608701519093506141768161313b565b60809690960151949793965091949392915050565b5f6020828403121561419b575f5ffd5b815167ffffffffffffffff8111156141b1575f5ffd5b8201601f810184136141c1575f5ffd5b6141d084825160208401613ee9565b949350505050565b602081525f8251608060208401526141f360a0840182613672565b90506001600160a01b03602085015116604084015260408401516060840152606084015160808401528091505092915050565b602081525f612f9a6020830184613672565b5f608082016001600160a01b03871683526080602084015280865180835260a0850191506020880192505f5b8181101561428b5783516001600160a01b0316835260209384019390920191600101614264565b50508381036040850152855180825260209182019250908601905f90815b818110156142c75783518552602094850194909301926001016142a9565b505050508281036060840152611a498185613672565b6001600160a01b03861681526001600160a01b038516602082015283604082015260a060608201525f61431360a0830185613672565b905061ffff831660808301529695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82614389577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b50049056fe610140604052348015610010575f5ffd5b5060405161071638038061071683398101604081905261002f916101fd565b60c086905263ffffffff808616608052841660a0526001600160a01b0380841660e05282811661010052811661012052610067610072565b505050505050610308565b5f5460ff161561007e57565b5f610100516001600160a01b0316638205bf6a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100be573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e29190610266565b905060c05181146101cc575f805460ff1916600117815560805160a05160e051604051610115939291859160200161027d565b60405160208183030381529060405290505f610120516001600160a01b03168260405161014291906102dc565b5f604051808303815f865af19150503d805f811461017b576040519150601f19603f3d011682016040523d82523d5f602084013e610180565b606091505b50509050806101c95760405162461bcd60e51b8152602060048201526011602482015270141c9bde1e4818d85b1b0819985a5b1959607a1b604482015260640160405180910390fd5b50505b50565b805163ffffffff811681146101e2575f5ffd5b919050565b80516001600160a01b03811681146101e2575f5ffd5b5f5f5f5f5f5f60c08789031215610212575f5ffd5b86519550610222602088016101cf565b9450610230604088016101cf565b935061023e606088016101e7565b925061024c608088016101e7565b915061025a60a088016101e7565b90509295509295509295565b5f60208284031215610276575f5ffd5b5051919050565b6001600160e01b031960e086811b8216835285901b1660048201525f600184106102b557634e487b7160e01b5f52602160045260245ffd5b5060f89290921b600883015260601b6001600160601b0319166009820152601d0192915050565b5f82515f5b818110156102fb57602081860181015185830152016102e1565b505f920191825250919050565b60805160a05160c05160e05161010051610120516103c961034d5f395f61019201525f602901525f61015601525f60b801525f61013201525f61011001526103c95ff3fe608060405234801561000f575f5ffd5b5061001861001a565b005b5f5460ff161561002657565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16638205bf6a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610090573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100b49190610288565b90507f00000000000000000000000000000000000000000000000000000000000000008114610285575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117815560405161017e907f0000000000000000000000000000000000000000000000000000000000000000907f00000000000000000000000000000000000000000000000000000000000000009084907f00000000000000000000000000000000000000000000000000000000000000009060200161029f565b60405160208183030381529060405290505f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16826040516101d59190610367565b5f604051808303815f865af19150503d805f811461020e576040519150601f19603f3d011682016040523d82523d5f602084013e610213565b606091505b5050905080610282576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f50726f78792063616c6c206661696c6564000000000000000000000000000000604482015260640160405180910390fd5b50505b50565b5f60208284031215610298575f5ffd5b5051919050565b7fffffffff000000000000000000000000000000000000000000000000000000008560e01b1681527fffffffff000000000000000000000000000000000000000000000000000000008460e01b1660048201525f60018410610328577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5060f89290921b600883015260601b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166009820152601d0192915050565b5f82515f5b81811015610386576020818601810151858301520161036c565b505f92019182525091905056fea2646970667358221220e86b747cf5dcff865ca9a6275009c9fa7fcbb2ce7a63d47395447b7abfaac32d64736f6c634300081b0033a2646970667358221220543b8b79c08da23f2725c5655cf6829c0cd3a7f77dde723db7341d84367a40d164736f6c634300081b0033