6080604052348015600e575f5ffd5b5060156019565b6078565b63409feecd198054600181161560365763f92ee8a95f526004601cfd5b8160c01c808260011c146073578060011b8355806020527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602080a15b505050565b611543806100855f395ff3fe608060405234801561000f575f5ffd5b506004361061012f575f3560e01c80637ecebe00116100ad578063a9059cbb1161007d578063dd62ed3e11610063578063dd62ed3e146102bd578063ea54aa86146102e5578063f6d2ee86146102f8575f5ffd5b8063a9059cbb14610297578063d505accf146102aa575f5ffd5b80637ecebe001461022a5780638da5cb5b1461024f57806395d89b411461027c5780639dc29fac14610284575f5ffd5b8063313ce5671161010257806340c10f19116100e857806340c10f19146101dd57806370a08231146101f25780637e0b420114610217575f5ffd5b8063313ce567146101a15780633644e515146101d5575f5ffd5b806306fdde0314610133578063095ea7b31461015157806318160ddd1461017457806323b872dd1461018e575b5f5ffd5b61013b61030b565b6040516101489190610eb3565b60405180910390f35b61016461015f366004610f2a565b6103bd565b6040519015158152602001610148565b6805345cdf77eb68f44c545b604051908152602001610148565b61016461019c366004610f54565b61040c565b7f3dc5e9c73aa4cf6dbb6954b8480371b37bbac7a2af2e9b392ef9b26d6f2ce6225460405160ff9091168152602001610148565b6101806104c6565b6101f06101eb366004610f2a565b610542565b005b610180610200366004610f92565b6387a211a2600c9081525f91909152602090205490565b6101f0610225366004611059565b61057b565b610180610238366004610f92565b6338377508600c9081525f91909152602090205490565b6102576105fa565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610148565b61013b6106af565b6101f0610292366004610f2a565b6106e0565b6101646102a5366004610f2a565b610715565b6101f06102b8366004611148565b61078c565b6101806102cb3660046111b2565b602052637f5e9f20600c9081525f91909152603490205490565b6101f06102f3366004611059565b61091f565b6101f0610306366004611273565b61099e565b60607f3dc5e9c73aa4cf6dbb6954b8480371b37bbac7a2af2e9b392ef9b26d6f2ce61f600101805461033c906112fa565b80601f0160208091040260200160405190810160405280929190818152602001828054610368906112fa565b80156103b35780601f1061038a576101008083540402835291602001916103b3565b820191905f5260205f20905b81548152906001019060200180831161039657829003601f168201915b5050505050905090565b5f82602052637f5e9f20600c52335f52816034600c2055815f52602c5160601c337f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560205fa350600192915050565b5f8360601b33602052637f5e9f208117600c526034600c208054600181011561044a5780851115610444576313be252b5f526004601cfd5b84810382555b50506387a211a28117600c526020600c208054808511156104725763f4d678b85f526004601cfd5b84810382555050835f526020600c208381540181555082602052600c5160601c8160601c7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a3505060019392505050565b5f806104d061030b565b8051906020012090506040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81528160208201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6604082015246606082015230608082015260a081209250505090565b61056d7f3dc5e9c73aa4cf6dbb6954b8480371b37bbac7a2af2e9b392ef9b26d6f2ce61f5b33610af9565b6105778282610c5a565b5050565b6105a47f3dc5e9c73aa4cf6dbb6954b8480371b37bbac7a2af2e9b392ef9b26d6f2ce61f610567565b5f5b8151811015610577576105f28282815181106105c4576105c461134b565b60200260200101515f01518383815181106105e1576105e161134b565b602002602001015160200151610c5a565b6001016105a6565b7f3dc5e9c73aa4cf6dbb6954b8480371b37bbac7a2af2e9b392ef9b26d6f2ce61f54604080517f8da5cb5b00000000000000000000000000000000000000000000000000000000815290515f9273ffffffffffffffffffffffffffffffffffffffff1691638da5cb5b9160048083019260209291908290030181865afa158015610686573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106aa9190611378565b905090565b60607f3dc5e9c73aa4cf6dbb6954b8480371b37bbac7a2af2e9b392ef9b26d6f2ce61f600201805461033c906112fa565b61070b7f3dc5e9c73aa4cf6dbb6954b8480371b37bbac7a2af2e9b392ef9b26d6f2ce61f5b33610cd6565b6105778282610e32565b5f6387a211a2600c52335f526020600c2080548084111561073d5763f4d678b85f526004601cfd5b83810382555050825f526020600c208281540181555081602052600c5160601c337fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a350600192915050565b5f61079561030b565b805190602001209050844211156107b357631a15a3cc5f526004601cfd5b6040518860601b60601c98508760601b60601c975065383775081901600e52885f526020600c2080547f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83528360208401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6604084015246606084015230608084015260a08320602e527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c983528a60208401528960408401528860608401528060808401528760a084015260c08320604e526042602c205f528660ff16602052856040528460605260208060805f60015afa8b3d51146108bb5763ddafbaef5f526004601cfd5b019055777f5e9f20000000000000000000000000000000000000000088176040526034602c2087905587897f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925602060608501a360405250505f606052505050505050565b6109487f3dc5e9c73aa4cf6dbb6954b8480371b37bbac7a2af2e9b392ef9b26d6f2ce61f610705565b5f5b8151811015610577576109968282815181106109685761096861134b565b60200260200101515f01518383815181106109855761098561134b565b602002602001015160200151610e32565b60010161094a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffbf60113280546003825580156109ef5760018160011c14303b106109e65763f92ee8a95f526004601cfd5b818160ff1b1b91505b507f3dc5e9c73aa4cf6dbb6954b8480371b37bbac7a2af2e9b392ef9b26d6f2ce61f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87161781557f3dc5e9c73aa4cf6dbb6954b8480371b37bbac7a2af2e9b392ef9b26d6f2ce620610a7a86826113d7565b5060028101610a8985826113d7565b5060030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff84161790558015610aed576002815560016020527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602080a15b5050505050565b505050565b815473ffffffffffffffffffffffffffffffffffffffff908116908216610b1e6105fa565b73ffffffffffffffffffffffffffffffffffffffff161480610bc957506040517faa271e1a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015282169063aa271e1a90602401602060405180830381865afa158015610ba5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bc991906114ee565b610af4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f54657374546f6b656e3a2063616c6c6572206973206e6f7420746865206f776e60448201527f6572206f722061206d696e74657200000000000000000000000000000000000060648201526084015b60405180910390fd5b6805345cdf77eb68f44c5481810181811015610c7d5763e5cfe9575f526004601cfd5b806805345cdf77eb68f44c5550506387a211a2600c52815f526020600c208181540181555080602052600c5160601c5f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602080a35050565b815473ffffffffffffffffffffffffffffffffffffffff908116908216610cfb6105fa565b73ffffffffffffffffffffffffffffffffffffffff161480610da657506040517f4334614a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152821690634334614a90602401602060405180830381865afa158015610d82573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610da691906114ee565b610af4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f54657374546f6b656e3a2063616c6c6572206973206e6f7420746865206f776e60448201527f6572206f722061206275726e65720000000000000000000000000000000000006064820152608401610c51565b6387a211a2600c52815f526020600c20805480831115610e595763f4d678b85f526004601cfd5b82900390556805345cdf77eb68f44c805482900390555f81815273ffffffffffffffffffffffffffffffffffffffff83167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602083a35050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b73ffffffffffffffffffffffffffffffffffffffff81168114610f27575f5ffd5b50565b5f5f60408385031215610f3b575f5ffd5b8235610f4681610f06565b946020939093013593505050565b5f5f5f60608486031215610f66575f5ffd5b8335610f7181610f06565b92506020840135610f8181610f06565b929592945050506040919091013590565b5f60208284031215610fa2575f5ffd5b8135610fad81610f06565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040805190810167ffffffffffffffff8111828210171561100457611004610fb4565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561105157611051610fb4565b604052919050565b5f60208284031215611069575f5ffd5b813567ffffffffffffffff81111561107f575f5ffd5b8201601f8101841361108f575f5ffd5b803567ffffffffffffffff8111156110a9576110a9610fb4565b6110b860208260051b0161100a565b8082825260208201915060208360061b8501019250868311156110d9575f5ffd5b6020840193505b8284101561112957604084880312156110f7575f5ffd5b6110ff610fe1565b843561110a81610f06565b81526020858101358183015290835260409094019391909101906110e0565b9695505050505050565b803560ff81168114611143575f5ffd5b919050565b5f5f5f5f5f5f5f60e0888a03121561115e575f5ffd5b873561116981610f06565b9650602088013561117981610f06565b9550604088013594506060880135935061119560808901611133565b9699959850939692959460a0840135945060c09093013592915050565b5f5f604083850312156111c3575f5ffd5b82356111ce81610f06565b915060208301356111de81610f06565b809150509250929050565b5f82601f8301126111f8575f5ffd5b813567ffffffffffffffff81111561121257611212610fb4565b61124360207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161100a565b818152846020838601011115611257575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f5f5f60808587031215611286575f5ffd5b843561129181610f06565b9350602085013567ffffffffffffffff8111156112ac575f5ffd5b6112b8878288016111e9565b935050604085013567ffffffffffffffff8111156112d4575f5ffd5b6112e0878288016111e9565b9250506112ef60608601611133565b905092959194509250565b600181811c9082168061130e57607f821691505b602082108103611345577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215611388575f5ffd5b8151610fad81610f06565b601f821115610af457805f5260205f20601f840160051c810160208510156113b85750805b601f840160051c820191505b81811015610aed575f81556001016113c4565b815167ffffffffffffffff8111156113f1576113f1610fb4565b611405816113ff84546112fa565b84611393565b6020601f821160018114611456575f83156114205750848201515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600385901b1c1916600184901b178455610aed565b5f848152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08516915b828110156114a35787850151825560209485019460019092019101611483565b50848210156114df57868401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b60f8161c191681555b50505050600190811b01905550565b5f602082840312156114fe575f5ffd5b81518015158114610fad575f5ffdfea2646970667358221220082183e8002d1002b391d76ac3476bff2c7f46449e5c57bd10443dbeff97ce4864736f6c634300081b0033