PGh0bWw+Cgo8aGVhZD4KPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KPHRpdGxlPkNvbm5lY3Rpdml0eSBFeHRyYWN0aW9uIFVzYWdlPC90aXRsZT4KPC9oZWFkPgoKPGJvZHk+Cgo8cD48Zm9udCBmYWNlPSJDb3VyaWVyIE5ldyI+I2luY2x1ZGUgJmx0O2Jvb3N0L3BvbHlnb24vcG9seWdvbi5ocHAmZ3Q7PGJyPgojaW5jbHVkZSAmbHQ7Y2Fzc2VydCZndDs8YnI+Cm5hbWVzcGFjZSBndGwgPSBib29zdDo6cG9seWdvbjs8YnI+Cjxicj4KLy9UaGlzIGZ1bmN0aW9uIHdvcmtzIHdpdGggYm90aCB0aGUgOTAgYW5kIDQ1IHZlcnNpb25zPGJyPgovL29mIGNvbm5lY3Rpdml0eSBleHRyYWN0aW9uIGFsZ3JvaXRobTxicj4KdGVtcGxhdGUgJmx0O3R5cGVuYW1lIGNlX3R5cGUmZ3Q7PGJyPgp2b2lkIHRlc3RfY2UoKSB7PGJyPgombmJzcDsgLy9maXJzdCB3ZSBjcmVhdGUgYW4gb2JqZWN0IHRvIGRvIHRoZSBjb25uZWN0aXZpdHkgZXh0cmFjdGlvbjxicj4KJm5ic3A7IGNlX3R5cGUgY2U7PGJyPgo8YnI+CiZuYnNwOyAvL2NyZWF0ZSBzb21lIHRlc3QgZGF0YTxicj4KJm5ic3A7IHN0ZDo6dmVjdG9yJmx0O2d0bDo6cmVjdGFuZ2xlX2RhdGEmbHQ7aW50Jmd0OyAmZ3Q7IHRlc3RfZGF0YTs8YnI+CiZuYnNwOyB0ZXN0X2RhdGEucHVzaF9iYWNrKGd0bDo6cmVjdGFuZ2xlX2RhdGEmbHQ7aW50Jmd0OygxMCwgMTAsIDkwLCA5MCkpOzxicj4KJm5ic3A7IHRlc3RfZGF0YS5wdXNoX2JhY2soZ3RsOjpyZWN0YW5nbGVfZGF0YSZsdDtpbnQmZ3Q7KDAsIDAsIDIwLCAyMCkpOzxicj4KJm5ic3A7IHRlc3RfZGF0YS5wdXNoX2JhY2soZ3RsOjpyZWN0YW5nbGVfZGF0YSZsdDtpbnQmZ3Q7KDgwLCAwLCAxMDAsIDIwKSk7PGJyPgombmJzcDsgdGVzdF9kYXRhLnB1c2hfYmFjayhndGw6OnJlY3RhbmdsZV9kYXRhJmx0O2ludCZndDsoMCwgODAsIDIwLCAxMDApKTs8YnI+CiZuYnNwOyB0ZXN0X2RhdGEucHVzaF9iYWNrKGd0bDo6cmVjdGFuZ2xlX2RhdGEmbHQ7aW50Jmd0Oyg4MCwgODAsIDEwMCwgMTAwKSk7PGJyPgombmJzcDsgLy9UaGVyZSBpcyBvbmUgYmlnIHNxdWFyZSBhbmQgZm91ciBsaXR0bGUgc3F1YXJlcyBjb3ZlcmluZyBlYWNoPGJyPgombmJzcDsgLy9vZiBpdHMgY29ybmVycy48YnI+Cjxicj4KJm5ic3A7IGZvcih1bnNpZ25lZCBpbnQgaSA9IDA7IGkgJmx0OyB0ZXN0X2RhdGEuc2l6ZSgpOyArK2kpIHs8YnI+CiZuYnNwOyZuYnNwOyZuYnNwOyAvL2luc2VydCByZXR1cm5zIGFuIGlkIHN0YXJ0aW5nIGF0IHplcm8gYW5kIGluY3JlbWVudGluZzxicj4KJm5ic3A7Jm5ic3A7Jm5ic3A7IC8vd2l0aCBlYWNoIGNhbGw8YnI+CiZuYnNwOyZuYnNwOyZuYnNwOyBhc3NlcnQoY2UuaW5zZXJ0KHRlc3RfZGF0YVtpXSkgPT0gaSk7PGJyPgombmJzcDsgfTxicj4KJm5ic3A7IC8vbm90aWNlIHRoYXQgaWRzIHJldHVybmVkIGJ5IGNlLmluc2VydCBoYXBwZW4gdG8gbWF0Y2g8YnI+CiZuYnNwOyAvL2luZGV4IGludG8gdmVjdG9yIG9mIGlucHV0cyBpbiB0aGlzIGNhc2U8YnI+Cjxicj4KJm5ic3A7IC8vbWFrZSBzdXJlIHRoZSB2ZWN0b3IgZ3JhcGggaGFzIGVsZW1lbnRzIGZvciBvdXIgbm9kZXM8YnI+CiZuYnNwOyBzdGQ6OnZlY3RvciZsdDtzdGQ6OnNldCZsdDtpbnQmZ3Q7ICZndDsgZ3JhcGgodGVzdF9kYXRhLnNpemUoKSk7PGJyPgo8YnI+CiZuYnNwOyAvL3BvcHVsYXRlIHRoZSBncmFwaCB3aXRoIGVkZ2UgZGF0YTxicj4KJm5ic3A7IGNlLmV4dHJhY3QoZ3JhcGgpOzxicj4KPGJyPgombmJzcDsgLy9tYWtlIGEgbWFwIHR5cGUgZ3JhcGggdG8gY29tcGFyZSByZXN1bHRzPGJyPgombmJzcDsgc3RkOjptYXAmbHQ7aW50LCBzdGQ6OnNldCZsdDtpbnQmZ3Q7ICZndDsgbWFwX2dyYXBoOzxicj4KJm5ic3A7IGNlLmV4dHJhY3QobWFwX2dyYXBoKTs8YnI+Cjxicj4KJm5ic3A7IGFzc2VydChtYXBfZ3JhcGguc2l6ZSgpICZhbXA7JmFtcDsgbWFwX2dyYXBoLnNpemUoKSA9PSBncmFwaC5zaXplKCkpOzxicj4KJm5ic3A7IGZvcih1bnNpZ25lZCBpbnQgaSA9IDA7IGkgJmx0OyBncmFwaC5zaXplKCk7ICsraSkgezxicj4KJm5ic3A7Jm5ic3A7Jm5ic3A7IGFzc2VydChncmFwaFtpXSA9PSBtYXBfZ3JhcGhbaV0pOzxicj4KJm5ic3A7Jm5ic3A7Jm5ic3A7IGlmKGkgPT0gMCk8YnI+CiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBhc3NlcnQoZ3JhcGhbaV0uc2l6ZSgpID09IDQpOyAvL2ZvdXIgbGl0dGxlIApzcXVhcmVzPGJyPgombmJzcDsmbmJzcDsmbmJzcDsgZWxzZTxicj4KJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGFzc2VydChncmFwaFtpXS5zaXplKCkgPT0gMSk7IC8vZWFjaCBsaXR0bGUgCnRvY2hlcyB0aGUgYmlnIHNxdWFyZTxicj4KJm5ic3A7IH08YnI+Cn08YnI+Cjxicj4KaW50IG1haW4oKSB7PGJyPgombmJzcDsgdGVzdF9jZSZsdDtndGw6OmNvbm5lY3Rpdml0eV9leHRyYWN0aW9uXzkwJmx0O2ludCZndDsgJmd0OygpOzxicj4KJm5ic3A7IHRlc3RfY2UmbHQ7Z3RsOjpjb25uZWN0aXZpdHlfZXh0cmFjdGlvbl80NSZsdDtpbnQmZ3Q7ICZndDsoKTs8YnI+CiZuYnNwOyByZXR1cm4gMDs8YnI+Cn08YnI+Cjxicj4KLy9Ob3cgeW91IGtub3cgaG93IHRvIHVzZSB0aGUgY29ubmVjdGl2aXR5IGV4dHJhY3Rpb24gYWxnb3JpdGhtPGJyPgovL3RvIGV4dHJhY3QgdGhlIGNvbm5lY3Rpdml0eSBncmFwaCBmb3Igb3ZlcmxhcHBpbmcgZ2VvbWV0cnk8YnI+CiZuYnNwOzwvZm9udD48L3A+CgoKPHRhYmxlIGNsYXNzPSJkb2NpbmZvIiBydWxlcz0ibm9uZSIgZnJhbWU9InZvaWQiIGlkPSJ0YWJsZTEiPgoJPGNvbGdyb3VwPgoJCTxjb2wgY2xhc3M9ImRvY2luZm8tbmFtZSI+PGNvbCBjbGFzcz0iZG9jaW5mby1jb250ZW50Ij4KCTwvY29sZ3JvdXA+Cgk8dGJvZHkgdkFsaWduPSJ0b3AiPgoJCTx0cj4KCQkJPHRoIGNsYXNzPSJkb2NpbmZvLW5hbWUiPkNvcHlyaWdodDo8L3RoPgoJCQk8dGQ+Q29weXJpZ2h0IKkgSW50ZWwgQ29ycG9yYXRpb24gMjAwOC0yMDEwLjwvdGQ+CgkJPC90cj4KCQk8dHIgY2xhc3M9ImZpZWxkIj4KCQkJPHRoIGNsYXNzPSJkb2NpbmZvLW5hbWUiPkxpY2Vuc2U6PC90aD4KCQkJPHRkIGNsYXNzPSJmaWVsZC1ib2R5Ij5EaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgCgkJCVZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlIDx0dCBjbGFzcz0ibGl0ZXJhbCI+CgkJCTxzcGFuIGNsYXNzPSJwcmUiPkxJQ0VOU0VfMV8wLnR4dDwvc3Bhbj48L3R0PiBvciBjb3B5IGF0CgkJCTxhIGNsYXNzPSJyZWZlcmVuY2UiIHRhcmdldD0iX3RvcCIgaHJlZj0iaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0Ij4KCQkJaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0PC9hPik8L3RkPgoJCTwvdHI+CjwvdGFibGU+Cgo8L2JvZHk+Cgo8L2h0bWw+Cg==