Li4gQWxnb3JpdGhtcy9UcmFuc2Zvcm1hdGlvbiBBbGdvcml0aG1zLy9yZXZlcnNlX3VuaXF1ZSB8MTgwCgpyZXZlcnNlX3VuaXF1ZQo9PT09PT09PT09PT09PQoKU3lub3BzaXMKLS0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgdGVtcGxhdGU8CiAgICAgICAgICB0eXBlbmFtZSBTZXEKICAgICAgICAsIHR5cGVuYW1lIFByZWQKICAgICAgICAsIHR5cGVuYW1lIEluID0gfHVuc3BlY2lmaWVkfAogICAgICAgID4KICAgIHN0cnVjdCByZXZlcnNlX3VuaXF1ZQogICAgewogICAgICAgIHR5cGVkZWYgfHVuc3BlY2lmaWVkfCB0eXBlOwogICAgfTsKCgpEZXNjcmlwdGlvbgotLS0tLS0tLS0tLQoKUmV0dXJucyBhIHNlcXVlbmNlIG9mIHRoZSBpbml0aWFsIGVsZW1lbnRzIG9mIGV2ZXJ5IHN1YnJhbmdlIG9mIHRoZQpyZXZlcnNlZCBvcmlnaW5hbCBzZXF1ZW5jZSBgYFNlcWBgIHdob3NlIGVsZW1lbnRzIGFyZSBhbGwgdGhlIHNhbWUuIAoKfHRyYW5zZm9ybWF0aW9uIGFsZ29yaXRobSBkaXNjbGFpbWVyfAoKSGVhZGVyCi0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICAjaW5jbHVkZSA8Ym9vc3QvbXBsL3VuaXF1ZS5ocHA+CgoKTW9kZWwgb2YKLS0tLS0tLS0KCnxSZXZlcnNpYmxlIEFsZ29yaXRobXwKCgpQYXJhbWV0ZXJzCi0tLS0tLS0tLS0KCistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBQYXJhbWV0ZXIgICAgIHwgUmVxdWlyZW1lbnQgICAgICAgICAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgfAorPT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCnwgYGBTZXF1ZW5jZWBgICB8IHxGb3J3YXJkIFNlcXVlbmNlfCAgICAgICAgICAgICAgICB8IEFuIG9yaWdpbmFsIHNlcXVlbmNlLiAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgUHJlZGBgICAgICAgfCBCaW5hcnkgfExhbWJkYSBFeHByZXNzaW9ufCAgICAgICAgfCBBbiBlcXVpdmFsZW5jZSByZWxhdGlvbi4gICAgICB8CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBgYEluYGAgICAgICAgIHwgfEluc2VydGVyfCAgICAgICAgICAgICAgICAgICAgICAgIHwgQW4gaW5zZXJ0ZXIuICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgoKRXhwcmVzc2lvbiBzZW1hbnRpY3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnxTZW1hbnRpY3MgZGlzY2xhaW1lci4uLnwgfFJldmVyc2libGUgQWxnb3JpdGhtfC4KCkZvciBhbnkgfEZvcndhcmQgU2VxdWVuY2V8IGBgc2BgLCBhIGJpbmFyeSB8TGFtYmRhIEV4cHJlc3Npb258IGBgcHJlZGBgLCAKYW5kIGFuIHxJbnNlcnRlcnwgYGBpbmBgOgoKCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0eXBlZGVmIHJldmVyc2VfdW5pcXVlPHMscHJlZCxpbj46OnR5cGUgcjsgCgo6UmV0dXJuIHR5cGU6CiAgICBBIHR5cGUuCgo6U2VtYW50aWNzOgogICAgSWYgYGBzaXplPHM+Ojp2YWx1ZSA8PSAxYGAsIHRoZW4gZXF1aXZhbGVudCB0bwoKICAgIC4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgICAgIHR5cGVkZWYgcmV2ZXJzZV9jb3B5PHMsaW4+Ojp0eXBlIHI7CiAgICAKICAgIG90aGVyd2lzZSBlcXVpdmFsZW50IHRvCgogICAgLi4gcGFyc2VkLWxpdGVyYWw6OgoKICAgICAgICB0eXBlZGVmIGxhbWJkYTxwcmVkPjo6dHlwZSBwOwogICAgICAgIHR5cGVkZWYgbGFtYmRhPGluOjpvcGVyYXRpb24+Ojp0eXBlIGluX29wOwogICAgICAgIHR5cGVkZWYgYXBwbHlfd3JhcFwgYGAyYGBcPAogICAgICAgICAgICAgIGluX29wCiAgICAgICAgICAgICwgaW46OnN0YXRlCiAgICAgICAgICAgICwgZnJvbnQ8dHlwZXM+Ojp0eXBlIAogICAgICAgICAgICA+Ojp0eXBlIGluX3N0YXRlOwoKICAgICAgICB0eXBlZGVmIHJldmVyc2VfZm9sZDwKICAgICAgICAgICAgICBzCiAgICAgICAgICAgICwgcGFpcjwgaW5fc3RhdGUsIGZyb250PHM+Ojp0eXBlID4KICAgICAgICAgICAgLCBldmFsX2lmPCAKICAgICAgICAgICAgICAgICAgYXBwbHlfd3JhcFwgYGAyYGBcPHAsIHNlY29uZDxfMT4sIF8yPgogICAgICAgICAgICAgICAgLCBpZGVudGl0eTwgZmlyc3Q8XzE+ID4KICAgICAgICAgICAgICAgICwgYXBwbHlfd3JhcFwgYGAyYGBcPGluX29wLCBmaXJzdDxfMT4sIF8yPgogICAgICAgICAgICAgICAgPgogICAgICAgICAgICA+Ojp0eXBlOjpmaXJzdCByOwoKCkNvbXBsZXhpdHkKLS0tLS0tLS0tLQoKTGluZWFyLiBQZXJmb3JtcyBleGFjdGx5IGBgc2l6ZTxzPjo6dmFsdWUgLSAxYGAgYXBwbGljYXRpb25zIG9mIGBgcHJlZGBgLCBhbmQgYXQgCm1vc3QgYGBzaXplPHM+Ojp2YWx1ZWBgIGluc2VydGlvbnMuCgoKRXhhbXBsZQotLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgIHR5cGVkZWYgdmVjdG9yPGludCxmbG9hdCxmbG9hdCxjaGFyLGludCxpbnQsaW50LGRvdWJsZT4gdHlwZXM7CiAgICB0eXBlZGVmIHZlY3Rvcjxkb3VibGUsaW50LGNoYXIsZmxvYXQsaW50PiBleHBlY3RlZDsKICAgIHR5cGVkZWYgcmV2ZXJzZV91bmlxdWU8IHR5cGVzLCBpc19zYW1lPF8xLF8yPiA+Ojp0eXBlIHJlc3VsdDsKICAgIAogICAgQk9PU1RfTVBMX0FTU0VSVCgoIGVxdWFsPCByZXN1bHQsZXhwZWN0ZWQgPiApKTsKCgpTZWUgYWxzbwotLS0tLS0tLQoKfFRyYW5zZm9ybWF0aW9uIEFsZ29yaXRobXN8LCB8UmV2ZXJzaWJsZSBBbGdvcml0aG18LCB8dW5pcXVlfCwgfHJldmVyc2VfcmVtb3ZlfCwgCnxyZXZlcnNlX2NvcHlfaWZ8LCB8cmVwbGFjZV9pZnwKCgouLiBjb3B5cmlnaHQ6OiBDb3B5cmlnaHQgqSAgMjAwMS0yMDA5IEFsZWtzZXkgR3VydG92b3kgYW5kIERhdmlkIEFicmFoYW1zCiAgIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKICAgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCg==