Li4gTWV0YWZ1bmN0aW9ucy9UeXBlIFNlbGVjdGlvbi8vaWZfIHwxMAoKaWZcXwo9PT09CgpTeW5vcHNpcwotLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICB0ZW1wbGF0ZTwgCiAgICAgICAgICB0eXBlbmFtZSBDCiAgICAgICAgLCB0eXBlbmFtZSBUMQogICAgICAgICwgdHlwZW5hbWUgVDIKICAgICAgICA+CiAgICBzdHJ1Y3QgaWZcXwogICAgewogICAgICAgIHR5cGVkZWYgfHVuc3BlY2lmaWVkfCB0eXBlOwogICAgfTsKCgoKRGVzY3JpcHRpb24KLS0tLS0tLS0tLS0KClJldHVybnMgb25lIG9mIGl0cyB0d28gYXJndW1lbnRzLCBgYFQxYGAgb3IgYGBUMmBgLCBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIGBgQ2BgLgoKCkhlYWRlcgotLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgI2luY2x1ZGUgPGJvb3N0L21wbC9pZi5ocHA+CgoKUGFyYW1ldGVycwotLS0tLS0tLS0tCgorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IFBhcmFtZXRlciAgICAgfCBSZXF1aXJlbWVudCAgICAgICAgICAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorPT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kwp8IGBgQ2BgICAgICAgICAgfCB8SW50ZWdyYWwgQ29uc3RhbnR8ICAgICAgICAgICAgICAgfCBBIHNlbGVjdGlvbiBjb25kaXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgVDFgYCwgYGBUMmBgfCBBbnkgdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUeXBlcyB0byBzZWxlY3QgZnJvbS4gICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKCkV4cHJlc3Npb24gc2VtYW50aWNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tCgpGb3IgYW55IHxJbnRlZ3JhbCBDb25zdGFudHwgYGBjYGAgYW5kIGFyYml0cmFyeSB0eXBlcyBgYHQxYGAsIGBgdDJgYDoKCgouLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgdHlwZWRlZiBpZl88Yyx0MSx0Mj46OnR5cGUgdDsKCjpSZXR1cm4gdHlwZToKICAgIEFueSB0eXBlLgoKOlNlbWFudGljczoKICAgIElmIGBgYzo6dmFsdWUgPT0gdHJ1ZWBgLCBgYHRgYCBpcyBpZGVudGljYWwgdG8gYGB0MWBgOyBvdGhlcndpc2UgYGB0YGAgaXMgCiAgICBpZGVudGljYWwgdG8gYGB0MmBgLgoKCkV4YW1wbGUKLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICB0eXBlZGVmIGlmXF88dHJ1ZVxfLGNoYXIsbG9uZz46OnR5cGUgdDE7CiAgICB0eXBlZGVmIGlmXF88ZmFsc2VcXyxjaGFyLGxvbmc+Ojp0eXBlIHQyOwoKICAgIEJPT1NUX01QTF9BU1NFUlQoKCBpc19zYW1lPHQxLCBjaGFyPiApKTsKICAgIEJPT1NUX01QTF9BU1NFUlQoKCBpc19zYW1lPHQyLCBsb25nPiApKTsKCgouLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgLy8gYWxsb2NhdGVzIHNwYWNlIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgVCBvbiBoZWFwIG9yICJpbnBsYWNlIgogICAgLy8gZGVwZW5kaW5nIG9uIGl0cyBzaXplCiAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+IHN0cnVjdCBsaWdodHdlaWdodAogICAgewogICAgICAgIC8vIC4uLgogICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgaWZcXzwKICAgICAgICAgICAgICBsZXNzX2VxdWFsPCBzaXplb2ZcXzxUPiwgc2l6ZW9mXF88VCo+ID4KICAgICAgICAgICAgLCBpbnBsYWNlX3N0b3JhZ2U8VD4KICAgICAgICAgICAgLCBoZWFwX3N0b3JhZ2U8VD4KICAgICAgICAgICAgPjo6dHlwZSBpbXBsX3Q7CgogICAgICAgIGltcGxfdCBpbXBsOwogICAgfTsKCgpTZWUgYWxzbwotLS0tLS0tLQoKfE1ldGFmdW5jdGlvbnN8LCB8SW50ZWdyYWwgQ29uc3RhbnR8LCB8aWZfY3wsIHxldmFsX2lmfAoKCi4uIGNvcHlyaWdodDo6IENvcHlyaWdodCCpICAyMDAxLTIwMDkgQWxla3NleSBHdXJ0b3ZveSBhbmQgRGF2aWQgQWJyYWhhbXMKICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwogICBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkK