Li4gSXRlcmF0b3JzL0l0ZXJhdG9yIE1ldGFmdW5jdGlvbnMvL3ByaW9yIHw0MAoKcHJpb3IKPT09PT0KClN5bm9wc2lzCi0tLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgdGVtcGxhdGU8CiAgICAgICAgICB0eXBlbmFtZSBJdGVyYXRvcgogICAgICAgID4KICAgIHN0cnVjdCBwcmlvcgogICAgewogICAgICAgIHR5cGVkZWYgfHVuc3BlY2lmaWVkfCB0eXBlOwogICAgfTsKCgoKRGVzY3JpcHRpb24KLS0tLS0tLS0tLS0KClJldHVybnMgdGhlIHByZXZpb3VzIGl0ZXJhdG9yIGluIHRoZSBzZXF1ZW5jZS4gfE5vdGU6fCBgYHByaW9yYGAgaGFzIGEgbnVtYmVyIG9mIApvdmVybG9hZGVkIG1lYW5pbmdzLCBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgaXRzIGFyZ3VtZW50LiBGb3IgaW5zdGFuY2UsCmlmIGBgWGBgIGlzIGFuIHxJbnRlZ3JhbCBDb25zdGFudHwsIGBgcHJpb3I8WD5gYCByZXR1cm5zIGFuIGRlY3JlbWVudGVkIAp8SW50ZWdyYWwgQ29uc3RhbnR8IG9mIHRoZSBzYW1lIHR5cGUuIFRoZSBmb2xsb3dpbmcgc3BlY2lmaWNhdGlvbiBpcyAKaXRlcmF0b3Itc3BlY2lmaWMuIFBsZWFzZSByZWZlciB0byB0aGUgY29ycmVzcG9uZGluZyBjb25jZXB0J3MKZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGRldGFpbHMgb2YgdGhlIGFsdGVybmF0aXZlIHNlbWFudGljcyB8LS0gZW5kIG5vdGV8LiAKCgpIZWFkZXIKLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgICNpbmNsdWRlIDxib29zdC9tcGwvbmV4dF9wcmlvci5ocHA+CgoKUGFyYW1ldGVycwotLS0tLS0tLS0tCgorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBQYXJhbWV0ZXIgICAgIHwgUmVxdWlyZW1lbnQgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICB8Cis9PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kwp8IGBgSXRlcmF0b3JgYCAgfCB8QmlkaXJlY3Rpb25hbCBJdGVyYXRvcnwuIHwgQW4gaXRlcmF0b3IgdG8gZGVjcmVtZW50LiAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgoKRXhwcmVzc2lvbiBzZW1hbnRpY3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkZvciBhbnkgfEJpZGlyZWN0aW9uYWwgSXRlcmF0b3J8XCBzIGBgaXRlcmBgOgoKCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0eXBlZGVmIHByaW9yPGl0ZXI+Ojp0eXBlIGo7IAoKOlJldHVybiB0eXBlOgogICAgfEJpZGlyZWN0aW9uYWwgSXRlcmF0b3J8LgoKOlByZWNvbmRpdGlvbjoKICAgIGBgaXRlcmBgIGlzIGRlY3JlbWVudGFibGUuCgo6U2VtYW50aWNzOgogICAgYGBqYGAgaXMgYW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIHByZXZpb3VzIGVsZW1lbnQgaW4gdGhlIHNlcXVlbmNlLiAKICAgIElmIGBgaXRlcmBgIGlzIGEgdXNlci1kZWZpbmVkIGl0ZXJhdG9yLCB0aGUgbGlicmFyeS1wcm92aWRlZCBkZWZhdWx0IAogICAgaW1wbGVtZW50YXRpb24gaXMgZXF1aXZhbGVudCB0bwoKICAgIC4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgICAgIHR5cGVkZWYgaXRlcjo6cHJpb3IgajsKCgpDb21wbGV4aXR5Ci0tLS0tLS0tLS0KCkFtb3J0aXplZCBjb25zdGFudCB0aW1lLgoKCkV4YW1wbGUKLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICB0eXBlZGVmIHZlY3Rvcl9jPGludCwxPiB2OwogICAgdHlwZWRlZiBiZWdpbjx2Pjo6dHlwZSBmaXJzdDsKICAgIHR5cGVkZWYgZW5kPHY+Ojp0eXBlIGxhc3Q7CiAgICAKICAgIEJPT1NUX01QTF9BU1NFUlQoKCBpc19zYW1lPCBwcmlvcjxsYXN0Pjo6dHlwZSwgZmlyc3QgPiApKTsKCgpTZWUgYWxzbwotLS0tLS0tLQoKfEl0ZXJhdG9yc3wsIHxiZWdpbnwgLyB8ZW5kfCwgfG5leHR8LCB8ZGVyZWZ8CgoKLi4gY29weXJpZ2h0OjogQ29weXJpZ2h0IKkgIDIwMDEtMjAwOSBBbGVrc2V5IEd1cnRvdm95IGFuZCBEYXZpZCBBYnJhaGFtcwogICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCiAgIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQo=