ZGlmZiAtLWdpdCBhLy5oZ3RhZ3MgYi8uaGd0YWdzCmluZGV4IGVhOWVmOGYuLmIzOTNhMzMgMTAwNjQ0Ci0tLSBhLy5oZ3RhZ3MKKysrIGIvLmhndGFncwpAQCAtMTQyLDQgKzE0Miw3IEBACiBjMGUzMTFlMDEwZmNiNWJhZThkODdjYTIyMDUxY2QwODQ1ZWEwY2EwIHYzLjQuMQogODcxMWEwOTUxMzg0OGNmYzQ4YzY4OWQ5ODM0OTVlZTY0ZjQ2NjhjYSB2My40LjJyYzEKIGFiMmMwMjNhOTQzMmYxNjY1MmU4OWM0MDRiYmM4NGFhOTFiZjU1YWYgdjMuNC4yCis2OWRkNTI4Y2E2MjU1YTY2YzM3Y2M1Y2Y2ODBlODM1N2QxMDhiMDM2IHYzLjQuM3JjMQorYjRjYmVjYmMwNzgxZTg5YTMwOWQwM2I2MGExZjc1Zjg0OTkyNTBlNiB2My40LjMKIDVkNGI2YTU3ZDVmZDc1NjRiZjczZjNkYjBlNDZmZTVlZWIwMGJjZDggdjMuNS4wYTEKKzAzMzdiZDdlYmNiNjU1OWQ2OTY3OWJjNzAyNTA1OWFkMWNlNGY0MzIgdjMuNS4wYTIKZGlmZiAtLWdpdCBhL0RvYy9leHRlbmRpbmcvbmV3dHlwZXMucnN0IGIvRG9jL2V4dGVuZGluZy9uZXd0eXBlcy5yc3QKaW5kZXggNDViNTcyMS4uZDUyMDcwMiAxMDA2NDQKLS0tIGEvRG9jL2V4dGVuZGluZy9uZXd0eXBlcy5yc3QKKysrIGIvRG9jL2V4dGVuZGluZy9uZXd0eXBlcy5yc3QKQEAgLTEyMDUsNyArMTIwNSw3IEBACiAgICB7CiAgICAgICAgaWYgKHN0cmNtcChuYW1lLCAiZGF0YSIpID09IDApCiAgICAgICAgewotICAgICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcob2JqLT5kYXRhKTsKKyAgICAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZyhvYmotPmRhdGEpOwogICAgICAgIH0KIAogICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKZGlmZiAtLWdpdCBhL0RvYy9ob3d0by9sb2dnaW5nLWNvb2tib29rLnJzdCBiL0RvYy9ob3d0by9sb2dnaW5nLWNvb2tib29rLnJzdAppbmRleCA1N2UyM2Y5Li5lMzFiNmMyIDEwMDY0NAotLS0gYS9Eb2MvaG93dG8vbG9nZ2luZy1jb29rYm9vay5yc3QKKysrIGIvRG9jL2hvd3RvL2xvZ2dpbmctY29va2Jvb2sucnN0CkBAIC0zMjUsNiArMzI1LDE1IEBACiAKICAgICBNYWluVGhyZWFkOiBMb29rIG91dCEKIAorLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjUKKyAgIFByaW9yIHRvIFB5dGhvbiAzLjUsIHRoZSA6Y2xhc3M6YFF1ZXVlTGlzdGVuZXJgIGFsd2F5cyBwYXNzZWQgZXZlcnkgbWVzc2FnZQorICAgcmVjZWl2ZWQgZnJvbSB0aGUgcXVldWUgdG8gZXZlcnkgaGFuZGxlciBpdCB3YXMgaW5pdGlhbGl6ZWQgd2l0aC4gKFRoaXMgd2FzCisgICBiZWNhdXNlIGl0IHdhcyBhc3N1bWVkIHRoYXQgbGV2ZWwgZmlsdGVyaW5nIHdhcyBhbGwgZG9uZSBvbiB0aGUgb3RoZXIgc2lkZSwKKyAgIHdoZXJlIHRoZSBxdWV1ZSBpcyBmaWxsZWQuKSBGcm9tIDMuNSBvbndhcmRzLCB0aGlzIGJlaGF2aW91ciBjYW4gYmUgY2hhbmdlZAorICAgYnkgcGFzc2luZyBhIGtleXdvcmQgYXJndW1lbnQgYGByZXNwZWN0X2hhbmRsZXJfbGV2ZWw9VHJ1ZWBgIHRvIHRoZQorICAgbGlzdGVuZXIncyBjb25zdHJ1Y3Rvci4gV2hlbiB0aGlzIGlzIGRvbmUsIHRoZSBsaXN0ZW5lciBjb21wYXJlcyB0aGUgbGV2ZWwKKyAgIG9mIGVhY2ggbWVzc2FnZSB3aXRoIHRoZSBoYW5kbGVyJ3MgbGV2ZWwsIGFuZCBvbmx5IHBhc3NlcyBhIG1lc3NhZ2UgdG8gYQorICAgaGFuZGxlciBpZiBpdCdzIGFwcHJvcHJpYXRlIHRvIGRvIHNvLgogCiAuLiBfbmV0d29yay1sb2dnaW5nOgogCmRpZmYgLS1naXQgYS9Eb2MvaG93dG8vcHlwb3J0aW5nLnJzdCBiL0RvYy9ob3d0by9weXBvcnRpbmcucnN0CmluZGV4IGJkODBkZmQuLmQyY2Q5ZGUgMTAwNjQ0Ci0tLSBhL0RvYy9ob3d0by9weXBvcnRpbmcucnN0CisrKyBiL0RvYy9ob3d0by9weXBvcnRpbmcucnN0CkBAIC0xNjksOCArMTY5LDkgQEAKICAgIGRpdmlzaW9uIG9yIGNvbnRpbnVlIHVzaW5nIGBgL2BgIGFuZCBleHBlY3QgYSBmbG9hdAogCiBUaGUgcmVhc29uIHRoYXQgYGAvYGAgaXNuJ3Qgc2ltcGx5IHRyYW5zbGF0ZWQgdG8gYGAvL2BgIGF1dG9tYXRpY2FsbHkgaXMgdGhhdCBpZgotYW4gb2JqZWN0IGRlZmluZXMgaXRzIG93biBgYF9fZGl2X19gYCBtZXRob2QgYnV0IG5vdCBgYF9fZmxvb3JkaXZfX2BgIHRoZW4geW91cgotY29kZSB3b3VsZCBiZWdpbiB0byBmYWlsLgorYW4gb2JqZWN0IGRlZmluZXMgYSBgYF9fdHJ1ZWRpdl9fYGAgbWV0aG9kIGJ1dCBub3QgYGBfX2Zsb29yZGl2X19gYCB0aGVuIHlvdXIKK2NvZGUgd291bGQgYmVnaW4gdG8gZmFpbCAoZS5nLiBhIHVzZXItZGVmaW5lZCBjbGFzcyB0aGF0IHVzZXMgYGAvYGAgdG8KK3NpZ25pZnkgc29tZSBvcGVyYXRpb24gYnV0IG5vdCBgYC8vYGAgZm9yIHRoZSBzYW1lIHRoaW5nIG9yIGF0IGFsbCkuCiAKIFRleHQgdmVyc3VzIGJpbmFyeSBkYXRhCiArKysrKysrKysrKysrKysrKysrKysrKwpkaWZmIC0tZ2l0IGEvRG9jL2luY2x1ZGVzL2VtYWlsLWhlYWRlcnMucHkgYi9Eb2MvaW5jbHVkZXMvZW1haWwtaGVhZGVycy5weQppbmRleCBhNTMzMTdkLi44OWM4ZjNhIDEwMDY0NAotLS0gYS9Eb2MvaW5jbHVkZXMvZW1haWwtaGVhZGVycy5weQorKysgYi9Eb2MvaW5jbHVkZXMvZW1haWwtaGVhZGVycy5weQpAQCAtMSw4ICsxLDkgQEAKICMgSW1wb3J0IHRoZSBlbWFpbCBtb2R1bGVzIHdlJ2xsIG5lZWQKIGZyb20gZW1haWwucGFyc2VyIGltcG9ydCBQYXJzZXIKIAotIyAgSWYgdGhlIGUtbWFpbCBoZWFkZXJzIGFyZSBpbiBhIGZpbGUsIHVuY29tbWVudCB0aGlzIGxpbmU6Ci0jaGVhZGVycyA9IFBhcnNlcigpLnBhcnNlKG9wZW4obWVzc2FnZWZpbGUsICdyJykpCisjIElmIHRoZSBlLW1haWwgaGVhZGVycyBhcmUgaW4gYSBmaWxlLCB1bmNvbW1lbnQgdGhlc2UgdHdvIGxpbmVzOgorIyB3aXRoIG9wZW4obWVzc2FnZWZpbGUpIGFzIGZwOgorIyAgICAgaGVhZGVycyA9IFBhcnNlcigpLnBhcnNlKGZwKQogCiAjICBPciBmb3IgcGFyc2luZyBoZWFkZXJzIGluIGEgc3RyaW5nLCB1c2U6CiBoZWFkZXJzID0gUGFyc2VyKCkucGFyc2VzdHIoJ0Zyb206IDx1c2VyQGV4YW1wbGUuY29tPlxuJwpkaWZmIC0tZ2l0IGEvRG9jL2luY2x1ZGVzL2VtYWlsLW1pbWUucHkgYi9Eb2MvaW5jbHVkZXMvZW1haWwtbWltZS5weQppbmRleCBhOTBlZGMxLi42MWQwODMwIDEwMDY0NAotLS0gYS9Eb2MvaW5jbHVkZXMvZW1haWwtbWltZS5weQorKysgYi9Eb2MvaW5jbHVkZXMvZW1haWwtbWltZS5weQpAQCAtMjAsOSArMjAsOCBAQAogZm9yIGZpbGUgaW4gcG5nZmlsZXM6CiAgICAgIyBPcGVuIHRoZSBmaWxlcyBpbiBiaW5hcnkgbW9kZS4gIExldCB0aGUgTUlNRUltYWdlIGNsYXNzIGF1dG9tYXRpY2FsbHkKICAgICAjIGd1ZXNzIHRoZSBzcGVjaWZpYyBpbWFnZSB0eXBlLgotICAgIGZwID0gb3BlbihmaWxlLCAncmInKQotICAgIGltZyA9IE1JTUVJbWFnZShmcC5yZWFkKCkpCi0gICAgZnAuY2xvc2UoKQorICAgIHdpdGggb3BlbihmaWxlLCAncmInKSBhcyBmcDoKKyAgICAgICAgaW1nID0gTUlNRUltYWdlKGZwLnJlYWQoKSkKICAgICBtc2cuYXR0YWNoKGltZykKIAogIyBTZW5kIHRoZSBlbWFpbCB2aWEgb3VyIG93biBTTVRQIHNlcnZlci4KZGlmZiAtLWdpdCBhL0RvYy9pbmNsdWRlcy9lbWFpbC1yZWFkLWFsdGVybmF0aXZlLW5ldy1hcGkucHkgYi9Eb2MvaW5jbHVkZXMvZW1haWwtcmVhZC1hbHRlcm5hdGl2ZS1uZXctYXBpLnB5CmluZGV4IDhhYjRlOWYuLjNmNWFiMjQgMTAwNjQ0Ci0tLSBhL0RvYy9pbmNsdWRlcy9lbWFpbC1yZWFkLWFsdGVybmF0aXZlLW5ldy1hcGkucHkKKysrIGIvRG9jL2luY2x1ZGVzL2VtYWlsLXJlYWQtYWx0ZXJuYXRpdmUtbmV3LWFwaS5weQpAQCAtMTIsNyArMTIsOCBAQAogZnJvbSBpbWFnaW5hcnkgaW1wb3J0IG1hZ2ljX2h0bWxfcGFyc2VyCiAKICMgSW4gYSByZWFsIHByb2dyYW0geW91J2QgZ2V0IHRoZSBmaWxlbmFtZSBmcm9tIHRoZSBhcmd1bWVudHMuCi1tc2cgPSBCeXRlc1BhcnNlcihwb2xpY3k9cG9saWN5LmRlZmF1bHQpLnBhcnNlKG9wZW4oJ291dGdvaW5nLm1zZycsICdyYicpKQord2l0aCBvcGVuKCdvdXRnb2luZy5tc2cnLCAncmInKSBhcyBmcDoKKyAgICBtc2cgPSBCeXRlc1BhcnNlcihwb2xpY3k9cG9saWN5LmRlZmF1bHQpLnBhcnNlKGZwKQogCiAjIE5vdyB0aGUgaGVhZGVyIGl0ZW1zIGNhbiBiZSBhY2Nlc3NlZCBhcyBhIGRpY3Rpb25hcnksIGFuZCBhbnkgbm9uLUFTQ0lJIHdpbGwKICMgYmUgY29udmVydGVkIHRvIHVuaWNvZGU6CmRpZmYgLS1naXQgYS9Eb2MvaW5jbHVkZXMvZW1haWwtc2ltcGxlLnB5IGIvRG9jL2luY2x1ZGVzL2VtYWlsLXNpbXBsZS5weQppbmRleCAwNzc1NjhkLi5iOWI4YjQxIDEwMDY0NAotLS0gYS9Eb2MvaW5jbHVkZXMvZW1haWwtc2ltcGxlLnB5CisrKyBiL0RvYy9pbmNsdWRlcy9lbWFpbC1zaW1wbGUucHkKQEAgLTYsMTAgKzYsOSBAQAogCiAjIE9wZW4gYSBwbGFpbiB0ZXh0IGZpbGUgZm9yIHJlYWRpbmcuICBGb3IgdGhpcyBleGFtcGxlLCBhc3N1bWUgdGhhdAogIyB0aGUgdGV4dCBmaWxlIGNvbnRhaW5zIG9ubHkgQVNDSUkgY2hhcmFjdGVycy4KLWZwID0gb3Blbih0ZXh0ZmlsZSwgJ3JiJykKLSMgQ3JlYXRlIGEgdGV4dC9wbGFpbiBtZXNzYWdlCi1tc2cgPSBNSU1FVGV4dChmcC5yZWFkKCkpCi1mcC5jbG9zZSgpCit3aXRoIG9wZW4odGV4dGZpbGUpIGFzIGZwOgorICAgICMgQ3JlYXRlIGEgdGV4dC9wbGFpbiBtZXNzYWdlCisgICAgbXNnID0gTUlNRVRleHQoZnAucmVhZCgpKQogCiAjIG1lID09IHRoZSBzZW5kZXIncyBlbWFpbCBhZGRyZXNzCiAjIHlvdSA9PSB0aGUgcmVjaXBpZW50J3MgZW1haWwgYWRkcmVzcwpkaWZmIC0tZ2l0IGEvRG9jL2luc3RhbGwvaW5kZXgucnN0IGIvRG9jL2luc3RhbGwvaW5kZXgucnN0CmluZGV4IDhmM2FkNzIuLjg3NmYzNTAgMTAwNjQ0Ci0tLSBhL0RvYy9pbnN0YWxsL2luZGV4LnJzdAorKysgYi9Eb2MvaW5zdGFsbC9pbmRleC5yc3QKQEAgLTM2MSw3ICszNjEsNyBAQAogVHlwZSBvZiBmaWxlICAgIEluc3RhbGxhdGlvbiBkaXJlY3RvcnkKID09PT09PT09PT09PT09PSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogbW9kdWxlcyAgICAgICAgIDpmaWxlOmB7dXNlcmJhc2V9XFxQeXRob257WFl9XFxzaXRlLXBhY2thZ2VzYAotc2NyaXB0cyAgICAgICAgIDpmaWxlOmB7dXNlcmJhc2V9XFxTY3JpcHRzYAorc2NyaXB0cyAgICAgICAgIDpmaWxlOmB7dXNlcmJhc2V9XFxQeXRob257WFl9XFxTY3JpcHRzYAogZGF0YSAgICAgICAgICAgIDpmaWxlOmB7dXNlcmJhc2V9YAogQyBoZWFkZXJzICAgICAgIDpmaWxlOmB7dXNlcmJhc2V9XFxQeXRob257WFl9XFxJbmNsdWRlXFx7ZGlzdG5hbWV9YAogPT09PT09PT09PT09PT09ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9hcmdwYXJzZS5yc3QgYi9Eb2MvbGlicmFyeS9hcmdwYXJzZS5yc3QKaW5kZXggOGIzZDlmYy4uMWY3NWNkOSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvYXJncGFyc2UucnN0CisrKyBiL0RvYy9saWJyYXJ5L2FyZ3BhcnNlLnJzdApAQCAtMTM1LDcgKzEzNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlcl9jbGFzcz1hcmdwYXJzZS5IZWxwRm9ybWF0dGVyLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeF9jaGFycz0nLScsIGZyb21maWxlX3ByZWZpeF9jaGFycz1Ob25lLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50X2RlZmF1bHQ9Tm9uZSwgY29uZmxpY3RfaGFuZGxlcj0nZXJyb3InLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9oZWxwPVRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9oZWxwPVRydWUsIGFsbG93X2FiYnJldj1UcnVlKQogCiAgICBDcmVhdGUgYSBuZXcgOmNsYXNzOmBBcmd1bWVudFBhcnNlcmAgb2JqZWN0LiBBbGwgcGFyYW1ldGVycyBzaG91bGQgYmUgcGFzc2VkCiAgICBhcyBrZXl3b3JkIGFyZ3VtZW50cy4gRWFjaCBwYXJhbWV0ZXIgaGFzIGl0cyBvd24gbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbgpAQCAtMTY5LDYgKzE2OSwxMiBAQAogCiAgICAqIGFkZF9oZWxwXyAtIEFkZCBhIC1oLy0taGVscCBvcHRpb24gdG8gdGhlIHBhcnNlciAoZGVmYXVsdDogYGBUcnVlYGApCiAKKyAgICogYWxsb3dfYWJicmV2XyAtIEFsbG93cyBsb25nIG9wdGlvbnMgdG8gYmUgYWJicmV2aWF0ZWQgaWYgdGhlCisgICAgIGFiYnJldmlhdGlvbiBpcyB1bmFtYmlndW91cy4gKGRlZmF1bHQ6IGBgVHJ1ZWBgKQorCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNQorICAgICAgKmFsbG93X2FiYnJldiogcGFyYW1ldGVyIHdhcyBhZGRlZC4KKwogVGhlIGZvbGxvd2luZyBzZWN0aW9ucyBkZXNjcmliZSBob3cgZWFjaCBvZiB0aGVzZSBhcmUgdXNlZC4KIAogCkBAIC01MTgsNiArNTI0LDI2IEBACiAgICA+Pj4gcGFyc2VyLnBhcnNlX2FyZ3MoW10pCiAgICBOYW1lc3BhY2UoKQogCisuLiBfYWxsb3dfYWJicmV2OgorCithbGxvd19hYmJyZXYKK15eXl5eXl5eXl5eXgorCitOb3JtYWxseSwgd2hlbiB5b3UgcGFzcyBhbiBhcmd1bWVudCBsaXN0IHRvIHRoZQorOm1ldGg6YH5Bcmd1bWVudFBhcnNlci5wYXJzZV9hcmdzYCBtZXRob2Qgb2YgYSA6Y2xhc3M6YEFyZ3VtZW50UGFyc2VyYCwKK2l0IDpyZWY6YHJlY29nbml6ZXMgYWJicmV2aWF0aW9ucyA8cHJlZml4LW1hdGNoaW5nPmAgb2YgbG9uZyBvcHRpb25zLgorCitUaGlzIGZlYXR1cmUgY2FuIGJlIGRpc2FibGVkIGJ5IHNldHRpbmcgYGBhbGxvd19hYmJyZXZgYCB0byBgYEZhbHNlYGA6OgorCisgICA+Pj4gcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIocHJvZz0nUFJPRycsIGFsbG93X2FiYnJldj1GYWxzZSkKKyAgID4+PiBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWZvb2JhcicsIGFjdGlvbj0nc3RvcmVfdHJ1ZScpCisgICA+Pj4gcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1mb29ubGV5JywgYWN0aW9uPSdzdG9yZV9mYWxzZScpCisgICA+Pj4gcGFyc2VyLnBhcnNlX2FyZ3MoWy0tZm9vbl0pCisgICB1c2FnZTogUFJPRyBbLWhdIFstLWZvb2Jhcl0gWy0tZm9vbmxleV0KKyAgIFBST0c6IGVycm9yOiB1bnJlY29nbml6ZWQgYXJndW1lbnRzOiAtLWZvb24KKworLi4gdmVyc2lvbmFkZGVkOjogMy41CisKIAogY29uZmxpY3RfaGFuZGxlcgogXl5eXl5eXl5eXl5eXl5eXgpAQCAtMTQxMCw5ICsxNDM2LDkgQEAKIEFyZ3VtZW50IGFiYnJldmlhdGlvbnMgKHByZWZpeCBtYXRjaGluZykKIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KIAotVGhlIDptZXRoOmB+QXJndW1lbnRQYXJzZXIucGFyc2VfYXJnc2AgbWV0aG9kIGFsbG93cyBsb25nIG9wdGlvbnMgdG8gYmUKLWFiYnJldmlhdGVkIHRvIGEgcHJlZml4LCBpZiB0aGUgYWJicmV2aWF0aW9uIGlzIHVuYW1iaWd1b3VzICh0aGUgcHJlZml4IG1hdGNoZXMKLWEgdW5pcXVlIG9wdGlvbik6OgorVGhlIDptZXRoOmB+QXJndW1lbnRQYXJzZXIucGFyc2VfYXJnc2AgbWV0aG9kIDpyZWY6YGJ5IGRlZmF1bHQgPGFsbG93X2FiYnJldj5gCithbGxvd3MgbG9uZyBvcHRpb25zIHRvIGJlIGFiYnJldmlhdGVkIHRvIGEgcHJlZml4LCBpZiB0aGUgYWJicmV2aWF0aW9uIGlzCit1bmFtYmlndW91cyAodGhlIHByZWZpeCBtYXRjaGVzIGEgdW5pcXVlIG9wdGlvbik6OgogCiAgICA+Pj4gcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIocHJvZz0nUFJPRycpCiAgICA+Pj4gcGFyc2VyLmFkZF9hcmd1bWVudCgnLWJhY29uJykKQEAgLTE0MjYsNiArMTQ1Miw3IEBACiAgICBQUk9HOiBlcnJvcjogYW1iaWd1b3VzIG9wdGlvbjogLWJhIGNvdWxkIG1hdGNoIC1iYWRnZXIsIC1iYWNvbgogCiBBbiBlcnJvciBpcyBwcm9kdWNlZCBmb3IgYXJndW1lbnRzIHRoYXQgY291bGQgcHJvZHVjZSBtb3JlIHRoYW4gb25lIG9wdGlvbnMuCitUaGlzIGZlYXR1cmUgY2FuIGJlIGRpc2FibGVkIGJ5IHNldHRpbmcgOnJlZjpgYWxsb3dfYWJicmV2YCB0byBgYEZhbHNlYGAuCiAKIAogQmV5b25kIGBgc3lzLmFyZ3ZgYApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvYXN5bmNpby1kZXYucnN0IGIvRG9jL2xpYnJhcnkvYXN5bmNpby1kZXYucnN0CmluZGV4IGJmNzdhOGYuLmQ3ZjQ3NGUgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2FzeW5jaW8tZGV2LnJzdAorKysgYi9Eb2MvbGlicmFyeS9hc3luY2lvLWRldi5yc3QKQEAgLTIxMiw2ICsyMTIsNyBAQAogICAgIGxvb3AgPSBhc3luY2lvLmdldF9ldmVudF9sb29wKCkKICAgICBhc3luY2lvLmFzeW5jKGJ1ZygpKQogICAgIGxvb3AucnVuX2ZvcmV2ZXIoKQorICAgIGxvb3AuY2xvc2UoKQogCiBPdXRwdXQ6OgogCkBAIC0yNTgsNiArMjU5LDcgQEAKICAgICBsb29wID0gYXN5bmNpby5nZXRfZXZlbnRfbG9vcCgpCiAgICAgYXN5bmNpby5hc3luYyhoYW5kbGVfZXhjZXB0aW9uKCkpCiAgICAgbG9vcC5ydW5fZm9yZXZlcigpCisgICAgbG9vcC5jbG9zZSgpCiAKIEFub3RoZXIgb3B0aW9uIGlzIHRvIHVzZSB0aGUgOm1ldGg6YEJhc2VFdmVudExvb3AucnVuX3VudGlsX2NvbXBsZXRlYAogZnVuY3Rpb246OgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvYXN5bmNpby1ldmVudGxvb3AucnN0IGIvRG9jL2xpYnJhcnkvYXN5bmNpby1ldmVudGxvb3AucnN0CmluZGV4IDRmN2ZkZmUuLmQyN2ViNGIgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2FzeW5jaW8tZXZlbnRsb29wLnJzdAorKysgYi9Eb2MvbGlicmFyeS9hc3luY2lvLWV2ZW50bG9vcC5yc3QKQEAgLTIyLDYgKzIyLDggQEAKIAogICAgQmFzZSBjbGFzcyBvZiBldmVudCBsb29wcy4KIAorICAgVGhpcyBjbGFzcyBpcyA6cmVmOmBub3QgdGhyZWFkIHNhZmUgPGFzeW5jaW8tbXVsdGl0aHJlYWRpbmc+YC4KKwogUnVuIGFuIGV2ZW50IGxvb3AKIC0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTEwNCw2ICsxMDYsOSBAQAogCiAgICBMaWtlIDptZXRoOmBjYWxsX3Nvb25gLCBidXQgdGhyZWFkIHNhZmUuCiAKKyAgIFNlZSB0aGUgOnJlZjpgY29uY3VycmVuY3kgYW5kIG11bHRpdGhyZWFkaW5nIDxhc3luY2lvLW11bHRpdGhyZWFkaW5nPmAKKyAgIHNlY3Rpb24gb2YgdGhlIGRvY3VtZW50YXRpb24uCisKIAogLi4gX2FzeW5jaW8tZGVsYXllZC1jYWxsczoKIApAQCAtMTgwLDcgKzE4NSw3IEBACiBDcmVhdGluZyBjb25uZWN0aW9ucwogLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotLi4gbWV0aG9kOjogQmFzZUV2ZW50TG9vcC5jcmVhdGVfY29ubmVjdGlvbihwcm90b2NvbF9mYWN0b3J5LCBob3N0PU5vbmUsIHBvcnQ9Tm9uZSwgXCosIHNzbD1Ob25lLCBmYW1pbHk9MCwgcHJvdG89MCwgZmxhZ3M9MCwgc29jaz1Ob25lLCBsb2NhbF9hZGRyPU5vbmUsIHNlcnZlcl9ob3N0bmFtZT1Ob25lKQorLi4gY29yb3V0aW5lbWV0aG9kOjogQmFzZUV2ZW50TG9vcC5jcmVhdGVfY29ubmVjdGlvbihwcm90b2NvbF9mYWN0b3J5LCBob3N0PU5vbmUsIHBvcnQ9Tm9uZSwgXCosIHNzbD1Ob25lLCBmYW1pbHk9MCwgcHJvdG89MCwgZmxhZ3M9MCwgc29jaz1Ob25lLCBsb2NhbF9hZGRyPU5vbmUsIHNlcnZlcl9ob3N0bmFtZT1Ob25lKQogCiAgICBDcmVhdGUgYSBzdHJlYW1pbmcgdHJhbnNwb3J0IGNvbm5lY3Rpb24gdG8gYSBnaXZlbiBJbnRlcm5ldCAqaG9zdCogYW5kCiAgICAqcG9ydCo6IHNvY2tldCBmYW1pbHkgOnB5OmRhdGE6YH5zb2NrZXQuQUZfSU5FVGAgb3IKQEAgLTI1Myw3ICsyNTgsNyBAQAogICAgICAgKDpjbGFzczpgU3RyZWFtUmVhZGVyYCwgOmNsYXNzOmBTdHJlYW1Xcml0ZXJgKSBpbnN0ZWFkIG9mIGEgcHJvdG9jb2wuCiAKIAotLi4gbWV0aG9kOjogQmFzZUV2ZW50TG9vcC5jcmVhdGVfZGF0YWdyYW1fZW5kcG9pbnQocHJvdG9jb2xfZmFjdG9yeSwgbG9jYWxfYWRkcj1Ob25lLCByZW1vdGVfYWRkcj1Ob25lLCBcKiwgZmFtaWx5PTAsIHByb3RvPTAsIGZsYWdzPTApCisuLiBjb3JvdXRpbmVtZXRob2Q6OiBCYXNlRXZlbnRMb29wLmNyZWF0ZV9kYXRhZ3JhbV9lbmRwb2ludChwcm90b2NvbF9mYWN0b3J5LCBsb2NhbF9hZGRyPU5vbmUsIHJlbW90ZV9hZGRyPU5vbmUsIFwqLCBmYW1pbHk9MCwgcHJvdG89MCwgZmxhZ3M9MCkKIAogICAgQ3JlYXRlIGRhdGFncmFtIGNvbm5lY3Rpb246IHNvY2tldCBmYW1pbHkgOnB5OmRhdGE6YH5zb2NrZXQuQUZfSU5FVGAgb3IKICAgIDpweTpkYXRhOmB+c29ja2V0LkFGX0lORVQ2YCBkZXBlbmRpbmcgb24gKmhvc3QqIChvciAqZmFtaWx5KiBpZiBzcGVjaWZpZWQpLApAQCAtMjcxLDcgKzI3Niw3IEBACiAgICA6cmVmOmBVRFAgZWNobyBzZXJ2ZXIgcHJvdG9jb2wgPGFzeW5jaW8tdWRwLWVjaG8tc2VydmVyLXByb3RvY29sPmAgZXhhbXBsZXMuCiAKIAotLi4gbWV0aG9kOjogQmFzZUV2ZW50TG9vcC5jcmVhdGVfdW5peF9jb25uZWN0aW9uKHByb3RvY29sX2ZhY3RvcnksIHBhdGgsIFwqLCBzc2w9Tm9uZSwgc29jaz1Ob25lLCBzZXJ2ZXJfaG9zdG5hbWU9Tm9uZSkKKy4uIGNvcm91dGluZW1ldGhvZDo6IEJhc2VFdmVudExvb3AuY3JlYXRlX3VuaXhfY29ubmVjdGlvbihwcm90b2NvbF9mYWN0b3J5LCBwYXRoLCBcKiwgc3NsPU5vbmUsIHNvY2s9Tm9uZSwgc2VydmVyX2hvc3RuYW1lPU5vbmUpCiAKICAgIENyZWF0ZSBVTklYIGNvbm5lY3Rpb246IHNvY2tldCBmYW1pbHkgOnB5OmRhdGE6YH5zb2NrZXQuQUZfVU5JWGAsIHNvY2tldAogICAgdHlwZSA6cHk6ZGF0YTpgfnNvY2tldC5TT0NLX1NUUkVBTWAuIFRoZSA6cHk6ZGF0YTpgfnNvY2tldC5BRl9VTklYYCBzb2NrZXQKQEAgLTI5MCw3ICsyOTUsNyBAQAogQ3JlYXRpbmcgbGlzdGVuaW5nIGNvbm5lY3Rpb25zCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotLi4gbWV0aG9kOjogQmFzZUV2ZW50TG9vcC5jcmVhdGVfc2VydmVyKHByb3RvY29sX2ZhY3RvcnksIGhvc3Q9Tm9uZSwgcG9ydD1Ob25lLCBcKiwgZmFtaWx5PXNvY2tldC5BRl9VTlNQRUMsIGZsYWdzPXNvY2tldC5BSV9QQVNTSVZFLCBzb2NrPU5vbmUsIGJhY2tsb2c9MTAwLCBzc2w9Tm9uZSwgcmV1c2VfYWRkcmVzcz1Ob25lKQorLi4gY29yb3V0aW5lbWV0aG9kOjogQmFzZUV2ZW50TG9vcC5jcmVhdGVfc2VydmVyKHByb3RvY29sX2ZhY3RvcnksIGhvc3Q9Tm9uZSwgcG9ydD1Ob25lLCBcKiwgZmFtaWx5PXNvY2tldC5BRl9VTlNQRUMsIGZsYWdzPXNvY2tldC5BSV9QQVNTSVZFLCBzb2NrPU5vbmUsIGJhY2tsb2c9MTAwLCBzc2w9Tm9uZSwgcmV1c2VfYWRkcmVzcz1Ob25lKQogCiAgICBDcmVhdGUgYSBUQ1Agc2VydmVyIChzb2NrZXQgdHlwZSA6ZGF0YTpgfnNvY2tldC5TT0NLX1NUUkVBTWApIGJvdW5kIHRvCiAgICAqaG9zdCogYW5kICpwb3J0Ki4KQEAgLTMzNiwxMSArMzQxLDEzIEBACiAgICAgICA6Y2xhc3M6YFN0cmVhbVdyaXRlcmApIHBhaXIgYW5kIGNhbGxzIGJhY2sgYSBmdW5jdGlvbiB3aXRoIHRoaXMgcGFpci4KIAogCi0uLiBtZXRob2Q6OiBCYXNlRXZlbnRMb29wLmNyZWF0ZV91bml4X3NlcnZlcihwcm90b2NvbF9mYWN0b3J5LCBwYXRoPU5vbmUsIFwqLCBzb2NrPU5vbmUsIGJhY2tsb2c9MTAwLCBzc2w9Tm9uZSkKKy4uIGNvcm91dGluZW1ldGhvZDo6IEJhc2VFdmVudExvb3AuY3JlYXRlX3VuaXhfc2VydmVyKHByb3RvY29sX2ZhY3RvcnksIHBhdGg9Tm9uZSwgXCosIHNvY2s9Tm9uZSwgYmFja2xvZz0xMDAsIHNzbD1Ob25lKQogCiAgICBTaW1pbGFyIHRvIDptZXRoOmBCYXNlRXZlbnRMb29wLmNyZWF0ZV9zZXJ2ZXJgLCBidXQgc3BlY2lmaWMgdG8gdGhlCiAgICBzb2NrZXQgZmFtaWx5IDpweTpkYXRhOmB+c29ja2V0LkFGX1VOSVhgLgogCisgICBUaGlzIG1ldGhvZCBpcyBhIDpyZWY6YGNvcm91dGluZSA8Y29yb3V0aW5lPmAuCisKICAgIEF2YWlsYWJpbGl0eTogVU5JWC4KIAogCkBAIC0zODQsNyArMzkxLDcgQEAKIExvdy1sZXZlbCBzb2NrZXQgb3BlcmF0aW9ucwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLS4uIG1ldGhvZDo6IEJhc2VFdmVudExvb3Auc29ja19yZWN2KHNvY2ssIG5ieXRlcykKKy4uIGNvcm91dGluZW1ldGhvZDo6IEJhc2VFdmVudExvb3Auc29ja19yZWN2KHNvY2ssIG5ieXRlcykKIAogICAgUmVjZWl2ZSBkYXRhIGZyb20gdGhlIHNvY2tldC4gIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBieXRlcyBvYmplY3QKICAgIHJlcHJlc2VudGluZyB0aGUgZGF0YSByZWNlaXZlZC4gIFRoZSBtYXhpbXVtIGFtb3VudCBvZiBkYXRhIHRvIGJlIHJlY2VpdmVkCkBAIC0zOTksNyArNDA2LDcgQEAKIAogICAgICAgVGhlIDptZXRoOmBzb2NrZXQuc29ja2V0LnJlY3ZgIG1ldGhvZC4KIAotLi4gbWV0aG9kOjogQmFzZUV2ZW50TG9vcC5zb2NrX3NlbmRhbGwoc29jaywgZGF0YSkKKy4uIGNvcm91dGluZW1ldGhvZDo6IEJhc2VFdmVudExvb3Auc29ja19zZW5kYWxsKHNvY2ssIGRhdGEpCiAKICAgIFNlbmQgZGF0YSB0byB0aGUgc29ja2V0LiAgVGhlIHNvY2tldCBtdXN0IGJlIGNvbm5lY3RlZCB0byBhIHJlbW90ZSBzb2NrZXQuCiAgICBUaGlzIG1ldGhvZCBjb250aW51ZXMgdG8gc2VuZCBkYXRhIGZyb20gKmRhdGEqIHVudGlsIGVpdGhlciBhbGwgZGF0YSBoYXMKQEAgLTQxNiw3ICs0MjMsNyBAQAogCiAgICAgICBUaGUgOm1ldGg6YHNvY2tldC5zb2NrZXQuc2VuZGFsbGAgbWV0aG9kLgogCi0uLiBtZXRob2Q6OiBCYXNlRXZlbnRMb29wLnNvY2tfY29ubmVjdChzb2NrLCBhZGRyZXNzKQorLi4gY29yb3V0aW5lbWV0aG9kOjogQmFzZUV2ZW50TG9vcC5zb2NrX2Nvbm5lY3Qoc29jaywgYWRkcmVzcykKIAogICAgQ29ubmVjdCB0byBhIHJlbW90ZSBzb2NrZXQgYXQgKmFkZHJlc3MqLgogCkBAIC00MzgsNyArNDQ1LDcgQEAKICAgICAgIG1ldGhvZC4KIAogCi0uLiBtZXRob2Q6OiBCYXNlRXZlbnRMb29wLnNvY2tfYWNjZXB0KHNvY2spCisuLiBjb3JvdXRpbmVtZXRob2Q6OiBCYXNlRXZlbnRMb29wLnNvY2tfYWNjZXB0KHNvY2spCiAKICAgIEFjY2VwdCBhIGNvbm5lY3Rpb24uIFRoZSBzb2NrZXQgbXVzdCBiZSBib3VuZCB0byBhbiBhZGRyZXNzIGFuZCBsaXN0ZW5pbmcKICAgIGZvciBjb25uZWN0aW9ucy4gVGhlIHJldHVybiB2YWx1ZSBpcyBhIHBhaXIgYGAoY29ubiwgYWRkcmVzcylgYCB3aGVyZSAqY29ubioKQEAgLTQ1OSwxMiArNDY2LDEyIEBACiBSZXNvbHZlIGhvc3QgbmFtZQogLS0tLS0tLS0tLS0tLS0tLS0KIAotLi4gbWV0aG9kOjogQmFzZUV2ZW50TG9vcC5nZXRhZGRyaW5mbyhob3N0LCBwb3J0LCBcKiwgZmFtaWx5PTAsIHR5cGU9MCwgcHJvdG89MCwgZmxhZ3M9MCkKKy4uIGNvcm91dGluZW1ldGhvZDo6IEJhc2VFdmVudExvb3AuZ2V0YWRkcmluZm8oaG9zdCwgcG9ydCwgXCosIGZhbWlseT0wLCB0eXBlPTAsIHByb3RvPTAsIGZsYWdzPTApCiAKICAgIFRoaXMgbWV0aG9kIGlzIGEgOnJlZjpgY29yb3V0aW5lIDxjb3JvdXRpbmU+YCwgc2ltaWxhciB0bwogICAgOm1ldGg6YHNvY2tldC5nZXRhZGRyaW5mb2AgZnVuY3Rpb24gYnV0IG5vbi1ibG9ja2luZy4KIAotLi4gbWV0aG9kOjogQmFzZUV2ZW50TG9vcC5nZXRuYW1laW5mbyhzb2NrYWRkciwgZmxhZ3M9MCkKKy4uIGNvcm91dGluZW1ldGhvZDo6IEJhc2VFdmVudExvb3AuZ2V0bmFtZWluZm8oc29ja2FkZHIsIGZsYWdzPTApCiAKICAgIFRoaXMgbWV0aG9kIGlzIGEgOnJlZjpgY29yb3V0aW5lIDxjb3JvdXRpbmU+YCwgc2ltaWxhciB0bwogICAgOm1ldGg6YHNvY2tldC5nZXRuYW1laW5mb2AgZnVuY3Rpb24gYnV0IG5vbi1ibG9ja2luZy4KQEAgLTQ3Niw3ICs0ODMsNyBAQAogT24gV2luZG93cyB3aXRoIDpjbGFzczpgU2VsZWN0b3JFdmVudExvb3BgLCB0aGVzZSBtZXRob2RzIGFyZSBub3Qgc3VwcG9ydGVkLgogVXNlIDpjbGFzczpgUHJvYWN0b3JFdmVudExvb3BgIHRvIHN1cHBvcnQgcGlwZXMgb24gV2luZG93cy4KIAotLi4gbWV0aG9kOjogQmFzZUV2ZW50TG9vcC5jb25uZWN0X3JlYWRfcGlwZShwcm90b2NvbF9mYWN0b3J5LCBwaXBlKQorLi4gY29yb3V0aW5lbWV0aG9kOjogQmFzZUV2ZW50TG9vcC5jb25uZWN0X3JlYWRfcGlwZShwcm90b2NvbF9mYWN0b3J5LCBwaXBlKQogCiAgICBSZWdpc3RlciByZWFkIHBpcGUgaW4gZXZlbnRsb29wLgogCkBAIC00OTAsNyArNDk3LDcgQEAKIAogICAgVGhpcyBtZXRob2QgaXMgYSA6cmVmOmBjb3JvdXRpbmUgPGNvcm91dGluZT5gLgogCi0uLiBtZXRob2Q6OiBCYXNlRXZlbnRMb29wLmNvbm5lY3Rfd3JpdGVfcGlwZShwcm90b2NvbF9mYWN0b3J5LCBwaXBlKQorLi4gY29yb3V0aW5lbWV0aG9kOjogQmFzZUV2ZW50TG9vcC5jb25uZWN0X3dyaXRlX3BpcGUocHJvdG9jb2xfZmFjdG9yeSwgcGlwZSkKIAogICAgUmVnaXN0ZXIgd3JpdGUgcGlwZSBpbiBldmVudGxvb3AuCiAKQEAgLTU0Myw3ICs1NTAsNyBAQAogcG9vbCBvZiBwcm9jZXNzZXMpLiBCeSBkZWZhdWx0LCBhbiBldmVudCBsb29wIHVzZXMgYSB0aHJlYWQgcG9vbCBleGVjdXRvcgogKDpjbGFzczpgfmNvbmN1cnJlbnQuZnV0dXJlcy5UaHJlYWRQb29sRXhlY3V0b3JgKS4KIAotLi4gbWV0aG9kOjogQmFzZUV2ZW50TG9vcC5ydW5faW5fZXhlY3V0b3IoZXhlY3V0b3IsIGNhbGxiYWNrLCBcKmFyZ3MpCisuLiBjb3JvdXRpbmVtZXRob2Q6OiBCYXNlRXZlbnRMb29wLnJ1bl9pbl9leGVjdXRvcihleGVjdXRvciwgY2FsbGJhY2ssIFwqYXJncykKIAogICAgQXJyYW5nZSBmb3IgYSBjYWxsYmFjayB0byBiZSBjYWxsZWQgaW4gdGhlIHNwZWNpZmllZCBleGVjdXRvci4KIApAQCAtNjU0LDcgKzY2MSw3IEBACiAgICAgICBUaGUgc2VydmVyIGlzIGNsb3NlZCBhc3luY2hvbm91c2x5LCB1c2UgdGhlIDptZXRoOmB3YWl0X2Nsb3NlZGAgY29yb3V0aW5lCiAgICAgICB0byB3YWl0IHVudGlsIHRoZSBzZXJ2ZXIgaXMgY2xvc2VkLgogCi0gICAuLiBtZXRob2Q6OiB3YWl0X2Nsb3NlZCgpCisgICAuLiBjb3JvdXRpbmVtZXRob2Q6OiB3YWl0X2Nsb3NlZCgpCiAKICAgICAgIFdhaXQgdW50aWwgdGhlIDptZXRoOmBjbG9zZWAgbWV0aG9kIGNvbXBsZXRlcy4KIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvYXN5bmNpby1wcm90b2NvbC5yc3QgYi9Eb2MvbGlicmFyeS9hc3luY2lvLXByb3RvY29sLnJzdAppbmRleCBiNmZjYzQ4Li4yZTY3MWU4IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9hc3luY2lvLXByb3RvY29sLnJzdAorKysgYi9Eb2MvbGlicmFyeS9hc3luY2lvLXByb3RvY29sLnJzdApAQCAtMjMsNiArMjMsOCBAQAogc3VicHJvY2VzcyBwaXBlcy4gIFRoZSBtZXRob2RzIGF2YWlsYWJsZSBvbiBhIHRyYW5zcG9ydCBkZXBlbmQgb24KIHRoZSB0cmFuc3BvcnQncyBraW5kLgogCitUaGUgdHJhbnNwb3J0IGNsYXNzZXMgYXJlIDpyZWY6YG5vdCB0aHJlYWQgc2FmZSA8YXN5bmNpby1tdWx0aXRocmVhZGluZz5gLgorCiAKIEJhc2VUcmFuc3BvcnQKIC0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2FzeW5jaW8tcXVldWUucnN0IGIvRG9jL2xpYnJhcnkvYXN5bmNpby1xdWV1ZS5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgyZTA4YgotLS0gL2Rldi9udWxsCisrKyBiL0RvYy9saWJyYXJ5L2FzeW5jaW8tcXVldWUucnN0CkBAIC0wLDAgKzEsMTY5IEBACisuLiBjdXJyZW50bW9kdWxlOjogYXN5bmNpbworCitRdWV1ZXMKKz09PT09PQorCitRdWV1ZXM6CisKKyogOmNsYXNzOmBRdWV1ZWAKKyogOmNsYXNzOmBQcmlvcml0eVF1ZXVlYAorKiA6Y2xhc3M6YExpZm9RdWV1ZWAKKyogOmNsYXNzOmBKb2luYWJsZVF1ZXVlYAorCithc3luY2lvIHF1ZXVlIEFQSSB3YXMgZGVzaWduZWQgdG8gYmUgY2xvc2UgdG8gY2xhc3NlcyBvZiB0aGUgOm1vZDpgcXVldWVgCittb2R1bGUgKDpjbGFzczpgfnF1ZXVlLlF1ZXVlYCwgOmNsYXNzOmB+cXVldWUuUHJpb3JpdHlRdWV1ZWAsCis6Y2xhc3M6YH5xdWV1ZS5MaWZvUXVldWVgKSwgYnV0IGl0IGhhcyBubyAqdGltZW91dCogcGFyYW1ldGVyLiBUaGUKKzpmdW5jOmBhc3luY2lvLndhaXRfZm9yYCBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjYW5jZWwgYSB0YXNrIGFmdGVyIGEgdGltZW91dC4KKworUXVldWUKKy0tLS0tCisKKy4uIGNsYXNzOjogUXVldWUobWF4c2l6ZT0wLCBcKiwgbG9vcD1Ob25lKQorCisgICBBIHF1ZXVlLCB1c2VmdWwgZm9yIGNvb3JkaW5hdGluZyBwcm9kdWNlciBhbmQgY29uc3VtZXIgY29yb3V0aW5lcy4KKworICAgSWYgKm1heHNpemUqIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB6ZXJvLCB0aGUgcXVldWUgc2l6ZSBpcyBpbmZpbml0ZS4gSWYKKyAgIGl0IGlzIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIGBgMGBgLCB0aGVuIGBgeWllbGQgZnJvbSBwdXQoKWBgIHdpbGwgYmxvY2sKKyAgIHdoZW4gdGhlIHF1ZXVlIHJlYWNoZXMgKm1heHNpemUqLCB1bnRpbCBhbiBpdGVtIGlzIHJlbW92ZWQgYnkgOm1ldGg6YGdldGAuCisKKyAgIFVubGlrZSB0aGUgc3RhbmRhcmQgbGlicmFyeSA6bW9kOmBxdWV1ZWAsIHlvdSBjYW4gcmVsaWFibHkga25vdyB0aGlzIFF1ZXVlJ3MKKyAgIHNpemUgd2l0aCA6bWV0aDpgcXNpemVgLCBzaW5jZSB5b3VyIHNpbmdsZS10aHJlYWRlZCBhc3luY2lvIGFwcGxpY2F0aW9uIHdvbid0CisgICBiZSBpbnRlcnJ1cHRlZCBiZXR3ZWVuIGNhbGxpbmcgOm1ldGg6YHFzaXplYCBhbmQgZG9pbmcgYW4gb3BlcmF0aW9uIG9uIHRoZQorICAgUXVldWUuCisKKyAgIFRoaXMgY2xhc3MgaXMgOnJlZjpgbm90IHRocmVhZCBzYWZlIDxhc3luY2lvLW11bHRpdGhyZWFkaW5nPmAuCisKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy40LjMKKyAgICAgIE5ldyA6bWV0aDpgam9pbmAgYW5kIDptZXRoOmB0YXNrX2RvbmVgIG1ldGhvZHMuCisKKyAgIC4uIG1ldGhvZDo6IGVtcHR5KCkKKworICAgICAgUmV0dXJuIGBgVHJ1ZWBgIGlmIHRoZSBxdWV1ZSBpcyBlbXB0eSwgYGBGYWxzZWBgIG90aGVyd2lzZS4KKworICAgLi4gbWV0aG9kOjogZnVsbCgpCisKKyAgICAgIFJldHVybiBgYFRydWVgYCBpZiB0aGVyZSBhcmUgOmF0dHI6YG1heHNpemVgIGl0ZW1zIGluIHRoZSBxdWV1ZS4KKworICAgICAgLi4gbm90ZTo6CisKKyAgICAgICAgIElmIHRoZSBRdWV1ZSB3YXMgaW5pdGlhbGl6ZWQgd2l0aCBgYG1heHNpemU9MGBgICh0aGUgZGVmYXVsdCksIHRoZW4KKyAgICAgICAgIDptZXRoOmBmdWxsKClgIGlzIG5ldmVyIGBgVHJ1ZWBgLgorCisgICAuLiBjb3JvdXRpbmVtZXRob2Q6OiBnZXQoKQorCisgICAgICBSZW1vdmUgYW5kIHJldHVybiBhbiBpdGVtIGZyb20gdGhlIHF1ZXVlLiBJZiBxdWV1ZSBpcyBlbXB0eSwgd2FpdCB1bnRpbAorICAgICAgYW4gaXRlbSBpcyBhdmFpbGFibGUuCisKKyAgICAgIFRoaXMgbWV0aG9kIGlzIGEgOnJlZjpgY29yb3V0aW5lIDxjb3JvdXRpbmU+YC4KKworICAgICAgLi4gc2VlYWxzbzo6CisKKyAgICAgICAgIFRoZSA6bWV0aDpgZW1wdHlgIG1ldGhvZC4KKworICAgLi4gbWV0aG9kOjogZ2V0X25vd2FpdCgpCisKKyAgICAgIFJlbW92ZSBhbmQgcmV0dXJuIGFuIGl0ZW0gZnJvbSB0aGUgcXVldWUuCisKKyAgICAgIFJldHVybiBhbiBpdGVtIGlmIG9uZSBpcyBpbW1lZGlhdGVseSBhdmFpbGFibGUsIGVsc2UgcmFpc2UKKyAgICAgIDpleGM6YFF1ZXVlRW1wdHlgLgorCisgICAuLiBjb3JvdXRpbmVtZXRob2Q6OiBqb2luKCkKKworICAgICAgQmxvY2sgdW50aWwgYWxsIGl0ZW1zIGluIHRoZSBxdWV1ZSBoYXZlIGJlZW4gZ290dGVuIGFuZCBwcm9jZXNzZWQuCisKKyAgICAgIFRoZSBjb3VudCBvZiB1bmZpbmlzaGVkIHRhc2tzIGdvZXMgdXAgd2hlbmV2ZXIgYW4gaXRlbSBpcyBhZGRlZCB0byB0aGUKKyAgICAgIHF1ZXVlLiBUaGUgY291bnQgZ29lcyBkb3duIHdoZW5ldmVyIGEgY29uc3VtZXIgdGhyZWFkIGNhbGxzCisgICAgICA6bWV0aDpgdGFza19kb25lYCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBpdGVtIHdhcyByZXRyaWV2ZWQgYW5kIGFsbCB3b3JrIG9uCisgICAgICBpdCBpcyBjb21wbGV0ZS4gIFdoZW4gdGhlIGNvdW50IG9mIHVuZmluaXNoZWQgdGFza3MgZHJvcHMgdG8gemVybywKKyAgICAgIDptZXRoOmBqb2luYCB1bmJsb2Nrcy4KKworICAgICAgVGhpcyBtZXRob2QgaXMgYSA6cmVmOmBjb3JvdXRpbmUgPGNvcm91dGluZT5gLgorCisgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjQuMworCisgICAuLiBjb3JvdXRpbmVtZXRob2Q6OiBwdXQoaXRlbSkKKworICAgICAgUHV0IGFuIGl0ZW0gaW50byB0aGUgcXVldWUuIElmIHRoZSBxdWV1ZSBpcyBmdWxsLCB3YWl0IHVudGlsIGEgZnJlZSBzbG90CisgICAgICBpcyBhdmFpbGFibGUgYmVmb3JlIGFkZGluZyBpdGVtLgorCisgICAgICBUaGlzIG1ldGhvZCBpcyBhIDpyZWY6YGNvcm91dGluZSA8Y29yb3V0aW5lPmAuCisKKyAgICAgIC4uIHNlZWFsc286OgorCisgICAgICAgICBUaGUgOm1ldGg6YGZ1bGxgIG1ldGhvZC4KKworICAgLi4gbWV0aG9kOjogcHV0X25vd2FpdChpdGVtKQorCisgICAgICBQdXQgYW4gaXRlbSBpbnRvIHRoZSBxdWV1ZSB3aXRob3V0IGJsb2NraW5nLgorCisgICAgICBJZiBubyBmcmVlIHNsb3QgaXMgaW1tZWRpYXRlbHkgYXZhaWxhYmxlLCByYWlzZSA6ZXhjOmBRdWV1ZUZ1bGxgLgorCisgICAuLiBtZXRob2Q6OiBxc2l6ZSgpCisKKyAgICAgIE51bWJlciBvZiBpdGVtcyBpbiB0aGUgcXVldWUuCisKKyAgIC4uIG1ldGhvZDo6IHRhc2tfZG9uZSgpCisKKyAgICAgIEluZGljYXRlIHRoYXQgYSBmb3JtZXJseSBlbnF1ZXVlZCB0YXNrIGlzIGNvbXBsZXRlLgorCisgICAgICBVc2VkIGJ5IHF1ZXVlIGNvbnN1bWVycy4gRm9yIGVhY2ggOm1ldGg6YH5RdWV1ZS5nZXRgIHVzZWQgdG8gZmV0Y2ggYSB0YXNrLCBhCisgICAgICBzdWJzZXF1ZW50IGNhbGwgdG8gOm1ldGg6YHRhc2tfZG9uZWAgdGVsbHMgdGhlIHF1ZXVlIHRoYXQgdGhlIHByb2Nlc3NpbmcKKyAgICAgIG9uIHRoZSB0YXNrIGlzIGNvbXBsZXRlLgorCisgICAgICBJZiBhIDptZXRoOmBqb2luYCBpcyBjdXJyZW50bHkgYmxvY2tpbmcsIGl0IHdpbGwgcmVzdW1lIHdoZW4gYWxsIGl0ZW1zCisgICAgICBoYXZlIGJlZW4gcHJvY2Vzc2VkIChtZWFuaW5nIHRoYXQgYSA6bWV0aDpgdGFza19kb25lYCBjYWxsIHdhcyByZWNlaXZlZAorICAgICAgZm9yIGV2ZXJ5IGl0ZW0gdGhhdCBoYWQgYmVlbiA6bWV0aDpgflF1ZXVlLnB1dGAgaW50byB0aGUgcXVldWUpLgorCisgICAgICBSYWlzZXMgOmV4YzpgVmFsdWVFcnJvcmAgaWYgY2FsbGVkIG1vcmUgdGltZXMgdGhhbiB0aGVyZSB3ZXJlIGl0ZW1zCisgICAgICBwbGFjZWQgaW4gdGhlIHF1ZXVlLgorCisgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjQuMworCisgICAuLiBhdHRyaWJ1dGU6OiBtYXhzaXplCisKKyAgICAgIE51bWJlciBvZiBpdGVtcyBhbGxvd2VkIGluIHRoZSBxdWV1ZS4KKworCitQcmlvcml0eVF1ZXVlCistLS0tLS0tLS0tLS0tCisKKy4uIGNsYXNzOjogUHJpb3JpdHlRdWV1ZQorCisgICBBIHN1YmNsYXNzIG9mIDpjbGFzczpgUXVldWVgOyByZXRyaWV2ZXMgZW50cmllcyBpbiBwcmlvcml0eSBvcmRlciAobG93ZXN0CisgICBmaXJzdCkuCisKKyAgIEVudHJpZXMgYXJlIHR5cGljYWxseSB0dXBsZXMgb2YgdGhlIGZvcm06IChwcmlvcml0eSBudW1iZXIsIGRhdGEpLgorCisKK0xpZm9RdWV1ZQorLS0tLS0tLS0tCisKKy4uIGNsYXNzOjogTGlmb1F1ZXVlCisKKyAgICBBIHN1YmNsYXNzIG9mIDpjbGFzczpgUXVldWVgIHRoYXQgcmV0cmlldmVzIG1vc3QgcmVjZW50bHkgYWRkZWQgZW50cmllcworICAgIGZpcnN0LgorCisKK0pvaW5hYmxlUXVldWUKK15eXl5eXl5eXl5eXl4KKworLi4gY2xhc3M6OiBKb2luYWJsZVF1ZXVlCisKKyAgIERlcHJlY2F0ZWQgYWxpYXMgZm9yIDpjbGFzczpgUXVldWVgLgorCisgICAuLiBkZXByZWNhdGVkOjogMy40LjMKKworCitFeGNlcHRpb25zCiteXl5eXl5eXl5eCisKKy4uIGV4Y2VwdGlvbjo6IFF1ZXVlRW1wdHkKKworICAgRXhjZXB0aW9uIHJhaXNlZCB3aGVuIHRoZSA6bWV0aDpgflF1ZXVlLmdldF9ub3dhaXRgIG1ldGhvZCBpcyBjYWxsZWQgb24gYQorICAgOmNsYXNzOmBRdWV1ZWAgb2JqZWN0IHdoaWNoIGlzIGVtcHR5LgorCisKKy4uIGV4Y2VwdGlvbjo6IFF1ZXVlRnVsbAorCisgICBFeGNlcHRpb24gcmFpc2VkIHdoZW4gdGhlIDptZXRoOmB+UXVldWUucHV0X25vd2FpdGAgbWV0aG9kIGlzIGNhbGxlZCBvbiBhCisgICA6Y2xhc3M6YFF1ZXVlYCBvYmplY3Qgd2hpY2ggaXMgZnVsbC4KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2FzeW5jaW8tc3RyZWFtLnJzdCBiL0RvYy9saWJyYXJ5L2FzeW5jaW8tc3RyZWFtLnJzdAppbmRleCAzODA5ZDk0Li40MWIyNGFjIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9hc3luY2lvLXN0cmVhbS5yc3QKKysrIGIvRG9jL2xpYnJhcnkvYXN5bmNpby1zdHJlYW0ucnN0CkBAIC05LDcgKzksNyBAQAogU3RyZWFtIGZ1bmN0aW9ucwogPT09PT09PT09PT09PT09PQogCi0uLiBmdW5jdGlvbjo6IG9wZW5fY29ubmVjdGlvbihob3N0PU5vbmUsIHBvcnQ9Tm9uZSwgXCosIGxvb3A9Tm9uZSwgbGltaXQ9Tm9uZSwgKiprd2RzKQorLi4gY29yb3V0aW5lZnVuY3Rpb246OiBvcGVuX2Nvbm5lY3Rpb24oaG9zdD1Ob25lLCBwb3J0PU5vbmUsIFwqLCBsb29wPU5vbmUsIGxpbWl0PU5vbmUsIFwqXCprd2RzKQogCiAgICBBIHdyYXBwZXIgZm9yIDptZXRoOmB+QmFzZUV2ZW50TG9vcC5jcmVhdGVfY29ubmVjdGlvbigpYCByZXR1cm5pbmcgYSAocmVhZGVyLAogICAgd3JpdGVyKSBwYWlyLgpAQCAtMzIsNyArMzIsNyBAQAogCiAgICBUaGlzIGZ1bmN0aW9uIGlzIGEgOnJlZjpgY29yb3V0aW5lIDxjb3JvdXRpbmU+YC4KIAotLi4gZnVuY3Rpb246OiBzdGFydF9zZXJ2ZXIoY2xpZW50X2Nvbm5lY3RlZF9jYiwgaG9zdD1Ob25lLCBwb3J0PU5vbmUsIFwqLCBsb29wPU5vbmUsIGxpbWl0PU5vbmUsICoqa3dkcykKKy4uIGNvcm91dGluZWZ1bmN0aW9uOjogc3RhcnRfc2VydmVyKGNsaWVudF9jb25uZWN0ZWRfY2IsIGhvc3Q9Tm9uZSwgcG9ydD1Ob25lLCBcKiwgbG9vcD1Ob25lLCBsaW1pdD1Ob25lLCBcKlwqa3dkcykKIAogICAgU3RhcnQgYSBzb2NrZXQgc2VydmVyLCB3aXRoIGEgY2FsbGJhY2sgZm9yIGVhY2ggY2xpZW50IGNvbm5lY3RlZC4gVGhlIHJldHVybgogICAgdmFsdWUgaXMgdGhlIHNhbWUgYXMgOm1ldGg6YH5CYXNlRXZlbnRMb29wLmNyZWF0ZV9zZXJ2ZXIoKWAuCkBAIC01Niw3ICs1Niw3IEBACiAKICAgIFRoaXMgZnVuY3Rpb24gaXMgYSA6cmVmOmBjb3JvdXRpbmUgPGNvcm91dGluZT5gLgogCi0uLiBmdW5jdGlvbjo6IG9wZW5fdW5peF9jb25uZWN0aW9uKHBhdGg9Tm9uZSwgXCosIGxvb3A9Tm9uZSwgbGltaXQ9Tm9uZSwgKiprd2RzKQorLi4gY29yb3V0aW5lZnVuY3Rpb246OiBvcGVuX3VuaXhfY29ubmVjdGlvbihwYXRoPU5vbmUsIFwqLCBsb29wPU5vbmUsIGxpbWl0PU5vbmUsICoqa3dkcykKIAogICAgQSB3cmFwcGVyIGZvciA6bWV0aDpgfkJhc2VFdmVudExvb3AuY3JlYXRlX3VuaXhfY29ubmVjdGlvbigpYCByZXR1cm5pbmcKICAgIGEgKHJlYWRlciwgd3JpdGVyKSBwYWlyLgpAQCAtNjgsNyArNjgsNyBAQAogCiAgICBBdmFpbGFiaWxpdHk6IFVOSVguCiAKLS4uIGZ1bmN0aW9uOjogc3RhcnRfdW5peF9zZXJ2ZXIoY2xpZW50X2Nvbm5lY3RlZF9jYiwgcGF0aD1Ob25lLCBcKiwgbG9vcD1Ob25lLCBsaW1pdD1Ob25lLCAqKmt3ZHMpCisuLiBjb3JvdXRpbmVmdW5jdGlvbjo6IHN0YXJ0X3VuaXhfc2VydmVyKGNsaWVudF9jb25uZWN0ZWRfY2IsIHBhdGg9Tm9uZSwgXCosIGxvb3A9Tm9uZSwgbGltaXQ9Tm9uZSwgKiprd2RzKQogCiAgICBTdGFydCBhIFVOSVggRG9tYWluIFNvY2tldCBzZXJ2ZXIsIHdpdGggYSBjYWxsYmFjayBmb3IgZWFjaCBjbGllbnQgY29ubmVjdGVkLgogCkBAIC04NSw2ICs4NSw4IEBACiAKIC4uIGNsYXNzOjogU3RyZWFtUmVhZGVyKGxpbWl0PU5vbmUsIGxvb3A9Tm9uZSkKIAorICAgVGhpcyBjbGFzcyBpcyA6cmVmOmBub3QgdGhyZWFkIHNhZmUgPGFzeW5jaW8tbXVsdGl0aHJlYWRpbmc+YC4KKwogICAgLi4gbWV0aG9kOjogZXhjZXB0aW9uKCkKIAogICAgICAgR2V0IHRoZSBleGNlcHRpb24uCkBAIC0xMDYsNyArMTA4LDcgQEAKIAogICAgICAgU2V0IHRoZSB0cmFuc3BvcnQuCiAKLSAgIC4uIG1ldGhvZDo6IHJlYWQobj0tMSkKKyAgIC4uIGNvcm91dGluZW1ldGhvZDo6IHJlYWQobj0tMSkKIAogICAgICAgUmVhZCB1cCB0byAqbiogYnl0ZXMuICBJZiAqbiogaXMgbm90IHByb3ZpZGVkLCBvciBzZXQgdG8gYGAtMWBgLAogICAgICAgcmVhZCB1bnRpbCBFT0YgYW5kIHJldHVybiBhbGwgcmVhZCBieXRlcy4KQEAgLTExNiw3ICsxMTgsNyBAQAogCiAgICAgICBUaGlzIG1ldGhvZCBpcyBhIDpyZWY6YGNvcm91dGluZSA8Y29yb3V0aW5lPmAuCiAKLSAgIC4uIG1ldGhvZDo6IHJlYWRsaW5lKCkKKyAgIC4uIGNvcm91dGluZW1ldGhvZDo6IHJlYWRsaW5lKCkKIAogICAgICAgUmVhZCBvbmUgbGluZSwgd2hlcmUgImxpbmUiIGlzIGEgc2VxdWVuY2Ugb2YgYnl0ZXMgZW5kaW5nIHdpdGggYGBcbmBgLgogCkBAIC0xMjgsNyArMTMwLDcgQEAKIAogICAgICAgVGhpcyBtZXRob2QgaXMgYSA6cmVmOmBjb3JvdXRpbmUgPGNvcm91dGluZT5gLgogCi0gICAuLiBtZXRob2Q6OiByZWFkZXhhY3RseShuKQorICAgLi4gY29yb3V0aW5lbWV0aG9kOjogcmVhZGV4YWN0bHkobikKIAogICAgICAgUmVhZCBleGFjdGx5ICpuKiBieXRlcy4gUmFpc2UgYW4gOmV4YzpgSW5jb21wbGV0ZVJlYWRFcnJvcmAgaWYgdGhlIGVuZCBvZgogICAgICAgdGhlIHN0cmVhbSBpcyByZWFjaGVkIGJlZm9yZSAqbiogY2FuIGJlIHJlYWQsIHRoZQpAQCAtMTU1LDYgKzE1Nyw4IEBACiAgICB3YWl0IGZvciBmbG93IGNvbnRyb2wuICBJdCBhbHNvIGFkZHMgYSB0cmFuc3BvcnQgYXR0cmlidXRlIHdoaWNoIHJlZmVyZW5jZXMKICAgIHRoZSA6Y2xhc3M6YFRyYW5zcG9ydGAgZGlyZWN0bHkuCiAKKyAgIFRoaXMgY2xhc3MgaXMgOnJlZjpgbm90IHRocmVhZCBzYWZlIDxhc3luY2lvLW11bHRpdGhyZWFkaW5nPmAuCisKICAgIC4uIGF0dHJpYnV0ZTo6IHRyYW5zcG9ydAogCiAgICAgICBUcmFuc3BvcnQuCkBAIC0xNjgsNyArMTcyLDcgQEAKIAogICAgICAgQ2xvc2UgdGhlIHRyYW5zcG9ydDogc2VlIDptZXRoOmBCYXNlVHJhbnNwb3J0LmNsb3NlYC4KIAotICAgLi4gbWV0aG9kOjogZHJhaW4oKQorICAgLi4gY29yb3V0aW5lbWV0aG9kOjogZHJhaW4oKQogCiAgICAgICBMZXQgdGhlIHdyaXRlIGJ1ZmZlciBvZiB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgYSBjaGFuY2UgdG8gYmUgZmx1c2hlZC4KIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvYXN5bmNpby1zdWJwcm9jZXNzLnJzdCBiL0RvYy9saWJyYXJ5L2FzeW5jaW8tc3VicHJvY2Vzcy5yc3QKaW5kZXggNTcwMTA3ZS4uMWI4MjAzMCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvYXN5bmNpby1zdWJwcm9jZXNzLnJzdAorKysgYi9Eb2MvbGlicmFyeS9hc3luY2lvLXN1YnByb2Nlc3MucnN0CkBAIC0yNyw3ICsyNyw3IEBACiBDcmVhdGUgYSBzdWJwcm9jZXNzOiBoaWdoLWxldmVsIEFQSSB1c2luZyBQcm9jZXNzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLS4uIGZ1bmN0aW9uOjogY3JlYXRlX3N1YnByb2Nlc3NfZXhlYyhcKmFyZ3MsIHN0ZGluPU5vbmUsIHN0ZG91dD1Ob25lLCBzdGRlcnI9Tm9uZSwgbG9vcD1Ob25lLCBsaW1pdD1Ob25lLCBcKlwqa3dkcykKKy4uIGNvcm91dGluZWZ1bmN0aW9uOjogY3JlYXRlX3N1YnByb2Nlc3NfZXhlYyhcKmFyZ3MsIHN0ZGluPU5vbmUsIHN0ZG91dD1Ob25lLCBzdGRlcnI9Tm9uZSwgbG9vcD1Ob25lLCBsaW1pdD1Ob25lLCBcKlwqa3dkcykKIAogICAgQ3JlYXRlIGEgc3VicHJvY2Vzcy4KIApAQCAtMzksNyArMzksNyBAQAogCiAgICBUaGlzIGZ1bmN0aW9uIGlzIGEgOnJlZjpgY29yb3V0aW5lIDxjb3JvdXRpbmU+YC4KIAotLi4gZnVuY3Rpb246OiBjcmVhdGVfc3VicHJvY2Vzc19zaGVsbChjbWQsIHN0ZGluPU5vbmUsIHN0ZG91dD1Ob25lLCBzdGRlcnI9Tm9uZSwgbG9vcD1Ob25lLCBsaW1pdD1Ob25lLCBcKlwqa3dkcykKKy4uIGNvcm91dGluZWZ1bmN0aW9uOjogY3JlYXRlX3N1YnByb2Nlc3Nfc2hlbGwoY21kLCBzdGRpbj1Ob25lLCBzdGRvdXQ9Tm9uZSwgc3RkZXJyPU5vbmUsIGxvb3A9Tm9uZSwgbGltaXQ9Tm9uZSwgXCpcKmt3ZHMpCiAKICAgIFJ1biB0aGUgc2hlbGwgY29tbWFuZCAqY21kKi4KIApAQCAtNjcsNyArNjcsNyBAQAogCiBSdW4gc3VicHJvY2Vzc2VzIGFzeW5jaHJvbm91c2x5IHVzaW5nIHRoZSA6bW9kOmBzdWJwcm9jZXNzYCBtb2R1bGUuCiAKLS4uIG1ldGhvZDo6IEJhc2VFdmVudExvb3Auc3VicHJvY2Vzc19leGVjKHByb3RvY29sX2ZhY3RvcnksIFwqYXJncywgc3RkaW49c3VicHJvY2Vzcy5QSVBFLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFLCBcKlwqa3dhcmdzKQorLi4gY29yb3V0aW5lbWV0aG9kOjogQmFzZUV2ZW50TG9vcC5zdWJwcm9jZXNzX2V4ZWMocHJvdG9jb2xfZmFjdG9yeSwgXCphcmdzLCBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUsIFwqXCprd2FyZ3MpCiAKICAgIENyZWF0ZSBhIHN1YnByb2Nlc3MgZnJvbSBvbmUgb3IgbW9yZSBzdHJpbmcgYXJndW1lbnRzIChjaGFyYWN0ZXIgc3RyaW5ncyBvcgogICAgYnl0ZXMgc3RyaW5ncyBlbmNvZGVkIHRvIHRoZSA6cmVmOmBmaWxlc3lzdGVtIGVuY29kaW5nCkBAIC0xMTYsNyArMTE2LDcgQEAKIAogICAgU2VlIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgOmNsYXNzOmBzdWJwcm9jZXNzLlBvcGVuYCBjbGFzcyBmb3IgcGFyYW1ldGVycy4KIAotLi4gbWV0aG9kOjogQmFzZUV2ZW50TG9vcC5zdWJwcm9jZXNzX3NoZWxsKHByb3RvY29sX2ZhY3RvcnksIGNtZCwgXCosIHN0ZGluPXN1YnByb2Nlc3MuUElQRSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSwgXCpcKmt3YXJncykKKy4uIGNvcm91dGluZW1ldGhvZDo6IEJhc2VFdmVudExvb3Auc3VicHJvY2Vzc19zaGVsbChwcm90b2NvbF9mYWN0b3J5LCBjbWQsIFwqLCBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUsIFwqXCprd2FyZ3MpCiAKICAgIENyZWF0ZSBhIHN1YnByb2Nlc3MgZnJvbSAqY21kKiwgd2hpY2ggaXMgYSBjaGFyYWN0ZXIgc3RyaW5nIG9yIGEgYnl0ZXMKICAgIHN0cmluZyBlbmNvZGVkIHRvIHRoZSA6cmVmOmBmaWxlc3lzdGVtIGVuY29kaW5nIDxmaWxlc3lzdGVtLWVuY29kaW5nPmAsCkBAIC0xOTMsNyArMTkzLDEwIEBACiAgICAgIDptZXRoOmB+c3VicHJvY2Vzcy5Qb3Blbi53YWl0YCBtZXRob2Qgb2YgdGhlIDpjbGFzczpgfnN1YnByb2Nlc3MuUG9wZW5gCiAgICAgIGNsYXNzIGlzIGltcGxlbWVudGVkIGFzIGEgYnVzeSBsb29wLgogCi0gICAuLiBtZXRob2Q6OiB3YWl0KCkKKyAgIFRoaXMgY2xhc3MgaXMgOnJlZjpgbm90IHRocmVhZCBzYWZlIDxhc3luY2lvLW11bHRpdGhyZWFkaW5nPmAuIFNlZSBhbHNvIHRoZQorICAgOnJlZjpgU3VicHJvY2VzcyBhbmQgdGhyZWFkcyA8YXN5bmNpby1zdWJwcm9jZXNzLXRocmVhZHM+YCBzZWN0aW9uLgorCisgICAuLiBjb3JvdXRpbmVtZXRob2Q6OiB3YWl0KCkKIAogICAgICAgV2FpdCBmb3IgY2hpbGQgcHJvY2VzcyB0byB0ZXJtaW5hdGUuICBTZXQgYW5kIHJldHVybiA6YXR0cjpgcmV0dXJuY29kZWAKICAgICAgIGF0dHJpYnV0ZS4KQEAgLTIwNyw3ICsyMTAsNyBAQAogICAgICAgICAgYmxvY2tzIHdhaXRpbmcgZm9yIHRoZSBPUyBwaXBlIGJ1ZmZlciB0byBhY2NlcHQgbW9yZSBkYXRhLiBVc2UgdGhlCiAgICAgICAgICA6bWV0aDpgY29tbXVuaWNhdGVgIG1ldGhvZCB3aGVuIHVzaW5nIHBpcGVzIHRvIGF2b2lkIHRoYXQuCiAKLSAgIC4uIG1ldGhvZDo6IGNvbW11bmljYXRlKGlucHV0PU5vbmUpCisgICAuLiBjb3JvdXRpbmVtZXRob2Q6OiBjb21tdW5pY2F0ZShpbnB1dD1Ob25lKQogCiAgICAgICBJbnRlcmFjdCB3aXRoIHByb2Nlc3M6IFNlbmQgZGF0YSB0byBzdGRpbi4gIFJlYWQgZGF0YSBmcm9tIHN0ZG91dCBhbmQKICAgICAgIHN0ZGVyciwgdW50aWwgZW5kLW9mLWZpbGUgaXMgcmVhY2hlZC4gIFdhaXQgZm9yIHByb2Nlc3MgdG8gdGVybWluYXRlLgpAQCAtMzEwLDYgKzMxMyw4IEBACiAgIHN1YnByb2Nlc3NlcyBmcm9tIG90aGVyIHRocmVhZHMuIENhbGwgdGhlIDpmdW5jOmBnZXRfY2hpbGRfd2F0Y2hlcmAKICAgZnVuY3Rpb24gaW4gdGhlIG1haW4gdGhyZWFkIHRvIGluc3RhbnRpYXRlIHRoZSBjaGlsZCB3YXRjaGVyLgogCitUaGUgOmNsYXNzOmBhc3luY2lvLnN1YnByb2Nlc3MuUHJvY2Vzc2AgY2xhc3MgaXMgbm90IHRocmVhZCBzYWZlLgorCiAuLiBzZWVhbHNvOjoKIAogICAgVGhlIDpyZWY6YENvbmN1cnJlbmN5IGFuZCBtdWx0aXRocmVhZGluZyBpbiBhc3luY2lvCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9hc3luY2lvLXN5bmMucnN0IGIvRG9jL2xpYnJhcnkvYXN5bmNpby1zeW5jLnJzdAppbmRleCA4MDk3NGQ5Li42MjJmZjVmZCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvYXN5bmNpby1zeW5jLnJzdAorKysgYi9Eb2MvbGlicmFyeS9hc3luY2lvLXN5bmMucnN0CkBAIC05LDIyICs5LDE2IEBACiAqIDpjbGFzczpgTG9ja2AKICogOmNsYXNzOmBFdmVudGAKICogOmNsYXNzOmBDb25kaXRpb25gCisKK1NlbWFwaG9yZXM6CisKICogOmNsYXNzOmBTZW1hcGhvcmVgCiAqIDpjbGFzczpgQm91bmRlZFNlbWFwaG9yZWAKIAotUXVldWVzOgotCi0qIDpjbGFzczpgUXVldWVgCi0qIDpjbGFzczpgUHJpb3JpdHlRdWV1ZWAKLSogOmNsYXNzOmBMaWZvUXVldWVgCi0qIDpjbGFzczpgSm9pbmFibGVRdWV1ZWAKLQotYXN5bmNpbyBsb2NrcyBhbmQgcXVldWVzIEFQSSB3ZXJlIGRlc2lnbmVkIHRvIGJlIGNsb3NlIHRvIGNsYXNzZXMgb2YgdGhlCi06bW9kOmB0aHJlYWRpbmdgIG1vZHVsZSAoOmNsYXNzOmB+dGhyZWFkaW5nLkxvY2tgLCA6Y2xhc3M6YH50aHJlYWRpbmcuRXZlbnRgLAorYXN5bmNpbyBsb2NrIEFQSSB3YXMgZGVzaWduZWQgdG8gYmUgY2xvc2UgdG8gY2xhc3NlcyBvZiB0aGUgOm1vZDpgdGhyZWFkaW5nYAorbW9kdWxlICg6Y2xhc3M6YH50aHJlYWRpbmcuTG9ja2AsIDpjbGFzczpgfnRocmVhZGluZy5FdmVudGAsCiA6Y2xhc3M6YH50aHJlYWRpbmcuQ29uZGl0aW9uYCwgOmNsYXNzOmB+dGhyZWFkaW5nLlNlbWFwaG9yZWAsCi06Y2xhc3M6YH50aHJlYWRpbmcuQm91bmRlZFNlbWFwaG9yZWApIGFuZCB0aGUgOm1vZDpgcXVldWVgIG1vZHVsZQotKDpjbGFzczpgfnF1ZXVlLlF1ZXVlYCwgOmNsYXNzOmB+cXVldWUuUHJpb3JpdHlRdWV1ZWAsCi06Y2xhc3M6YH5xdWV1ZS5MaWZvUXVldWVgKSwgYnV0IHRoZXkgaGF2ZSBubyAqdGltZW91dCogcGFyYW1ldGVyLiBUaGUKKzpjbGFzczpgfnRocmVhZGluZy5Cb3VuZGVkU2VtYXBob3JlYCksIGJ1dCBpdCBoYXMgbm8gKnRpbWVvdXQqIHBhcmFtZXRlci4gVGhlCiA6ZnVuYzpgYXN5bmNpby53YWl0X2ZvcmAgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY2FuY2VsIGEgdGFzayBhZnRlciBhIHRpbWVvdXQuCiAKIExvY2tzCkBAIC02MCw2ICs1NCw4IEBACiAgICBMb2NrcyBhbHNvIHN1cHBvcnQgdGhlIGNvbnRleHQgbWFuYWdlbWVudCBwcm90b2NvbC4gIGBgKHlpZWxkIGZyb20gbG9jaylgYAogICAgc2hvdWxkIGJlIHVzZWQgYXMgY29udGV4dCBtYW5hZ2VyIGV4cHJlc3Npb24uCiAKKyAgIFRoaXMgY2xhc3MgaXMgOnJlZjpgbm90IHRocmVhZCBzYWZlIDxhc3luY2lvLW11bHRpdGhyZWFkaW5nPmAuCisKICAgIFVzYWdlOjoKIAogICAgICAgIGxvY2sgPSBMb2NrKCkKQEAgLTg5LDcgKzg1LDcgQEAKIAogICAgICAgUmV0dXJuIGBgVHJ1ZWBgIGlmIHRoZSBsb2NrIGlzIGFjcXVpcmVkLgogCi0gICAuLiBtZXRob2Q6OiBhY3F1aXJlKCkKKyAgIC4uIGNvcm91dGluZW1ldGhvZDo6IGFjcXVpcmUoKQogCiAgICAgICBBY3F1aXJlIGEgbG9jay4KIApAQCAtMTIzLDYgKzExOSw4IEBACiAgICBtZXRob2QuICBUaGUgOm1ldGg6YHdhaXRgIG1ldGhvZCBibG9ja3MgdW50aWwgdGhlIGZsYWcgaXMgdHJ1ZS4gVGhlIGZsYWcgaXMKICAgIGluaXRpYWxseSBmYWxzZS4KIAorICAgVGhpcyBjbGFzcyBpcyA6cmVmOmBub3QgdGhyZWFkIHNhZmUgPGFzeW5jaW8tbXVsdGl0aHJlYWRpbmc+YC4KKwogICAgLi4gbWV0aG9kOjogY2xlYXIoKQogCiAgICAgICBSZXNldCB0aGUgaW50ZXJuYWwgZmxhZyB0byBmYWxzZS4gU3Vic2VxdWVudGx5LCBjb3JvdXRpbmVzIGNhbGxpbmcKQEAgLTEzOSw3ICsxMzcsNyBAQAogICAgICAgdHJ1ZSBhcmUgYXdha2VuZWQuIENvcm91dGluZSB0aGF0IGNhbGwgOm1ldGg6YHdhaXRgIG9uY2UgdGhlIGZsYWcgaXMgdHJ1ZQogICAgICAgd2lsbCBub3QgYmxvY2sgYXQgYWxsLgogCi0gICAuLiBtZXRob2Q6OiB3YWl0KCkKKyAgIC4uIGNvcm91dGluZW1ldGhvZDo6IHdhaXQoKQogCiAgICAgICBCbG9jayB1bnRpbCB0aGUgaW50ZXJuYWwgZmxhZyBpcyB0cnVlLgogCkBAIC0xNjYsNyArMTY0LDkgQEAKICAgIG9iamVjdCwgYW5kIGl0IGlzIHVzZWQgYXMgdGhlIHVuZGVybHlpbmcgbG9jay4gIE90aGVyd2lzZSwKICAgIGEgbmV3IDpjbGFzczpgTG9ja2Agb2JqZWN0IGlzIGNyZWF0ZWQgYW5kIHVzZWQgYXMgdGhlIHVuZGVybHlpbmcgbG9jay4KIAotICAgLi4gbWV0aG9kOjogYWNxdWlyZSgpCisgICBUaGlzIGNsYXNzIGlzIDpyZWY6YG5vdCB0aHJlYWQgc2FmZSA8YXN5bmNpby1tdWx0aXRocmVhZGluZz5gLgorCisgICAuLiBjb3JvdXRpbmVtZXRob2Q6OiBhY3F1aXJlKCkKIAogICAgICAgQWNxdWlyZSB0aGUgdW5kZXJseWluZyBsb2NrLgogCkBAIC0yMTMsNyArMjEzLDcgQEAKIAogICAgICAgVGhlcmUgaXMgbm8gcmV0dXJuIHZhbHVlLgogCi0gICAuLiBtZXRob2Q6OiB3YWl0KCkKKyAgIC4uIGNvcm91dGluZW1ldGhvZDo6IHdhaXQoKQogCiAgICAgICBXYWl0IHVudGlsIG5vdGlmaWVkLgogCkBAIC0yMjcsNyArMjI3LDcgQEAKIAogICAgICAgVGhpcyBtZXRob2QgaXMgYSA6cmVmOmBjb3JvdXRpbmUgPGNvcm91dGluZT5gLgogCi0gICAuLiBtZXRob2Q6OiB3YWl0X2ZvcihwcmVkaWNhdGUpCisgICAuLiBjb3JvdXRpbmVtZXRob2Q6OiB3YWl0X2ZvcihwcmVkaWNhdGUpCiAKICAgICAgIFdhaXQgdW50aWwgYSBwcmVkaWNhdGUgYmVjb21lcyB0cnVlLgogCkBAIC0yNTgsNyArMjU4LDkgQEAKICAgIGRlZmF1bHRzIHRvIGBgMWBgLiBJZiB0aGUgdmFsdWUgZ2l2ZW4gaXMgbGVzcyB0aGFuIGBgMGBgLCA6ZXhjOmBWYWx1ZUVycm9yYAogICAgaXMgcmFpc2VkLgogCi0gICAuLiBtZXRob2Q6OiBhY3F1aXJlKCkKKyAgIFRoaXMgY2xhc3MgaXMgOnJlZjpgbm90IHRocmVhZCBzYWZlIDxhc3luY2lvLW11bHRpdGhyZWFkaW5nPmAuCisKKyAgIC4uIGNvcm91dGluZW1ldGhvZDo6IGFjcXVpcmUoKQogCiAgICAgICBBY3F1aXJlIGEgc2VtYXBob3JlLgogCkBAIC0yNzMsNyArMjc1LDcgQEAKIAogICAgICAgUmV0dXJucyBgYFRydWVgYCBpZiBzZW1hcGhvcmUgY2FuIG5vdCBiZSBhY3F1aXJlZCBpbW1lZGlhdGVseS4KIAotICAgLi4gbWV0aG9kOjogcmVsZWFzZSgpCisgICAuLiBjb3JvdXRpbmVtZXRob2Q6OiByZWxlYXNlKCkKIAogICAgICAgUmVsZWFzZSBhIHNlbWFwaG9yZSwgaW5jcmVtZW50aW5nIHRoZSBpbnRlcm5hbCBjb3VudGVyIGJ5IG9uZS4gV2hlbiBpdAogICAgICAgd2FzIHplcm8gb24gZW50cnkgYW5kIGFub3RoZXIgY29yb3V0aW5lIGlzIHdhaXRpbmcgZm9yIGl0IHRvIGJlY29tZQpAQCAtMjg1LDE1NCArMjg3LDggQEAKIAogLi4gY2xhc3M6OiBCb3VuZGVkU2VtYXBob3JlKHZhbHVlPTEsIFwqLCBsb29wPU5vbmUpCiAKLSAgICBBIGJvdW5kZWQgc2VtYXBob3JlIGltcGxlbWVudGF0aW9uLiBJbmhlcml0IGZyb20gOmNsYXNzOmBTZW1hcGhvcmVgLgorICAgQSBib3VuZGVkIHNlbWFwaG9yZSBpbXBsZW1lbnRhdGlvbi4gSW5oZXJpdCBmcm9tIDpjbGFzczpgU2VtYXBob3JlYC4KIAotICAgIFRoaXMgcmFpc2VzIDpleGM6YFZhbHVlRXJyb3JgIGluIDptZXRoOmB+U2VtYXBob3JlLnJlbGVhc2VgIGlmIGl0IHdvdWxkCi0gICAgaW5jcmVhc2UgdGhlIHZhbHVlIGFib3ZlIHRoZSBpbml0aWFsIHZhbHVlLgorICAgVGhpcyByYWlzZXMgOmV4YzpgVmFsdWVFcnJvcmAgaW4gOm1ldGg6YH5TZW1hcGhvcmUucmVsZWFzZWAgaWYgaXQgd291bGQKKyAgIGluY3JlYXNlIHRoZSB2YWx1ZSBhYm92ZSB0aGUgaW5pdGlhbCB2YWx1ZS4KIAotCi1RdWV1ZXMKLS0tLS0tLQotCi1RdWV1ZQotXl5eXl4KLQotLi4gY2xhc3M6OiBRdWV1ZShtYXhzaXplPTAsIFwqLCBsb29wPU5vbmUpCi0KLSAgIEEgcXVldWUsIHVzZWZ1bCBmb3IgY29vcmRpbmF0aW5nIHByb2R1Y2VyIGFuZCBjb25zdW1lciBjb3JvdXRpbmVzLgotCi0gICBJZiAqbWF4c2l6ZSogaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHplcm8sIHRoZSBxdWV1ZSBzaXplIGlzIGluZmluaXRlLiBJZgotICAgaXQgaXMgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gYGAwYGAsIHRoZW4gYGB5aWVsZCBmcm9tIHB1dCgpYGAgd2lsbCBibG9jawotICAgd2hlbiB0aGUgcXVldWUgcmVhY2hlcyAqbWF4c2l6ZSosIHVudGlsIGFuIGl0ZW0gaXMgcmVtb3ZlZCBieSA6bWV0aDpgZ2V0YC4KLQotICAgVW5saWtlIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IDptb2Q6YHF1ZXVlYCwgeW91IGNhbiByZWxpYWJseSBrbm93IHRoaXMgUXVldWUncwotICAgc2l6ZSB3aXRoIDptZXRoOmBxc2l6ZWAsIHNpbmNlIHlvdXIgc2luZ2xlLXRocmVhZGVkIGFzeW5jaW8gYXBwbGljYXRpb24gd29uJ3QKLSAgIGJlIGludGVycnVwdGVkIGJldHdlZW4gY2FsbGluZyA6bWV0aDpgcXNpemVgIGFuZCBkb2luZyBhbiBvcGVyYXRpb24gb24gdGhlCi0gICBRdWV1ZS4KLQotICAgLi4gbWV0aG9kOjogZW1wdHkoKQotCi0gICAgICBSZXR1cm4gYGBUcnVlYGAgaWYgdGhlIHF1ZXVlIGlzIGVtcHR5LCBgYEZhbHNlYGAgb3RoZXJ3aXNlLgotCi0gICAuLiBtZXRob2Q6OiBmdWxsKCkKLQotICAgICAgUmV0dXJuIGBgVHJ1ZWBgIGlmIHRoZXJlIGFyZSA6YXR0cjpgbWF4c2l6ZWAgaXRlbXMgaW4gdGhlIHF1ZXVlLgotCi0gICAgICAuLiBub3RlOjoKLQotICAgICAgICAgSWYgdGhlIFF1ZXVlIHdhcyBpbml0aWFsaXplZCB3aXRoIGBgbWF4c2l6ZT0wYGAgKHRoZSBkZWZhdWx0KSwgdGhlbgotICAgICAgICAgOm1ldGg6YGZ1bGwoKWAgaXMgbmV2ZXIgYGBUcnVlYGAuCi0KLSAgIC4uIG1ldGhvZDo6IGdldCgpCi0KLSAgICAgIFJlbW92ZSBhbmQgcmV0dXJuIGFuIGl0ZW0gZnJvbSB0aGUgcXVldWUuIElmIHF1ZXVlIGlzIGVtcHR5LCB3YWl0IHVudGlsCi0gICAgICBhbiBpdGVtIGlzIGF2YWlsYWJsZS4KLQotICAgICAgVGhpcyBtZXRob2QgaXMgYSA6cmVmOmBjb3JvdXRpbmUgPGNvcm91dGluZT5gLgotCi0gICAgICAuLiBzZWVhbHNvOjoKLQotICAgICAgICAgVGhlIDptZXRoOmBlbXB0eWAgbWV0aG9kLgotCi0gICAuLiBtZXRob2Q6OiBnZXRfbm93YWl0KCkKLQotICAgICAgUmVtb3ZlIGFuZCByZXR1cm4gYW4gaXRlbSBmcm9tIHRoZSBxdWV1ZS4KLQotICAgICAgUmV0dXJuIGFuIGl0ZW0gaWYgb25lIGlzIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSwgZWxzZSByYWlzZQotICAgICAgOmV4YzpgUXVldWVFbXB0eWAuCi0KLSAgIC4uIG1ldGhvZDo6IHB1dChpdGVtKQotCi0gICAgICBQdXQgYW4gaXRlbSBpbnRvIHRoZSBxdWV1ZS4gSWYgdGhlIHF1ZXVlIGlzIGZ1bGwsIHdhaXQgdW50aWwgYSBmcmVlIHNsb3QKLSAgICAgIGlzIGF2YWlsYWJsZSBiZWZvcmUgYWRkaW5nIGl0ZW0uCi0KLSAgICAgIFRoaXMgbWV0aG9kIGlzIGEgOnJlZjpgY29yb3V0aW5lIDxjb3JvdXRpbmU+YC4KLQotICAgICAgLi4gc2VlYWxzbzo6Ci0KLSAgICAgICAgIFRoZSA6bWV0aDpgZnVsbGAgbWV0aG9kLgotCi0gICAuLiBtZXRob2Q6OiBwdXRfbm93YWl0KGl0ZW0pCi0KLSAgICAgIFB1dCBhbiBpdGVtIGludG8gdGhlIHF1ZXVlIHdpdGhvdXQgYmxvY2tpbmcuCi0KLSAgICAgIElmIG5vIGZyZWUgc2xvdCBpcyBpbW1lZGlhdGVseSBhdmFpbGFibGUsIHJhaXNlIDpleGM6YFF1ZXVlRnVsbGAuCi0KLSAgIC4uIG1ldGhvZDo6IHFzaXplKCkKLQotICAgICAgTnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBxdWV1ZS4KLQotICAgLi4gYXR0cmlidXRlOjogbWF4c2l6ZQotCi0gICAgICBOdW1iZXIgb2YgaXRlbXMgYWxsb3dlZCBpbiB0aGUgcXVldWUuCi0KLQotUHJpb3JpdHlRdWV1ZQotXl5eXl5eXl5eXl5eXgotCi0uLiBjbGFzczo6IFByaW9yaXR5UXVldWUKLQotICAgQSBzdWJjbGFzcyBvZiA6Y2xhc3M6YFF1ZXVlYDsgcmV0cmlldmVzIGVudHJpZXMgaW4gcHJpb3JpdHkgb3JkZXIgKGxvd2VzdAotICAgZmlyc3QpLgotCi0gICBFbnRyaWVzIGFyZSB0eXBpY2FsbHkgdHVwbGVzIG9mIHRoZSBmb3JtOiAocHJpb3JpdHkgbnVtYmVyLCBkYXRhKS4KLQotCi1MaWZvUXVldWUKLV5eXl5eXl5eXgotCi0uLiBjbGFzczo6IExpZm9RdWV1ZQotCi0gICAgQSBzdWJjbGFzcyBvZiA6Y2xhc3M6YFF1ZXVlYCB0aGF0IHJldHJpZXZlcyBtb3N0IHJlY2VudGx5IGFkZGVkIGVudHJpZXMKLSAgICBmaXJzdC4KLQotCi1Kb2luYWJsZVF1ZXVlCi1eXl5eXl5eXl5eXl5eCi0KLS4uIGNsYXNzOjogSm9pbmFibGVRdWV1ZQotCi0gICBBIHN1YmNsYXNzIG9mIDpjbGFzczpgUXVldWVgIHdpdGggOm1ldGg6YHRhc2tfZG9uZWAgYW5kIDptZXRoOmBqb2luYAotICAgbWV0aG9kcy4KLQotICAgLi4gbWV0aG9kOjogam9pbigpCi0KLSAgICAgIEJsb2NrIHVudGlsIGFsbCBpdGVtcyBpbiB0aGUgcXVldWUgaGF2ZSBiZWVuIGdvdHRlbiBhbmQgcHJvY2Vzc2VkLgotCi0gICAgICBUaGUgY291bnQgb2YgdW5maW5pc2hlZCB0YXNrcyBnb2VzIHVwIHdoZW5ldmVyIGFuIGl0ZW0gaXMgYWRkZWQgdG8gdGhlCi0gICAgICBxdWV1ZS4gVGhlIGNvdW50IGdvZXMgZG93biB3aGVuZXZlciBhIGNvbnN1bWVyIHRocmVhZCBjYWxscwotICAgICAgOm1ldGg6YHRhc2tfZG9uZWAgdG8gaW5kaWNhdGUgdGhhdCB0aGUgaXRlbSB3YXMgcmV0cmlldmVkIGFuZCBhbGwgd29yayBvbgotICAgICAgaXQgaXMgY29tcGxldGUuICBXaGVuIHRoZSBjb3VudCBvZiB1bmZpbmlzaGVkIHRhc2tzIGRyb3BzIHRvIHplcm8sCi0gICAgICA6bWV0aDpgam9pbmAgdW5ibG9ja3MuCi0KLSAgICAgIFRoaXMgbWV0aG9kIGlzIGEgOnJlZjpgY29yb3V0aW5lIDxjb3JvdXRpbmU+YC4KLQotICAgLi4gbWV0aG9kOjogdGFza19kb25lKCkKLQotICAgICAgSW5kaWNhdGUgdGhhdCBhIGZvcm1lcmx5IGVucXVldWVkIHRhc2sgaXMgY29tcGxldGUuCi0KLSAgICAgIFVzZWQgYnkgcXVldWUgY29uc3VtZXJzLiBGb3IgZWFjaCA6bWV0aDpgflF1ZXVlLmdldGAgdXNlZCB0byBmZXRjaCBhIHRhc2ssIGEKLSAgICAgIHN1YnNlcXVlbnQgY2FsbCB0byA6bWV0aDpgdGFza19kb25lYCB0ZWxscyB0aGUgcXVldWUgdGhhdCB0aGUgcHJvY2Vzc2luZwotICAgICAgb24gdGhlIHRhc2sgaXMgY29tcGxldGUuCi0KLSAgICAgIElmIGEgOm1ldGg6YGpvaW5gIGlzIGN1cnJlbnRseSBibG9ja2luZywgaXQgd2lsbCByZXN1bWUgd2hlbiBhbGwgaXRlbXMKLSAgICAgIGhhdmUgYmVlbiBwcm9jZXNzZWQgKG1lYW5pbmcgdGhhdCBhIDptZXRoOmB0YXNrX2RvbmVgIGNhbGwgd2FzIHJlY2VpdmVkCi0gICAgICBmb3IgZXZlcnkgaXRlbSB0aGF0IGhhZCBiZWVuIDptZXRoOmB+UXVldWUucHV0YCBpbnRvIHRoZSBxdWV1ZSkuCi0KLSAgICAgIFJhaXNlcyA6ZXhjOmBWYWx1ZUVycm9yYCBpZiBjYWxsZWQgbW9yZSB0aW1lcyB0aGFuIHRoZXJlIHdlcmUgaXRlbXMKLSAgICAgIHBsYWNlZCBpbiB0aGUgcXVldWUuCi0KLQotRXhjZXB0aW9ucwotXl5eXl5eXl5eXgotCi0uLiBleGNlcHRpb246OiBRdWV1ZUVtcHR5Ci0KLSAgIEV4Y2VwdGlvbiByYWlzZWQgd2hlbiB0aGUgOm1ldGg6YH5RdWV1ZS5nZXRfbm93YWl0YCBtZXRob2QgaXMgY2FsbGVkIG9uIGEKLSAgIDpjbGFzczpgUXVldWVgIG9iamVjdCB3aGljaCBpcyBlbXB0eS4KLQotCi0uLiBleGNlcHRpb246OiBRdWV1ZUZ1bGwKLQotICAgRXhjZXB0aW9uIHJhaXNlZCB3aGVuIHRoZSA6bWV0aDpgflF1ZXVlLnB1dF9ub3dhaXRgIG1ldGhvZCBpcyBjYWxsZWQgb24gYQotICAgOmNsYXNzOmBRdWV1ZWAgb2JqZWN0IHdoaWNoIGlzIGZ1bGwuCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9hc3luY2lvLXRhc2sucnN0IGIvRG9jL2xpYnJhcnkvYXN5bmNpby10YXNrLnJzdAppbmRleCAzMDA4Yzg2Li4xNThhMGQ4IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9hc3luY2lvLXRhc2sucnN0CisrKyBiL0RvYy9saWJyYXJ5L2FzeW5jaW8tdGFzay5yc3QKQEAgLTIwOSw2ICsyMDksOCBAQAogICAgICA6ZnVuYzpgfmNvbmN1cnJlbnQuZnV0dXJlcy5hc19jb21wbGV0ZWRgIGZ1bmN0aW9ucyBpbiB0aGUKICAgICAgOm1vZDpgY29uY3VycmVudC5mdXR1cmVzYCBwYWNrYWdlLgogCisgICBUaGlzIGNsYXNzIGlzIDpyZWY6YG5vdCB0aHJlYWQgc2FmZSA8YXN5bmNpby1tdWx0aXRocmVhZGluZz5gLgorCiAgICAuLiBtZXRob2Q6OiBjYW5jZWwoKQogCiAgICAgICBDYW5jZWwgdGhlIGZ1dHVyZSBhbmQgc2NoZWR1bGUgY2FsbGJhY2tzLgpAQCAtMzc1LDYgKzM3Nyw4IEBACiAgICBEb24ndCBkaXJlY3RseSBjcmVhdGUgOmNsYXNzOmBUYXNrYCBpbnN0YW5jZXM6IHVzZSB0aGUgOmZ1bmM6YGFzeW5jYAogICAgZnVuY3Rpb24gb3IgdGhlIDptZXRoOmBCYXNlRXZlbnRMb29wLmNyZWF0ZV90YXNrYCBtZXRob2QuCiAKKyAgIFRoaXMgY2xhc3MgaXMgOnJlZjpgbm90IHRocmVhZCBzYWZlIDxhc3luY2lvLW11bHRpdGhyZWFkaW5nPmAuCisKICAgIC4uIGNsYXNzbWV0aG9kOjogYWxsX3Rhc2tzKGxvb3A9Tm9uZSkKIAogICAgICAgUmV0dXJuIGEgc2V0IG9mIGFsbCB0YXNrcyBmb3IgYW4gZXZlbnQgbG9vcC4KQEAgLTU0NSw3ICs1NDksNyBAQAogICAgUmV0dXJuIGBgVHJ1ZWBgIGlmICpmdW5jKiBpcyBhIGRlY29yYXRlZCA6cmVmOmBjb3JvdXRpbmUgZnVuY3Rpb24KICAgIDxjb3JvdXRpbmU+YC4KIAotLi4gZnVuY3Rpb246OiBzbGVlcChkZWxheSwgcmVzdWx0PU5vbmUsIFwqLCBsb29wPU5vbmUpCisuLiBjb3JvdXRpbmVmdW5jdGlvbjo6IHNsZWVwKGRlbGF5LCByZXN1bHQ9Tm9uZSwgXCosIGxvb3A9Tm9uZSkKIAogICAgQ3JlYXRlIGEgOnJlZjpgY29yb3V0aW5lIDxjb3JvdXRpbmU+YCB0aGF0IGNvbXBsZXRlcyBhZnRlciBhIGdpdmVuCiAgICB0aW1lIChpbiBzZWNvbmRzKS4gIElmICpyZXN1bHQqIGlzIHByb3ZpZGVkLCBpdCBpcyBwcm9kdWNlZCB0byB0aGUgY2FsbGVyCkBAIC01NTQsNiArNTU4LDggQEAKICAgIFRoZSByZXNvbHV0aW9uIG9mIHRoZSBzbGVlcCBkZXBlbmRzIG9uIHRoZSA6cmVmOmBncmFudWxhcml0eSBvZiB0aGUgZXZlbnQKICAgIGxvb3AgPGFzeW5jaW8tZGVsYXllZC1jYWxscz5gLgogCisgICBUaGlzIGZ1bmN0aW9uIGlzIGEgOnJlZjpgY29yb3V0aW5lIDxjb3JvdXRpbmU+YC4KKwogLi4gZnVuY3Rpb246OiBzaGllbGQoYXJnLCBcKiwgbG9vcD1Ob25lKQogCiAgICBXYWl0IGZvciBhIGZ1dHVyZSwgc2hpZWxkaW5nIGl0IGZyb20gY2FuY2VsbGF0aW9uLgpAQCAtNTgxLDcgKzU4Nyw3IEBACiAgICAgICAgZXhjZXB0IENhbmNlbGxlZEVycm9yOgogICAgICAgICAgICByZXMgPSBOb25lCiAKLS4uIGZ1bmN0aW9uOjogd2FpdChmdXR1cmVzLCBcKiwgbG9vcD1Ob25lLCB0aW1lb3V0PU5vbmUsIHJldHVybl93aGVuPUFMTF9DT01QTEVURUQpCisuLiBjb3JvdXRpbmVmdW5jdGlvbjo6IHdhaXQoZnV0dXJlcywgXCosIGxvb3A9Tm9uZSwgdGltZW91dD1Ob25lLCByZXR1cm5fd2hlbj1BTExfQ09NUExFVEVEKQogCiAgICBXYWl0IGZvciB0aGUgRnV0dXJlcyBhbmQgY29yb3V0aW5lIG9iamVjdHMgZ2l2ZW4gYnkgdGhlIHNlcXVlbmNlICpmdXR1cmVzKgogICAgdG8gY29tcGxldGUuICBDb3JvdXRpbmVzIHdpbGwgYmUgd3JhcHBlZCBpbiBUYXNrcy4gUmV0dXJucyB0d28gc2V0cyBvZgpAQCAtNjI2LDcgKzYzMiw3IEBACiAgICAgICB3aGVuIHRoZSB0aW1lb3V0IG9jY3VycyBhcmUgcmV0dXJuZWQgaW4gdGhlIHNlY29uZCBzZXQuCiAKIAotLi4gZnVuY3Rpb246OiB3YWl0X2ZvcihmdXQsIHRpbWVvdXQsIFwqLCBsb29wPU5vbmUpCisuLiBjb3JvdXRpbmVmdW5jdGlvbjo6IHdhaXRfZm9yKGZ1dCwgdGltZW91dCwgXCosIGxvb3A9Tm9uZSkKIAogICAgV2FpdCBmb3IgdGhlIHNpbmdsZSA6Y2xhc3M6YEZ1dHVyZWAgb3IgOnJlZjpgY29yb3V0aW5lIG9iamVjdCA8Y29yb3V0aW5lPmAKICAgIHRvIGNvbXBsZXRlIHdpdGggdGltZW91dC4gSWYgKnRpbWVvdXQqIGlzIGBgTm9uZWBgLCBibG9jayB1bnRpbCB0aGUgZnV0dXJlCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9hc3luY2lvLnJzdCBiL0RvYy9saWJyYXJ5L2FzeW5jaW8ucnN0CmluZGV4IDY5MDAxOTguLjliNGQ2NWUgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2FzeW5jaW8ucnN0CisrKyBiL0RvYy9saWJyYXJ5L2FzeW5jaW8ucnN0CkBAIC00Niw2ICs0NiwxMSBAQAogICB5b3UgYWJzb2x1dGVseSwgcG9zaXRpdmVseSBoYXZlIHRvIHVzZSBhIGxpYnJhcnkgdGhhdCBtYWtlcyBibG9ja2luZwogICBJL08gY2FsbHMuCiAKK0FzeW5jaHJvbm91cyBwcm9ncmFtbWluZyBpcyBtb3JlIGNvbXBsZXggdGhhbiBjbGFzc2ljYWwgInNlcXVlbnRpYWwiCitwcm9ncmFtbWluZzogc2VlIHRoZSA6cmVmOmBEZXZlbG9wIHdpdGggYXN5bmNpbyA8YXN5bmNpby1kZXY+YCBwYWdlIHdoaWNoIGxpc3RzCitjb21tb24gdHJhcHMgYW5kIGV4cGxhaW5zIGhvdyB0byBhdm9pZCB0aGVtLiA6cmVmOmBFbmFibGUgdGhlIGRlYnVnIG1vZGUKKzxhc3luY2lvLWRlYnVnLW1vZGU+YCBkdXJpbmcgZGV2ZWxvcG1lbnQgdG8gZGV0ZWN0IGNvbW1vbiBpc3N1ZXMuCisKIFRhYmxlIG9mIGNvbnRlbnRzOgogCiAuLiB0b2N0cmVlOjoKQEAgLTU4LDYgKzYzLDcgQEAKICAgIGFzeW5jaW8tc3RyZWFtLnJzdAogICAgYXN5bmNpby1zdWJwcm9jZXNzLnJzdAogICAgYXN5bmNpby1zeW5jLnJzdAorICAgYXN5bmNpby1xdWV1ZS5yc3QKICAgIGFzeW5jaW8tZGV2LnJzdAogCiAuLiBzZWVhbHNvOjoKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2JpbmFzY2lpLnJzdCBiL0RvYy9saWJyYXJ5L2JpbmFzY2lpLnJzdAppbmRleCBjOTJhOGUxLi4zZjdkZjc0IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9iaW5hc2NpaS5yc3QKKysrIGIvRG9jL2xpYnJhcnkvYmluYXNjaWkucnN0CkBAIC02NSw5ICs2NSw2IEBACiAgICBkYXRhLiBNb3JlIHRoYW4gb25lIGxpbmUgbWF5IGJlIHBhc3NlZCBhdCBhIHRpbWUuIElmIHRoZSBvcHRpb25hbCBhcmd1bWVudAogICAgKmhlYWRlciogaXMgcHJlc2VudCBhbmQgdHJ1ZSwgdW5kZXJzY29yZXMgd2lsbCBiZSBkZWNvZGVkIGFzIHNwYWNlcy4KIAotICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjIKLSAgICAgIEFjY2VwdCBvbmx5IGJ5dGVzdHJpbmcgb3IgYnl0ZWFycmF5IG9iamVjdHMgYXMgaW5wdXQuCi0KIAogLi4gZnVuY3Rpb246OiBiMmFfcXAoZGF0YSwgcXVvdGV0YWJzPUZhbHNlLCBpc3RleHQ9VHJ1ZSwgaGVhZGVyPUZhbHNlKQogCkBAIC0xNTYsOSArMTUzLDYgQEAKICAgIG9mIGhleGFkZWNpbWFsIGRpZ2l0cyAod2hpY2ggY2FuIGJlIHVwcGVyIG9yIGxvd2VyIGNhc2UpLCBvdGhlcndpc2UgYQogICAgOmV4YzpgVHlwZUVycm9yYCBpcyByYWlzZWQuCiAKLSAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy4yCi0gICAgICBBY2NlcHQgb25seSBieXRlc3RyaW5nIG9yIGJ5dGVhcnJheSBvYmplY3RzIGFzIGlucHV0LgotCiAKIC4uIGV4Y2VwdGlvbjo6IEVycm9yCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2J6Mi5yc3QgYi9Eb2MvbGlicmFyeS9iejIucnN0CmluZGV4IDQ4OGNkYTUuLmVkMjg2OTkgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2J6Mi5yc3QKKysrIGIvRG9jL2xpYnJhcnkvYnoyLnJzdApAQCAtMTYyLDE1ICsxNjIsMzIgQEAKICAgICAgIHlvdSBuZWVkIHRvIGRlY29tcHJlc3MgYSBtdWx0aS1zdHJlYW0gaW5wdXQgd2l0aCA6Y2xhc3M6YEJaMkRlY29tcHJlc3NvcmAsCiAgICAgICB5b3UgbXVzdCB1c2UgYSBuZXcgZGVjb21wcmVzc29yIGZvciBlYWNoIHN0cmVhbS4KIAotICAgLi4gbWV0aG9kOjogZGVjb21wcmVzcyhkYXRhKQorICAgLi4gbWV0aG9kOjogZGVjb21wcmVzcyhkYXRhLCBtYXhfbGVuZ3RoPS0xKQogCi0gICAgICBQcm92aWRlIGRhdGEgdG8gdGhlIGRlY29tcHJlc3NvciBvYmplY3QuIFJldHVybnMgYSBjaHVuayBvZiBkZWNvbXByZXNzZWQKLSAgICAgIGRhdGEgaWYgcG9zc2libGUsIG9yIGFuIGVtcHR5IGJ5dGUgc3RyaW5nIG90aGVyd2lzZS4KKyAgICAgIERlY29tcHJlc3MgKmRhdGEqIChhIDp0ZXJtOmBieXRlcy1saWtlIG9iamVjdGApLCByZXR1cm5pbmcKKyAgICAgIHVuY29tcHJlc3NlZCBkYXRhIGFzIGJ5dGVzLiBTb21lIG9mICpkYXRhKiBtYXkgYmUgYnVmZmVyZWQKKyAgICAgIGludGVybmFsbHksIGZvciB1c2UgaW4gbGF0ZXIgY2FsbHMgdG8gOm1ldGg6YGRlY29tcHJlc3NgLiBUaGUKKyAgICAgIHJldHVybmVkIGRhdGEgc2hvdWxkIGJlIGNvbmNhdGVuYXRlZCB3aXRoIHRoZSBvdXRwdXQgb2YgYW55CisgICAgICBwcmV2aW91cyBjYWxscyB0byA6bWV0aDpgZGVjb21wcmVzc2AuCiAKLSAgICAgIEF0dGVtcHRpbmcgdG8gZGVjb21wcmVzcyBkYXRhIGFmdGVyIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgc3RyZWFtIGlzCi0gICAgICByZWFjaGVkIHJhaXNlcyBhbiA6ZXhjOmBFT0ZFcnJvcmAuIElmIGFueSBkYXRhIGlzIGZvdW5kIGFmdGVyIHRoZSBlbmQgb2YKLSAgICAgIHRoZSBzdHJlYW0sIGl0IGlzIGlnbm9yZWQgYW5kIHNhdmVkIGluIHRoZSA6YXR0cjpgdW51c2VkX2RhdGFgIGF0dHJpYnV0ZS4KKyAgICAgIElmICptYXhfbGVuZ3RoKiBpcyBub25uZWdhdGl2ZSwgcmV0dXJucyBhdCBtb3N0ICptYXhfbGVuZ3RoKgorICAgICAgYnl0ZXMgb2YgZGVjb21wcmVzc2VkIGRhdGEuIElmIHRoaXMgbGltaXQgaXMgcmVhY2hlZCBhbmQgZnVydGhlcgorICAgICAgb3V0cHV0IGNhbiBiZSBwcm9kdWNlZCwgdGhlIDphdHRyOmB+Lm5lZWRzX2lucHV0YCBhdHRyaWJ1dGUgd2lsbAorICAgICAgYmUgc2V0IHRvIGBgRmFsc2VgYC4gSW4gdGhpcyBjYXNlLCB0aGUgbmV4dCBjYWxsIHRvCisgICAgICA6bWV0aDpgfi5kZWNvbXByZXNzYCBtYXkgcHJvdmlkZSAqZGF0YSogYXMgYGBiJydgYCB0byBvYnRhaW4KKyAgICAgIG1vcmUgb2YgdGhlIG91dHB1dC4KIAorICAgICAgSWYgYWxsIG9mIHRoZSBpbnB1dCBkYXRhIHdhcyBkZWNvbXByZXNzZWQgYW5kIHJldHVybmVkIChlaXRoZXIKKyAgICAgIGJlY2F1c2UgdGhpcyB3YXMgbGVzcyB0aGFuICptYXhfbGVuZ3RoKiBieXRlcywgb3IgYmVjYXVzZQorICAgICAgKm1heF9sZW5ndGgqIHdhcyBuZWdhdGl2ZSksIHRoZSA6YXR0cjpgfi5uZWVkc19pbnB1dGAgYXR0cmlidXRlCisgICAgICB3aWxsIGJlIHNldCB0byBgYFRydWVgYC4KKworICAgICAgQXR0ZW1wdGluZyB0byBkZWNvbXByZXNzIGRhdGEgYWZ0ZXIgdGhlIGVuZCBvZiBzdHJlYW0gaXMgcmVhY2hlZAorICAgICAgcmFpc2VzIGFuIGBFT0ZFcnJvcmAuICBBbnkgZGF0YSBmb3VuZCBhZnRlciB0aGUgZW5kIG9mIHRoZQorICAgICAgc3RyZWFtIGlzIGlnbm9yZWQgYW5kIHNhdmVkIGluIHRoZSA6YXR0cjpgfi51bnVzZWRfZGF0YWAgYXR0cmlidXRlLgorCisgICAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNQorICAgICAgICAgQWRkZWQgdGhlICptYXhfbGVuZ3RoKiBwYXJhbWV0ZXIuCiAKICAgIC4uIGF0dHJpYnV0ZTo6IGVvZgogCkBAIC0xODYsNiArMjAzLDEzIEBACiAgICAgICBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBhY2Nlc3NlZCBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIGhhcyBiZWVuCiAgICAgICByZWFjaGVkLCBpdHMgdmFsdWUgd2lsbCBiZSBgYGInJ2BgLgogCisgICAuLiBhdHRyaWJ1dGU6OiBuZWVkc19pbnB1dAorCisgICAgICBgYEZhbHNlYGAgaWYgdGhlIDptZXRoOmAuZGVjb21wcmVzc2AgbWV0aG9kIGNhbiBwcm92aWRlIG1vcmUKKyAgICAgIGRlY29tcHJlc3NlZCBkYXRhIGJlZm9yZSByZXF1aXJpbmcgbmV3IHVuY29tcHJlc3NlZCBpbnB1dC4KKworICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMy41CisKIAogT25lLXNob3QgKGRlKWNvbXByZXNzaW9uCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2NvZGVjcy5yc3QgYi9Eb2MvbGlicmFyeS9jb2RlY3MucnN0CmluZGV4IDA0OGYwZTkuLjA0MzBjYjkgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2NvZGVjcy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvY29kZWNzLnJzdApAQCAtNDAzLDcgKzQwMyw3IEBACiAgICBJbXBsZW1lbnRzIHRoZSBgYCdyZXBsYWNlJ2BgIGVycm9yIGhhbmRsaW5nIChmb3IgOnRlcm06YHRleHQgZW5jb2RpbmdzCiAgICA8dGV4dCBlbmNvZGluZz5gIG9ubHkpOiBzdWJzdGl0dXRlcyBgYCc/J2BgIGZvciBlbmNvZGluZyBlcnJvcnMKICAgICh0byBiZSBlbmNvZGVkIGJ5IHRoZSBjb2RlYyksIGFuZCBgYCdcdWZmZmQnYGAgKHRoZSBVbmljb2RlIHJlcGxhY2VtZW50Ci0gICBjaGFyYWN0ZXIsIGBgJ++/vSdgYCkgZm9yIGRlY29kaW5nIGVycm9ycy4KKyAgIGNoYXJhY3RlcikgZm9yIGRlY29kaW5nIGVycm9ycy4KIAogCiAuLiBmdW5jdGlvbjo6IGlnbm9yZV9lcnJvcnMoZXhjZXB0aW9uKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvZGF0ZXRpbWUucnN0IGIvRG9jL2xpYnJhcnkvZGF0ZXRpbWUucnN0CmluZGV4IDdhOWY5M2MuLmY4MmY0MjUgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2RhdGV0aW1lLnJzdAorKysgYi9Eb2MvbGlicmFyeS9kYXRldGltZS5yc3QKQEAgLTc1OSwxMyArNzU5LDE5IEBACiAgICA6YXR0cjpgdHppbmZvYCBgYE5vbmVgYC4gVGhpcyBtYXkgcmFpc2UgOmV4YzpgT3ZlcmZsb3dFcnJvcmAsIGlmIHRoZSB0aW1lc3RhbXAgaXMKICAgIG91dCBvZiB0aGUgcmFuZ2Ugb2YgdmFsdWVzIHN1cHBvcnRlZCBieSB0aGUgcGxhdGZvcm0gQyA6YzpmdW5jOmBnbXRpbWVgIGZ1bmN0aW9uLAogICAgYW5kIDpleGM6YE9TRXJyb3JgIG9uIDpjOmZ1bmM6YGdtdGltZWAgZmFpbHVyZS4KLSAgIEl0J3MgY29tbW9uIGZvciB0aGlzIHRvIGJlIHJlc3RyaWN0ZWQgdG8geWVhcnMgaW4gMTk3MCB0aHJvdWdoIDIwMzguIFNlZSBhbHNvCi0gICA6bWV0aDpgZnJvbXRpbWVzdGFtcGAuCisgICBJdCdzIGNvbW1vbiBmb3IgdGhpcyB0byBiZSByZXN0cmljdGVkIHRvIHllYXJzIGluIDE5NzAgdGhyb3VnaCAyMDM4LgogCi0gICBPbiB0aGUgUE9TSVggY29tcGxpYW50IHBsYXRmb3JtcywgYGB1dGNmcm9tdGltZXN0YW1wKHRpbWVzdGFtcClgYAotICAgaXMgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nIGV4cHJlc3Npb246OgorICAgVG8gZ2V0IGFuIGF3YXJlIDpjbGFzczpgLmRhdGV0aW1lYCBvYmplY3QsIGNhbGwgOm1ldGg6YGZyb210aW1lc3RhbXBgOjoKIAotICAgICBkYXRldGltZSgxOTcwLCAxLCAxKSArIHRpbWVkZWx0YShzZWNvbmRzPXRpbWVzdGFtcCkKKyAgICAgZGF0ZXRpbWUuZnJvbXRpbWVzdGFtcCh0aW1lc3RhbXAsIHRpbWV6b25lLnV0YykKKworICAgT24gdGhlIFBPU0lYIGNvbXBsaWFudCBwbGF0Zm9ybXMsIGl0IGlzIGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZworICAgZXhwcmVzc2lvbjo6CisKKyAgICAgZGF0ZXRpbWUoMTk3MCwgMSwgMSwgdHppbmZvPXRpbWV6b25lLnV0YykgKyB0aW1lZGVsdGEoc2Vjb25kcz10aW1lc3RhbXApCisKKyAgIGV4Y2VwdCB0aGUgbGF0dGVyIGZvcm11bGEgYWx3YXlzIHN1cHBvcnRzIHRoZSBmdWxsIHllYXJzIHJhbmdlOiBiZXR3ZWVuCisgICA6Y29uc3Q6YE1JTllFQVJgIGFuZCA6Y29uc3Q6YE1BWFlFQVJgIGluY2x1c2l2ZS4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjMKICAgICAgIFJhaXNlIDpleGM6YE92ZXJmbG93RXJyb3JgIGluc3RlYWQgb2YgOmV4YzpgVmFsdWVFcnJvcmAgaWYgdGhlIHRpbWVzdGFtcApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvZGlzLnJzdCBiL0RvYy9saWJyYXJ5L2Rpcy5yc3QKaW5kZXggM2I0MTllNi4uMmIxMDc5NSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvZGlzLnJzdAorKysgYi9Eb2MvbGlicmFyeS9kaXMucnN0CkBAIC05LDkgKzksOSBAQAogLS0tLS0tLS0tLS0tLS0KIAogVGhlIDptb2Q6YGRpc2AgbW9kdWxlIHN1cHBvcnRzIHRoZSBhbmFseXNpcyBvZiBDUHl0aG9uIDp0ZXJtOmBieXRlY29kZWAgYnkKLWRpc2Fzc2VtYmxpbmcgaXQuIFRoZSBDUHl0aG9uIGJ5dGVjb2RlIHdoaWNoIHRoaXMgbW9kdWxlIHRha2VzIGFzIGFuCi1pbnB1dCBpcyBkZWZpbmVkIGluIHRoZSBmaWxlIDpmaWxlOmBJbmNsdWRlL29wY29kZS5oYCBhbmQgdXNlZCBieSB0aGUgY29tcGlsZXIKLWFuZCB0aGUgaW50ZXJwcmV0ZXIuCitkaXNhc3NlbWJsaW5nIGl0LiBUaGUgQ1B5dGhvbiBieXRlY29kZSB3aGljaCB0aGlzIG1vZHVsZSB0YWtlcyBhcyBhbiBpbnB1dCBpcworZGVmaW5lZCBpbiB0aGUgZmlsZSA6ZmlsZTpgSW5jbHVkZS9vcGNvZGUuaGAgYW5kIHVzZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCB0aGUKK2ludGVycHJldGVyLgogCiAuLiBpbXBsLWRldGFpbDo6CiAKQEAgLTQzLDMzICs0MywzMiBAQAogLi4gdmVyc2lvbmFkZGVkOjogMy40CiAKIFRoZSBieXRlY29kZSBhbmFseXNpcyBBUEkgYWxsb3dzIHBpZWNlcyBvZiBQeXRob24gY29kZSB0byBiZSB3cmFwcGVkIGluIGEKLTpjbGFzczpgQnl0ZWNvZGVgIG9iamVjdCB0aGF0IHByb3ZpZGVzIGVhc3kgYWNjZXNzIHRvIGRldGFpbHMgb2YgdGhlCi1jb21waWxlZCBjb2RlLgorOmNsYXNzOmBCeXRlY29kZWAgb2JqZWN0IHRoYXQgcHJvdmlkZXMgZWFzeSBhY2Nlc3MgdG8gZGV0YWlscyBvZiB0aGUgY29tcGlsZWQKK2NvZGUuCiAKIC4uIGNsYXNzOjogQnl0ZWNvZGUoeCwgKiwgZmlyc3RfbGluZT1Ob25lLCBjdXJyZW50X29mZnNldD1Ob25lKQogCi0gICBBbmFseXNlIHRoZSBieXRlY29kZSBjb3JyZXNwb25kaW5nIHRvIGEgZnVuY3Rpb24sIGdlbmVyYXRvciwgbWV0aG9kLAotICAgc3RyaW5nIG9mIHNvdXJjZSBjb2RlLCBvciBhIGNvZGUgb2JqZWN0IChhcyByZXR1cm5lZCBieSA6ZnVuYzpgY29tcGlsZWApLgogCi0gICBUaGlzIGlzIGEgY29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQgbWFueSBvZiB0aGUgZnVuY3Rpb25zIGxpc3RlZCBiZWxvdywKLSAgIG1vc3Qgbm90YWJseSA6ZnVuYzpgZ2V0X2luc3RydWN0aW9uc2AsIGFzIGl0ZXJhdGluZyBvdmVyIGEKLSAgIDpjbGFzczpgQnl0ZWNvZGVgIGluc3RhbmNlIHlpZWxkcyB0aGUgYnl0ZWNvZGUgb3BlcmF0aW9ucyBhcwotICAgOmNsYXNzOmBJbnN0cnVjdGlvbmAgaW5zdGFuY2VzLgorICAgQW5hbHlzZSB0aGUgYnl0ZWNvZGUgY29ycmVzcG9uZGluZyB0byBhIGZ1bmN0aW9uLCBnZW5lcmF0b3IsIG1ldGhvZCwgc3RyaW5nCisgICBvZiBzb3VyY2UgY29kZSwgb3IgYSBjb2RlIG9iamVjdCAoYXMgcmV0dXJuZWQgYnkgOmZ1bmM6YGNvbXBpbGVgKS4KIAotICAgSWYgKmZpcnN0X2xpbmUqIGlzIG5vdCBOb25lLCBpdCBpbmRpY2F0ZXMgdGhlIGxpbmUgbnVtYmVyIHRoYXQgc2hvdWxkCi0gICBiZSByZXBvcnRlZCBmb3IgdGhlIGZpcnN0IHNvdXJjZSBsaW5lIGluIHRoZSBkaXNhc3NlbWJsZWQgY29kZS4KLSAgIE90aGVyd2lzZSwgdGhlIHNvdXJjZSBsaW5lIGluZm9ybWF0aW9uIChpZiBhbnkpIGlzIHRha2VuIGRpcmVjdGx5IGZyb20KLSAgIHRoZSBkaXNhc3NlbWJsZWQgY29kZSBvYmplY3QuCisgICBUaGlzIGlzIGEgY29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQgbWFueSBvZiB0aGUgZnVuY3Rpb25zIGxpc3RlZCBiZWxvdywgbW9zdAorICAgbm90YWJseSA6ZnVuYzpgZ2V0X2luc3RydWN0aW9uc2AsIGFzIGl0ZXJhdGluZyBvdmVyIGEgOmNsYXNzOmBCeXRlY29kZWAKKyAgIGluc3RhbmNlIHlpZWxkcyB0aGUgYnl0ZWNvZGUgb3BlcmF0aW9ucyBhcyA6Y2xhc3M6YEluc3RydWN0aW9uYCBpbnN0YW5jZXMuCiAKLSAgIElmICpjdXJyZW50X29mZnNldCogaXMgbm90IE5vbmUsIGl0IHJlZmVycyB0byBhbiBpbnN0cnVjdGlvbiBvZmZzZXQKLSAgIGluIHRoZSBkaXNhc3NlbWJsZWQgY29kZS4gU2V0dGluZyB0aGlzIG1lYW5zIDptZXRoOmBkaXNgIHdpbGwgZGlzcGxheQotICAgYSAiY3VycmVudCBpbnN0cnVjdGlvbiIgbWFya2VyIGFnYWluc3QgdGhlIHNwZWNpZmllZCBvcGNvZGUuCisgICBJZiAqZmlyc3RfbGluZSogaXMgbm90IE5vbmUsIGl0IGluZGljYXRlcyB0aGUgbGluZSBudW1iZXIgdGhhdCBzaG91bGQgYmUKKyAgIHJlcG9ydGVkIGZvciB0aGUgZmlyc3Qgc291cmNlIGxpbmUgaW4gdGhlIGRpc2Fzc2VtYmxlZCBjb2RlLiAgT3RoZXJ3aXNlLCB0aGUKKyAgIHNvdXJjZSBsaW5lIGluZm9ybWF0aW9uIChpZiBhbnkpIGlzIHRha2VuIGRpcmVjdGx5IGZyb20gdGhlIGRpc2Fzc2VtYmxlZCBjb2RlCisgICBvYmplY3QuCisKKyAgIElmICpjdXJyZW50X29mZnNldCogaXMgbm90IE5vbmUsIGl0IHJlZmVycyB0byBhbiBpbnN0cnVjdGlvbiBvZmZzZXQgaW4gdGhlCisgICBkaXNhc3NlbWJsZWQgY29kZS4gU2V0dGluZyB0aGlzIG1lYW5zIDptZXRoOmAuZGlzYCB3aWxsIGRpc3BsYXkgYSAiY3VycmVudAorICAgaW5zdHJ1Y3Rpb24iIG1hcmtlciBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgb3Bjb2RlLgogCiAgICAuLiBjbGFzc21ldGhvZDo6IGZyb21fdHJhY2ViYWNrKHRiKQogCi0gICAgICBDb25zdHJ1Y3QgYSA6Y2xhc3M6YEJ5dGVjb2RlYCBpbnN0YW5jZSBmcm9tIHRoZSBnaXZlbiB0cmFjZWJhY2ssCi0gICAgICBzZXR0aW5nICpjdXJyZW50X29mZnNldCogdG8gdGhlIGluc3RydWN0aW9uIHJlc3BvbnNpYmxlIGZvciB0aGUKLSAgICAgIGV4Y2VwdGlvbi4KKyAgICAgIENvbnN0cnVjdCBhIDpjbGFzczpgQnl0ZWNvZGVgIGluc3RhbmNlIGZyb20gdGhlIGdpdmVuIHRyYWNlYmFjaywgc2V0dGluZworICAgICAgKmN1cnJlbnRfb2Zmc2V0KiB0byB0aGUgaW5zdHJ1Y3Rpb24gcmVzcG9uc2libGUgZm9yIHRoZSBleGNlcHRpb24uCiAKICAgIC4uIGRhdGE6OiBjb2Rlb2JqCiAKQEAgLTgxLDggKzgwLDggQEAKIAogICAgLi4gbWV0aG9kOjogZGlzKCkKIAotICAgICAgUmV0dXJuIGEgZm9ybWF0dGVkIHZpZXcgb2YgdGhlIGJ5dGVjb2RlIG9wZXJhdGlvbnMgKHRoZSBzYW1lIGFzCi0gICAgICBwcmludGVkIGJ5IDpmdW5jOmBkaXNgLCBidXQgcmV0dXJuZWQgYXMgYSBtdWx0aS1saW5lIHN0cmluZykuCisgICAgICBSZXR1cm4gYSBmb3JtYXR0ZWQgdmlldyBvZiB0aGUgYnl0ZWNvZGUgb3BlcmF0aW9ucyAodGhlIHNhbWUgYXMgcHJpbnRlZCBieQorICAgICAgOmZ1bmM6YGRpcy5kaXNgLCBidXQgcmV0dXJuZWQgYXMgYSBtdWx0aS1saW5lIHN0cmluZykuCiAKICAgIC4uIG1ldGhvZDo6IGluZm8oKQogCkBAIC0xMDQsMTAgKzEwMyw5IEBACiBBbmFseXNpcyBmdW5jdGlvbnMKIC0tLS0tLS0tLS0tLS0tLS0tLQogCi1UaGUgOm1vZDpgZGlzYCBtb2R1bGUgYWxzbyBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgYW5hbHlzaXMgZnVuY3Rpb25zIHRoYXQKLWNvbnZlcnQgdGhlIGlucHV0IGRpcmVjdGx5IHRvIHRoZSBkZXNpcmVkIG91dHB1dC4gVGhleSBjYW4gYmUgdXNlZnVsIGlmCi1vbmx5IGEgc2luZ2xlIG9wZXJhdGlvbiBpcyBiZWluZyBwZXJmb3JtZWQsIHNvIHRoZSBpbnRlcm1lZGlhdGUgYW5hbHlzaXMKLW9iamVjdCBpc24ndCB1c2VmdWw6CitUaGUgOm1vZDpgZGlzYCBtb2R1bGUgYWxzbyBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgYW5hbHlzaXMgZnVuY3Rpb25zIHRoYXQgY29udmVydAordGhlIGlucHV0IGRpcmVjdGx5IHRvIHRoZSBkZXNpcmVkIG91dHB1dC4gVGhleSBjYW4gYmUgdXNlZnVsIGlmIG9ubHkgYSBzaW5nbGUKK29wZXJhdGlvbiBpcyBiZWluZyBwZXJmb3JtZWQsIHNvIHRoZSBpbnRlcm1lZGlhdGUgYW5hbHlzaXMgb2JqZWN0IGlzbid0IHVzZWZ1bDoKIAogLi4gZnVuY3Rpb246OiBjb2RlX2luZm8oeCkKIApAQCAtMTk2LDEzICsxOTQsMTMgQEAKICAgIFJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSBpbnN0cnVjdGlvbnMgaW4gdGhlIHN1cHBsaWVkIGZ1bmN0aW9uLCBtZXRob2QsCiAgICBzb3VyY2UgY29kZSBzdHJpbmcgb3IgY29kZSBvYmplY3QuCiAKLSAgIFRoZSBpdGVyYXRvciBnZW5lcmF0ZXMgYSBzZXJpZXMgb2YgOmNsYXNzOmBJbnN0cnVjdGlvbmAgbmFtZWQgdHVwbGVzCi0gICBnaXZpbmcgdGhlIGRldGFpbHMgb2YgZWFjaCBvcGVyYXRpb24gaW4gdGhlIHN1cHBsaWVkIGNvZGUuCisgICBUaGUgaXRlcmF0b3IgZ2VuZXJhdGVzIGEgc2VyaWVzIG9mIDpjbGFzczpgSW5zdHJ1Y3Rpb25gIG5hbWVkIHR1cGxlcyBnaXZpbmcKKyAgIHRoZSBkZXRhaWxzIG9mIGVhY2ggb3BlcmF0aW9uIGluIHRoZSBzdXBwbGllZCBjb2RlLgogCi0gICBJZiAqZmlyc3RfbGluZSogaXMgbm90IE5vbmUsIGl0IGluZGljYXRlcyB0aGUgbGluZSBudW1iZXIgdGhhdCBzaG91bGQKLSAgIGJlIHJlcG9ydGVkIGZvciB0aGUgZmlyc3Qgc291cmNlIGxpbmUgaW4gdGhlIGRpc2Fzc2VtYmxlZCBjb2RlLgotICAgT3RoZXJ3aXNlLCB0aGUgc291cmNlIGxpbmUgaW5mb3JtYXRpb24gKGlmIGFueSkgaXMgdGFrZW4gZGlyZWN0bHkgZnJvbQotICAgdGhlIGRpc2Fzc2VtYmxlZCBjb2RlIG9iamVjdC4KKyAgIElmICpmaXJzdF9saW5lKiBpcyBub3QgTm9uZSwgaXQgaW5kaWNhdGVzIHRoZSBsaW5lIG51bWJlciB0aGF0IHNob3VsZCBiZQorICAgcmVwb3J0ZWQgZm9yIHRoZSBmaXJzdCBzb3VyY2UgbGluZSBpbiB0aGUgZGlzYXNzZW1ibGVkIGNvZGUuICBPdGhlcndpc2UsIHRoZQorICAgc291cmNlIGxpbmUgaW5mb3JtYXRpb24gKGlmIGFueSkgaXMgdGFrZW4gZGlyZWN0bHkgZnJvbSB0aGUgZGlzYXNzZW1ibGVkIGNvZGUKKyAgIG9iamVjdC4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMy40CiAKQEAgLTUxMSw4ICs1MDksOCBAQAogLi4gb3Bjb2RlOjogUFJJTlRfRVhQUgogCiAgICBJbXBsZW1lbnRzIHRoZSBleHByZXNzaW9uIHN0YXRlbWVudCBmb3IgdGhlIGludGVyYWN0aXZlIG1vZGUuICBUT1MgaXMgcmVtb3ZlZAotICAgZnJvbSB0aGUgc3RhY2sgYW5kIHByaW50ZWQuICBJbiBub24taW50ZXJhY3RpdmUgbW9kZSwgYW4gZXhwcmVzc2lvbiBzdGF0ZW1lbnQgaXMKLSAgIHRlcm1pbmF0ZWQgd2l0aCA6b3Bjb2RlOmBQT1BfVE9QYC4KKyAgIGZyb20gdGhlIHN0YWNrIGFuZCBwcmludGVkLiAgSW4gbm9uLWludGVyYWN0aXZlIG1vZGUsIGFuIGV4cHJlc3Npb24gc3RhdGVtZW50CisgICBpcyB0ZXJtaW5hdGVkIHdpdGggOm9wY29kZTpgUE9QX1RPUGAuCiAKIAogLi4gb3Bjb2RlOjogQlJFQUtfTE9PUApAQCAtNTQyLDkgKzU0MCw5IEBACiAgICBjb21wcmVoZW5zaW9ucy4KIAogRm9yIGFsbCBvZiB0aGUgOm9wY29kZTpgU0VUX0FERGAsIDpvcGNvZGU6YExJU1RfQVBQRU5EYCBhbmQgOm9wY29kZTpgTUFQX0FERGAKLWluc3RydWN0aW9ucywgd2hpbGUgdGhlCi1hZGRlZCB2YWx1ZSBvciBrZXkvdmFsdWUgcGFpciBpcyBwb3BwZWQgb2ZmLCB0aGUgY29udGFpbmVyIG9iamVjdCByZW1haW5zIG9uCi10aGUgc3RhY2sgc28gdGhhdCBpdCBpcyBhdmFpbGFibGUgZm9yIGZ1cnRoZXIgaXRlcmF0aW9ucyBvZiB0aGUgbG9vcC4KK2luc3RydWN0aW9ucywgd2hpbGUgdGhlIGFkZGVkIHZhbHVlIG9yIGtleS92YWx1ZSBwYWlyIGlzIHBvcHBlZCBvZmYsIHRoZQorY29udGFpbmVyIG9iamVjdCByZW1haW5zIG9uIHRoZSBzdGFjayBzbyB0aGF0IGl0IGlzIGF2YWlsYWJsZSBmb3IgZnVydGhlcgoraXRlcmF0aW9ucyBvZiB0aGUgbG9vcC4KIAogCiAuLiBvcGNvZGU6OiBSRVRVUk5fVkFMVUUKQEAgLTU1NCwzNSArNTUyLDM1IEBACiAKIC4uIG9wY29kZTo6IFlJRUxEX1ZBTFVFCiAKLSAgIFBvcHMgYGBUT1NgYCBhbmQgeWllbGRzIGl0IGZyb20gYSA6dGVybTpgZ2VuZXJhdG9yYC4KKyAgIFBvcHMgVE9TIGFuZCB5aWVsZHMgaXQgZnJvbSBhIDp0ZXJtOmBnZW5lcmF0b3JgLgogCiAKIC4uIG9wY29kZTo6IFlJRUxEX0ZST00KIAotICAgUG9wcyBgYFRPU2BgIGFuZCBkZWxlZ2F0ZXMgdG8gaXQgYXMgYSBzdWJpdGVyYXRvciBmcm9tIGEgOnRlcm06YGdlbmVyYXRvcmAuCisgICBQb3BzIFRPUyBhbmQgZGVsZWdhdGVzIHRvIGl0IGFzIGEgc3ViaXRlcmF0b3IgZnJvbSBhIDp0ZXJtOmBnZW5lcmF0b3JgLgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjMKIAogCiAuLiBvcGNvZGU6OiBJTVBPUlRfU1RBUgogCi0gICBMb2FkcyBhbGwgc3ltYm9scyBub3Qgc3RhcnRpbmcgd2l0aCBgYCdfJ2BgIGRpcmVjdGx5IGZyb20gdGhlIG1vZHVsZSBUT1MgdG8gdGhlCi0gICBsb2NhbCBuYW1lc3BhY2UuIFRoZSBtb2R1bGUgaXMgcG9wcGVkIGFmdGVyIGxvYWRpbmcgYWxsIG5hbWVzLiBUaGlzIG9wY29kZQotICAgaW1wbGVtZW50cyBgYGZyb20gbW9kdWxlIGltcG9ydCAqYGAuCisgICBMb2FkcyBhbGwgc3ltYm9scyBub3Qgc3RhcnRpbmcgd2l0aCBgYCdfJ2BgIGRpcmVjdGx5IGZyb20gdGhlIG1vZHVsZSBUT1MgdG8KKyAgIHRoZSBsb2NhbCBuYW1lc3BhY2UuIFRoZSBtb2R1bGUgaXMgcG9wcGVkIGFmdGVyIGxvYWRpbmcgYWxsIG5hbWVzLiBUaGlzCisgICBvcGNvZGUgaW1wbGVtZW50cyBgYGZyb20gbW9kdWxlIGltcG9ydCAqYGAuCiAKIAogLi4gb3Bjb2RlOjogUE9QX0JMT0NLCiAKLSAgIFJlbW92ZXMgb25lIGJsb2NrIGZyb20gdGhlIGJsb2NrIHN0YWNrLiAgUGVyIGZyYW1lLCB0aGVyZSBpcyBhICBzdGFjayBvZiBibG9ja3MsCi0gICBkZW5vdGluZyBuZXN0ZWQgbG9vcHMsIHRyeSBzdGF0ZW1lbnRzLCBhbmQgc3VjaC4KKyAgIFJlbW92ZXMgb25lIGJsb2NrIGZyb20gdGhlIGJsb2NrIHN0YWNrLiAgUGVyIGZyYW1lLCB0aGVyZSBpcyBhIHN0YWNrIG9mCisgICBibG9ja3MsIGRlbm90aW5nIG5lc3RlZCBsb29wcywgdHJ5IHN0YXRlbWVudHMsIGFuZCBzdWNoLgogCiAKIC4uIG9wY29kZTo6IFBPUF9FWENFUFQKIAogICAgUmVtb3ZlcyBvbmUgYmxvY2sgZnJvbSB0aGUgYmxvY2sgc3RhY2suIFRoZSBwb3BwZWQgYmxvY2sgbXVzdCBiZSBhbiBleGNlcHRpb24KLSAgIGhhbmRsZXIgYmxvY2ssIGFzIGltcGxpY2l0bHkgY3JlYXRlZCB3aGVuIGVudGVyaW5nIGFuIGV4Y2VwdCBoYW5kbGVyLgotICAgSW4gYWRkaXRpb24gdG8gcG9wcGluZyBleHRyYW5lb3VzIHZhbHVlcyBmcm9tIHRoZSBmcmFtZSBzdGFjaywgdGhlCi0gICBsYXN0IHRocmVlIHBvcHBlZCB2YWx1ZXMgYXJlIHVzZWQgdG8gcmVzdG9yZSB0aGUgZXhjZXB0aW9uIHN0YXRlLgorICAgaGFuZGxlciBibG9jaywgYXMgaW1wbGljaXRseSBjcmVhdGVkIHdoZW4gZW50ZXJpbmcgYW4gZXhjZXB0IGhhbmRsZXIuICBJbgorICAgYWRkaXRpb24gdG8gcG9wcGluZyBleHRyYW5lb3VzIHZhbHVlcyBmcm9tIHRoZSBmcmFtZSBzdGFjaywgdGhlIGxhc3QgdGhyZWUKKyAgIHBvcHBlZCB2YWx1ZXMgYXJlIHVzZWQgdG8gcmVzdG9yZSB0aGUgZXhjZXB0aW9uIHN0YXRlLgogCiAKIC4uIG9wY29kZTo6IEVORF9GSU5BTExZCkBAIC02MTIsOSArNjEwLDkgQEAKIAogLi4gb3Bjb2RlOjogV0lUSF9DTEVBTlVQCiAKLSAgIENsZWFucyB1cCB0aGUgc3RhY2sgd2hlbiBhIDprZXl3b3JkOmB3aXRoYCBzdGF0ZW1lbnQgYmxvY2sgZXhpdHMuICBUT1MgaXMKLSAgIHRoZSBjb250ZXh0IG1hbmFnZXIncyA6bWV0aDpgX19leGl0X19gIGJvdW5kIG1ldGhvZC4gQmVsb3cgVE9TIGFyZSAxLS0zCi0gICB2YWx1ZXMgaW5kaWNhdGluZyBob3cvd2h5IHRoZSBmaW5hbGx5IGNsYXVzZSB3YXMgZW50ZXJlZDoKKyAgIENsZWFucyB1cCB0aGUgc3RhY2sgd2hlbiBhIDprZXl3b3JkOmB3aXRoYCBzdGF0ZW1lbnQgYmxvY2sgZXhpdHMuICBUT1MgaXMgdGhlCisgICBjb250ZXh0IG1hbmFnZXIncyA6bWV0aDpgX19leGl0X19gIGJvdW5kIG1ldGhvZC4gQmVsb3cgVE9TIGFyZSAxLS0zIHZhbHVlcworICAgaW5kaWNhdGluZyBob3cvd2h5IHRoZSBmaW5hbGx5IGNsYXVzZSB3YXMgZW50ZXJlZDoKIAogICAgKiBTRUNPTkQgPSBgYE5vbmVgYAogICAgKiAoU0VDT05ELCBUSElSRCkgPSAoYGBXSFlfe1JFVFVSTixDT05USU5VRX1gYCksIHJldHZhbApAQCAtNjI0LDEwICs2MjIsMTAgQEAKICAgIEluIHRoZSBsYXN0IGNhc2UsIGBgVE9TKFNFQ09ORCwgVEhJUkQsIEZPVVJUSClgYCBpcyBjYWxsZWQsIG90aGVyd2lzZQogICAgYGBUT1MoTm9uZSwgTm9uZSwgTm9uZSlgYC4gIEluIGFkZGl0aW9uLCBUT1MgaXMgcmVtb3ZlZCBmcm9tIHRoZSBzdGFjay4KIAotICAgSWYgdGhlIHN0YWNrIHJlcHJlc2VudHMgYW4gZXhjZXB0aW9uLCAqYW5kKiB0aGUgZnVuY3Rpb24gY2FsbCByZXR1cm5zCi0gICBhICd0cnVlJyB2YWx1ZSwgdGhpcyBpbmZvcm1hdGlvbiBpcyAiemFwcGVkIiBhbmQgcmVwbGFjZWQgd2l0aCBhIHNpbmdsZQotICAgYGBXSFlfU0lMRU5DRURgYCB0byBwcmV2ZW50IDpvcGNvZGU6YEVORF9GSU5BTExZYCBmcm9tIHJlLXJhaXNpbmcgdGhlIGV4Y2VwdGlvbi4KLSAgIChCdXQgbm9uLWxvY2FsIGdvdG9zIHdpbGwgc3RpbGwgYmUgcmVzdW1lZC4pCisgICBJZiB0aGUgc3RhY2sgcmVwcmVzZW50cyBhbiBleGNlcHRpb24sICphbmQqIHRoZSBmdW5jdGlvbiBjYWxsIHJldHVybnMgYQorICAgJ3RydWUnIHZhbHVlLCB0aGlzIGluZm9ybWF0aW9uIGlzICJ6YXBwZWQiIGFuZCByZXBsYWNlZCB3aXRoIGEgc2luZ2xlCisgICBgYFdIWV9TSUxFTkNFRGBgIHRvIHByZXZlbnQgOm9wY29kZTpgRU5EX0ZJTkFMTFlgIGZyb20gcmUtcmFpc2luZyB0aGUKKyAgIGV4Y2VwdGlvbi4gIChCdXQgbm9uLWxvY2FsIGdvdG9zIHdpbGwgc3RpbGwgYmUgcmVzdW1lZC4pCiAKICAgIC4uIFhYWCBleHBsYWluIHRoZSBXSFkgc3R1ZmYhCiAKQEAgLTYzOCw4ICs2MzYsOCBAQAogLi4gb3Bjb2RlOjogU1RPUkVfTkFNRSAobmFtZWkpCiAKICAgIEltcGxlbWVudHMgYGBuYW1lID0gVE9TYGAuICpuYW1laSogaXMgdGhlIGluZGV4IG9mICpuYW1lKiBpbiB0aGUgYXR0cmlidXRlCi0gICA6YXR0cjpgY29fbmFtZXNgIG9mIHRoZSBjb2RlIG9iamVjdC4gVGhlIGNvbXBpbGVyIHRyaWVzIHRvIHVzZSA6b3Bjb2RlOmBTVE9SRV9GQVNUYAotICAgb3IgOm9wY29kZTpgU1RPUkVfR0xPQkFMYCBpZiBwb3NzaWJsZS4KKyAgIDphdHRyOmBjb19uYW1lc2Agb2YgdGhlIGNvZGUgb2JqZWN0LiBUaGUgY29tcGlsZXIgdHJpZXMgdG8gdXNlCisgICA6b3Bjb2RlOmBTVE9SRV9GQVNUYCBvciA6b3Bjb2RlOmBTVE9SRV9HTE9CQUxgIGlmIHBvc3NpYmxlLgogCiAKIC4uIG9wY29kZTo6IERFTEVURV9OQU1FIChuYW1laSkKQEAgLTY5OSw4ICs2OTcsOCBAQAogCiAuLiBvcGNvZGU6OiBCVUlMRF9UVVBMRSAoY291bnQpCiAKLSAgIENyZWF0ZXMgYSB0dXBsZSBjb25zdW1pbmcgKmNvdW50KiBpdGVtcyBmcm9tIHRoZSBzdGFjaywgYW5kIHB1c2hlcyB0aGUgcmVzdWx0aW5nCi0gICB0dXBsZSBvbnRvIHRoZSBzdGFjay4KKyAgIENyZWF0ZXMgYSB0dXBsZSBjb25zdW1pbmcgKmNvdW50KiBpdGVtcyBmcm9tIHRoZSBzdGFjaywgYW5kIHB1c2hlcyB0aGUKKyAgIHJlc3VsdGluZyB0dXBsZSBvbnRvIHRoZSBzdGFjay4KIAogCiAuLiBvcGNvZGU6OiBCVUlMRF9MSVNUIChjb3VudCkKQEAgLTczNCw4ICs3MzIsOCBAQAogCiAgICBJbXBvcnRzIHRoZSBtb2R1bGUgYGBjb19uYW1lc1tuYW1laV1gYC4gIFRPUyBhbmQgVE9TMSBhcmUgcG9wcGVkIGFuZCBwcm92aWRlCiAgICB0aGUgKmZyb21saXN0KiBhbmQgKmxldmVsKiBhcmd1bWVudHMgb2YgOmZ1bmM6YF9faW1wb3J0X19gLiAgVGhlIG1vZHVsZQotICAgb2JqZWN0IGlzIHB1c2hlZCBvbnRvIHRoZSBzdGFjay4gIFRoZSBjdXJyZW50IG5hbWVzcGFjZSBpcyBub3QgYWZmZWN0ZWQ6Ci0gICBmb3IgYSBwcm9wZXIgaW1wb3J0IHN0YXRlbWVudCwgYSBzdWJzZXF1ZW50IDpvcGNvZGU6YFNUT1JFX0ZBU1RgIGluc3RydWN0aW9uCisgICBvYmplY3QgaXMgcHVzaGVkIG9udG8gdGhlIHN0YWNrLiAgVGhlIGN1cnJlbnQgbmFtZXNwYWNlIGlzIG5vdCBhZmZlY3RlZDogZm9yCisgICBhIHByb3BlciBpbXBvcnQgc3RhdGVtZW50LCBhIHN1YnNlcXVlbnQgOm9wY29kZTpgU1RPUkVfRkFTVGAgaW5zdHJ1Y3Rpb24KICAgIG1vZGlmaWVzIHRoZSBuYW1lc3BhY2UuCiAKIApAQCAtNzYzLDE0ICs3NjEsMTQgQEAKIAogLi4gb3Bjb2RlOjogSlVNUF9JRl9UUlVFX09SX1BPUCAodGFyZ2V0KQogCi0gICBJZiBUT1MgaXMgdHJ1ZSwgc2V0cyB0aGUgYnl0ZWNvZGUgY291bnRlciB0byAqdGFyZ2V0KiBhbmQgbGVhdmVzIFRPUwotICAgb24gdGhlIHN0YWNrLiAgT3RoZXJ3aXNlIChUT1MgaXMgZmFsc2UpLCBUT1MgaXMgcG9wcGVkLgorICAgSWYgVE9TIGlzIHRydWUsIHNldHMgdGhlIGJ5dGVjb2RlIGNvdW50ZXIgdG8gKnRhcmdldCogYW5kIGxlYXZlcyBUT1Mgb24gdGhlCisgICBzdGFjay4gIE90aGVyd2lzZSAoVE9TIGlzIGZhbHNlKSwgVE9TIGlzIHBvcHBlZC4KIAogCiAuLiBvcGNvZGU6OiBKVU1QX0lGX0ZBTFNFX09SX1BPUCAodGFyZ2V0KQogCi0gICBJZiBUT1MgaXMgZmFsc2UsIHNldHMgdGhlIGJ5dGVjb2RlIGNvdW50ZXIgdG8gKnRhcmdldCogYW5kIGxlYXZlcwotICAgVE9TIG9uIHRoZSBzdGFjay4gIE90aGVyd2lzZSAoVE9TIGlzIHRydWUpLCBUT1MgaXMgcG9wcGVkLgorICAgSWYgVE9TIGlzIGZhbHNlLCBzZXRzIHRoZSBieXRlY29kZSBjb3VudGVyIHRvICp0YXJnZXQqIGFuZCBsZWF2ZXMgVE9TIG9uIHRoZQorICAgc3RhY2suICBPdGhlcndpc2UgKFRPUyBpcyB0cnVlKSwgVE9TIGlzIHBvcHBlZC4KIAogCiAuLiBvcGNvZGU6OiBKVU1QX0FCU09MVVRFICh0YXJnZXQpCkBAIC03ODAsMTAgKzc3OCwxMCBAQAogCiAuLiBvcGNvZGU6OiBGT1JfSVRFUiAoZGVsdGEpCiAKLSAgIGBgVE9TYGAgaXMgYW4gOnRlcm06YGl0ZXJhdG9yYC4gIENhbGwgaXRzIDptZXRoOmB+aXRlcmF0b3IuX19uZXh0X19gIG1ldGhvZC4KLSAgIElmIHRoaXMgeWllbGRzIGEgbmV3IHZhbHVlLCBwdXNoIGl0IG9uIHRoZSBzdGFjayAobGVhdmluZyB0aGUgaXRlcmF0b3IgYmVsb3cKLSAgIGl0KS4gIElmIHRoZSBpdGVyYXRvciBpbmRpY2F0ZXMgaXQgaXMgZXhoYXVzdGVkIGBgVE9TYGAgaXMgcG9wcGVkLCBhbmQgdGhlCi0gICBieXRlIGNvZGUgY291bnRlciBpcyBpbmNyZW1lbnRlZCBieSAqZGVsdGEqLgorICAgVE9TIGlzIGFuIDp0ZXJtOmBpdGVyYXRvcmAuICBDYWxsIGl0cyA6bWV0aDpgfml0ZXJhdG9yLl9fbmV4dF9fYCBtZXRob2QuICBJZgorICAgdGhpcyB5aWVsZHMgYSBuZXcgdmFsdWUsIHB1c2ggaXQgb24gdGhlIHN0YWNrIChsZWF2aW5nIHRoZSBpdGVyYXRvciBiZWxvdworICAgaXQpLiAgSWYgdGhlIGl0ZXJhdG9yIGluZGljYXRlcyBpdCBpcyBleGhhdXN0ZWQgVE9TIGlzIHBvcHBlZCwgYW5kIHRoZSBieXRlCisgICBjb2RlIGNvdW50ZXIgaXMgaW5jcmVtZW50ZWQgYnkgKmRlbHRhKi4KIAogCiAuLiBvcGNvZGU6OiBMT0FEX0dMT0JBTCAobmFtZWkpCkBAIC03OTksMTkgKzc5NywxOSBAQAogCiAuLiBvcGNvZGU6OiBTRVRVUF9FWENFUFQgKGRlbHRhKQogCi0gICBQdXNoZXMgYSB0cnkgYmxvY2sgZnJvbSBhIHRyeS1leGNlcHQgY2xhdXNlIG9udG8gdGhlIGJsb2NrIHN0YWNrLiAqZGVsdGEqIHBvaW50cwotICAgdG8gdGhlIGZpcnN0IGV4Y2VwdCBibG9jay4KKyAgIFB1c2hlcyBhIHRyeSBibG9jayBmcm9tIGEgdHJ5LWV4Y2VwdCBjbGF1c2Ugb250byB0aGUgYmxvY2sgc3RhY2suICpkZWx0YSoKKyAgIHBvaW50cyB0byB0aGUgZmlyc3QgZXhjZXB0IGJsb2NrLgogCiAKIC4uIG9wY29kZTo6IFNFVFVQX0ZJTkFMTFkgKGRlbHRhKQogCi0gICBQdXNoZXMgYSB0cnkgYmxvY2sgZnJvbSBhIHRyeS1leGNlcHQgY2xhdXNlIG9udG8gdGhlIGJsb2NrIHN0YWNrLiAqZGVsdGEqIHBvaW50cwotICAgdG8gdGhlIGZpbmFsbHkgYmxvY2suCisgICBQdXNoZXMgYSB0cnkgYmxvY2sgZnJvbSBhIHRyeS1leGNlcHQgY2xhdXNlIG9udG8gdGhlIGJsb2NrIHN0YWNrLiAqZGVsdGEqCisgICBwb2ludHMgdG8gdGhlIGZpbmFsbHkgYmxvY2suCiAKIC4uIG9wY29kZTo6IFNUT1JFX01BUAogCi0gICBTdG9yZSBhIGtleSBhbmQgdmFsdWUgcGFpciBpbiBhIGRpY3Rpb25hcnkuICBQb3BzIHRoZSBrZXkgYW5kIHZhbHVlIHdoaWxlIGxlYXZpbmcKLSAgIHRoZSBkaWN0aW9uYXJ5IG9uIHRoZSBzdGFjay4KKyAgIFN0b3JlIGEga2V5IGFuZCB2YWx1ZSBwYWlyIGluIGEgZGljdGlvbmFyeS4gIFBvcHMgdGhlIGtleSBhbmQgdmFsdWUgd2hpbGUKKyAgIGxlYXZpbmcgdGhlIGRpY3Rpb25hcnkgb24gdGhlIHN0YWNrLgogCiAuLiBvcGNvZGU6OiBMT0FEX0ZBU1QgKHZhcl9udW0pCiAKQEAgLTgzMSw4ICs4MjksOCBAQAogLi4gb3Bjb2RlOjogTE9BRF9DTE9TVVJFIChpKQogCiAgICBQdXNoZXMgYSByZWZlcmVuY2UgdG8gdGhlIGNlbGwgY29udGFpbmVkIGluIHNsb3QgKmkqIG9mIHRoZSBjZWxsIGFuZCBmcmVlCi0gICB2YXJpYWJsZSBzdG9yYWdlLiAgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIGlzICBgYGNvX2NlbGx2YXJzW2ldYGAgaWYgKmkqIGlzCi0gICBsZXNzIHRoYW4gdGhlIGxlbmd0aCBvZiAqY29fY2VsbHZhcnMqLiAgT3RoZXJ3aXNlIGl0IGlzICBgYGNvX2ZyZWV2YXJzW2kgLQorICAgdmFyaWFibGUgc3RvcmFnZS4gIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSBpcyBgYGNvX2NlbGx2YXJzW2ldYGAgaWYgKmkqIGlzCisgICBsZXNzIHRoYW4gdGhlIGxlbmd0aCBvZiAqY29fY2VsbHZhcnMqLiAgT3RoZXJ3aXNlIGl0IGlzIGBgY29fZnJlZXZhcnNbaSAtCiAgICBsZW4oY29fY2VsbHZhcnMpXWBgLgogCiAKQEAgLTg3MiwxMSArODcwLDEyIEBACiAKICAgIENhbGxzIGEgZnVuY3Rpb24uICBUaGUgbG93IGJ5dGUgb2YgKmFyZ2MqIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIHBvc2l0aW9uYWwKICAgIHBhcmFtZXRlcnMsIHRoZSBoaWdoIGJ5dGUgdGhlIG51bWJlciBvZiBrZXl3b3JkIHBhcmFtZXRlcnMuIE9uIHRoZSBzdGFjaywgdGhlCi0gICBvcGNvZGUgZmluZHMgdGhlIGtleXdvcmQgcGFyYW1ldGVycyBmaXJzdC4gIEZvciBlYWNoIGtleXdvcmQgYXJndW1lbnQsIHRoZSB2YWx1ZQotICAgaXMgb24gdG9wIG9mIHRoZSBrZXkuICBCZWxvdyB0aGUga2V5d29yZCBwYXJhbWV0ZXJzLCB0aGUgcG9zaXRpb25hbCBwYXJhbWV0ZXJzCi0gICBhcmUgb24gdGhlIHN0YWNrLCB3aXRoIHRoZSByaWdodC1tb3N0IHBhcmFtZXRlciBvbiB0b3AuICBCZWxvdyB0aGUgcGFyYW1ldGVycywKLSAgIHRoZSBmdW5jdGlvbiBvYmplY3QgdG8gY2FsbCBpcyBvbiB0aGUgc3RhY2suICBQb3BzIGFsbCBmdW5jdGlvbiBhcmd1bWVudHMsIGFuZAotICAgdGhlIGZ1bmN0aW9uIGl0c2VsZiBvZmYgdGhlIHN0YWNrLCBhbmQgcHVzaGVzIHRoZSByZXR1cm4gdmFsdWUuCisgICBvcGNvZGUgZmluZHMgdGhlIGtleXdvcmQgcGFyYW1ldGVycyBmaXJzdC4gIEZvciBlYWNoIGtleXdvcmQgYXJndW1lbnQsIHRoZQorICAgdmFsdWUgaXMgb24gdG9wIG9mIHRoZSBrZXkuICBCZWxvdyB0aGUga2V5d29yZCBwYXJhbWV0ZXJzLCB0aGUgcG9zaXRpb25hbAorICAgcGFyYW1ldGVycyBhcmUgb24gdGhlIHN0YWNrLCB3aXRoIHRoZSByaWdodC1tb3N0IHBhcmFtZXRlciBvbiB0b3AuICBCZWxvdyB0aGUKKyAgIHBhcmFtZXRlcnMsIHRoZSBmdW5jdGlvbiBvYmplY3QgdG8gY2FsbCBpcyBvbiB0aGUgc3RhY2suICBQb3BzIGFsbCBmdW5jdGlvbgorICAgYXJndW1lbnRzLCBhbmQgdGhlIGZ1bmN0aW9uIGl0c2VsZiBvZmYgdGhlIHN0YWNrLCBhbmQgcHVzaGVzIHRoZSByZXR1cm4KKyAgIHZhbHVlLgogCiAKIC4uIG9wY29kZTo6IE1BS0VfRlVOQ1RJT04gKGFyZ2MpCkBAIC04OTksOCArODk4LDggQEAKICAgIENyZWF0ZXMgYSBuZXcgZnVuY3Rpb24gb2JqZWN0LCBzZXRzIGl0cyAqX19jbG9zdXJlX18qIHNsb3QsIGFuZCBwdXNoZXMgaXQgb24KICAgIHRoZSBzdGFjay4gIFRPUyBpcyB0aGUgOnRlcm06YHF1YWxpZmllZCBuYW1lYCBvZiB0aGUgZnVuY3Rpb24sIFRPUzEgaXMgdGhlCiAgICBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZnVuY3Rpb24sIGFuZCBUT1MyIGlzIHRoZSB0dXBsZSBjb250YWluaW5nIGNlbGxzIGZvcgotICAgdGhlIGNsb3N1cmUncyBmcmVlIHZhcmlhYmxlcy4gIFRoZSBmdW5jdGlvbiBhbHNvIGhhcyAqYXJnYyogZGVmYXVsdCBwYXJhbWV0ZXJzLAotICAgd2hpY2ggYXJlIGZvdW5kIGJlbG93IHRoZSBjZWxscy4KKyAgIHRoZSBjbG9zdXJlJ3MgZnJlZSB2YXJpYWJsZXMuICBUaGUgZnVuY3Rpb24gYWxzbyBoYXMgKmFyZ2MqIGRlZmF1bHQKKyAgIHBhcmFtZXRlcnMsIHdoaWNoIGFyZSBmb3VuZCBiZWxvdyB0aGUgY2VsbHMuCiAKIAogLi4gb3Bjb2RlOjogQlVJTERfU0xJQ0UgKGFyZ2MpCkBAIC05MTYsMzYgKzkxNSwzNyBAQAogCiAgICBQcmVmaXhlcyBhbnkgb3Bjb2RlIHdoaWNoIGhhcyBhbiBhcmd1bWVudCB0b28gYmlnIHRvIGZpdCBpbnRvIHRoZSBkZWZhdWx0IHR3bwogICAgYnl0ZXMuICAqZXh0KiBob2xkcyB0d28gYWRkaXRpb25hbCBieXRlcyB3aGljaCwgdGFrZW4gdG9nZXRoZXIgd2l0aCB0aGUKLSAgIHN1YnNlcXVlbnQgb3Bjb2RlJ3MgYXJndW1lbnQsIGNvbXByaXNlIGEgZm91ci1ieXRlIGFyZ3VtZW50LCAqZXh0KiBiZWluZyB0aGUgdHdvCi0gICBtb3N0LXNpZ25pZmljYW50IGJ5dGVzLgorICAgc3Vic2VxdWVudCBvcGNvZGUncyBhcmd1bWVudCwgY29tcHJpc2UgYSBmb3VyLWJ5dGUgYXJndW1lbnQsICpleHQqIGJlaW5nIHRoZQorICAgdHdvIG1vc3Qtc2lnbmlmaWNhbnQgYnl0ZXMuCiAKIAogLi4gb3Bjb2RlOjogQ0FMTF9GVU5DVElPTl9WQVIgKGFyZ2MpCiAKLSAgIENhbGxzIGEgZnVuY3Rpb24uICphcmdjKiBpcyBpbnRlcnByZXRlZCBhcyBpbiA6b3Bjb2RlOmBDQUxMX0ZVTkNUSU9OYC4gVGhlIHRvcCBlbGVtZW50Ci0gICBvbiB0aGUgc3RhY2sgY29udGFpbnMgdGhlIHZhcmlhYmxlIGFyZ3VtZW50IGxpc3QsIGZvbGxvd2VkIGJ5IGtleXdvcmQgYW5kCi0gICBwb3NpdGlvbmFsIGFyZ3VtZW50cy4KKyAgIENhbGxzIGEgZnVuY3Rpb24uICphcmdjKiBpcyBpbnRlcnByZXRlZCBhcyBpbiA6b3Bjb2RlOmBDQUxMX0ZVTkNUSU9OYC4gVGhlCisgICB0b3AgZWxlbWVudCBvbiB0aGUgc3RhY2sgY29udGFpbnMgdGhlIHZhcmlhYmxlIGFyZ3VtZW50IGxpc3QsIGZvbGxvd2VkIGJ5CisgICBrZXl3b3JkIGFuZCBwb3NpdGlvbmFsIGFyZ3VtZW50cy4KIAogCiAuLiBvcGNvZGU6OiBDQUxMX0ZVTkNUSU9OX0tXIChhcmdjKQogCi0gICBDYWxscyBhIGZ1bmN0aW9uLiAqYXJnYyogaXMgaW50ZXJwcmV0ZWQgYXMgaW4gOm9wY29kZTpgQ0FMTF9GVU5DVElPTmAuIFRoZSB0b3AgZWxlbWVudAotICAgb24gdGhlIHN0YWNrIGNvbnRhaW5zIHRoZSBrZXl3b3JkIGFyZ3VtZW50cyBkaWN0aW9uYXJ5LCAgZm9sbG93ZWQgYnkgZXhwbGljaXQKLSAgIGtleXdvcmQgYW5kIHBvc2l0aW9uYWwgYXJndW1lbnRzLgorICAgQ2FsbHMgYSBmdW5jdGlvbi4gKmFyZ2MqIGlzIGludGVycHJldGVkIGFzIGluIDpvcGNvZGU6YENBTExfRlVOQ1RJT05gLiBUaGUKKyAgIHRvcCBlbGVtZW50IG9uIHRoZSBzdGFjayBjb250YWlucyB0aGUga2V5d29yZCBhcmd1bWVudHMgZGljdGlvbmFyeSwgZm9sbG93ZWQKKyAgIGJ5IGV4cGxpY2l0IGtleXdvcmQgYW5kIHBvc2l0aW9uYWwgYXJndW1lbnRzLgogCiAKIC4uIG9wY29kZTo6IENBTExfRlVOQ1RJT05fVkFSX0tXIChhcmdjKQogCi0gICBDYWxscyBhIGZ1bmN0aW9uLiAqYXJnYyogaXMgaW50ZXJwcmV0ZWQgYXMgaW4gOm9wY29kZTpgQ0FMTF9GVU5DVElPTmAuICBUaGUgdG9wCi0gICBlbGVtZW50IG9uIHRoZSBzdGFjayBjb250YWlucyB0aGUga2V5d29yZCBhcmd1bWVudHMgZGljdGlvbmFyeSwgZm9sbG93ZWQgYnkgdGhlCi0gICB2YXJpYWJsZS1hcmd1bWVudHMgdHVwbGUsIGZvbGxvd2VkIGJ5IGV4cGxpY2l0IGtleXdvcmQgYW5kIHBvc2l0aW9uYWwgYXJndW1lbnRzLgorICAgQ2FsbHMgYSBmdW5jdGlvbi4gKmFyZ2MqIGlzIGludGVycHJldGVkIGFzIGluIDpvcGNvZGU6YENBTExfRlVOQ1RJT05gLiAgVGhlCisgICB0b3AgZWxlbWVudCBvbiB0aGUgc3RhY2sgY29udGFpbnMgdGhlIGtleXdvcmQgYXJndW1lbnRzIGRpY3Rpb25hcnksIGZvbGxvd2VkCisgICBieSB0aGUgdmFyaWFibGUtYXJndW1lbnRzIHR1cGxlLCBmb2xsb3dlZCBieSBleHBsaWNpdCBrZXl3b3JkIGFuZCBwb3NpdGlvbmFsCisgICBhcmd1bWVudHMuCiAKIAogLi4gb3Bjb2RlOjogSEFWRV9BUkdVTUVOVAogCi0gICBUaGlzIGlzIG5vdCByZWFsbHkgYW4gb3Bjb2RlLiAgSXQgaWRlbnRpZmllcyB0aGUgZGl2aWRpbmcgbGluZSBiZXR3ZWVuIG9wY29kZXMKLSAgIHdoaWNoIGRvbid0IHRha2UgYXJndW1lbnRzIGBgPCBIQVZFX0FSR1VNRU5UYGAgYW5kIHRob3NlIHdoaWNoIGRvIGBgPj0KLSAgIEhBVkVfQVJHVU1FTlRgYC4KKyAgIFRoaXMgaXMgbm90IHJlYWxseSBhbiBvcGNvZGUuICBJdCBpZGVudGlmaWVzIHRoZSBkaXZpZGluZyBsaW5lIGJldHdlZW4KKyAgIG9wY29kZXMgd2hpY2ggZG9uJ3QgdGFrZSBhcmd1bWVudHMgYGA8IEhBVkVfQVJHVU1FTlRgYCBhbmQgdGhvc2Ugd2hpY2ggZG8KKyAgIGBgPj0gSEFWRV9BUkdVTUVOVGBgLgogCiAuLiBfb3Bjb2RlX2NvbGxlY3Rpb25zOgogCkBAIC05NzcsMTAgKzk3NywxMCBAQAogCiAuLiBkYXRhOjogaGFzZnJlZQogCi0gICBTZXF1ZW5jZSBvZiBieXRlY29kZXMgdGhhdCBhY2Nlc3MgYSBmcmVlIHZhcmlhYmxlIChub3RlIHRoYXQgJ2ZyZWUnIGluCi0gICB0aGlzIGNvbnRleHQgcmVmZXJzIHRvIG5hbWVzIGluIHRoZSBjdXJyZW50IHNjb3BlIHRoYXQgYXJlIHJlZmVyZW5jZWQgYnkKLSAgIGlubmVyIHNjb3BlcyBvciBuYW1lcyBpbiBvdXRlciBzY29wZXMgdGhhdCBhcmUgcmVmZXJlbmNlZCBmcm9tIHRoaXMgc2NvcGUuCi0gICBJdCBkb2VzICpub3QqIGluY2x1ZGUgcmVmZXJlbmNlcyB0byBnbG9iYWwgb3IgYnVpbHRpbiBzY29wZXMpLgorICAgU2VxdWVuY2Ugb2YgYnl0ZWNvZGVzIHRoYXQgYWNjZXNzIGEgZnJlZSB2YXJpYWJsZSAobm90ZSB0aGF0ICdmcmVlJyBpbiB0aGlzCisgICBjb250ZXh0IHJlZmVycyB0byBuYW1lcyBpbiB0aGUgY3VycmVudCBzY29wZSB0aGF0IGFyZSByZWZlcmVuY2VkIGJ5IGlubmVyCisgICBzY29wZXMgb3IgbmFtZXMgaW4gb3V0ZXIgc2NvcGVzIHRoYXQgYXJlIHJlZmVyZW5jZWQgZnJvbSB0aGlzIHNjb3BlLiAgSXQgZG9lcworICAgKm5vdCogaW5jbHVkZSByZWZlcmVuY2VzIHRvIGdsb2JhbCBvciBidWlsdGluIHNjb3BlcykuCiAKIAogLi4gZGF0YTo6IGhhc25hbWUKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2h0dHAuY2xpZW50LnJzdCBiL0RvYy9saWJyYXJ5L2h0dHAuY2xpZW50LnJzdAppbmRleCBiNDk1ZjQxLi41ZTI3YTM2IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9odHRwLmNsaWVudC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvaHR0cC5jbGllbnQucnN0CkBAIC0xNjksNiArMTY5LDEyIEBACiAgICBzdGF0dXMgY29kZSB0aGF0IHdlIGRvbid0IHVuZGVyc3RhbmQuCiAKIAorLi4gZXhjZXB0aW9uOjogTGluZVRvb0xvbmcKKworICAgQSBzdWJjbGFzcyBvZiA6ZXhjOmBIVFRQRXhjZXB0aW9uYC4gIFJhaXNlZCBpZiBhbiBleGNlc3NpdmVseSBsb25nIGxpbmUKKyAgIGlzIHJlY2VpdmVkIGluIHRoZSBIVFRQIHByb3RvY29sIGZyb20gdGhlIHNlcnZlci4KKworCiBUaGUgY29uc3RhbnRzIGRlZmluZWQgaW4gdGhpcyBtb2R1bGUgYXJlOgogCiAuLiBkYXRhOjogSFRUUF9QT1JUCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9odHRwLnNlcnZlci5yc3QgYi9Eb2MvbGlicmFyeS9odHRwLnNlcnZlci5yc3QKaW5kZXggZWM1NDY0My4uMWMzZTIwMiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvaHR0cC5zZXJ2ZXIucnN0CisrKyBiL0RvYy9saWJyYXJ5L2h0dHAuc2VydmVyLnJzdApAQCAtNjQsNiArNjQsMTggQEAKIAogICAgICAgQ29udGFpbnMgdGhlIHNlcnZlciBpbnN0YW5jZS4KIAorICAgLi4gYXR0cmlidXRlOjogY2xvc2VfY29ubmVjdGlvbgorCisgICAgICBCb29sZWFuIHRoYXQgc2hvdWxkIGJlIHNldCBiZWZvcmUgOm1ldGg6YGhhbmRsZV9vbmVfcmVxdWVzdGAgcmV0dXJucywKKyAgICAgIGluZGljYXRpbmcgaWYgYW5vdGhlciByZXF1ZXN0IG1heSBiZSBleHBlY3RlZCwgb3IgaWYgdGhlIGNvbm5lY3Rpb24gc2hvdWxkCisgICAgICBiZSBzaHV0IGRvd24uCisKKyAgIC4uIGF0dHJpYnV0ZTo6IHJlcXVlc3RsaW5lCisKKyAgICAgIENvbnRhaW5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIEhUVFAgcmVxdWVzdCBsaW5lLiBUaGUKKyAgICAgIHRlcm1pbmF0aW5nIENSTEYgaXMgc3RyaXBwZWQuIFRoaXMgYXR0cmlidXRlIHNob3VsZCBiZSBzZXQgYnkKKyAgICAgIDptZXRoOmBoYW5kbGVfb25lX3JlcXVlc3RgLiBJZiBubyB2YWxpZCByZXF1ZXN0IGxpbmUgd2FzIHByb2Nlc3NlZCwgaXQKKyAgICAgIHNob3VsZCBiZSBzZXQgdG8gdGhlIGVtcHR5IHN0cmluZy4KIAogICAgLi4gYXR0cmlidXRlOjogY29tbWFuZAogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9pbXBvcnRsaWIucnN0IGIvRG9jL2xpYnJhcnkvaW1wb3J0bGliLnJzdAppbmRleCA5YzZiMjgwLi5lNjFhYzM1IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9pbXBvcnRsaWIucnN0CisrKyBiL0RvYy9saWJyYXJ5L2ltcG9ydGxpYi5yc3QKQEAgLTY5LDYgKzY5LDEwIEBACiAKICAgICBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYnVpbHQtaW4gOmZ1bmM6YF9faW1wb3J0X19gIGZ1bmN0aW9uLgogCisgICAgLi4gbm90ZTo6CisgICAgICAgUHJvZ3JhbW1hdGljIGltcG9ydGluZyBvZiBtb2R1bGVzIHNob3VsZCB1c2UgOmZ1bmM6YGltcG9ydF9tb2R1bGVgCisgICAgICAgaW5zdGVhZCBvZiB0aGlzIGZ1bmN0aW9uLgorCiAuLiBmdW5jdGlvbjo6IGltcG9ydF9tb2R1bGUobmFtZSwgcGFja2FnZT1Ob25lKQogCiAgICAgSW1wb3J0IGEgbW9kdWxlLiBUaGUgKm5hbWUqIGFyZ3VtZW50IHNwZWNpZmllcyB3aGF0IG1vZHVsZSB0bwpAQCAtODEsMTIgKzg1LDE1IEBACiAKICAgICBUaGUgOmZ1bmM6YGltcG9ydF9tb2R1bGVgIGZ1bmN0aW9uIGFjdHMgYXMgYSBzaW1wbGlmeWluZyB3cmFwcGVyIGFyb3VuZAogICAgIDpmdW5jOmBpbXBvcnRsaWIuX19pbXBvcnRfX2AuIFRoaXMgbWVhbnMgYWxsIHNlbWFudGljcyBvZiB0aGUgZnVuY3Rpb24gYXJlCi0gICAgZGVyaXZlZCBmcm9tIDpmdW5jOmBpbXBvcnRsaWIuX19pbXBvcnRfX2AsIGluY2x1ZGluZyByZXF1aXJpbmcgdGhlIHBhY2thZ2UKLSAgICBmcm9tIHdoaWNoIGFuIGltcG9ydCBpcyBvY2N1cnJpbmcgdG8gaGF2ZSBiZWVuIHByZXZpb3VzbHkgaW1wb3J0ZWQKLSAgICAoaS5lLiwgKnBhY2thZ2UqIG11c3QgYWxyZWFkeSBiZSBpbXBvcnRlZCkuIFRoZSBtb3N0IGltcG9ydGFudCBkaWZmZXJlbmNlCi0gICAgaXMgdGhhdCA6ZnVuYzpgaW1wb3J0X21vZHVsZWAgcmV0dXJucyB0aGUgc3BlY2lmaWVkIHBhY2thZ2Ugb3IgbW9kdWxlCi0gICAgKGUuZy4gYGBwa2cubW9kYGApLCB3aGlsZSA6ZnVuYzpgX19pbXBvcnRfX2AgcmV0dXJucyB0aGUKLSAgICB0b3AtbGV2ZWwgcGFja2FnZSBvciBtb2R1bGUgKGUuZy4gYGBwa2dgYCkuCisgICAgZGVyaXZlZCBmcm9tIDpmdW5jOmBpbXBvcnRsaWIuX19pbXBvcnRfX2AuIFRoZSBtb3N0IGltcG9ydGFudCBkaWZmZXJlbmNlCisgICAgYmV0d2VlbiB0aGVzZSB0d28gZnVuY3Rpb25zIGlzIHRoYXQgOmZ1bmM6YGltcG9ydF9tb2R1bGVgIHJldHVybnMgdGhlCisgICAgc3BlY2lmaWVkIHBhY2thZ2Ugb3IgbW9kdWxlIChlLmcuIGBgcGtnLm1vZGBgKSwgd2hpbGUgOmZ1bmM6YF9faW1wb3J0X19gCisgICAgcmV0dXJucyB0aGUgdG9wLWxldmVsIHBhY2thZ2Ugb3IgbW9kdWxlIChlLmcuIGBgcGtnYGApLgorCisgICAgSWYgeW91IGFyZSBkeW5hbWljYWxseSBpbXBvcnRpbmcgYSBtb2R1bGUgdGhhdCB3YXMgY3JlYXRlZCBzaW5jZSB0aGUKKyAgICBpbnRlcnByZXRlciBiZWdhbiBleGVjdXRpb24gKGUuZy4sIGNyZWF0ZWQgYSBQeXRob24gc291cmNlIGZpbGUpLCB5b3UgbWF5CisgICAgbmVlZCB0byBjYWxsIDpmdW5jOmBpbnZhbGlkYXRlX2NhY2hlc2AgaW4gb3JkZXIgZm9yIHRoZSBuZXcgbW9kdWxlIHRvIGJlCisgICAgbm90aWNlZCBieSB0aGUgaW1wb3J0IHN5c3RlbS4KIAogICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy4zCiAgICAgICAgUGFyZW50IHBhY2thZ2VzIGFyZSBhdXRvbWF0aWNhbGx5IGltcG9ydGVkLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvbGluZWNhY2hlLnJzdCBiL0RvYy9saWJyYXJ5L2xpbmVjYWNoZS5yc3QKaW5kZXggZGFjZjhhYS4uMTJkMDExMyAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvbGluZWNhY2hlLnJzdAorKysgYi9Eb2MvbGlicmFyeS9saW5lY2FjaGUucnN0CkBAIC00Myw2ICs0MywxNCBAQAogICAgY2hhbmdlZCBvbiBkaXNrLCBhbmQgeW91IHJlcXVpcmUgdGhlIHVwZGF0ZWQgdmVyc2lvbi4gIElmICpmaWxlbmFtZSogaXMgb21pdHRlZCwKICAgIGl0IHdpbGwgY2hlY2sgYWxsIHRoZSBlbnRyaWVzIGluIHRoZSBjYWNoZS4KIAorLi4gZnVuY3Rpb246OiBsYXp5Y2FjaGUoZmlsZW5hbWUsIG1vZHVsZV9nbG9iYWxzKQorCisgICBDYXB0dXJlIGVub3VnaCBkZXRhaWwgYWJvdXQgYSBub24tZmlsZSBiYXNlZCBtb2R1bGUgdG8gcGVybWl0IGdldHRpbmcgaXRzCisgICBsaW5lcyBsYXRlciB2aWEgOmZ1bmM6YGdldGxpbmVgIGV2ZW4gaWYgKm1vZHVsZV9nbG9iYWxzKiBpcyBOb25lIGluIHRoZSBsYXRlcgorICAgY2FsbC4gVGhpcyBhdm9pZHMgZG9pbmcgSS9PIHVudGlsIGEgbGluZSBpcyBhY3R1YWxseSBuZWVkZWQsIHdpdGhvdXQgaGF2aW5nCisgICB0byBjYXJyeSB0aGUgbW9kdWxlIGdsb2JhbHMgYXJvdW5kIGluZGVmaW5pdGVseS4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy41CiAKIEV4YW1wbGU6OgogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9sb2dnaW5nLmhhbmRsZXJzLnJzdCBiL0RvYy9saWJyYXJ5L2xvZ2dpbmcuaGFuZGxlcnMucnN0CmluZGV4IDQ4YzU3Y2YuLjY3NDAzYTkgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2xvZ2dpbmcuaGFuZGxlcnMucnN0CisrKyBiL0RvYy9saWJyYXJ5L2xvZ2dpbmcuaGFuZGxlcnMucnN0CkBAIC05NTMsMTMgKzk1MywyMCBAQAogcG9zc2libGUsIHdoaWxlIGFueSBwb3RlbnRpYWxseSBzbG93IG9wZXJhdGlvbnMgKHN1Y2ggYXMgc2VuZGluZyBhbiBlbWFpbCB2aWEKIDpjbGFzczpgU01UUEhhbmRsZXJgKSBhcmUgZG9uZSBvbiBhIHNlcGFyYXRlIHRocmVhZC4KIAotLi4gY2xhc3M6OiBRdWV1ZUxpc3RlbmVyKHF1ZXVlLCAqaGFuZGxlcnMpCisuLiBjbGFzczo6IFF1ZXVlTGlzdGVuZXIocXVldWUsICpoYW5kbGVycywgcmVzcGVjdF9oYW5kbGVyX2xldmVsPUZhbHNlKQogCiAgICBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA6Y2xhc3M6YFF1ZXVlTGlzdGVuZXJgIGNsYXNzLiBUaGUgaW5zdGFuY2UgaXMKICAgIGluaXRpYWxpemVkIHdpdGggdGhlIHF1ZXVlIHRvIHNlbmQgbWVzc2FnZXMgdG8gYW5kIGEgbGlzdCBvZiBoYW5kbGVycyB3aGljaAogICAgd2lsbCBoYW5kbGUgZW50cmllcyBwbGFjZWQgb24gdGhlIHF1ZXVlLiBUaGUgcXVldWUgY2FuIGJlIGFueSBxdWV1ZS0KICAgIGxpa2Ugb2JqZWN0OyBpdCdzIHBhc3NlZCBhcy1pcyB0byB0aGUgOm1ldGg6YGRlcXVldWVgIG1ldGhvZCwgd2hpY2ggbmVlZHMKLSAgIHRvIGtub3cgaG93IHRvIGdldCBtZXNzYWdlcyBmcm9tIGl0LgorICAgdG8ga25vdyBob3cgdG8gZ2V0IG1lc3NhZ2VzIGZyb20gaXQuIElmIGBgcmVzcGVjdF9oYW5kbGVyX2xldmVsYGAgaXMgYGBUcnVlYGAsCisgICBhIGhhbmRsZXIncyBsZXZlbCBpcyByZXNwZWN0ZWQgKGNvbXBhcmVkIHdpdGggdGhlIGxldmVsIGZvciB0aGUgbWVzc2FnZSkgd2hlbgorICAgZGVjaWRpbmcgd2hldGhlciB0byBwYXNzIG1lc3NhZ2VzIHRvIHRoYXQgaGFuZGxlcjsgb3RoZXJ3aXNlLCB0aGUgYmVoYXZpb3VyCisgICBpcyBhcyBpbiBwcmV2aW91cyBQeXRob24gdmVyc2lvbnMgLSB0byBhbHdheXMgcGFzcyBlYWNoIG1lc3NhZ2UgdG8gZWFjaAorICAgaGFuZGxlci4KKworICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjUKKyAgICAgIFRoZSBgYHJlc3BlY3RfaGFuZGxlcl9sZXZlbHNgYCBhcmd1bWVudCB3YXMgYWRkZWQuCiAKICAgIC4uIG1ldGhvZDo6IGRlcXVldWUoYmxvY2spCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L21pbWV0eXBlcy5yc3QgYi9Eb2MvbGlicmFyeS9taW1ldHlwZXMucnN0CmluZGV4IGY4MzYyNDMuLjg3MzllYTMgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L21pbWV0eXBlcy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvbWltZXR5cGVzLnJzdApAQCAtMTA2LDggKzEwNiw4IEBACiAgICBleHRlbnNpb24gaXMgYWxyZWFkeSBrbm93biwgdGhlIG5ldyB0eXBlIHdpbGwgcmVwbGFjZSB0aGUgb2xkIG9uZS4gV2hlbiB0aGUgdHlwZQogICAgaXMgYWxyZWFkeSBrbm93biB0aGUgZXh0ZW5zaW9uIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2Yga25vd24gZXh0ZW5zaW9ucy4KIAotICAgV2hlbiAqc3RyaWN0KiBpcyBgYFRydWVgYCAodGhlIGRlZmF1bHQpLCB0aGUgbWFwcGluZyB3aWxsIGFkZGVkIHRvIHRoZSBvZmZpY2lhbCBNSU1FCi0gICB0eXBlcywgb3RoZXJ3aXNlIHRvIHRoZSBub24tc3RhbmRhcmQgb25lcy4KKyAgIFdoZW4gKnN0cmljdCogaXMgYGBUcnVlYGAgKHRoZSBkZWZhdWx0KSwgdGhlIG1hcHBpbmcgd2lsbCBiZSBhZGRlZCB0byB0aGUKKyAgIG9mZmljaWFsIE1JTUUgdHlwZXMsIG90aGVyd2lzZSB0byB0aGUgbm9uLXN0YW5kYXJkIG9uZXMuCiAKIAogLi4gZGF0YTo6IGluaXRlZApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvb3MucnN0IGIvRG9jL2xpYnJhcnkvb3MucnN0CmluZGV4IGM0YjhiYWMuLjAwMTRiNmMgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L29zLnJzdAorKysgYi9Eb2MvbGlicmFyeS9vcy5yc3QKQEAgLTE2MDEsNiArMTYwMSwxMSBAQAogCiAgICBBdmFpbGFiaWxpdHk6IFVuaXgsIFdpbmRvd3MuCiAKKyAgIC4uIHNlZWFsc286OgorCisgICAgICBUaGUgOmZ1bmM6YHNjYW5kaXJgIGZ1bmN0aW9uIHJldHVybnMgdGhlIGRpcmVjdG9yeSBlbnRyaWVzIHdpdGggbW9yZQorICAgICAgaW5mb3JtYXRpb24gdGhhbiBqdXN0IHRoZSBuYW1lLgorCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuMgogICAgICAgVGhlICpwYXRoKiBwYXJhbWV0ZXIgYmVjYW1lIG9wdGlvbmFsLgogCkBAIC0xODkzLDYgKzE4OTgsMTc4IEBACiAgICAgICBUaGUgKmRpcl9mZCogcGFyYW1ldGVyLgogCiAKKy4uIGZ1bmN0aW9uOjogc2NhbmRpcihwYXRoPScuJykKKworICAgUmV0dXJuIGFuIGl0ZXJhdG9yIG9mIDpjbGFzczpgRGlyRW50cnlgIG9iamVjdHMgY29ycmVzcG9uZGluZyB0byB0aGUgZW50cmllcworICAgaW4gdGhlIGRpcmVjdG9yeSBnaXZlbiBieSAqcGF0aCouIFRoZSBlbnRyaWVzIGFyZSB5aWVsZGVkIGluIGFyYml0cmFyeQorICAgb3JkZXIsIGFuZCB0aGUgc3BlY2lhbCBlbnRyaWVzIGBgJy4nYGAgYW5kIGBgJy4uJ2BgIGFyZSBub3QgaW5jbHVkZWQuCisKKyAgIE9uIFdpbmRvd3MsICpwYXRoKiBtdXN0IG9mIHR5cGUgOmNsYXNzOmBzdHJgLiBPbiBQT1NJWCwgKnBhdGgqIGNhbiBiZSBvZgorICAgdHlwZSA6Y2xhc3M6YHN0cmAgb3IgOmNsYXNzOmBieXRlc2AuICBJZiAqcGF0aCogaXMgb2YgdHlwZSA6Y2xhc3M6YGJ5dGVzYCwKKyAgIHRoZSA6YXR0cjpgfkRpckVudHJ5Lm5hbWVgIGFuZCA6YXR0cjpgfkRpckVudHJ5LnBhdGhgIGF0dHJpYnV0ZXMgb2YKKyAgIDpjbGFzczpgRGlyRW50cnlgIGFyZSBhbHNvIG9mIHR5cGUgYGBieXRlc2BgLiBVc2UgOmZ1bmM6YH5vcy5mc2VuY29kZWAgYW5kCisgICA6ZnVuYzpgfm9zLmZzZGVjb2RlYCB0byBlbmNvZGUgYW5kIGRlY29kZSBwYXRocy4KKworICAgVGhlIDpmdW5jOmBzY2FuZGlyYCBmdW5jdGlvbiBpcyByZWNvbW1lbmRlZCwgaW5zdGVhZCBvZiA6ZnVuYzpgbGlzdGRpcmAsCisgICB3aGVuIHRoZSBmaWxlIHR5cGUgb2YgZW50cmllcyBpcyB1c2VkLiBJbiBtb3N0IGNhc2VzLCB0aGUgZmlsZSB0eXBlIG9mIGEKKyAgIDpjbGFzczpgRGlyRW50cnlgIGlzIHJldHJpZXZlZCBkaXJlY3RseSBieSA6ZnVuYzpgc2NhbmRpcmAsIG5vIHN5c3RlbSBjYWxsCisgICBpcyByZXF1aXJlZC4gSWYgb25seSB0aGUgbmFtZSBvZiBlbnRyaWVzIGlzIHVzZWQsIDpmdW5jOmBsaXN0ZGlyYCBjYW4KKyAgIGJlIG1vcmUgZWZmaWNpZW50IHRoYW4gOmZ1bmM6YHNjYW5kaXJgLgorCisgICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgYSBzaW1wbGUgdXNlIG9mIDpmdW5jOmBzY2FuZGlyYCB0byBkaXNwbGF5IGFsbAorICAgdGhlIGZpbGVzIGV4Y2x1ZGluZyBkaXJlY3RvcmllcyBpbiB0aGUgZ2l2ZW4gKnBhdGgqIHRoYXQgZG9uJ3Qgc3RhcnQgd2l0aAorICAgYGAnLidgYDo6CisKKyAgICAgIGZvciBlbnRyeSBpbiBvcy5zY2FuZGlyKHBhdGgpOgorICAgICAgICAgaWYgbm90IGVudHJ5Lm5hbWUuc3RhcnRzd2l0aCgnLicpIGFuZCBlbnRyeS5pc19maWxlKCk6CisgICAgICAgICAgICAgcHJpbnQoZW50cnkubmFtZSkKKworICAgLi4gbm90ZTo6CisKKyAgICAgIE9uIFVuaXgtYmFzZWQgc3lzdGVtcywgOmZ1bmM6YHNjYW5kaXJgIHVzZXMgdGhlIHN5c3RlbSdzCisgICAgICBgb3BlbmRpcigpIDxodHRwOi8vcHVicy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA5Njk1Mzk5L2Z1bmN0aW9ucy9vcGVuZGlyLmh0bWw+YF8KKyAgICAgIGFuZAorICAgICAgYHJlYWRkaXIoKSA8aHR0cDovL3B1YnMub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwOTY5NTM5OS9mdW5jdGlvbnMvcmVhZGRpcl9yLmh0bWw+YF8KKyAgICAgIGZ1bmN0aW9ucy4gT24gV2luZG93cywgaXQgdXNlcyB0aGUgV2luMzIKKyAgICAgIGBGaW5kRmlyc3RGaWxlVyA8aHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3dpbmRvd3MvZGVza3RvcC9hYTM2NDQxOCh2PXZzLjg1KS5hc3B4PmBfCisgICAgICBhbmQKKyAgICAgIGBGaW5kTmV4dEZpbGVXIDxodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvd2luZG93cy9kZXNrdG9wL2FhMzY0NDI4KHY9dnMuODUpLmFzcHg+YF8KKyAgICAgIGZ1bmN0aW9ucy4KKworICAgLi4gc2VlYWxzbzo6CisKKyAgICAgIFRoZSA6ZnVuYzpgbGlzdGRpcmAgZnVuY3Rpb24gcmV0dXJucyB0aGUgbmFtZXMgb2YgdGhlIGRpcmVjdG9yeSBlbnRyaWVzLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjUKKworCisuLiBjbGFzczo6IERpckVudHJ5CisKKyAgIE9iamVjdCB5aWVsZGVkIGJ5IDpmdW5jOmBzY2FuZGlyYCB0byBleHBvc2UgdGhlIGZpbGUgcGF0aCBhbmQgb3RoZXIgZmlsZQorICAgYXR0cmlidXRlcyBvZiBhIGRpcmVjdG9yeSBlbnRyeS4KKworICAgOmZ1bmM6YHNjYW5kaXJgIHdpbGwgcHJvdmlkZSBhcyBtdWNoIG9mIHRoaXMgaW5mb3JtYXRpb24gYXMgcG9zc2libGUgd2l0aG91dAorICAgbWFraW5nIGFkZGl0aW9uYWwgc3lzdGVtIGNhbGxzLiBXaGVuIGEgYGBzdGF0KClgYCBvciBgYGxzdGF0KClgYCBzeXN0ZW0gY2FsbAorICAgaXMgbWFkZSwgdGhlIGBgRGlyRW50cnlgYCBvYmplY3QgY2FjaGUgdGhlIHJlc3VsdCAuCisKKyAgIGBgRGlyRW50cnlgYCBpbnN0YW5jZXMgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSBzdG9yZWQgaW4gbG9uZy1saXZlZCBkYXRhCisgICBzdHJ1Y3R1cmVzOyBpZiB5b3Uga25vdyB0aGUgZmlsZSBtZXRhZGF0YSBoYXMgY2hhbmdlZCBvciBpZiBhIGxvbmcgdGltZSBoYXMKKyAgIGVsYXBzZWQgc2luY2UgY2FsbGluZyA6ZnVuYzpgc2NhbmRpcmAsIGNhbGwgYGBvcy5zdGF0KGVudHJ5LnBhdGgpYGAgdG8gZmV0Y2gKKyAgIHVwLXRvLWRhdGUgaW5mb3JtYXRpb24uCisKKyAgIEJlY2F1c2UgdGhlIGBgRGlyRW50cnlgYCBtZXRob2RzIGNhbiBtYWtlIG9wZXJhdGluZyBzeXN0ZW0gY2FsbHMsIHRoZXkgbWF5CisgICBhbHNvIHJhaXNlIDpleGM6YE9TRXJyb3JgLiBGb3IgZXhhbXBsZSwgaWYgYSBmaWxlIGlzIGRlbGV0ZWQgYmV0d2VlbiBjYWxsaW5nCisgICA6ZnVuYzpgc2NhbmRpcmAgYW5kIGNhbGxpbmcgOmZ1bmM6YERpckVudHJ5LnN0YXRgLCBhCisgICA6ZXhjOmBGaWxlTm90Rm91bmRFcnJvcmAgZXhjZXB0aW9uIGNhbiBiZSByYWlzZWQuIFVuZm9ydHVuYXRlbHksIHRoZQorICAgYmVoYXZpb3VyIG9uIGVycm9ycyBkZXBlbmRzIG9uIHRoZSBwbGF0Zm9ybS4gSWYgeW91IG5lZWQgdmVyeSBmaW5lLWdyYWluZWQKKyAgIGNvbnRyb2wgb3ZlciBlcnJvcnMsIHlvdSBjYW4gY2F0Y2ggOmV4YzpgT1NFcnJvcmAgd2hlbiBjYWxsaW5nIG9uZSBvZiB0aGUKKyAgIGBgRGlyRW50cnlgYCBtZXRob2RzIGFuZCBoYW5kbGUgYXMgYXBwcm9wcmlhdGUuCisKKyAgIEF0dHJpYnV0ZXMgYW5kIG1ldGhvZHMgb24gYSBgYERpckVudHJ5YGAgaW5zdGFuY2UgYXJlIGFzIGZvbGxvd3M6CisKKyAgIC4uIGF0dHJpYnV0ZTo6IG5hbWUKKworICAgICAgVGhlIGVudHJ5J3MgYmFzZSBmaWxlbmFtZSwgcmVsYXRpdmUgdG8gdGhlIDpmdW5jOmBzY2FuZGlyYCAqcGF0aCoKKyAgICAgIGFyZ3VtZW50LgorCisgICAgICBUaGUgOmF0dHI6YG5hbWVgIHR5cGUgaXMgOmNsYXNzOmBzdHJgLiBPbiBQT1NJWCwgaXQgY2FuIGJlIG9mIHR5cGUKKyAgICAgIDpjbGFzczpgYnl0ZXNgIGlmIHRoZSB0eXBlIG9mIHRoZSA6ZnVuYzpgc2NhbmRpcmAgKnBhdGgqIGFyZ3VtZW50IGlzIGFsc28KKyAgICAgIDpjbGFzczpgYnl0ZXNgLiBVc2UgOmZ1bmM6YH5vcy5mc2RlY29kZWAgdG8gZGVjb2RlIHRoZSBuYW1lLgorCisgICAuLiBhdHRyaWJ1dGU6OiBwYXRoCisKKyAgICAgIFRoZSBlbnRyeSdzIGZ1bGwgcGF0aCBuYW1lOiBlcXVpdmFsZW50IHRvIGBgb3MucGF0aC5qb2luKHNjYW5kaXJfcGF0aCwKKyAgICAgIGVudHJ5Lm5hbWUpYGAgd2hlcmUgKnNjYW5kaXJfcGF0aCogaXMgdGhlIDpmdW5jOmBzY2FuZGlyYCAqcGF0aCoKKyAgICAgIGFyZ3VtZW50LiAgVGhlIHBhdGggaXMgb25seSBhYnNvbHV0ZSBpZiB0aGUgOmZ1bmM6YHNjYW5kaXJgICpwYXRoKgorICAgICAgYXJndW1lbnQgaXMgYWJzb2x1dGUuCisKKyAgICAgIFRoZSA6YXR0cjpgbmFtZWAgdHlwZSBpcyA6Y2xhc3M6YHN0cmAuIE9uIFBPU0lYLCBpdCBjYW4gYmUgb2YgdHlwZQorICAgICAgOmNsYXNzOmBieXRlc2AgaWYgdGhlIHR5cGUgb2YgdGhlIDpmdW5jOmBzY2FuZGlyYCAqcGF0aCogYXJndW1lbnQgaXMgYWxzbworICAgICAgOmNsYXNzOmBieXRlc2AuIFVzZSA6ZnVuYzpgfm9zLmZzZGVjb2RlYCB0byBkZWNvZGUgdGhlIHBhdGguCisKKyAgIC4uIG1ldGhvZDo6IGlub2RlKCkKKworICAgICAgUmV0dXJuIHRoZSBpbm9kZSBudW1iZXIgb2YgdGhlIGVudHJ5LgorCisgICAgICBUaGUgcmVzdWx0IGlzIGNhY2hlZCBpbiB0aGUgb2JqZWN0LCB1c2UgYGBvcy5zdGF0KGVudHJ5LnBhdGgsCisgICAgICBmb2xsb3dfc3ltbGlua3M9RmFsc2UpLnN0X2lub2BgIHRvIGZldGNoIHVwLXRvLWRhdGUgaW5mb3JtYXRpb24uCisKKyAgICAgIE9uIFBPU0lYLCBubyBzeXN0ZW0gY2FsbCBpcyByZXF1aXJlZC4KKworICAgLi4gbWV0aG9kOjogaXNfZGlyKFwqLCBmb2xsb3dfc3ltbGlua3M9VHJ1ZSkKKworICAgICAgSWYgKmZvbGxvd19zeW1saW5rcyogaXMgYGBUcnVlYGAgKHRoZSBkZWZhdWx0KSwgcmV0dXJuIGBgVHJ1ZWBgIGlmIHRoZQorICAgICAgZW50cnkgaXMgYSBkaXJlY3Rvcnkgb3IgYSBzeW1ib2xpYyBsaW5rIHBvaW50aW5nIHRvIGEgZGlyZWN0b3J5LAorICAgICAgcmV0dXJuIGBgRmFsc2VgYCBpZiBpdCBwb2ludHMgdG8gYW5vdGhlciBraW5kIG9mIGZpbGUsIGlmIGl0IGRvZXNuJ3QKKyAgICAgIGV4aXN0IGFueW1vcmUgb3IgaWYgaXQgaXMgYSBicm9rZW4gc3ltYm9saWMgbGluay4KKworICAgICAgSWYgKmZvbGxvd19zeW1saW5rcyogaXMgYGBGYWxzZWBgLCByZXR1cm4gYGBUcnVlYGAgb25seSBpZiB0aGlzIGVudHJ5CisgICAgICBpcyBhIGRpcmVjdG9yeSwgcmV0dXJuIGBgRmFsc2VgYCBpZiBpdCBwb2ludHMgdG8gYSBzeW1ib2xpYyBsaW5rIG9yCisgICAgICBhbm90aGVyIGtpbmQgb2YgZmlsZSwgaWYgdGhlIGVudHJ5IGRvZXNuJ3QgZXhpc3QgYW55bW9yZSBvciBpZiBpdCBpcyBhCisgICAgICBicm9rZW4gc3ltYm9saWMgbGluaworCisgICAgICBUaGUgcmVzdWx0IGlzIGNhY2hlZCBpbiB0aGUgb2JqZWN0LiBDYWxsIDpmdW5jOmBzdGF0LlNfSVNESVJgIHdpdGgKKyAgICAgIDpmdW5jOmBvcy5zdGF0YCB0byBmZXRjaCB1cC10by1kYXRlIGluZm9ybWF0aW9uLgorCisgICAgICBUaGUgbWV0aG9kIGNhbiByYWlzZSA6ZXhjOmBPU0Vycm9yYCwgc3VjaCBhcyA6ZXhjOmBQZXJtaXNzaW9uRXJyb3JgLAorICAgICAgYnV0IDpleGM6YEZpbGVOb3RGb3VuZEVycm9yYCBpcyBjYXRjaGVkLgorCisgICAgICBJbiBtb3N0IGNhc2VzLCBubyBzeXN0ZW0gY2FsbCBpcyByZXF1aXJlZC4KKworICAgLi4gbWV0aG9kOjogaXNfZmlsZShcKiwgZm9sbG93X3N5bWxpbmtzPVRydWUpCisKKyAgICAgIElmICpmb2xsb3dfc3ltbGlua3MqIGlzIGBgVHJ1ZWBgICh0aGUgZGVmYXVsdCksIHJldHVybiBgYFRydWVgYCBpZiB0aGUKKyAgICAgIGVudHJ5IGlzIGEgcmVndWxhciBmaWxlIG9yIGEgc3ltYm9saWMgbGluayBwb2ludGluZyB0byBhIHJlZ3VsYXIgZmlsZSwKKyAgICAgIHJldHVybiBgYEZhbHNlYGAgaWYgaXQgcG9pbnRzIHRvIGFub3RoZXIga2luZCBvZiBmaWxlLCBpZiBpdCBkb2Vzbid0CisgICAgICBleGlzdCBhbnltb3JlIG9yIGlmIGl0IGlzIGEgYnJva2VuIHN5bWJvbGljIGxpbmsuCisKKyAgICAgIElmICpmb2xsb3dfc3ltbGlua3MqIGlzIGBgRmFsc2VgYCwgcmV0dXJuIGBgVHJ1ZWBgIG9ubHkgaWYgdGhpcyBlbnRyeQorICAgICAgaXMgYSByZWd1bGFyIGZpbGUsIHJldHVybiBgYEZhbHNlYGAgaWYgaXQgcG9pbnRzIHRvIGEgc3ltYm9saWMgbGluayBvcgorICAgICAgYW5vdGhlciBraW5kIG9mIGZpbGUsIGlmIGl0IGRvZXNuJ3QgZXhpc3QgYW55bW9yZSBvciBpZiBpdCBpcyBhIGJyb2tlbgorICAgICAgc3ltYm9saWMgbGluay4KKworICAgICAgVGhlIHJlc3VsdCBpcyBjYWNoZWQgaW4gdGhlIG9iamVjdC4gQ2FsbCA6ZnVuYzpgc3RhdC5TX0lTUkVHYCB3aXRoCisgICAgICA6ZnVuYzpgb3Muc3RhdGAgdG8gZmV0Y2ggdXAtdG8tZGF0ZSBpbmZvcm1hdGlvbi4KKworICAgICAgVGhlIG1ldGhvZCBjYW4gcmFpc2UgOmV4YzpgT1NFcnJvcmAsIHN1Y2ggYXMgOmV4YzpgUGVybWlzc2lvbkVycm9yYCwKKyAgICAgIGJ1dCA6ZXhjOmBGaWxlTm90Rm91bmRFcnJvcmAgaXMgY2F0Y2hlZC4KKworICAgICAgSW4gbW9zdCBjYXNlcywgbm8gc3lzdGVtIGNhbGwgaXMgcmVxdWlyZWQuCisKKyAgIC4uIG1ldGhvZDo6IGlzX3N5bWxpbmsoKQorCisgICAgICBSZXR1cm4gYGBUcnVlYGAgaWYgdGhpcyBlbnRyeSBpcyBhIHN5bWJvbGljIGxpbmsgb3IgYSBicm9rZW4gc3ltYm9saWMKKyAgICAgIGxpbmssIHJldHVybiBgYEZhbHNlYGAgaWYgaXQgcG9pbnRzIHRvIGEgYW5vdGhlciBraW5kIG9mIGZpbGUgb3IgaWYgdGhlCisgICAgICBlbnRyeSBkb2Vzbid0IGV4aXN0IGFueW1vcmUuCisKKyAgICAgIFRoZSByZXN1bHQgaXMgY2FjaGVkIGluIHRoZSBvYmplY3QuIENhbGwgOmZ1bmM6YG9zLnBhdGguaXNsaW5rYCB0byBmZXRjaAorICAgICAgdXAtdG8tZGF0ZSBpbmZvcm1hdGlvbi4KKworICAgICAgVGhlIG1ldGhvZCBjYW4gcmFpc2UgOmV4YzpgT1NFcnJvcmAsIHN1Y2ggYXMgOmV4YzpgUGVybWlzc2lvbkVycm9yYCwKKyAgICAgIGJ1dCA6ZXhjOmBGaWxlTm90Rm91bmRFcnJvcmAgaXMgY2F0Y2hlZC4KKworICAgICAgSW4gbW9zdCBjYXNlcywgbm8gc3lzdGVtIGNhbGwgaXMgcmVxdWlyZWQuCisKKyAgIC4uIG1ldGhvZDo6IHN0YXQoXCosIGZvbGxvd19zeW1saW5rcz1UcnVlKQorCisgICAgICBSZXR1cm4gYSA6Y2xhc3M6YHN0YXRfcmVzdWx0YCBvYmplY3QgZm9yIHRoaXMgZW50cnkuIFRoaXMgZnVuY3Rpb24KKyAgICAgIG5vcm1hbGx5IGZvbGxvd3Mgc3ltYm9saWMgbGlua3M7IHRvIHN0YXQgYSBzeW1ib2xpYyBsaW5rIGFkZCB0aGUKKyAgICAgIGFyZ3VtZW50IGBgZm9sbG93X3N5bWxpbmtzPUZhbHNlYGAuCisKKyAgICAgIE9uIFdpbmRvd3MsIHRoZSBgYHN0X2lub2BgLCBgYHN0X2RldmBgIGFuZCBgYHN0X25saW5rYGAgYXR0cmlidXRlcyBvZiB0aGUKKyAgICAgIDpjbGFzczpgc3RhdF9yZXN1bHRgIGFyZSBhbHdheXMgc2V0IHRvIHplcm8uIENhbGwgOmZ1bmM6YG9zLnN0YXRgIHRvCisgICAgICBnZXQgdGhlc2UgYXR0cmlidXRlcy4KKworICAgICAgVGhlIHJlc3VsdCBpcyBjYWNoZWQgaW4gdGhlIG9iamVjdC4gQ2FsbCA6ZnVuYzpgb3Muc3RhdGAgdG8gZmV0Y2gKKyAgICAgIHVwLXRvLWRhdGUgaW5mb3JtYXRpb24uCisKKyAgICAgIE9uIFdpbmRvd3MsIGBgRGlyRW50cnkuc3RhdChmb2xsb3dfc3ltbGlua3M9RmFsc2UpYGAgZG9lc24ndCByZXF1aXJlIGEKKyAgICAgIHN5c3RlbSBjYWxsLiBgYERpckVudHJ5LnN0YXQoKWBgIHJlcXVpcmVzIGEgc3lzdGVtIGNhbGwgaWYgdGhlIGVudHJ5IGlzIGEKKyAgICAgIHN5bWJvbGljIGxpbmsuCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNQorCisKIC4uIGZ1bmN0aW9uOjogc3RhdChwYXRoLCBcKiwgZGlyX2ZkPU5vbmUsIGZvbGxvd19zeW1saW5rcz1UcnVlKQogCiAgICBHZXQgdGhlIHN0YXR1cyBvZiBhIGZpbGUgb3IgYSBmaWxlIGRlc2NyaXB0b3IuIFBlcmZvcm0gdGhlIGVxdWl2YWxlbnQgb2YgYQpAQCAtMjE5NSw3ICsyMzcyLDggQEAKICAgIGNvbnRhaW4gOmZ1bmM6YG9zLmFjY2Vzc2AsIG90aGVyd2lzZSBpdCB3aWxsIGJlIGVtcHR5LgogCiAgICBUbyBjaGVjayB3aGV0aGVyIHlvdSBjYW4gdXNlIHRoZSAqZWZmZWN0aXZlX2lkcyogcGFyYW1ldGVyIGZvcgotICAgOmZ1bmM6YG9zLmFjY2Vzc2AsIHVzZSB0aGUgYGBpbmBgIG9wZXJhdG9yIG9uIGBgc3VwcG9ydHNfZGlyX2ZkYGAsIGxpa2Ugc286OgorICAgOmZ1bmM6YG9zLmFjY2Vzc2AsIHVzZSB0aGUgYGBpbmBgIG9wZXJhdG9yIG9uIGBgc3VwcG9ydHNfZWZmZWN0aXZlX2lkc2BgLAorICAgbGlrZSBzbzo6CiAKICAgICAgICBvcy5hY2Nlc3MgaW4gb3Muc3VwcG9ydHNfZWZmZWN0aXZlX2lkcwogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9vdGhlcmd1aS5yc3QgYi9Eb2MvbGlicmFyeS9vdGhlcmd1aS5yc3QKaW5kZXggZWZiN2NmZi4uNDM3MjFiMiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvb3RoZXJndWkucnN0CisrKyBiL0RvYy9saWJyYXJ5L290aGVyZ3VpLnJzdApAQCAtNTAsNyArNTAsNyBAQAogICAgICAgbG93LWxldmVsIGRldmljZSBjb250ZXh0IGRyYXdpbmcsIGRyYWcgYW5kIGRyb3AsIHN5c3RlbSBjbGlwYm9hcmQgYWNjZXNzLAogICAgICAgYW4gWE1MLWJhc2VkIHJlc291cmNlIGZvcm1hdCBhbmQgbW9yZSwgaW5jbHVkaW5nIGFuIGV2ZXIgZ3Jvd2luZyBsaWJyYXJ5CiAgICAgICBvZiB1c2VyLWNvbnRyaWJ1dGVkIG1vZHVsZXMuICB3eFB5dGhvbiBoYXMgYSBib29rLCBgd3hQeXRob24gaW4gQWN0aW9uCi0gICAgICA8aHR0cDovL3d3dy5hbWF6b24uY29tL2V4ZWMvb2JpZG9zL0FTSU4vMTkzMjM5NDYyMT5gXywgYnkgTm9lbCBSYXBwaW4gYW5kCisgICAgICA8aHR0cDovL3d3dy5tYW5uaW5nLmNvbS9yYXBwaW4vPmBfLCBieSBOb2VsIFJhcHBpbiBhbmQKICAgICAgIFJvYmluIER1bm4uCiAKIFB5R1RLLCBQeVF0LCBhbmQgd3hQeXRob24sIGFsbCBoYXZlIGEgbW9kZXJuIGxvb2sgYW5kIGZlZWwgYW5kIG1vcmUKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3JlLnJzdCBiL0RvYy9saWJyYXJ5L3JlLnJzdAppbmRleCA4ZTIwNDk2Li4wZDMwNWQ1IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9yZS5yc3QKKysrIGIvRG9jL2xpYnJhcnkvcmUucnN0CkBAIC0yOTcsNiArMjk3LDkgQEAKICAgICAgID4+PiBtLmdyb3VwKDApCiAgICAgICAnZWdnJwogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDogMy41CisgICAgICBBZGRlZCBzdXBwb3J0IGZvciBncm91cCByZWZlcmVuY2VzIG9mIGZpeGVkIGxlbmd0aC4KKwogYGAoPzwhLi4uKWBgCiAgICBNYXRjaGVzIGlmIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBzdHJpbmcgaXMgbm90IHByZWNlZGVkIGJ5IGEgbWF0Y2ggZm9yCiAgICBgYC4uLmBgLiAgVGhpcyBpcyBjYWxsZWQgYSA6ZGZuOmBuZWdhdGl2ZSBsb29rYmVoaW5kIGFzc2VydGlvbmAuICBTaW1pbGFyIHRvCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9zc2wucnN0IGIvRG9jL2xpYnJhcnkvc3NsLnJzdAppbmRleCBlN2NmNDI1Li43ODQ2Y2FkIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9zc2wucnN0CisrKyBiL0RvYy9saWJyYXJ5L3NzbC5yc3QKQEAgLTM0NCwxMCArMzQ0LDkgQEAKICAgIFZlcmlmeSB0aGF0ICpjZXJ0KiAoaW4gZGVjb2RlZCBmb3JtYXQgYXMgcmV0dXJuZWQgYnkKICAgIDptZXRoOmBTU0xTb2NrZXQuZ2V0cGVlcmNlcnRgKSBtYXRjaGVzIHRoZSBnaXZlbiAqaG9zdG5hbWUqLiAgVGhlIHJ1bGVzCiAgICBhcHBsaWVkIGFyZSB0aG9zZSBmb3IgY2hlY2tpbmcgdGhlIGlkZW50aXR5IG9mIEhUVFBTIHNlcnZlcnMgYXMgb3V0bGluZWQKLSAgIGluIDpyZmM6YDI4MThgIGFuZCA6cmZjOmA2MTI1YCwgZXhjZXB0IHRoYXQgSVAgYWRkcmVzc2VzIGFyZSBub3QgY3VycmVudGx5Ci0gICBzdXBwb3J0ZWQuIEluIGFkZGl0aW9uIHRvIEhUVFBTLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBzdWl0YWJsZSBmb3IKLSAgIGNoZWNraW5nIHRoZSBpZGVudGl0eSBvZiBzZXJ2ZXJzIGluIHZhcmlvdXMgU1NMLWJhc2VkIHByb3RvY29scyBzdWNoIGFzCi0gICBGVFBTLCBJTUFQUywgUE9QUyBhbmQgb3RoZXJzLgorICAgaW4gOnJmYzpgMjgxOGAgYW5kIDpyZmM6YDYxMjVgLiAgSW4gYWRkaXRpb24gdG8gSFRUUFMsIHRoaXMgZnVuY3Rpb24KKyAgIHNob3VsZCBiZSBzdWl0YWJsZSBmb3IgY2hlY2tpbmcgdGhlIGlkZW50aXR5IG9mIHNlcnZlcnMgaW4gdmFyaW91cworICAgU1NMLWJhc2VkIHByb3RvY29scyBzdWNoIGFzIEZUUFMsIElNQVBTLCBQT1BTIGFuZCBvdGhlcnMuCiAKICAgIDpleGM6YENlcnRpZmljYXRlRXJyb3JgIGlzIHJhaXNlZCBvbiBmYWlsdXJlLiBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24KICAgIHJldHVybnMgbm90aGluZzo6CkBAIC0zNjksNiArMzY4LDEwIEBACiAgICAgICBJRE4gQS1sYWJlbHMgc3VjaCBhcyBgYHd3dyoueG4tLXB0aG9uLWt2YS5vcmdgYCBhcmUgc3RpbGwgc3VwcG9ydGVkLAogICAgICAgYnV0IGBgeCoucHl0aG9uLm9yZ2BgIG5vIGxvbmdlciBtYXRjaGVzIGBgeG4tLXRkYS5weXRob24ub3JnYGAuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy41CisgICAgICBNYXRjaGluZyBvZiBJUCBhZGRyZXNzZXMsIHdoZW4gcHJlc2VudCBpbiB0aGUgc3ViamVjdEFsdE5hbWUgZmllbGQKKyAgICAgIG9mIHRoZSBjZXJ0aWZpY2F0ZSwgaXMgbm93IHN1cHBvcnRlZC4KKwogLi4gZnVuY3Rpb246OiBjZXJ0X3RpbWVfdG9fc2Vjb25kcyhjZXJ0X3RpbWUpCiAKICAgIFJldHVybiB0aGUgdGltZSBpbiBzZWNvbmRzIHNpbmNlIHRoZSBFcG9jaCwgZ2l2ZW4gdGhlIGBgY2VydF90aW1lYGAKQEAgLTUxNyw5ICs1MjAsOSBAQAogCiAuLiBkYXRhOjogVkVSSUZZX0RFRkFVTFQKIAotICAgUG9zc2libGUgdmFsdWUgZm9yIDphdHRyOmBTU0xDb250ZXh0LnZlcmlmeV9mbGFnc2AuIEluIHRoaXMgbW9kZSwKLSAgIGNlcnRpZmljYXRlIHJldm9jYXRpb24gbGlzdHMgKENSTHMpIGFyZSBub3QgY2hlY2tlZC4gQnkgZGVmYXVsdCBPcGVuU1NMCi0gICBkb2VzIG5laXRoZXIgcmVxdWlyZSBub3IgdmVyaWZ5IENSTHMuCisgICBQb3NzaWJsZSB2YWx1ZSBmb3IgOmF0dHI6YFNTTENvbnRleHQudmVyaWZ5X2ZsYWdzYC4gSW4gdGhpcyBtb2RlLCBjZXJ0aWZpY2F0ZQorICAgcmV2b2NhdGlvbiBsaXN0cyAoQ1JMcykgYXJlIG5vdCBjaGVja2VkLiBCeSBkZWZhdWx0IE9wZW5TU0wgZG9lcyBuZWl0aGVyCisgICByZXF1aXJlIG5vciB2ZXJpZnkgQ1JMcy4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMy40CiAKQEAgLTU0Nyw2ICs1NTAsMTQgQEAKIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMy40CiAKKy4uIGRhdGE6OiBWRVJJRllfWDUwOV9UUlVTVEVEX0ZJUlNUCisKKyAgIFBvc3NpYmxlIHZhbHVlIGZvciA6YXR0cjpgU1NMQ29udGV4dC52ZXJpZnlfZmxhZ3NgLiBJdCBpbnN0cnVjdHMgT3BlblNTTCB0bworICAgcHJlZmVyIHRydXN0ZWQgY2VydGlmaWNhdGVzIHdoZW4gYnVpbGRpbmcgdGhlIHRydXN0IGNoYWluIHRvIHZhbGlkYXRlIGEKKyAgIGNlcnRpZmljYXRlLiBUaGlzIGZsYWcgaXMgZW5hYmxlZCBieSBkZWZhdWx0LgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjQuNQorCiAuLiBkYXRhOjogUFJPVE9DT0xfU1NMdjIzCiAKICAgIFNlbGVjdHMgdGhlIGhpZ2hlc3QgcHJvdG9jb2wgdmVyc2lvbiB0aGF0IGJvdGggdGhlIGNsaWVudCBhbmQgc2VydmVyIHN1cHBvcnQuCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9zdGR0eXBlcy5yc3QgYi9Eb2MvbGlicmFyeS9zdGR0eXBlcy5yc3QKaW5kZXggNTVmNTM1MS4uZjc5YzQxNiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvc3RkdHlwZXMucnN0CisrKyBiL0RvYy9saWJyYXJ5L3N0ZHR5cGVzLnJzdApAQCAtMjg4MCw4ICsyODgwLDggQEAKIC4uIG1ldGhvZDo6IGJ5dGVzLmlzdXBwZXIoKQogICAgICAgICAgICAgYnl0ZWFycmF5LmlzdXBwZXIoKQogCi0gICBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgbG93ZXJjYXNlIGFscGhhYmV0aWMgQVNDSUkgY2hhcmFjdGVyCi0gICBpbiB0aGUgc2VxdWVuY2UgYW5kIG5vIHVwcGVyY2FzZSBBU0NJSSBjaGFyYWN0ZXJzLCBmYWxzZSBvdGhlcndpc2UuCisgICBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgdXBwZXJjYXNlIGFscGhhYmV0aWMgQVNDSUkgY2hhcmFjdGVyCisgICBpbiB0aGUgc2VxdWVuY2UgYW5kIG5vIGxvd2VyY2FzZSBBU0NJSSBjaGFyYWN0ZXJzLCBmYWxzZSBvdGhlcndpc2UuCiAKICAgIEZvciBleGFtcGxlOjoKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvdGFyZmlsZS5yc3QgYi9Eb2MvbGlicmFyeS90YXJmaWxlLnJzdAppbmRleCBmZTJlZDk5Li40ZmQ5NGZkIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS90YXJmaWxlLnJzdAorKysgYi9Eb2MvbGlicmFyeS90YXJmaWxlLnJzdApAQCAtNjIsNiArNjIsMjMgQEAKICAgICstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICAgfCBgYCdyOnh6J2BgICAgICAgIHwgT3BlbiBmb3IgcmVhZGluZyB3aXRoIGx6bWEgY29tcHJlc3Npb24uICAgICB8CiAgICArLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgIHwgYGAneCdgYCBvciAgICAgICB8IENyZWF0ZSBhIHRhcmZpbGUgZXhjbHVzaXZlbHkgd2l0aG91dCAgICAgICAgfAorICAgfCBgYCd4OidgYCAgICAgICAgIHwgY29tcHJlc3Npb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICB8ICAgICAgICAgICAgICAgICAgfCBSYWlzZSBhbiA6ZXhjOmBGaWxlRXhpc3RzRXJyb3JgIGV4Y2VwdGlvbiAgIHwKKyAgIHwgICAgICAgICAgICAgICAgICB8IGlmIGl0IGlzIGFscmVhZHkgZXhpc3RzLiAgICAgICAgICAgICAgICAgICAgfAorICAgKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICB8IGBgJ3g6Z3onYGAgICAgICAgfCBDcmVhdGUgYSB0YXJmaWxlIHdpdGggZ3ppcCBjb21wcmVzc2lvbi4gICAgIHwKKyAgIHwgICAgICAgICAgICAgICAgICB8IFJhaXNlIGFuIDpleGM6YEZpbGVFeGlzdHNFcnJvcmAgZXhjZXB0aW9uICAgfAorICAgfCAgICAgICAgICAgICAgICAgIHwgaWYgaXQgaXMgYWxyZWFkeSBleGlzdHMuICAgICAgICAgICAgICAgICAgICB8CisgICArLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgIHwgYGAneDpiejInYGAgICAgICB8IENyZWF0ZSBhIHRhcmZpbGUgd2l0aCBiemlwMiBjb21wcmVzc2lvbi4gICAgfAorICAgfCAgICAgICAgICAgICAgICAgIHwgUmFpc2UgYW4gOmV4YzpgRmlsZUV4aXN0c0Vycm9yYCBleGNlcHRpb24gICB8CisgICB8ICAgICAgICAgICAgICAgICAgfCBpZiBpdCBpcyBhbHJlYWR5IGV4aXN0cy4gICAgICAgICAgICAgICAgICAgIHwKKyAgICstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgfCBgYCd4Onh6J2BgICAgICAgIHwgQ3JlYXRlIGEgdGFyZmlsZSB3aXRoIGx6bWEgY29tcHJlc3Npb24uICAgICB8CisgICB8ICAgICAgICAgICAgICAgICAgfCBSYWlzZSBhbiA6ZXhjOmBGaWxlRXhpc3RzRXJyb3JgIGV4Y2VwdGlvbiAgIHwKKyAgIHwgICAgICAgICAgICAgICAgICB8IGlmIGl0IGlzIGFscmVhZHkgZXhpc3RzLiAgICAgICAgICAgICAgICAgICAgfAorICAgKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgICB8IGBgJ2EnIG9yICdhOidgYCAgfCBPcGVuIGZvciBhcHBlbmRpbmcgd2l0aCBubyBjb21wcmVzc2lvbi4gVGhlIHwKICAgIHwgICAgICAgICAgICAgICAgICB8IGZpbGUgaXMgY3JlYXRlZCBpZiBpdCBkb2VzIG5vdCBleGlzdC4gICAgICAgfAogICAgKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCkBAIC04Miw5ICs5OSw5IEBACiAgICBJZiAqZmlsZW9iaiogaXMgc3BlY2lmaWVkLCBpdCBpcyB1c2VkIGFzIGFuIGFsdGVybmF0aXZlIHRvIGEgOnRlcm06YGZpbGUgb2JqZWN0YAogICAgb3BlbmVkIGluIGJpbmFyeSBtb2RlIGZvciAqbmFtZSouIEl0IGlzIHN1cHBvc2VkIHRvIGJlIGF0IHBvc2l0aW9uIDAuCiAKLSAgIEZvciBtb2RlcyBgYCd3Omd6J2BgLCBgYCdyOmd6J2BgLCBgYCd3OmJ6MidgYCwgYGAncjpiejInYGAsIDpmdW5jOmB0YXJmaWxlLm9wZW5gCi0gICBhY2NlcHRzIHRoZSBrZXl3b3JkIGFyZ3VtZW50ICpjb21wcmVzc2xldmVsKiB0byBzcGVjaWZ5IHRoZSBjb21wcmVzc2lvbiBsZXZlbCBvZgotICAgdGhlIGZpbGUuCisgICBGb3IgbW9kZXMgYGAndzpneidgYCwgYGAncjpneidgYCwgYGAndzpiejInYGAsIGBgJ3I6YnoyJ2BgLCBgYCd4Omd6J2BgLAorICAgYGAneDpiejInYGAsIDpmdW5jOmB0YXJmaWxlLm9wZW5gIGFjY2VwdHMgdGhlIGtleXdvcmQgYXJndW1lbnQKKyAgICpjb21wcmVzc2xldmVsKiB0byBzcGVjaWZ5IHRoZSBjb21wcmVzc2lvbiBsZXZlbCBvZiB0aGUgZmlsZS4KIAogICAgRm9yIHNwZWNpYWwgcHVycG9zZXMsIHRoZXJlIGlzIGEgc2Vjb25kIGZvcm1hdCBmb3IgKm1vZGUqOgogICAgYGAnZmlsZW1vZGV8W2NvbXByZXNzaW9uXSdgYC4gIDpmdW5jOmB0YXJmaWxlLm9wZW5gIHdpbGwgcmV0dXJuIGEgOmNsYXNzOmBUYXJGaWxlYApAQCAtMTI3LDYgKzE0NCw4IEBACiAgICB8ICAgICAgICAgICAgIHwgd3JpdGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgICstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNQorICAgICAgVGhlIGBgJ3gnYGAgKGV4Y2x1c2l2ZSBjcmVhdGlvbikgbW9kZSB3YXMgYWRkZWQuCiAKIC4uIGNsYXNzOjogVGFyRmlsZQogCkBAIC0yNTIsOCArMjcxLDggQEAKICAgIEluIHRoaXMgY2FzZSwgdGhlIGZpbGUgb2JqZWN0J3MgOmF0dHI6YG5hbWVgIGF0dHJpYnV0ZSBpcyB1c2VkIGlmIGl0IGV4aXN0cy4KIAogICAgKm1vZGUqIGlzIGVpdGhlciBgYCdyJ2BgIHRvIHJlYWQgZnJvbSBhbiBleGlzdGluZyBhcmNoaXZlLCBgYCdhJ2BgIHRvIGFwcGVuZAotICAgZGF0YSB0byBhbiBleGlzdGluZyBmaWxlIG9yIGBgJ3cnYGAgdG8gY3JlYXRlIGEgbmV3IGZpbGUgb3ZlcndyaXRpbmcgYW4gZXhpc3RpbmcKLSAgIG9uZS4KKyAgIGRhdGEgdG8gYW4gZXhpc3RpbmcgZmlsZSwgYGAndydgYCB0byBjcmVhdGUgYSBuZXcgZmlsZSBvdmVyd3JpdGluZyBhbiBleGlzdGluZworICAgb25lIG9yIGBgJ3gnYGAgdG8gY3JlYXRlIGEgbmV3IGZpbGUgb25seSBpZiBpdCdzIG5vdCBleGlzdHMuCiAKICAgIElmICpmaWxlb2JqKiBpcyBnaXZlbiwgaXQgaXMgdXNlZCBmb3IgcmVhZGluZyBvciB3cml0aW5nIGRhdGEuIElmIGl0IGNhbiBiZQogICAgZGV0ZXJtaW5lZCwgKm1vZGUqIGlzIG92ZXJyaWRkZW4gYnkgKmZpbGVvYmoqJ3MgbW9kZS4gKmZpbGVvYmoqIHdpbGwgYmUgdXNlZApAQCAtMjkyLDEyICszMTEsMTQgQEAKICAgIHRvIGJlIGhhbmRsZWQuIFRoZSBkZWZhdWx0IHNldHRpbmdzIHdpbGwgd29yayBmb3IgbW9zdCB1c2Vycy4KICAgIFNlZSBzZWN0aW9uIDpyZWY6YHRhci11bmljb2RlYCBmb3IgaW4tZGVwdGggaW5mb3JtYXRpb24uCiAKLSAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy4yCi0gICAgICBVc2UgYGAnc3Vycm9nYXRlZXNjYXBlJ2BgIGFzIHRoZSBkZWZhdWx0IGZvciB0aGUgKmVycm9ycyogYXJndW1lbnQuCi0KICAgIFRoZSAqcGF4X2hlYWRlcnMqIGFyZ3VtZW50IGlzIGFuIG9wdGlvbmFsIGRpY3Rpb25hcnkgb2Ygc3RyaW5ncyB3aGljaAogICAgd2lsbCBiZSBhZGRlZCBhcyBhIHBheCBnbG9iYWwgaGVhZGVyIGlmICpmb3JtYXQqIGlzIDpjb25zdDpgUEFYX0ZPUk1BVGAuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy4yCisgICAgICBVc2UgYGAnc3Vycm9nYXRlZXNjYXBlJ2BgIGFzIHRoZSBkZWZhdWx0IGZvciB0aGUgKmVycm9ycyogYXJndW1lbnQuCisKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy41CisgICAgICBUaGUgYGAneCdgYCAoZXhjbHVzaXZlIGNyZWF0aW9uKSBtb2RlIHdhcyBhZGRlZC4KIAogLi4gY2xhc3NtZXRob2Q6OiBUYXJGaWxlLm9wZW4oLi4uKQogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS90a2ludGVyLnJzdCBiL0RvYy9saWJyYXJ5L3RraW50ZXIucnN0CmluZGV4IDQwZTk3YmYuLjNiNmM2ODEgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3RraW50ZXIucnN0CisrKyBiL0RvYy9saWJyYXJ5L3RraW50ZXIucnN0CkBAIC0zMSwxMyArMzEsMTMgQEAKICAgIGBUY2wvVGsgbWFudWFsIDxodHRwOi8vd3d3LnRjbC50ay9tYW4vdGNsOC41Lz5gXwogICAgICAgT2ZmaWNpYWwgbWFudWFsIGZvciB0aGUgbGF0ZXN0IHRjbC90ayB2ZXJzaW9uLgogCi0gICBgUHJvZ3JhbW1pbmcgUHl0aG9uIDxodHRwOi8vd3d3LmFtYXpvbi5jb20vUHJvZ3JhbW1pbmctUHl0aG9uLU1hcmstTHV0ei9kcC8wNTk2MTU4MTA2Lz5gXworICAgYFByb2dyYW1taW5nIFB5dGhvbiA8aHR0cDovL3d3dy5ybWkubmV0L35sdXR6L2Fib3V0LXBwNGUuaHRtbD5gXwogICAgICAgQm9vayBieSBNYXJrIEx1dHosIGhhcyBleGNlbGxlbnQgY292ZXJhZ2Ugb2YgVGtpbnRlci4KIAogICAgYE1vZGVybiBUa2ludGVyIGZvciBCdXN5IFB5dGhvbiBEZXZlbG9wZXJzIDxodHRwOi8vd3d3LmFtYXpvbi5jb20vTW9kZXJuLVRraW50ZXItUHl0aG9uLURldmVsb3BlcnMtZWJvb2svZHAvQjAwNzFRRE5MTy8+YF8KICAgICAgIEJvb2sgYnkgTWFyayBSb3plcm1hbiBhYm91dCBidWlsZGluZyBhdHRyYWN0aXZlIGFuZCBtb2Rlcm4gZ3JhcGhpY2FsIHVzZXIgaW50ZXJmYWNlcyB3aXRoIFB5dGhvbiBhbmQgVGtpbnRlci4KIAotICAgYFB5dGhvbiBhbmQgVGtpbnRlciBQcm9ncmFtbWluZyA8aHR0cDovL3d3dy5hbWF6b24uY29tL2V4ZWMvb2JpZG9zL0FTSU4vMTg4NDc3NzgxMz5gXworICAgYFB5dGhvbiBhbmQgVGtpbnRlciBQcm9ncmFtbWluZyA8aHR0cDovL3d3dy5tYW5uaW5nLmNvbS9ncmF5c29uLz5gXwogICAgICAgVGhlIGJvb2sgYnkgSm9obiBHcmF5c29uIChJU0JOIDEtODg0Nzc3LTgxLTMpLgogCiAKQEAgLTE4Miw3ICsxODIsNyBAQAogICAgYFRjbCBhbmQgdGhlIFRrIFRvb2xraXQgPGh0dHA6Ly93d3cuYW1hem9uLmNvbS9leGVjL29iaWRvcy9BU0lOLzAyMDE2MzMzN1g+YF8KICAgICAgIFRoZSBib29rIGJ5IEpvaG4gT3VzdGVyaG91dCwgdGhlIGludmVudG9yIG9mIFRjbC4KIAotICAgYFByYWN0aWNhbCBQcm9ncmFtbWluZyBpbiBUY2wgYW5kIFRrIDxodHRwOi8vd3d3LmFtYXpvbi5jb20vZXhlYy9vYmlkb3MvQVNJTi8wMTMwMjIwMjgwPmBfCisgICBgUHJhY3RpY2FsIFByb2dyYW1taW5nIGluIFRjbCBhbmQgVGsgPGh0dHA6Ly93d3cuYmVlZHViLmNvbS9ib29rLz5gXwogICAgICAgQnJlbnQgV2VsY2gncyBlbmN5Y2xvcGVkaWMgYm9vay4KIAogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS90cmFjZWJhY2sucnN0IGIvRG9jL2xpYnJhcnkvdHJhY2ViYWNrLnJzdAppbmRleCAxNWZiZWRjLi5jNmI1ZDBjIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS90cmFjZWJhY2sucnN0CisrKyBiL0RvYy9saWJyYXJ5L3RyYWNlYmFjay5yc3QKQEAgLTEzNiw2ICsxMzYsMTYyIEBACiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNAogCisuLiBmdW5jdGlvbjo6IHdhbGtfc3RhY2soZikKKworICAgV2FsayBhIHN0YWNrIGZvbGxvd2luZyBgYGYuZl9iYWNrYGAgZnJvbSB0aGUgZ2l2ZW4gZnJhbWUsIHlpZWxkaW5nIHRoZSBmcmFtZQorICAgYW5kIGxpbmUgbnVtYmVyIGZvciBlYWNoIGZyYW1lLiBJZiAqZiogaXMgYGBOb25lYGAsIHRoZSBjdXJyZW50IHN0YWNrIGlzCisgICB1c2VkLiBUaGlzIGhlbHBlciBpcyB1c2VkIHdpdGggOm1ldGg6YFN0YWNrU3VtbWFyeS5leHRyYWN0YC4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy41CisKKy4uIGZ1bmN0aW9uOjogd2Fsa190Yih0YikKKworICAgV2FsayBhIHRyYWNlYmFjayBmb2xsb3dpbmcgYGB0Yl9uZXh0YGAgeWllbGRpbmcgdGhlIGZyYW1lIGFuZCBsaW5lIG51bWJlcgorICAgZm9yIGVhY2ggZnJhbWUuIFRoaXMgaGVscGVyIGlzIHVzZWQgd2l0aCA6bWV0aDpgU3RhY2tTdW1tYXJ5LmV4dHJhY3RgLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjUKKworVGhlIG1vZHVsZSBhbHNvIGRlZmluZXMgdGhlIGZvbGxvd2luZyBjbGFzc2VzOgorCis6Y2xhc3M6YFRyYWNlYmFja0V4Y2VwdGlvbmAgT2JqZWN0cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLi4gdmVyc2lvbmFkZGVkOjogMy41CisKKzpjbGFzczpgVHJhY2ViYWNrRXhjZXB0aW9uYCBvYmplY3RzIGFyZSBjcmVhdGVkIGZyb20gYWN0dWFsIGV4Y2VwdGlvbnMgdG8KK2NhcHR1cmUgZGF0YSBmb3IgbGF0ZXIgcHJpbnRpbmcgaW4gYSBsaWdodHdlaWdodCBmYXNoaW9uLgorCisuLiBjbGFzczo6IFRyYWNlYmFja0V4Y2VwdGlvbihleGNfdHlwZSwgZXhjX3ZhbHVlLCBleGNfdHJhY2ViYWNrLCAqLCBsaW1pdD1Ob25lLCBsb29rdXBfbGluZXM9VHJ1ZSwgY2FwdHVyZV9sb2NhbHM9RmFsc2UpCisKKyAgIENhcHR1cmUgYW4gZXhjZXB0aW9uIGZvciBsYXRlciByZW5kZXJpbmcuICpsaW1pdCosICpsb29rdXBfbGluZXMqIGFuZAorICAgKmNhcHR1cmVfbG9jYWxzKiBhcmUgYXMgZm9yIHRoZSA6Y2xhc3M6YFN0YWNrU3VtbWFyeWAgY2xhc3MuCisKKyAgIE5vdGUgdGhhdCB3aGVuIGxvY2FscyBhcmUgY2FwdHVyZWQsIHRoZXkgYXJlIGFsc28gc2hvd24gaW4gdGhlIHRyYWNlYmFjay4KKworICAgLi4gYXR0cmlidXRlOjogX19jYXVzZV9fCisKKyAgICAgIEEgOmNsYXNzOmBUcmFjZWJhY2tFeGNlcHRpb25gIG9mIHRoZSBvcmlnaW5hbCBgYF9fY2F1c2VfX2BgLgorCisgICAuLiBhdHRyaWJ1dGU6OiBfX2NvbnRleHRfXworCisgICAgICBBIDpjbGFzczpgVHJhY2ViYWNrRXhjZXB0aW9uYCBvZiB0aGUgb3JpZ2luYWwgYGBfX2NvbnRleHRfX2BgLgorCisgICAuLiBhdHRyaWJ1dGU6OiBfX3N1cHByZXNzX2NvbnRleHRfXworCisgICAgICBUaGUgYGBfX3N1cHByZXNzX2NvbnRleHRfX2BgIHZhbHVlIGZyb20gdGhlIG9yaWdpbmFsIGV4Y2VwdGlvbi4KKworICAgLi4gYXR0cmlidXRlOjogc3RhY2sKKworICAgICAgQSA6Y2xhc3M6YFN0YWNrU3VtbWFyeWAgcmVwcmVzZW50aW5nIHRoZSB0cmFjZWJhY2suCisKKyAgIC4uIGF0dHJpYnV0ZTo6IGV4Y190eXBlCisKKyAgICAgIFRoZSBjbGFzcyBvZiB0aGUgb3JpZ2luYWwgdHJhY2ViYWNrLgorCisgICAuLiBhdHRyaWJ1dGU6OiBmaWxlbmFtZQorCisgICAgICBGb3Igc3ludGF4IGVycm9ycyAtIHRoZSBmaWxlIG5hbWUgd2hlcmUgdGhlIGVycm9yIG9jY3VycmVkLgorCisgICAuLiBhdHRyaWJ1dGU6OiBsaW5lbm8KKworICAgICAgRm9yIHN5bnRheCBlcnJvcnMgLSB0aGUgbGluZSBudW1iZXIgd2hlcmUgdGhlIGVycm9yIG9jY3VycmVkLgorCisgICAuLiBhdHRyaWJ1dGU6OiB0ZXh0CisKKyAgICAgIEZvciBzeW50YXggZXJyb3JzIC0gdGhlIHRleHQgd2hlcmUgdGhlIGVycm9yIG9jY3VycmVkLgorCisgICAuLiBhdHRyaWJ1dGU6OiBvZmZzZXQKKworICAgICAgRm9yIHN5bnRheCBlcnJvcnMgLSB0aGUgb2Zmc2V0IGludG8gdGhlIHRleHQgd2hlcmUgdGhlIGVycm9yIG9jY3VycmVkLgorCisgICAuLiBhdHRyaWJ1dGU6OiBtc2cKKworICAgICAgRm9yIHN5bnRheCBlcnJvcnMgLSB0aGUgY29tcGlsZXIgZXJyb3IgbWVzc2FnZS4KKworICAgLi4gY2xhc3NtZXRob2Q6OiBmcm9tX2V4Y2VwdGlvbihleGMsICosIGxpbWl0PU5vbmUsIGxvb2t1cF9saW5lcz1UcnVlLCBjYXB0dXJlX2xvY2Fscz1GYWxzZSkKKworICAgICAgQ2FwdHVyZSBhbiBleGNlcHRpb24gZm9yIGxhdGVyIHJlbmRlcmluZy4gKmxpbWl0KiwgKmxvb2t1cF9saW5lcyogYW5kCisgICAgICAqY2FwdHVyZV9sb2NhbHMqIGFyZSBhcyBmb3IgdGhlIDpjbGFzczpgU3RhY2tTdW1tYXJ5YCBjbGFzcy4KKworICAgICAgTm90ZSB0aGF0IHdoZW4gbG9jYWxzIGFyZSBjYXB0dXJlZCwgdGhleSBhcmUgYWxzbyBzaG93biBpbiB0aGUgdHJhY2ViYWNrLgorCisgICAuLiBtZXRob2Q6OiBmb3JtYXQoKiwgY2hhaW49VHJ1ZSkKKworICAgICAgRm9ybWF0IHRoZSBleGNlcHRpb24uCisKKyAgICAgIElmICpjaGFpbiogaXMgbm90IGBgVHJ1ZWBgLCBgYF9fY2F1c2VfX2BgIGFuZCBgYF9fY29udGV4dF9fYGAgd2lsbCBub3QKKyAgICAgIGJlIGZvcm1hdHRlZC4KKworICAgICAgVGhlIHJldHVybiB2YWx1ZSBpcyBhIGdlbmVyYXRvciBvZiBzdHJpbmdzLCBlYWNoIGVuZGluZyBpbiBhIG5ld2xpbmUgYW5kCisgICAgICBzb21lIGNvbnRhaW5pbmcgaW50ZXJuYWwgbmV3bGluZXMuIDpmdW5jOmB+dHJhY2ViYWNrLnByaW50X2V4Y2VwdGlvbmAKKyAgICAgIGlzIGEgd3JhcHBlciBhcm91bmQgdGhpcyBtZXRob2Qgd2hpY2gganVzdCBwcmludHMgdGhlIGxpbmVzIHRvIGEgZmlsZS4KKworICAgICAgVGhlIG1lc3NhZ2UgaW5kaWNhdGluZyB3aGljaCBleGNlcHRpb24gb2NjdXJyZWQgaXMgYWx3YXlzIHRoZSBsYXN0CisgICAgICBzdHJpbmcgaW4gdGhlIG91dHB1dC4KKworICAgLi4gbWV0aG9kOjogIGZvcm1hdF9leGNlcHRpb25fb25seSgpCisKKyAgICAgIEZvcm1hdCB0aGUgZXhjZXB0aW9uIHBhcnQgb2YgdGhlIHRyYWNlYmFjay4KKworICAgICAgVGhlIHJldHVybiB2YWx1ZSBpcyBhIGdlbmVyYXRvciBvZiBzdHJpbmdzLCBlYWNoIGVuZGluZyBpbiBhIG5ld2xpbmUuCisKKyAgICAgIE5vcm1hbGx5LCB0aGUgZ2VuZXJhdG9yIGVtaXRzIGEgc2luZ2xlIHN0cmluZzsgaG93ZXZlciwgZm9yCisgICAgICA6ZXhjOmBTeW50YXhFcnJvcmAgZXhjZXB0aW9ucywgaXQgZW1pdHMgc2V2ZXJhbCBsaW5lcyB0aGF0ICh3aGVuCisgICAgICBwcmludGVkKSBkaXNwbGF5IGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHdoZXJlIHRoZSBzeW50YXgKKyAgICAgIGVycm9yIG9jY3VycmVkLgorCisgICAgICBUaGUgbWVzc2FnZSBpbmRpY2F0aW5nIHdoaWNoIGV4Y2VwdGlvbiBvY2N1cnJlZCBpcyBhbHdheXMgdGhlIGxhc3QKKyAgICAgIHN0cmluZyBpbiB0aGUgb3V0cHV0LgorCisKKzpjbGFzczpgU3RhY2tTdW1tYXJ5YCBPYmplY3RzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisuLiB2ZXJzaW9uYWRkZWQ6OiAzLjUKKworOmNsYXNzOmBTdGFja1N1bW1hcnlgIG9iamVjdHMgcmVwcmVzZW50IGEgY2FsbCBzdGFjayByZWFkeSBmb3IgZm9ybWF0dGluZy4KKworLi4gY2xhc3M6OiBTdGFja1N1bW1hcnkKKworICAgLi4gY2xhc3NtZXRob2Q6OiBleHRyYWN0KGZyYW1lX2dlbiwgKiwgbGltaXQ9Tm9uZSwgbG9va3VwX2xpbmVzPVRydWUsIGNhcHR1cmVfbG9jYWxzPUZhbHNlKQorCisgICAgICBDb25zdHJ1Y3QgYSA6Y2xhc3M6YFN0YWNrU3VtbWFyeWAgb2JqZWN0IGZyb20gYSBmcmFtZSBnZW5lcmF0b3IgKHN1Y2ggYXMKKyAgICAgIGlzIHJldHVybmVkIGJ5IDpmdW5jOmB+dHJhY2ViYWNrLndhbGtfc3RhY2tgIG9yCisgICAgICA6ZnVuYzpgfnRyYWNlYmFjay53YWxrX3RiYCkuCisKKyAgICAgIElmICpsaW1pdCogaXMgc3VwcGxpZWQsIG9ubHkgdGhpcyBtYW55IGZyYW1lcyBhcmUgdGFrZW4gZnJvbSAqZnJhbWVfZ2VuKi4KKyAgICAgIElmICpsb29rdXBfbGluZXMqIGlzIGBgRmFsc2VgYCwgdGhlIHJldHVybmVkIDpjbGFzczpgRnJhbWVTdW1tYXJ5YAorICAgICAgb2JqZWN0cyB3aWxsIG5vdCBoYXZlIHJlYWQgdGhlaXIgbGluZXMgaW4geWV0LCBtYWtpbmcgdGhlIGNvc3Qgb2YKKyAgICAgIGNyZWF0aW5nIHRoZSA6Y2xhc3M6YFN0YWNrU3VtbWFyeWAgY2hlYXBlciAod2hpY2ggbWF5IGJlIHZhbHVhYmxlIGlmIGl0CisgICAgICBtYXkgbm90IGFjdHVhbGx5IGdldCBmb3JtYXR0ZWQpLiBJZiAqY2FwdHVyZV9sb2NhbHMqIGlzIGBgVHJ1ZWBgIHRoZQorICAgICAgbG9jYWwgdmFyaWFibGVzIGluIGVhY2ggOmNsYXNzOmBGcmFtZVN1bW1hcnlgIGFyZSBjYXB0dXJlZCBhcyBvYmplY3QKKyAgICAgIHJlcHJlc2VudGF0aW9ucy4KKworICAgLi4gY2xhc3NtZXRob2Q6OiBmcm9tX2xpc3QoYV9saXN0KQorCisgICAgICBDb25zdHJ1Y3QgYSA6Y2xhc3M6YFN0YWNrU3VtbWFyeWAgb2JqZWN0IGZyb20gYSBzdXBwbGllZCBvbGQtc3R5bGUgbGlzdAorICAgICAgb2YgdHVwbGVzLiBFYWNoIHR1cGxlIHNob3VsZCBiZSBhIDQtdHVwbGUgd2l0aCBmaWxlbmFtZSwgbGluZW5vLCBuYW1lLAorICAgICAgbGluZSBhcyB0aGUgZWxlbWVudHMuCisKKworOmNsYXNzOmBGcmFtZVN1bW1hcnlgIE9iamVjdHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy4uIHZlcnNpb25hZGRlZDo6IDMuNQorCis6Y2xhc3M6YEZyYW1lU3VtbWFyeWAgb2JqZWN0cyByZXByZXNlbnQgYSBzaW5nbGUgZnJhbWUgaW4gYSB0cmFjZWJhY2suCisKKy4uIGNsYXNzOjogRnJhbWVTdW1tYXJ5KGZpbGVuYW1lLCBsaW5lbm8sIG5hbWUsIGxvb2t1cF9saW5lPVRydWUsIGxvY2Fscz1Ob25lLCBsaW5lPU5vbmUpCisKKyAgIFJlcHJlc2VudCBhIHNpbmdsZSBmcmFtZSBpbiB0aGUgdHJhY2ViYWNrIG9yIHN0YWNrIHRoYXQgaXMgYmVpbmcgZm9ybWF0dGVkCisgICBvciBwcmludGVkLiBJdCBtYXkgb3B0aW9uYWxseSBoYXZlIGEgc3RyaW5naWZpZWQgdmVyc2lvbiBvZiB0aGUgZnJhbWVzCisgICBsb2NhbHMgaW5jbHVkZWQgaW4gaXQuIElmICpsb29rdXBfbGluZSogaXMgYGBGYWxzZWBgLCB0aGUgc291cmNlIGNvZGUgaXMgbm90CisgICBsb29rZWQgdXAgdW50aWwgdGhlIDpjbGFzczpgRnJhbWVTdW1tYXJ5YCBoYXMgdGhlIDphdHRyOmB+RnJhbWVTdW1tYXJ5LmxpbmVgCisgICBhdHRyaWJ1dGUgYWNjZXNzZWQgKHdoaWNoIGFsc28gaGFwcGVucyB3aGVuIGNhc3RpbmcgaXQgdG8gYSB0dXBsZSkuCisgICA6YXR0cjpgfkZyYW1lU3VtbWFyeS5saW5lYCBtYXkgYmUgZGlyZWN0bHkgcHJvdmlkZWQsIGFuZCB3aWxsIHByZXZlbnQgbGluZQorICAgbG9va3VwcyBoYXBwZW5pbmcgYXQgYWxsLiAqbG9jYWxzKiBpcyBhbiBvcHRpb25hbCBsb2NhbCB2YXJpYWJsZQorICAgZGljdGlvbmFyeSwgYW5kIGlmIHN1cHBsaWVkIHRoZSB2YXJpYWJsZSByZXByZXNlbnRhdGlvbnMgYXJlIHN0b3JlZCBpbiB0aGUKKyAgIHN1bW1hcnkgZm9yIGxhdGVyIGRpc3BsYXkuCiAKIC4uIF90cmFjZWJhY2stZXhhbXBsZToKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvdHVydGxlLnJzdCBiL0RvYy9saWJyYXJ5L3R1cnRsZS5yc3QKaW5kZXggMTU3ZmU5My4uMzBkZDZlZiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvdHVydGxlLnJzdAorKysgYi9Eb2MvbGlicmFyeS90dXJ0bGUucnN0CkBAIC0yMzUxLDYgKzIzNTEsOSBAQAogfCAgICAgICAgICAgICAgICB8IHBhaXJ3aXNlIGluIG9wcG9zaXRlICAgICAgICAgfCBzaGFwZXNpemUsIHRpbHQsICAgICAgfAogfCAgICAgICAgICAgICAgICB8IGRpcmVjdGlvbiAgICAgICAgICAgICAgICAgICAgfCBnZXRfc2hhcGVwb2x5LCB1cGRhdGUgfAogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworfCBzb3J0aW5nX2FuaW1hdGV8IHZpc3VhbCBkZW1vbnN0cmF0aW9uIG9mICAgICAgfCBzaW1wbGUgYWxpZ25tZW50LCAgICAgfAorfCAgICAgICAgICAgICAgICB8IGRpZmZlcmVudCBzb3J0aW5nIG1ldGhvZHMgICAgfCByYW5kb21pemF0aW9uICAgICAgICAgfAorKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogfCB0cmVlICAgICAgICAgICB8IGEgKGdyYXBoaWNhbCkgYnJlYWR0aCAgICAgICAgfCA6ZnVuYzpgY2xvbmVgICAgICAgICAgfAogfCAgICAgICAgICAgICAgICB8IGZpcnN0IHRyZWUgKHVzaW5nIGdlbmVyYXRvcnMpfCAgICAgICAgICAgICAgICAgICAgICAgfAogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvdW5pdHRlc3QucnN0IGIvRG9jL2xpYnJhcnkvdW5pdHRlc3QucnN0CmluZGV4IDkyNjA5ZWMuLjdkZGY3MDMgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3VuaXR0ZXN0LnJzdAorKysgYi9Eb2MvbGlicmFyeS91bml0dGVzdC5yc3QKQEAgLTIyMyw5ICsyMjMsMTYgQEAKIAogICAgU3RvcCB0aGUgdGVzdCBydW4gb24gdGhlIGZpcnN0IGVycm9yIG9yIGZhaWx1cmUuCiAKKy4uIGNtZG9wdGlvbjo6IC0tbG9jYWxzCisKKyAgIFNob3cgbG9jYWwgdmFyaWFibGVzIGluIHRyYWNlYmFja3MuCisKIC4uIHZlcnNpb25hZGRlZDo6IDMuMgogICAgVGhlIGNvbW1hbmQtbGluZSBvcHRpb25zIGBgLWJgYCwgYGAtY2BgIGFuZCBgYC1mYGAgd2VyZSBhZGRlZC4KIAorLi4gdmVyc2lvbmFkZGVkOjogMy41CisgICBUaGUgY29tbWFuZC1saW5lIG9wdGlvbiBgYC0tbG9jYWxzYGAuCisKIFRoZSBjb21tYW5kIGxpbmUgY2FuIGFsc28gYmUgdXNlZCBmb3IgdGVzdCBkaXNjb3ZlcnksIGZvciBydW5uaW5nIGFsbCBvZiB0aGUKIHRlc3RzIGluIGEgcHJvamVjdCBvciBqdXN0IGEgc3Vic2V0LgogCkBAIC0xNzgyLDEyICsxNzg5LDEwIEBACiAKICAgICAgIFNldCB0byBgYFRydWVgYCB3aGVuIHRoZSBleGVjdXRpb24gb2YgdGVzdHMgc2hvdWxkIHN0b3AgYnkgOm1ldGg6YHN0b3BgLgogCi0KICAgIC4uIGF0dHJpYnV0ZTo6IHRlc3RzUnVuCiAKICAgICAgIFRoZSB0b3RhbCBudW1iZXIgb2YgdGVzdHMgcnVuIHNvIGZhci4KIAotCiAgICAuLiBhdHRyaWJ1dGU6OiBidWZmZXIKIAogICAgICAgSWYgc2V0IHRvIHRydWUsIGBgc3lzLnN0ZG91dGBgIGFuZCBgYHN5cy5zdGRlcnJgYCB3aWxsIGJlIGJ1ZmZlcmVkIGluIGJldHdlZW4KQEAgLTE3OTcsNyArMTgwMiw2IEBACiAKICAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuMgogCi0KICAgIC4uIGF0dHJpYnV0ZTo6IGZhaWxmYXN0CiAKICAgICAgIElmIHNldCB0byB0cnVlIDptZXRoOmBzdG9wYCB3aWxsIGJlIGNhbGxlZCBvbiB0aGUgZmlyc3QgZmFpbHVyZSBvciBlcnJvciwKQEAgLTE4MDUsNiArMTgwOSwxMSBAQAogCiAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjIKIAorICAgLi4gYXR0cmlidXRlOjogdGJfbG9jYWxzCisKKyAgICAgIElmIHNldCB0byB0cnVlIHRoZW4gbG9jYWwgdmFyaWFibGVzIHdpbGwgYmUgc2hvd24gaW4gdHJhY2ViYWNrcy4KKworICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMy41CiAKICAgIC4uIG1ldGhvZDo6IHdhc1N1Y2Nlc3NmdWwoKQogCkBAIC0xODE1LDcgKzE4MjQsNiBAQAogICAgICAgICAgUmV0dXJucyBgYEZhbHNlYGAgaWYgdGhlcmUgd2VyZSBhbnkgOmF0dHI6YHVuZXhwZWN0ZWRTdWNjZXNzZXNgCiAgICAgICAgICBmcm9tIHRlc3RzIG1hcmtlZCB3aXRoIHRoZSA6ZnVuYzpgZXhwZWN0ZWRGYWlsdXJlYCBkZWNvcmF0b3IuCiAKLQogICAgLi4gbWV0aG9kOjogc3RvcCgpCiAKICAgICAgIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgdG8gc2lnbmFsIHRoYXQgdGhlIHNldCBvZiB0ZXN0cyBiZWluZyBydW4gc2hvdWxkCkBAIC0xOTQ3LDEyICsxOTU1LDE0IEBACiAKIAogLi4gY2xhc3M6OiBUZXh0VGVzdFJ1bm5lcihzdHJlYW09Tm9uZSwgZGVzY3JpcHRpb25zPVRydWUsIHZlcmJvc2l0eT0xLCBmYWlsZmFzdD1GYWxzZSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXI9RmFsc2UsIHJlc3VsdGNsYXNzPU5vbmUsIHdhcm5pbmdzPU5vbmUpCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcj1GYWxzZSwgcmVzdWx0Y2xhc3M9Tm9uZSwgd2FybmluZ3M9Tm9uZSwgKiwgdGJfbG9jYWxzPUZhbHNlKQogCiAgICBBIGJhc2ljIHRlc3QgcnVubmVyIGltcGxlbWVudGF0aW9uIHRoYXQgb3V0cHV0cyByZXN1bHRzIHRvIGEgc3RyZWFtLiBJZiAqc3RyZWFtKgogICAgaXMgYGBOb25lYGAsIHRoZSBkZWZhdWx0LCA6ZGF0YTpgc3lzLnN0ZGVycmAgaXMgdXNlZCBhcyB0aGUgb3V0cHV0IHN0cmVhbS4gVGhpcyBjbGFzcwogICAgaGFzIGEgZmV3IGNvbmZpZ3VyYWJsZSBwYXJhbWV0ZXJzLCBidXQgaXMgZXNzZW50aWFsbHkgdmVyeSBzaW1wbGUuICBHcmFwaGljYWwKLSAgIGFwcGxpY2F0aW9ucyB3aGljaCBydW4gdGVzdCBzdWl0ZXMgc2hvdWxkIHByb3ZpZGUgYWx0ZXJuYXRlIGltcGxlbWVudGF0aW9ucy4KKyAgIGFwcGxpY2F0aW9ucyB3aGljaCBydW4gdGVzdCBzdWl0ZXMgc2hvdWxkIHByb3ZpZGUgYWx0ZXJuYXRlIGltcGxlbWVudGF0aW9ucy4gU3VjaAorICAgaW1wbGVtZW50YXRpb25zIHNob3VsZCBhY2NlcHQgYGAqKmt3YXJnc2BgIGFzIHRoZSBpbnRlcmZhY2UgdG8gY29uc3RydWN0IHJ1bm5lcnMKKyAgIGNoYW5nZXMgd2hlbiBmZWF0dXJlcyBhcmUgYWRkZWQgdG8gdW5pdHRlc3QuCiAKICAgIEJ5IGRlZmF1bHQgdGhpcyBydW5uZXIgc2hvd3MgOmV4YzpgRGVwcmVjYXRpb25XYXJuaW5nYCwKICAgIDpleGM6YFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmdgLCA6ZXhjOmBSZXNvdXJjZVdhcm5pbmdgIGFuZApAQCAtMTk3MSw2ICsxOTgxLDkgQEAKICAgICAgIFRoZSBkZWZhdWx0IHN0cmVhbSBpcyBzZXQgdG8gOmRhdGE6YHN5cy5zdGRlcnJgIGF0IGluc3RhbnRpYXRpb24gdGltZSByYXRoZXIKICAgICAgIHRoYW4gaW1wb3J0IHRpbWUuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy41CisgICAgICBBZGRlZCB0aGUgdGJfbG9jYWxzIHBhcmFtZXRlci4KKwogICAgLi4gbWV0aG9kOjogX21ha2VSZXN1bHQoKQogCiAgICAgICBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBpbnN0YW5jZSBvZiBgYFRlc3RSZXN1bHRgYCB1c2VkIGJ5IDptZXRoOmBydW5gLgpkaWZmIC0tZ2l0IGEvRG9jL21ha2UuYmF0IGIvRG9jL21ha2UuYmF0CmluZGV4IGZkNTRjYjguLjZhYWUzNGEgMTAwNjQ0Ci0tLSBhL0RvYy9tYWtlLmJhdAorKysgYi9Eb2MvbWFrZS5iYXQKQEAgLTgsMTMgKzgsMTcgQEAKIGlmICIlU1BISU5YQlVJTEQlIiBFUVUgIiIgc2V0IFNQSElOWEJVSUxEPXNwaGlueC1idWlsZAogaWYgIiVQWVRIT04lIiBFUVUgIiIgc2V0IFBZVEhPTj1weQogCi1pZiAiJUhUTUxIRUxQJSIgRVFVICIiICgKLSAgICB3aGVyZSBoaGMgMj5udWwgPiIlVEVNUCVcaGhjLmxvYyIKLSAgICBpZiBlcnJvcmxldmVsIDEgZGlyICIuLlxleHRlcm5hbHNcaGhjLmV4ZSIgL3MvYiA+ICIlVEVNUCVcaGhjLmxvYyIKLSAgICBpZiBlcnJvcmxldmVsIDEgZWNobyBDYW5ub3QgZmluZCBISEMgb24gUEFUSCBvciBpbiBleHRlcm5hbHMgJiBleGl0IC9CIDEKLSAgICBzZXQgL1AgSFRNTEhFTFA9IDwgIiVURU1QJVxoaGMubG9jIgotICAgIGRlbCAiJVRFTVAlXGhoYy5sb2MiCi0pCitpZiAiJTEiIE5FUSAiaHRtbGhlbHAiIGdvdG8gOnNraXBoaGNzZWFyY2gKK2lmIGV4aXN0ICIlSFRNTEhFTFAlIiBnb3RvIDpza2lwaGhjc2VhcmNoCisKK3JlbSBTZWFyY2ggZm9yIEhIQyBpbiBsaWtlbHkgcGxhY2VzCitzZXQgSFRNTEhFTFA9Cit3aGVyZSBoaGMgL3EgJiYgc2V0IEhUTUxIRUxQPWhoYyAmJiBnb3RvIDpza2lwaGhjc2VhcmNoCit3aGVyZSAvUiAuLlxleHRlcm5hbHMgaGhjID4gIiVURU1QJVxoaGMubG9jIiAyPiBudWwgJiYgc2V0IC9QIEhUTUxIRUxQPSA8ICIlVEVNUCVcaGhjLmxvYyIgJiBkZWwgIiVURU1QJVxoaGMubG9jIgoraWYgbm90IGV4aXN0ICIlSFRNTEhFTFAlIiB3aGVyZSAvUiAiJVByb2dyYW1GaWxlcyh4ODYpJSIgaGhjID4gIiVURU1QJVxoaGMubG9jIiAyPiBudWwgJiYgc2V0IC9QIEhUTUxIRUxQPSA8ICIlVEVNUCVcaGhjLmxvYyIgJiBkZWwgIiVURU1QJVxoaGMubG9jIgoraWYgbm90IGV4aXN0ICIlSFRNTEhFTFAlIiB3aGVyZSAvUiAiJVByb2dyYW1GaWxlcyUiIGhoYyA+ICIlVEVNUCVcaGhjLmxvYyIgMj4gbnVsICYmIHNldCAvUCBIVE1MSEVMUD0gPCAiJVRFTVAlXGhoYy5sb2MiICYgZGVsICIlVEVNUCVcaGhjLmxvYyIKK2lmIG5vdCBleGlzdCAiJUhUTUxIRUxQJSIgZWNobyBDYW5ub3QgZmluZCBISEMgb24gUEFUSCBvciBpbiBleHRlcm5hbHMgJiBleGl0IC9CIDEKKzpza2lwaGhjc2VhcmNoCiAKIGlmICIlRElTVFZFUlNJT04lIiBFUVUgIiIgZm9yIC9mICJ1c2ViYWNrcSIgJSV2IGluIChgJVBZVEhPTiUgdG9vbHMvZXh0ZW5zaW9ucy9wYXRjaGxldmVsLnB5YCkgZG8gc2V0IERJU1RWRVJTSU9OPSUldgogCmRpZmYgLS1naXQgYS9Eb2MvcmVmZXJlbmNlL2V4cHJlc3Npb25zLnJzdCBiL0RvYy9yZWZlcmVuY2UvZXhwcmVzc2lvbnMucnN0CmluZGV4IDU4ZDM4ZWQuLjEyZjlmMmYgMTAwNjQ0Ci0tLSBhL0RvYy9yZWZlcmVuY2UvZXhwcmVzc2lvbnMucnN0CisrKyBiL0RvYy9yZWZlcmVuY2UvZXhwcmVzc2lvbnMucnN0CkBAIC0xMDc1LDcgKzEwNzUsNyBAQAogKiBOdW1iZXJzIGFyZSBjb21wYXJlZCBhcml0aG1ldGljYWxseS4KIAogKiBUaGUgdmFsdWVzIDpjb25zdDpgZmxvYXQoJ05hTicpYCBhbmQgOmNvbnN0OmBEZWNpbWFsKCdOYU4nKWAgYXJlIHNwZWNpYWwuCi0gIFRoZSBhcmUgaWRlbnRpY2FsIHRvIHRoZW1zZWx2ZXMsIGBgeCBpcyB4YGAgYnV0IGFyZSBub3QgZXF1YWwgdG8gdGhlbXNlbHZlcywKKyAgVGhleSBhcmUgaWRlbnRpY2FsIHRvIHRoZW1zZWx2ZXMsIGBgeCBpcyB4YGAgYnV0IGFyZSBub3QgZXF1YWwgdG8gdGhlbXNlbHZlcywKICAgYGB4ICE9IHhgYC4gIEFkZGl0aW9uYWxseSwgY29tcGFyaW5nIGFueSB2YWx1ZSB0byBhIG5vdC1hLW51bWJlciB2YWx1ZQogICB3aWxsIHJldHVybiBgYEZhbHNlYGAuICBGb3IgZXhhbXBsZSwgYm90aCBgYDMgPCBmbG9hdCgnTmFOJylgYCBhbmQKICAgYGBmbG9hdCgnTmFOJykgPCAzYGAgd2lsbCByZXR1cm4gYGBGYWxzZWBgLgpkaWZmIC0tZ2l0IGEvRG9jL3Rvb2xzL2V4dGVuc2lvbnMvcHlzcGVjaWZpYy5weSBiL0RvYy90b29scy9leHRlbnNpb25zL3B5c3BlY2lmaWMucHkKaW5kZXggNDFjMjViYy4uOWI3ODE4NCAxMDA2NDQKLS0tIGEvRG9jL3Rvb2xzL2V4dGVuc2lvbnMvcHlzcGVjaWZpYy5weQorKysgYi9Eb2MvdG9vbHMvZXh0ZW5zaW9ucy9weXNwZWNpZmljLnB5CkBAIC0xNDUsNiArMTQ1LDI1IEBACiAgICAgICAgIHJldHVybiBQeUNsYXNzbWVtYmVyLnJ1bihzZWxmKQogCiAKK2NsYXNzIFB5Q29yb3V0aW5lTWl4aW4ob2JqZWN0KToKKyAgICBkZWYgaGFuZGxlX3NpZ25hdHVyZShzZWxmLCBzaWcsIHNpZ25vZGUpOgorICAgICAgICByZXQgPSBzdXBlcihQeUNvcm91dGluZU1peGluLCBzZWxmKS5oYW5kbGVfc2lnbmF0dXJlKHNpZywgc2lnbm9kZSkKKyAgICAgICAgc2lnbm9kZS5pbnNlcnQoMCwgYWRkbm9kZXMuZGVzY19hbm5vdGF0aW9uKCdjb3JvdXRpbmUgJywgJ2Nvcm91dGluZSAnKSkKKyAgICAgICAgcmV0dXJuIHJldAorCisKK2NsYXNzIFB5Q29yb3V0aW5lRnVuY3Rpb24oUHlDb3JvdXRpbmVNaXhpbiwgUHlNb2R1bGVsZXZlbCk6CisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgc2VsZi5uYW1lID0gJ3B5OmZ1bmN0aW9uJworICAgICAgICByZXR1cm4gUHlNb2R1bGVsZXZlbC5ydW4oc2VsZikKKworCitjbGFzcyBQeUNvcm91dGluZU1ldGhvZChQeUNvcm91dGluZU1peGluLCBQeUNsYXNzbWVtYmVyKToKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICBzZWxmLm5hbWUgPSAncHk6bWV0aG9kJworICAgICAgICByZXR1cm4gUHlDbGFzc21lbWJlci5ydW4oc2VsZikKKworCiAjIFN1cHBvcnQgZm9yIGRvY3VtZW50aW5nIHZlcnNpb24gb2YgcmVtb3ZhbCBpbiBkZXByZWNhdGlvbnMKIAogY2xhc3MgRGVwcmVjYXRlZFJlbW92ZWQoRGlyZWN0aXZlKToKQEAgLTM0Nyw1ICszNjYsNyBAQAogICAgIGFwcC5hZGRfZGVzY3JpcHRpb25fdW5pdCgnMnRvM2ZpeGVyJywgJzJ0bzNmaXhlcicsICclcyAoMnRvMyBmaXhlciknKQogICAgIGFwcC5hZGRfZGlyZWN0aXZlX3RvX2RvbWFpbigncHknLCAnZGVjb3JhdG9yJywgUHlEZWNvcmF0b3JGdW5jdGlvbikKICAgICBhcHAuYWRkX2RpcmVjdGl2ZV90b19kb21haW4oJ3B5JywgJ2RlY29yYXRvcm1ldGhvZCcsIFB5RGVjb3JhdG9yTWV0aG9kKQorICAgIGFwcC5hZGRfZGlyZWN0aXZlX3RvX2RvbWFpbigncHknLCAnY29yb3V0aW5lZnVuY3Rpb24nLCBQeUNvcm91dGluZUZ1bmN0aW9uKQorICAgIGFwcC5hZGRfZGlyZWN0aXZlX3RvX2RvbWFpbigncHknLCAnY29yb3V0aW5lbWV0aG9kJywgUHlDb3JvdXRpbmVNZXRob2QpCiAgICAgYXBwLmFkZF9kaXJlY3RpdmUoJ21pc2NuZXdzJywgTWlzY05ld3MpCiAgICAgcmV0dXJuIHsndmVyc2lvbic6ICcxLjAnLCAncGFyYWxsZWxfcmVhZF9zYWZlJzogVHJ1ZX0KZGlmZiAtLWdpdCBhL0RvYy91c2luZy93aW5kb3dzLnJzdCBiL0RvYy91c2luZy93aW5kb3dzLnJzdAppbmRleCBhZjY2MTk2Li5mMTk0ODAyIDEwMDY0NAotLS0gYS9Eb2MvdXNpbmcvd2luZG93cy5yc3QKKysrIGIvRG9jL3VzaW5nL3dpbmRvd3MucnN0CkBAIC00MDQsNiArNDA0LDE4IEBACiBQZXItdXNlciBpbnN0YWxsYXRpb25zIG9mIFB5dGhvbiBkbyBub3QgYWRkIHRoZSBsYXVuY2hlciB0byA6ZW52dmFyOmBQQVRIYAogdW5sZXNzIHRoZSBvcHRpb24gd2FzIHNlbGVjdGVkIG9uIGluc3RhbGxhdGlvbi4KIAorVmlydHVhbCBlbnZpcm9ubWVudHMKK15eXl5eXl5eXl5eXl5eXl5eXl5eCisKKy4uIHZlcnNpb25hZGRlZDo6IDMuNQorCitJZiB0aGUgbGF1bmNoZXIgaXMgcnVuIHdpdGggbm8gZXhwbGljaXQgUHl0aG9uIHZlcnNpb24gc3BlY2lmaWNhdGlvbiwgYW5kIGEKK3ZpcnR1YWwgZW52aXJvbm1lbnQgKGNyZWF0ZWQgd2l0aCB0aGUgc3RhbmRhcmQgbGlicmFyeSA6bW9kOmB2ZW52YCBtb2R1bGUgb3IKK3RoZSBleHRlcm5hbCBgYHZpcnR1YWxlbnZgYCB0b29sKSBhY3RpdmUsIHRoZSBsYXVuY2hlciB3aWxsIHJ1biB0aGUgdmlydHVhbAorZW52aXJvbm1lbnQncyBpbnRlcnByZXRlciByYXRoZXIgdGhhbiB0aGUgZ2xvYmFsIG9uZS4gIFRvIHJ1biB0aGUgZ2xvYmFsCitpbnRlcnByZXRlciwgZWl0aGVyIGRlYWN0aXZhdGUgdGhlIHZpcnR1YWwgZW52aXJvbm1lbnQsIG9yIGV4cGxpY2l0bHkgc3BlY2lmeQordGhlIGdsb2JhbCBQeXRob24gdmVyc2lvbi4KKwogRnJvbSBhIHNjcmlwdAogXl5eXl5eXl5eXl5eXgogCkBAIC00NzgsNiArNDkwLDE2IEBACiBvbiBXaW5kb3dzIHdoaWNoIHlvdSBob3BlIHdpbGwgYmUgdXNlZnVsIG9uIFVuaXgsIHlvdSBzaG91bGQgdXNlIG9uZSBvZiB0aGUKIHNoZWJhbmcgbGluZXMgc3RhcnRpbmcgd2l0aCBgYC91c3JgYC4KIAorQW55IG9mIHRoZSBhYm92ZSB2aXJ0dWFsIGNvbW1hbmRzIGNhbiBiZSBzdWZmaXhlZCB3aXRoIGFuIGV4cGxpY2l0IHZlcnNpb24KKyhlaXRoZXIganVzdCB0aGUgbWFqb3IgdmVyc2lvbiwgb3IgdGhlIG1ham9yIGFuZCBtaW5vciB2ZXJzaW9uKSAtIGZvciBleGFtcGxlCitgYC91c3IvYmluL3B5dGhvbjIuN2BgIC0gd2hpY2ggd2lsbCBjYXVzZSB0aGF0IHNwZWNpZmljIHZlcnNpb24gdG8gYmUgbG9jYXRlZAorYW5kIHVzZWQuCisKK1RoZSBgYC91c3IvYmluL2VudmBgIGZvcm0gb2Ygc2hlYmFuZyBsaW5lIGhhcyBvbmUgZnVydGhlciBzcGVjaWFsIHByb3BlcnR5LgorQmVmb3JlIGxvb2tpbmcgZm9yIGluc3RhbGxlZCBQeXRob24gaW50ZXJwcmV0ZXJzLCB0aGlzIGZvcm0gd2lsbCBzZWFyY2ggdGhlCitleGVjdXRhYmxlIDplbnZ2YXI6YFBBVEhgIGZvciBhIFB5dGhvbiBleGVjdXRhYmxlLiBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZQorYmVoYXZpb3VyIG9mIHRoZSBVbml4IGBgZW52YGAgcHJvZ3JhbSwgd2hpY2ggcGVyZm9ybXMgYSA6ZW52dmFyOmBQQVRIYCBzZWFyY2guCisKIEFyZ3VtZW50cyBpbiBzaGViYW5nIGxpbmVzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCmRpZmYgLS1naXQgYS9Eb2Mvd2hhdHNuZXcvMy41LnJzdCBiL0RvYy93aGF0c25ldy8zLjUucnN0CmluZGV4IDJjNmMzYTIuLjY5MzJmY2IgMTAwNjQ0Ci0tLSBhL0RvYy93aGF0c25ldy8zLjUucnN0CisrKyBiL0RvYy93aGF0c25ldy8zLjUucnN0CkBAIC0xMTEsNiArMTExLDE5IEBACiAgICAgICAgUEVQIHdyaXR0ZW4gYnkgQ2FybCBNZXllcgogCiAKKworUEVQIDQ3MSAtIG9zLnNjYW5kaXIoKSBmdW5jdGlvbiAtLSBhIGJldHRlciBhbmQgZmFzdGVyIGRpcmVjdG9yeSBpdGVyYXRvcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis6cGVwOmA0NzFgICBpbmNsdWRlcyBhIG5ldyBkaXJlY3RvcnkgaXRlcmF0aW9uIGZ1bmN0aW9uLCA6ZnVuYzpgb3Muc2NhbmRpcmAsCitpbiB0aGUgc3RhbmRhcmQgbGlicmFyeS4KKworLi4gc2VlYWxzbzo6CisKKyAgIDpwZXA6YDQ3MWAgLS0gb3Muc2NhbmRpcigpIGZ1bmN0aW9uIC0tIGEgYmV0dGVyIGFuZCBmYXN0ZXIgZGlyZWN0b3J5CisgICBpdGVyYXRvci4KKworCiBQRVAgNDc1OiBSZXRyeSBzeXN0ZW0gY2FsbHMgZmFpbGluZyB3aXRoIEVJTlRSCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTExOCwxMSArMTMxLDI1IEBACiB0aGlzIG1lYW5zIHRoYXQgdXNlciBjb2RlIGRvZXNuJ3QgaGF2ZSB0byBkZWFsIHdpdGggRUlOVFIgb3IgSW50ZXJydXB0ZWRFcnJvcgogbWFudWFsbHksIGFuZCBzaG91bGQgbWFrZSBpdCBtb3JlIHJvYnVzdCBhZ2FpbnN0IGFzeW5jaHJvbm91cyBzaWduYWwgcmVjZXB0aW9uLgogCitQRVAgYW5kIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4gYnkgQmVuIEhveXQgd2l0aCB0aGUgaGVscCBvZiBWaWN0b3IgU3Rpbm5lci4KKwogLi4gc2VlYWxzbzo6CiAKICAgIDpwZXA6YDQ3NWAgLS0gUmV0cnkgc3lzdGVtIGNhbGxzIGZhaWxpbmcgd2l0aCBFSU5UUgogCiAKK1BFUCA0ODY6IE1ha2UgdGhlIFB5dGhvbiBMYXVuY2hlciBhd2FyZSBvZiB2aXJ0dWFsIGVudmlyb25tZW50cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzpwZXA6YDQ4NmAgbWFrZXMgdGhlIFdpbmRvd3MgbGF1bmNoZXIgKHNlZSA6cGVwOmAzOTdgKSBhd2FyZSBvZiBhbiBhY3RpdmUKK3ZpcnR1YWwgZW52aXJvbm1lbnQuIFdoZW4gdGhlIGRlZmF1bHQgaW50ZXJwcmV0ZXIgd291bGQgYmUgdXNlZCBhbmQgdGhlCitgYFZJUlRVQUxfRU5WYGAgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0LCB0aGUgaW50ZXJwcmV0ZXIgaW4gdGhlIHZpcnR1YWwKK2Vudmlyb25tZW50IHdpbGwgYmUgdXNlZC4KKworLi4gc2VlYWxzbzo6CisKKyAgICA6cGVwOmA0ODZgIC0tIE1ha2UgdGhlIFB5dGhvbiBMYXVuY2hlciBhd2FyZSBvZiB2aXJ0dWFsIGVudmlyb25tZW50cworCiBPdGhlciBMYW5ndWFnZSBDaGFuZ2VzCiA9PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTE0NiwxMCArMTczLDE4IEBACiBJbXByb3ZlZCBNb2R1bGVzCiA9PT09PT09PT09PT09PT09CiAKK2FyZ3BhcnNlCistLS0tLS0tLQorCisqIDpjbGFzczpgfmFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyYCBub3cgYWxsb3dzIHRvIGRpc2FibGUKKyAgOnJlZjpgYWJicmV2aWF0ZWQgdXNhZ2UgPHByZWZpeC1tYXRjaGluZz5gIG9mIGxvbmcgb3B0aW9ucyBieSBzZXR0aW5nCisgIDpyZWY6YGFsbG93X2FiYnJldmAgdG8gYGBGYWxzZWBgLgorICAoQ29udHJpYnV0ZWQgYnkgSm9uYXRoYW4gUGF1Z2gsIFN0ZXZlbiBCZXRoYXJkLCBwYXVsIGozIGFuZCBEYW5pZWwgRXJpa3Nzb24uKQorCiBjZ2kKIC0tLQogCi0qIDpjbGFzczpgRmllbGRTdG9yYWdlYCBub3cgc3VwcG9ydHMgdGhlIGNvbnRleHQgbWFuYWdlbWVudCBwcm90b2NvbC4KKyogOmNsYXNzOmB+Y2dpLkZpZWxkU3RvcmFnZWAgbm93IHN1cHBvcnRzIHRoZSBjb250ZXh0IG1hbmFnZW1lbnQgcHJvdG9jb2wuCiAgIChDb250cmlidXRlZCBieSBCZXJrZXIgUGVrc2FnIGluIDppc3N1ZTpgMjAyODlgLikKIAogY29kZQpAQCAtMjU5LDYgKzI5NCwxMCBAQAogb3MKIC0tCiAKKyogTmV3IDpmdW5jOmBvcy5zY2FuZGlyYCBmdW5jdGlvbjogUmV0dXJuIGFuIGl0ZXJhdG9yIG9mIDpjbGFzczpgb3MuRGlyRW50cnlgCisgIG9iamVjdHMgY29ycmVzcG9uZGluZyB0byB0aGUgZW50cmllcyBpbiB0aGUgZGlyZWN0b3J5IGdpdmVuIGJ5ICpwYXRoKi4KKyAgKEltcGxlbWVudGF0aW9uIHdyaXR0ZW4gYnkgQmVuIEhveXQgd2l0aCB0aGUgaGVscCBvZiBWaWN0b3IgU3Rpbm5lci4pCisKICogOmNsYXNzOmBvcy5zdGF0X3Jlc3VsdGAgbm93IGhhcyBhIDphdHRyOmB+b3Muc3RhdF9yZXN1bHQuc3RfZmlsZV9hdHRyaWJ1dGVzYAogICBhdHRyaWJ1dGUgb24gV2luZG93cy4gIChDb250cmlidXRlZCBieSBCZW4gSG95dCBpbiA6aXNzdWU6YDIxNzE5YC4pCiAKQEAgLTMzNCwxNCArMzczLDI3IEBACiAgIDptZXRoOmBzb2NrZXQuc29ja2V0LnNlbmRgLgogICAoQ29udHJpYnV0ZWQgYnkgR2lhbXBhb2xvIFJvZG9sYScgaW4gOmlzc3VlOmAxNzU1MmAuKQogCitzeXNjb25maWcKKy0tLS0tLS0tLQorCisqIFRoZSB1c2VyIHNjcmlwdHMgZGlyZWN0b3J5IG9uIFdpbmRvd3MgaXMgbm93IHZlcnNpb25lZC4KKyAgKENvbnRyaWJ1dGVkIGJ5IFBhdWwgTW9vcmUgaW4gOmlzc3VlOmAyMzQzN2AuKQorCisKK3RhcmZpbGUKKy0tLS0tLS0KKworKiBUaGUgOmZ1bmM6YHRhcmZpbGUub3BlbmAgZnVuY3Rpb24gbm93IHN1cHBvcnRzIGBgJ3gnYGAgKGV4Y2x1c2l2ZSBjcmVhdGlvbikKKyAgbW9kZS4gIChDb250cmlidXRlZCBieSBCZXJrZXIgUGVrc2FnIGluIDppc3N1ZTpgMjE3MTdgLikKKwogdGltZQogLS0tLQogCiAqIFRoZSA6ZnVuYzpgdGltZS5tb25vdG9uaWNgIGZ1bmN0aW9uIGlzIG5vdyBhbHdheXMgYXZhaWxhYmxlLiAgKENvbnRyaWJ1dGVkIGJ5CiAgIFZpY3RvciBTdGlubmVyIGluIDppc3N1ZTpgMjIwNDNgLikKIAotdGltZQotLS0tLQordXJsbGliCistLS0tLS0KIAogKiBBIG5ldyA6Y2xhc3M6YHVybGxpYi5yZXF1ZXN0LkhUVFBCYXNpY1ByaW9yQXV0aEhhbmRsZXJgIGFsbG93cyBIVFRQIEJhc2ljCiAgIEF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxzIHRvIGJlIHNlbnQgdW5jb25kaXRpb25hbGx5IHdpdGggdGhlIGZpcnN0IEhUVFAKQEAgLTM3OSw3ICs0MzEsMTIgQEAKICAgKDppc3N1ZTpgMjE0ODZgLCA6aXNzdWU6YDIxNDg3YCwgOmlzc3VlOmAyMDgyNmApCiAKICogTWFueSBvcGVyYXRpb25zIG9uIDpjbGFzczpgaW8uQnl0ZXNJT2AgYXJlIG5vdyA1MCUgdG8gMTAwJSBmYXN0ZXIuCi0gIChDb250cmlidXRlZCBieSBTZXJoaXkgU3RvcmNoYWthIGluIDppc3N1ZTpgMTUzODFgLikKKyAgKENvbnRyaWJ1dGVkIGJ5IFNlcmhpeSBTdG9yY2hha2EgaW4gOmlzc3VlOmAxNTM4MWAgYW5kIERhdmlkIFdpbHNvbiBpbgorICA6aXNzdWU6YDIyMDAzYC4pCisKKyogOmZ1bmM6YG1hcnNoYWwuZHVtcHNgIGlzIG5vdyBmYXN0ZXIgKDY1JS04NSUgd2l0aCB2ZXJzaW9ucyAzLS00LCAyMC0yNSUgd2l0aAorICB2ZXJzaW9ucyAwLS0yIG9uIHR5cGljYWwgZGF0YSwgYW5kIHVwIHRvIDV4IGluIGJlc3QgY2FzZXMpLgorICAoQ29udHJpYnV0ZWQgYnkgU2VyaGl5IFN0b3JjaGFrYSBpbiA6aXNzdWU6YDIwNDE2YCBhbmQgOmlzc3VlOmAyMzM0NGAuKQogCiAKIEJ1aWxkIGFuZCBDIEFQSSBDaGFuZ2VzCkBAIC01MjMsMyArNTgwLDggQEAKICogUmVtb3ZlZCBub24tZG9jdW1lbnRlZCBtYWNybyA6YzptYWNybzpgUHlPYmplY3RfUkVQUmAgd2hpY2ggbGVha2VkIHJlZmVyZW5jZXMuCiAgIFVzZSBmb3JtYXQgY2hhcmFjdGVyIGBgJVJgYCBpbiA6YzpmdW5jOmBQeVVuaWNvZGVfRnJvbUZvcm1hdGAtbGlrZSBmdW5jdGlvbnMKICAgdG8gZm9ybWF0IHRoZSA6ZnVuYzpgcmVwcmAgb2YgdGhlIG9iamVjdC4KKworKiBCZWNhdXNlIHRoZSBsYWNrIG9mIHRoZSA6YXR0cjpgX19tb2R1bGVfX2AgYXR0cmlidXRlIGJyZWFrcyBwaWNrbGluZyBhbmQKKyAgaW50cm9zcGVjdGlvbiwgYSBkZXByZWNhdGlvbiB3YXJuaW5nIG5vdyBpcyByYWlzZWQgZm9yIGJ1aWx0aW4gdHlwZSB3aXRob3V0CisgIHRoZSA6YXR0cjpgX19tb2R1bGVfX2AgYXR0cmlidXRlLiAgV291bGQgYmUgYW4gQXR0cmlidXRlRXJyb3IgaW4gZnV0dXJlLgorICAoOmlzc3VlOmAyMDIwNGApCmRpZmYgLS1naXQgYS9JbmNsdWRlL2Fic3RyYWN0LmggYi9JbmNsdWRlL2Fic3RyYWN0LmgKaW5kZXggZGI3MGYyMS4uNTZmYmY4NiAxMDA2NDQKLS0tIGEvSW5jbHVkZS9hYnN0cmFjdC5oCisrKyBiL0luY2x1ZGUvYWJzdHJhY3QuaApAQCAtMjY2LDYgKzI2NiwxMSBAQAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5T2JqZWN0X0NhbGwoUHlPYmplY3QgKmNhbGxhYmxlX29iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpOwogCisjaWZuZGVmIFB5X0xJTUlURURfQVBJCisgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5X0NoZWNrRnVuY3Rpb25SZXN1bHQoUHlPYmplY3QgKm9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmdW5jX25hbWUpOworI2VuZGlmCisKICAgICAgICAvKgogICAgICBDYWxsIGEgY2FsbGFibGUgUHl0aG9uIG9iamVjdCwgY2FsbGFibGVfb2JqZWN0LCB3aXRoCiAgICAgIGFyZ3VtZW50cyBhbmQga2V5d29yZHMgYXJndW1lbnRzLiAgVGhlICdhcmdzJyBhcmd1bWVudCBjYW4gbm90IGJlCmRpZmYgLS1naXQgYS9JbmNsdWRlL2ZpbGVvYmplY3QuaCBiL0luY2x1ZGUvZmlsZW9iamVjdC5oCmluZGV4IDA5Mzk3NDQuLjAzMTU1ZDMgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvZmlsZW9iamVjdC5oCisrKyBiL0luY2x1ZGUvZmlsZW9iamVjdC5oCkBAIC0zMiwxNyArMzIsNiBAQAogI2lmbmRlZiBQeV9MSU1JVEVEX0FQSQogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUZpbGVfTmV3U3RkUHJpbnRlcihpbnQpOwogUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5U3RkUHJpbnRlcl9UeXBlOwotCi0jaWYgZGVmaW5lZCBfTVNDX1ZFUiAmJiBfTVNDX1ZFUiA+PSAxNDAwCi0vKiBBIHJvdXRpbmUgdG8gY2hlY2sgaWYgYSBmaWxlIGRlc2NyaXB0b3IgaXMgdmFsaWQgb24gV2luZG93cy4gIFJldHVybnMgMAotICogYW5kIHNldHMgZXJybm8gdG8gRUJBREYgaWYgaXQgaXNuJ3QuICBUaGlzIGlzIHRvIGF2b2lkIEFzc2VydGlvbnMKLSAqIGZyb20gdmFyaW91cyBmdW5jdGlvbnMgaW4gdGhlIFdpbmRvd3MgQ1JUIGJlZ2lubmluZyB3aXRoCi0gKiBWaXN1YWwgU3R1ZGlvIDIwMDUKLSAqLwotaW50IF9QeVZlcmlmeV9mZChpbnQgZmQpOwotI2Vsc2UKLSNkZWZpbmUgX1B5VmVyaWZ5X2ZkKEEpICgxKSAvKiBkdW1teSAqLwotI2VuZGlmCiAjZW5kaWYgLyogUHlfTElNSVRFRF9BUEkgKi8KIAogLyogQSByb3V0aW5lIHRvIGNoZWNrIGlmIGEgZmlsZSBkZXNjcmlwdG9yIGNhbiBiZSBzZWxlY3QoKS1lZC4gKi8KZGlmZiAtLWdpdCBhL0luY2x1ZGUvZmlsZXV0aWxzLmggYi9JbmNsdWRlL2ZpbGV1dGlscy5oCmluZGV4IGM1ZWViYzUuLjk1NjMyZWQgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvZmlsZXV0aWxzLmgKKysrIGIvSW5jbHVkZS9maWxldXRpbHMuaApAQCAtMjEsMTEgKzIxLDQyIEBACiAgICAgc3RydWN0IHN0YXQgKmJ1Zik7CiAjZW5kaWYKIAorI2lmbmRlZiBQeV9MSU1JVEVEX0FQSQorI2lmIGRlZmluZWQoSEFWRV9GU1RBVCkgfHwgZGVmaW5lZChNU19XSU5ET1dTKQorCisjaWZkZWYgTVNfV0lORE9XUworc3RydWN0IF9QeV9zdGF0X3N0cnVjdCB7CisgICAgdW5zaWduZWQgbG9uZyBzdF9kZXY7CisgICAgX19pbnQ2NCBzdF9pbm87CisgICAgdW5zaWduZWQgc2hvcnQgc3RfbW9kZTsKKyAgICBpbnQgc3Rfbmxpbms7CisgICAgaW50IHN0X3VpZDsKKyAgICBpbnQgc3RfZ2lkOworICAgIHVuc2lnbmVkIGxvbmcgc3RfcmRldjsKKyAgICBfX2ludDY0IHN0X3NpemU7CisgICAgdGltZV90IHN0X2F0aW1lOworICAgIGludCBzdF9hdGltZV9uc2VjOworICAgIHRpbWVfdCBzdF9tdGltZTsKKyAgICBpbnQgc3RfbXRpbWVfbnNlYzsKKyAgICB0aW1lX3Qgc3RfY3RpbWU7CisgICAgaW50IHN0X2N0aW1lX25zZWM7CisgICAgdW5zaWduZWQgbG9uZyBzdF9maWxlX2F0dHJpYnV0ZXM7Cit9OworI2Vsc2UKKyMgIGRlZmluZSBfUHlfc3RhdF9zdHJ1Y3Qgc3RhdAorI2VuZGlmCisKK1B5QVBJX0ZVTkMoaW50KSBfUHlfZnN0YXQoCisgICAgaW50IGZkLAorICAgIHN0cnVjdCBfUHlfc3RhdF9zdHJ1Y3QgKnN0YXQpOworI2VuZGlmICAgLyogSEFWRV9GU1RBVCB8fCBNU19XSU5ET1dTICovCisjZW5kaWYgICAvKiBQeV9MSU1JVEVEX0FQSSAqLworCiAjaWZkZWYgSEFWRV9TVEFUCiBQeUFQSV9GVU5DKGludCkgX1B5X3N0YXQoCiAgICAgUHlPYmplY3QgKnBhdGgsCiAgICAgc3RydWN0IHN0YXQgKnN0YXRidWYpOwotI2VuZGlmCisjZW5kaWYgICAvKiBIQVZFX1NUQVQgKi8KIAogI2lmbmRlZiBQeV9MSU1JVEVEX0FQSQogUHlBUElfRlVOQyhpbnQpIF9QeV9vcGVuKApAQCAtNzcsNiArMTA4LDE4IEBACiBQeUFQSV9GVU5DKGludCkgX1B5X3NldF9ibG9ja2luZyhpbnQgZmQsIGludCBibG9ja2luZyk7CiAjZW5kaWYgICAvKiAhTVNfV0lORE9XUyAqLwogCisjaWYgZGVmaW5lZCBfTVNDX1ZFUiAmJiBfTVNDX1ZFUiA+PSAxNDAwCisvKiBBIHJvdXRpbmUgdG8gY2hlY2sgaWYgYSBmaWxlIGRlc2NyaXB0b3IgaXMgdmFsaWQgb24gV2luZG93cy4gIFJldHVybnMgMAorICogYW5kIHNldHMgZXJybm8gdG8gRUJBREYgaWYgaXQgaXNuJ3QuICBUaGlzIGlzIHRvIGF2b2lkIEFzc2VydGlvbnMKKyAqIGZyb20gdmFyaW91cyBmdW5jdGlvbnMgaW4gdGhlIFdpbmRvd3MgQ1JUIGJlZ2lubmluZyB3aXRoCisgKiBWaXN1YWwgU3R1ZGlvIDIwMDUKKyAqLworaW50IF9QeVZlcmlmeV9mZChpbnQgZmQpOworCisjZWxzZQorI2RlZmluZSBfUHlWZXJpZnlfZmQoQSkgKDEpIC8qIGR1bW15ICovCisjZW5kaWYKKwogI2VuZGlmICAgLyogUHlfTElNSVRFRF9BUEkgKi8KIAogI2lmZGVmIF9fY3BsdXNwbHVzCmRpZmYgLS1naXQgYS9JbmNsdWRlL3BhdGNobGV2ZWwuaCBiL0luY2x1ZGUvcGF0Y2hsZXZlbC5oCmluZGV4IDk2MDZjMTUuLjdjYTI3NzUgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvcGF0Y2hsZXZlbC5oCisrKyBiL0luY2x1ZGUvcGF0Y2hsZXZlbC5oCkBAIC0yMCwxMCArMjAsMTAgQEAKICNkZWZpbmUgUFlfTUlOT1JfVkVSU0lPTgk1CiAjZGVmaW5lIFBZX01JQ1JPX1ZFUlNJT04JMAogI2RlZmluZSBQWV9SRUxFQVNFX0xFVkVMCVBZX1JFTEVBU0VfTEVWRUxfQUxQSEEKLSNkZWZpbmUgUFlfUkVMRUFTRV9TRVJJQUwJMQorI2RlZmluZSBQWV9SRUxFQVNFX1NFUklBTAkyCiAKIC8qIFZlcnNpb24gYXMgYSBzdHJpbmcgKi8KLSNkZWZpbmUgUFlfVkVSU0lPTiAgICAgIAkiMy41LjBhMSIKKyNkZWZpbmUgUFlfVkVSU0lPTiAgICAgIAkiMy41LjBhMiIKIC8qLS1lbmQgY29uc3RhbnRzLS0qLwogCiAvKiBWZXJzaW9uIGFzIGEgc2luZ2xlIDQtYnl0ZSBoZXggbnVtYmVyLCBlLmcuIDB4MDEwNTAyQjIgPT0gMS41LjJiMi4KZGlmZiAtLWdpdCBhL0luY2x1ZGUvdW5pY29kZW9iamVjdC5oIGIvSW5jbHVkZS91bmljb2Rlb2JqZWN0LmgKaW5kZXggZDJmZmFiZS4uODE0ZDdjMCAxMDA2NDQKLS0tIGEvSW5jbHVkZS91bmljb2Rlb2JqZWN0LmgKKysrIGIvSW5jbHVkZS91bmljb2Rlb2JqZWN0LmgKQEAgLTEwNTIsNyArMTA1Miw3IEBACiAgICBhbHdheXMgZW5kcyB3aXRoIGEgbnVsIGNoYXJhY3Rlci4gSWYgc2l6ZSBpcyBub3QgTlVMTCwgd3JpdGUgdGhlIG51bWJlciBvZgogICAgd2lkZSBjaGFyYWN0ZXJzIChleGNsdWRpbmcgdGhlIG51bGwgY2hhcmFjdGVyKSBpbnRvICpzaXplLgogCi0gICBSZXR1cm5zIGEgYnVmZmVyIGFsbG9jYXRlZCBieSBQeU1lbV9BbGxvYygpICh1c2UgUHlNZW1fRnJlZSgpIHRvIGZyZWUgaXQpCisgICBSZXR1cm5zIGEgYnVmZmVyIGFsbG9jYXRlZCBieSBQeU1lbV9NYWxsb2MoKSAodXNlIFB5TWVtX0ZyZWUoKSB0byBmcmVlIGl0KQogICAgb24gc3VjY2Vzcy4gT24gZXJyb3IsIHJldHVybnMgTlVMTCwgKnNpemUgaXMgdW5kZWZpbmVkIGFuZCByYWlzZXMgYQogICAgTWVtb3J5RXJyb3IuICovCiAKZGlmZiAtLWdpdCBhL0xpYi9fcHlkZWNpbWFsLnB5IGIvTGliL19weWRlY2ltYWwucHkKaW5kZXggY2E2YzRiZC4uODgyMjJiZSAxMDA2NDQKLS0tIGEvTGliL19weWRlY2ltYWwucHkKKysrIGIvTGliL19weWRlY2ltYWwucHkKQEAgLTQxMDgsNyArNDEwOCw3IEBACiAgICAgICAgID4+PiBjb250ZXh0LmNyZWF0ZV9kZWNpbWFsX2Zyb21fZmxvYXQoMy4xNDE1OTI2NTM1ODk3OTMyKQogICAgICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAgICAgICAgICAuLi4KLSAgICAgICAgZGVjaW1hbC5JbmV4YWN0OiBOb25lCisgICAgICAgIGRlY2ltYWwuSW5leGFjdAogCiAgICAgICAgICIiIgogICAgICAgICBkID0gRGVjaW1hbC5mcm9tX2Zsb2F0KGYpICAgICAgICMgQW4gZXhhY3QgY29udmVyc2lvbgpkaWZmIC0tZ2l0IGEvTGliL2FyZ3BhcnNlLnB5IGIvTGliL2FyZ3BhcnNlLnB5CmluZGV4IGJhOWUzZGYuLjlhMDY3MTkgMTAwNjQ0Ci0tLSBhL0xpYi9hcmdwYXJzZS5weQorKysgYi9MaWIvYXJncGFyc2UucHkKQEAgLTE1OTAsNiArMTU5MCw3IEBACiAgICAgICAgIC0gYXJndW1lbnRfZGVmYXVsdCAtLSBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgYWxsIGFyZ3VtZW50cwogICAgICAgICAtIGNvbmZsaWN0X2hhbmRsZXIgLS0gU3RyaW5nIGluZGljYXRpbmcgaG93IHRvIGhhbmRsZSBjb25mbGljdHMKICAgICAgICAgLSBhZGRfaGVscCAtLSBBZGQgYSAtaC8taGVscCBvcHRpb24KKyAgICAgICAgLSBhbGxvd19hYmJyZXYgLS0gQWxsb3cgbG9uZyBvcHRpb25zIHRvIGJlIGFiYnJldmlhdGVkIHVuYW1iaWd1b3VzbHkKICAgICAiIiIKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLApAQCAtMTYwMyw3ICsxNjA0LDggQEAKICAgICAgICAgICAgICAgICAgZnJvbWZpbGVfcHJlZml4X2NoYXJzPU5vbmUsCiAgICAgICAgICAgICAgICAgIGFyZ3VtZW50X2RlZmF1bHQ9Tm9uZSwKICAgICAgICAgICAgICAgICAgY29uZmxpY3RfaGFuZGxlcj0nZXJyb3InLAotICAgICAgICAgICAgICAgICBhZGRfaGVscD1UcnVlKToKKyAgICAgICAgICAgICAgICAgYWRkX2hlbHA9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgYWxsb3dfYWJicmV2PVRydWUpOgogCiAgICAgICAgIHN1cGVyaW5pdCA9IHN1cGVyKEFyZ3VtZW50UGFyc2VyLCBzZWxmKS5fX2luaXRfXwogICAgICAgICBzdXBlcmluaXQoZGVzY3JpcHRpb249ZGVzY3JpcHRpb24sCkBAIC0xNjIxLDYgKzE2MjMsNyBAQAogICAgICAgICBzZWxmLmZvcm1hdHRlcl9jbGFzcyA9IGZvcm1hdHRlcl9jbGFzcwogICAgICAgICBzZWxmLmZyb21maWxlX3ByZWZpeF9jaGFycyA9IGZyb21maWxlX3ByZWZpeF9jaGFycwogICAgICAgICBzZWxmLmFkZF9oZWxwID0gYWRkX2hlbHAKKyAgICAgICAgc2VsZi5hbGxvd19hYmJyZXYgPSBhbGxvd19hYmJyZXYKIAogICAgICAgICBhZGRfZ3JvdXAgPSBzZWxmLmFkZF9hcmd1bWVudF9ncm91cAogICAgICAgICBzZWxmLl9wb3NpdGlvbmFscyA9IGFkZF9ncm91cChfKCdwb3NpdGlvbmFsIGFyZ3VtZW50cycpKQpAQCAtMjA5OCwyMyArMjEwMSwyNCBAQAogICAgICAgICAgICAgICAgIGFjdGlvbiA9IHNlbGYuX29wdGlvbl9zdHJpbmdfYWN0aW9uc1tvcHRpb25fc3RyaW5nXQogICAgICAgICAgICAgICAgIHJldHVybiBhY3Rpb24sIG9wdGlvbl9zdHJpbmcsIGV4cGxpY2l0X2FyZwogCi0gICAgICAgICMgc2VhcmNoIHRocm91Z2ggYWxsIHBvc3NpYmxlIHByZWZpeGVzIG9mIHRoZSBvcHRpb24gc3RyaW5nCi0gICAgICAgICMgYW5kIGFsbCBhY3Rpb25zIGluIHRoZSBwYXJzZXIgZm9yIHBvc3NpYmxlIGludGVycHJldGF0aW9ucwotICAgICAgICBvcHRpb25fdHVwbGVzID0gc2VsZi5fZ2V0X29wdGlvbl90dXBsZXMoYXJnX3N0cmluZykKKyAgICAgICAgaWYgc2VsZi5hbGxvd19hYmJyZXY6CisgICAgICAgICAgICAjIHNlYXJjaCB0aHJvdWdoIGFsbCBwb3NzaWJsZSBwcmVmaXhlcyBvZiB0aGUgb3B0aW9uIHN0cmluZworICAgICAgICAgICAgIyBhbmQgYWxsIGFjdGlvbnMgaW4gdGhlIHBhcnNlciBmb3IgcG9zc2libGUgaW50ZXJwcmV0YXRpb25zCisgICAgICAgICAgICBvcHRpb25fdHVwbGVzID0gc2VsZi5fZ2V0X29wdGlvbl90dXBsZXMoYXJnX3N0cmluZykKIAotICAgICAgICAjIGlmIG11bHRpcGxlIGFjdGlvbnMgbWF0Y2gsIHRoZSBvcHRpb24gc3RyaW5nIHdhcyBhbWJpZ3VvdXMKLSAgICAgICAgaWYgbGVuKG9wdGlvbl90dXBsZXMpID4gMToKLSAgICAgICAgICAgIG9wdGlvbnMgPSAnLCAnLmpvaW4oW29wdGlvbl9zdHJpbmcKLSAgICAgICAgICAgICAgICBmb3IgYWN0aW9uLCBvcHRpb25fc3RyaW5nLCBleHBsaWNpdF9hcmcgaW4gb3B0aW9uX3R1cGxlc10pCi0gICAgICAgICAgICBhcmdzID0geydvcHRpb24nOiBhcmdfc3RyaW5nLCAnbWF0Y2hlcyc6IG9wdGlvbnN9Ci0gICAgICAgICAgICBtc2cgPSBfKCdhbWJpZ3VvdXMgb3B0aW9uOiAlKG9wdGlvbilzIGNvdWxkIG1hdGNoICUobWF0Y2hlcylzJykKLSAgICAgICAgICAgIHNlbGYuZXJyb3IobXNnICUgYXJncykKKyAgICAgICAgICAgICMgaWYgbXVsdGlwbGUgYWN0aW9ucyBtYXRjaCwgdGhlIG9wdGlvbiBzdHJpbmcgd2FzIGFtYmlndW91cworICAgICAgICAgICAgaWYgbGVuKG9wdGlvbl90dXBsZXMpID4gMToKKyAgICAgICAgICAgICAgICBvcHRpb25zID0gJywgJy5qb2luKFtvcHRpb25fc3RyaW5nCisgICAgICAgICAgICAgICAgICAgIGZvciBhY3Rpb24sIG9wdGlvbl9zdHJpbmcsIGV4cGxpY2l0X2FyZyBpbiBvcHRpb25fdHVwbGVzXSkKKyAgICAgICAgICAgICAgICBhcmdzID0geydvcHRpb24nOiBhcmdfc3RyaW5nLCAnbWF0Y2hlcyc6IG9wdGlvbnN9CisgICAgICAgICAgICAgICAgbXNnID0gXygnYW1iaWd1b3VzIG9wdGlvbjogJShvcHRpb24pcyBjb3VsZCBtYXRjaCAlKG1hdGNoZXMpcycpCisgICAgICAgICAgICAgICAgc2VsZi5lcnJvcihtc2cgJSBhcmdzKQogCi0gICAgICAgICMgaWYgZXhhY3RseSBvbmUgYWN0aW9uIG1hdGNoZWQsIHRoaXMgc2VnbWVudGF0aW9uIGlzIGdvb2QsCi0gICAgICAgICMgc28gcmV0dXJuIHRoZSBwYXJzZWQgYWN0aW9uCi0gICAgICAgIGVsaWYgbGVuKG9wdGlvbl90dXBsZXMpID09IDE6Ci0gICAgICAgICAgICBvcHRpb25fdHVwbGUsID0gb3B0aW9uX3R1cGxlcwotICAgICAgICAgICAgcmV0dXJuIG9wdGlvbl90dXBsZQorICAgICAgICAgICAgIyBpZiBleGFjdGx5IG9uZSBhY3Rpb24gbWF0Y2hlZCwgdGhpcyBzZWdtZW50YXRpb24gaXMgZ29vZCwKKyAgICAgICAgICAgICMgc28gcmV0dXJuIHRoZSBwYXJzZWQgYWN0aW9uCisgICAgICAgICAgICBlbGlmIGxlbihvcHRpb25fdHVwbGVzKSA9PSAxOgorICAgICAgICAgICAgICAgIG9wdGlvbl90dXBsZSwgPSBvcHRpb25fdHVwbGVzCisgICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbl90dXBsZQogCiAgICAgICAgICMgaWYgaXQgd2FzIG5vdCBmb3VuZCBhcyBhbiBvcHRpb24sIGJ1dCBpdCBsb29rcyBsaWtlIGEgbmVnYXRpdmUKICAgICAgICAgIyBudW1iZXIsIGl0IHdhcyBtZWFudCB0byBiZSBwb3NpdGlvbmFsCmRpZmYgLS1naXQgYS9MaWIvYXN5bmNpby9iYXNlX3N1YnByb2Nlc3MucHkgYi9MaWIvYXN5bmNpby9iYXNlX3N1YnByb2Nlc3MucHkKaW5kZXggMDJiOWU4OS4uYzFjZGZkYSAxMDA2NDQKLS0tIGEvTGliL2FzeW5jaW8vYmFzZV9zdWJwcm9jZXNzLnB5CisrKyBiL0xpYi9hc3luY2lvL2Jhc2Vfc3VicHJvY2Vzcy5weQpAQCAtNTcsNiArNTcsOCBAQAogICAgICAgICBpbmZvLmFwcGVuZCgncGlkPSVzJyAlIHNlbGYuX3BpZCkKICAgICAgICAgaWYgc2VsZi5fcmV0dXJuY29kZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgIGluZm8uYXBwZW5kKCdyZXR1cm5jb2RlPSVzJyAlIHNlbGYuX3JldHVybmNvZGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpbmZvLmFwcGVuZCgncnVubmluZycpCiAKICAgICAgICAgc3RkaW4gPSBzZWxmLl9waXBlcy5nZXQoMCkKICAgICAgICAgaWYgc3RkaW4gaXMgbm90IE5vbmU6CkBAIC03NywxMiArNzksNiBAQAogICAgIGRlZiBfc3RhcnQoc2VsZiwgYXJncywgc2hlbGwsIHN0ZGluLCBzdGRvdXQsIHN0ZGVyciwgYnVmc2l6ZSwgKiprd2FyZ3MpOgogICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCiAKLSAgICBkZWYgX21ha2Vfd3JpdGVfc3VicHJvY2Vzc19waXBlX3Byb3RvKHNlbGYsIGZkKToKLSAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgotCi0gICAgZGVmIF9tYWtlX3JlYWRfc3VicHJvY2Vzc19waXBlX3Byb3RvKHNlbGYsIGZkKToKLSAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgotCiAgICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgICBpZiBzZWxmLl9jbG9zZWQ6CiAgICAgICAgICAgICByZXR1cm4KQEAgLTkzLDcgKzg5LDEyIEBACiAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgIHByb3RvLnBpcGUuY2xvc2UoKQogCi0gICAgICAgIGlmIHNlbGYuX3Byb2MgaXMgbm90IE5vbmUgYW5kIHNlbGYuX3JldHVybmNvZGUgaXMgTm9uZToKKyAgICAgICAgaWYgKHNlbGYuX3Byb2MgaXMgbm90IE5vbmUKKyAgICAgICAgIyB0aGUgY2hpbGQgcHJvY2VzcyBmaW5pc2hlZD8KKyAgICAgICAgYW5kIHNlbGYuX3JldHVybmNvZGUgaXMgTm9uZQorICAgICAgICAjIHRoZSBjaGlsZCBwcm9jZXNzIGZpbmlzaGVkIGJ1dCB0aGUgdHJhbnNwb3J0IHdhcyBub3Qgbm90aWZpZWQgeWV0PworICAgICAgICBhbmQgc2VsZi5fcHJvYy5wb2xsKCkgaXMgTm9uZQorICAgICAgICApOgogICAgICAgICAgICAgaWYgc2VsZi5fbG9vcC5nZXRfZGVidWcoKToKICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygnQ2xvc2UgcnVubmluZyBjaGlsZCBwcm9jZXNzOiBraWxsICVyJywgc2VsZikKIApkaWZmIC0tZ2l0IGEvTGliL2FzeW5jaW8vcXVldWVzLnB5IGIvTGliL2FzeW5jaW8vcXVldWVzLnB5CmluZGV4IDRhZWI2YzQuLjg0Y2RhYmMgMTAwNjQ0Ci0tLSBhL0xpYi9hc3luY2lvL3F1ZXVlcy5weQorKysgYi9MaWIvYXN5bmNpby9xdWV1ZXMucHkKQEAgLTEsNyArMSw3IEBACiAiIiJRdWV1ZXMiIiIKIAotX19hbGxfXyA9IFsnUXVldWUnLCAnUHJpb3JpdHlRdWV1ZScsICdMaWZvUXVldWUnLCAnSm9pbmFibGVRdWV1ZScsCi0gICAgICAgICAgICdRdWV1ZUZ1bGwnLCAnUXVldWVFbXB0eSddCitfX2FsbF9fID0gWydRdWV1ZScsICdQcmlvcml0eVF1ZXVlJywgJ0xpZm9RdWV1ZScsICdRdWV1ZUZ1bGwnLCAnUXVldWVFbXB0eScsCisgICAgICAgICAgICdKb2luYWJsZVF1ZXVlJ10KIAogaW1wb3J0IGNvbGxlY3Rpb25zCiBpbXBvcnQgaGVhcHEKQEAgLTQ5LDYgKzQ5LDkgQEAKICAgICAgICAgc2VsZi5fZ2V0dGVycyA9IGNvbGxlY3Rpb25zLmRlcXVlKCkKICAgICAgICAgIyBQYWlycyBvZiAoaXRlbSwgRnV0dXJlKS4KICAgICAgICAgc2VsZi5fcHV0dGVycyA9IGNvbGxlY3Rpb25zLmRlcXVlKCkKKyAgICAgICAgc2VsZi5fdW5maW5pc2hlZF90YXNrcyA9IDAKKyAgICAgICAgc2VsZi5fZmluaXNoZWQgPSBsb2Nrcy5FdmVudChsb29wPXNlbGYuX2xvb3ApCisgICAgICAgIHNlbGYuX2ZpbmlzaGVkLnNldCgpCiAgICAgICAgIHNlbGYuX2luaXQobWF4c2l6ZSkKIAogICAgIGRlZiBfaW5pdChzZWxmLCBtYXhzaXplKToKQEAgLTU5LDYgKzYyLDggQEAKIAogICAgIGRlZiBfcHV0KHNlbGYsIGl0ZW0pOgogICAgICAgICBzZWxmLl9xdWV1ZS5hcHBlbmQoaXRlbSkKKyAgICAgICAgc2VsZi5fdW5maW5pc2hlZF90YXNrcyArPSAxCisgICAgICAgIHNlbGYuX2ZpbmlzaGVkLmNsZWFyKCkKIAogICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICAgcmV0dXJuICc8e30gYXQgezojeH0ge30+Jy5mb3JtYXQoCkBAIC03NSw2ICs4MCw4IEBACiAgICAgICAgICAgICByZXN1bHQgKz0gJyBfZ2V0dGVyc1t7fV0nLmZvcm1hdChsZW4oc2VsZi5fZ2V0dGVycykpCiAgICAgICAgIGlmIHNlbGYuX3B1dHRlcnM6CiAgICAgICAgICAgICByZXN1bHQgKz0gJyBfcHV0dGVyc1t7fV0nLmZvcm1hdChsZW4oc2VsZi5fcHV0dGVycykpCisgICAgICAgIGlmIHNlbGYuX3VuZmluaXNoZWRfdGFza3M6CisgICAgICAgICAgICByZXN1bHQgKz0gJyB0YXNrcz17fScuZm9ybWF0KHNlbGYuX3VuZmluaXNoZWRfdGFza3MpCiAgICAgICAgIHJldHVybiByZXN1bHQKIAogICAgIGRlZiBfY29uc3VtZV9kb25lX2dldHRlcnMoc2VsZik6CkBAIC0xMjYsOSArMTMzLDYgQEAKICAgICAgICAgICAgICAgICAncXVldWUgbm9uLWVtcHR5LCB3aHkgYXJlIGdldHRlcnMgd2FpdGluZz8nKQogCiAgICAgICAgICAgICBnZXR0ZXIgPSBzZWxmLl9nZXR0ZXJzLnBvcGxlZnQoKQotCi0gICAgICAgICAgICAjIFVzZSBfcHV0IGFuZCBfZ2V0IGluc3RlYWQgb2YgcGFzc2luZyBpdGVtIHN0cmFpZ2h0IHRvIGdldHRlciwgaW4KLSAgICAgICAgICAgICMgY2FzZSBhIHN1YmNsYXNzIGhhcyBsb2dpYyB0aGF0IG11c3QgcnVuIChlLmcuIEpvaW5hYmxlUXVldWUpLgogICAgICAgICAgICAgc2VsZi5fcHV0KGl0ZW0pCiAKICAgICAgICAgICAgICMgZ2V0dGVyIGNhbm5vdCBiZSBjYW5jZWxsZWQsIHdlIGp1c3QgcmVtb3ZlZCBkb25lIGdldHRlcnMKQEAgLTE1NCw5ICsxNTgsNiBAQAogICAgICAgICAgICAgICAgICdxdWV1ZSBub24tZW1wdHksIHdoeSBhcmUgZ2V0dGVycyB3YWl0aW5nPycpCiAKICAgICAgICAgICAgIGdldHRlciA9IHNlbGYuX2dldHRlcnMucG9wbGVmdCgpCi0KLSAgICAgICAgICAgICMgVXNlIF9wdXQgYW5kIF9nZXQgaW5zdGVhZCBvZiBwYXNzaW5nIGl0ZW0gc3RyYWlnaHQgdG8gZ2V0dGVyLCBpbgotICAgICAgICAgICAgIyBjYXNlIGEgc3ViY2xhc3MgaGFzIGxvZ2ljIHRoYXQgbXVzdCBydW4gKGUuZy4gSm9pbmFibGVRdWV1ZSkuCiAgICAgICAgICAgICBzZWxmLl9wdXQoaXRlbSkKIAogICAgICAgICAgICAgIyBnZXR0ZXIgY2Fubm90IGJlIGNhbmNlbGxlZCwgd2UganVzdCByZW1vdmVkIGRvbmUgZ2V0dGVycwpAQCAtMjE5LDYgKzIyMCwzOCBAQAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcmFpc2UgUXVldWVFbXB0eQogCisgICAgZGVmIHRhc2tfZG9uZShzZWxmKToKKyAgICAgICAgIiIiSW5kaWNhdGUgdGhhdCBhIGZvcm1lcmx5IGVucXVldWVkIHRhc2sgaXMgY29tcGxldGUuCisKKyAgICAgICAgVXNlZCBieSBxdWV1ZSBjb25zdW1lcnMuIEZvciBlYWNoIGdldCgpIHVzZWQgdG8gZmV0Y2ggYSB0YXNrLAorICAgICAgICBhIHN1YnNlcXVlbnQgY2FsbCB0byB0YXNrX2RvbmUoKSB0ZWxscyB0aGUgcXVldWUgdGhhdCB0aGUgcHJvY2Vzc2luZworICAgICAgICBvbiB0aGUgdGFzayBpcyBjb21wbGV0ZS4KKworICAgICAgICBJZiBhIGpvaW4oKSBpcyBjdXJyZW50bHkgYmxvY2tpbmcsIGl0IHdpbGwgcmVzdW1lIHdoZW4gYWxsIGl0ZW1zIGhhdmUKKyAgICAgICAgYmVlbiBwcm9jZXNzZWQgKG1lYW5pbmcgdGhhdCBhIHRhc2tfZG9uZSgpIGNhbGwgd2FzIHJlY2VpdmVkIGZvciBldmVyeQorICAgICAgICBpdGVtIHRoYXQgaGFkIGJlZW4gcHV0KCkgaW50byB0aGUgcXVldWUpLgorCisgICAgICAgIFJhaXNlcyBWYWx1ZUVycm9yIGlmIGNhbGxlZCBtb3JlIHRpbWVzIHRoYW4gdGhlcmUgd2VyZSBpdGVtcyBwbGFjZWQgaW4KKyAgICAgICAgdGhlIHF1ZXVlLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5fdW5maW5pc2hlZF90YXNrcyA8PSAwOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigndGFza19kb25lKCkgY2FsbGVkIHRvbyBtYW55IHRpbWVzJykKKyAgICAgICAgc2VsZi5fdW5maW5pc2hlZF90YXNrcyAtPSAxCisgICAgICAgIGlmIHNlbGYuX3VuZmluaXNoZWRfdGFza3MgPT0gMDoKKyAgICAgICAgICAgIHNlbGYuX2ZpbmlzaGVkLnNldCgpCisKKyAgICBAY29yb3V0aW5lCisgICAgZGVmIGpvaW4oc2VsZik6CisgICAgICAgICIiIkJsb2NrIHVudGlsIGFsbCBpdGVtcyBpbiB0aGUgcXVldWUgaGF2ZSBiZWVuIGdvdHRlbiBhbmQgcHJvY2Vzc2VkLgorCisgICAgICAgIFRoZSBjb3VudCBvZiB1bmZpbmlzaGVkIHRhc2tzIGdvZXMgdXAgd2hlbmV2ZXIgYW4gaXRlbSBpcyBhZGRlZCB0byB0aGUKKyAgICAgICAgcXVldWUuIFRoZSBjb3VudCBnb2VzIGRvd24gd2hlbmV2ZXIgYSBjb25zdW1lciBjYWxscyB0YXNrX2RvbmUoKSB0bworICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBpdGVtIHdhcyByZXRyaWV2ZWQgYW5kIGFsbCB3b3JrIG9uIGl0IGlzIGNvbXBsZXRlLgorICAgICAgICBXaGVuIHRoZSBjb3VudCBvZiB1bmZpbmlzaGVkIHRhc2tzIGRyb3BzIHRvIHplcm8sIGpvaW4oKSB1bmJsb2Nrcy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuX3VuZmluaXNoZWRfdGFza3MgPiAwOgorICAgICAgICAgICAgeWllbGQgZnJvbSBzZWxmLl9maW5pc2hlZC53YWl0KCkKKwogCiBjbGFzcyBQcmlvcml0eVF1ZXVlKFF1ZXVlKToKICAgICAiIiJBIHN1YmNsYXNzIG9mIFF1ZXVlOyByZXRyaWV2ZXMgZW50cmllcyBpbiBwcmlvcml0eSBvcmRlciAobG93ZXN0IGZpcnN0KS4KQEAgLTI0OSw1NCArMjgyLDUgQEAKICAgICAgICAgcmV0dXJuIHNlbGYuX3F1ZXVlLnBvcCgpCiAKIAotY2xhc3MgSm9pbmFibGVRdWV1ZShRdWV1ZSk6Ci0gICAgIiIiQSBzdWJjbGFzcyBvZiBRdWV1ZSB3aXRoIHRhc2tfZG9uZSgpIGFuZCBqb2luKCkgbWV0aG9kcy4iIiIKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXhzaXplPTAsICosIGxvb3A9Tm9uZSk6Ci0gICAgICAgIHN1cGVyKCkuX19pbml0X18obWF4c2l6ZT1tYXhzaXplLCBsb29wPWxvb3ApCi0gICAgICAgIHNlbGYuX3VuZmluaXNoZWRfdGFza3MgPSAwCi0gICAgICAgIHNlbGYuX2ZpbmlzaGVkID0gbG9ja3MuRXZlbnQobG9vcD1zZWxmLl9sb29wKQotICAgICAgICBzZWxmLl9maW5pc2hlZC5zZXQoKQotCi0gICAgZGVmIF9mb3JtYXQoc2VsZik6Ci0gICAgICAgIHJlc3VsdCA9IFF1ZXVlLl9mb3JtYXQoc2VsZikKLSAgICAgICAgaWYgc2VsZi5fdW5maW5pc2hlZF90YXNrczoKLSAgICAgICAgICAgIHJlc3VsdCArPSAnIHRhc2tzPXt9Jy5mb3JtYXQoc2VsZi5fdW5maW5pc2hlZF90YXNrcykKLSAgICAgICAgcmV0dXJuIHJlc3VsdAotCi0gICAgZGVmIF9wdXQoc2VsZiwgaXRlbSk6Ci0gICAgICAgIHN1cGVyKCkuX3B1dChpdGVtKQotICAgICAgICBzZWxmLl91bmZpbmlzaGVkX3Rhc2tzICs9IDEKLSAgICAgICAgc2VsZi5fZmluaXNoZWQuY2xlYXIoKQotCi0gICAgZGVmIHRhc2tfZG9uZShzZWxmKToKLSAgICAgICAgIiIiSW5kaWNhdGUgdGhhdCBhIGZvcm1lcmx5IGVucXVldWVkIHRhc2sgaXMgY29tcGxldGUuCi0KLSAgICAgICAgVXNlZCBieSBxdWV1ZSBjb25zdW1lcnMuIEZvciBlYWNoIGdldCgpIHVzZWQgdG8gZmV0Y2ggYSB0YXNrLAotICAgICAgICBhIHN1YnNlcXVlbnQgY2FsbCB0byB0YXNrX2RvbmUoKSB0ZWxscyB0aGUgcXVldWUgdGhhdCB0aGUgcHJvY2Vzc2luZwotICAgICAgICBvbiB0aGUgdGFzayBpcyBjb21wbGV0ZS4KLQotICAgICAgICBJZiBhIGpvaW4oKSBpcyBjdXJyZW50bHkgYmxvY2tpbmcsIGl0IHdpbGwgcmVzdW1lIHdoZW4gYWxsIGl0ZW1zIGhhdmUKLSAgICAgICAgYmVlbiBwcm9jZXNzZWQgKG1lYW5pbmcgdGhhdCBhIHRhc2tfZG9uZSgpIGNhbGwgd2FzIHJlY2VpdmVkIGZvciBldmVyeQotICAgICAgICBpdGVtIHRoYXQgaGFkIGJlZW4gcHV0KCkgaW50byB0aGUgcXVldWUpLgotCi0gICAgICAgIFJhaXNlcyBWYWx1ZUVycm9yIGlmIGNhbGxlZCBtb3JlIHRpbWVzIHRoYW4gdGhlcmUgd2VyZSBpdGVtcyBwbGFjZWQgaW4KLSAgICAgICAgdGhlIHF1ZXVlLgotICAgICAgICAiIiIKLSAgICAgICAgaWYgc2VsZi5fdW5maW5pc2hlZF90YXNrcyA8PSAwOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigndGFza19kb25lKCkgY2FsbGVkIHRvbyBtYW55IHRpbWVzJykKLSAgICAgICAgc2VsZi5fdW5maW5pc2hlZF90YXNrcyAtPSAxCi0gICAgICAgIGlmIHNlbGYuX3VuZmluaXNoZWRfdGFza3MgPT0gMDoKLSAgICAgICAgICAgIHNlbGYuX2ZpbmlzaGVkLnNldCgpCi0KLSAgICBAY29yb3V0aW5lCi0gICAgZGVmIGpvaW4oc2VsZik6Ci0gICAgICAgICIiIkJsb2NrIHVudGlsIGFsbCBpdGVtcyBpbiB0aGUgcXVldWUgaGF2ZSBiZWVuIGdvdHRlbiBhbmQgcHJvY2Vzc2VkLgotCi0gICAgICAgIFRoZSBjb3VudCBvZiB1bmZpbmlzaGVkIHRhc2tzIGdvZXMgdXAgd2hlbmV2ZXIgYW4gaXRlbSBpcyBhZGRlZCB0byB0aGUKLSAgICAgICAgcXVldWUuIFRoZSBjb3VudCBnb2VzIGRvd24gd2hlbmV2ZXIgYSBjb25zdW1lciB0aHJlYWQgY2FsbHMgdGFza19kb25lKCkKLSAgICAgICAgdG8gaW5kaWNhdGUgdGhhdCB0aGUgaXRlbSB3YXMgcmV0cmlldmVkIGFuZCBhbGwgd29yayBvbiBpdCBpcyBjb21wbGV0ZS4KLSAgICAgICAgV2hlbiB0aGUgY291bnQgb2YgdW5maW5pc2hlZCB0YXNrcyBkcm9wcyB0byB6ZXJvLCBqb2luKCkgdW5ibG9ja3MuCi0gICAgICAgICIiIgotICAgICAgICBpZiBzZWxmLl91bmZpbmlzaGVkX3Rhc2tzID4gMDoKLSAgICAgICAgICAgIHlpZWxkIGZyb20gc2VsZi5fZmluaXNoZWQud2FpdCgpCitKb2luYWJsZVF1ZXVlID0gUXVldWUKKyIiIkRlcHJlY2F0ZWQgYWxpYXMgZm9yIFF1ZXVlLiIiIgpkaWZmIC0tZ2l0IGEvTGliL2NvZGUucHkgYi9MaWIvY29kZS5weQppbmRleCA4NmUxZjAzLi41MzI0NGUzIDEwMDY0NAotLS0gYS9MaWIvY29kZS5weQorKysgYi9MaWIvY29kZS5weQpAQCAtMTQwLDMyICsxNDAsMTUgQEAKICAgICAgICAgc3lzLmxhc3RfdHlwZSwgc3lzLmxhc3RfdmFsdWUsIGxhc3RfdGIgPSBlaSA9IHN5cy5leGNfaW5mbygpCiAgICAgICAgIHN5cy5sYXN0X3RyYWNlYmFjayA9IGxhc3RfdGIKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgbGluZXMgPSBbXQotICAgICAgICAgICAgZm9yIHZhbHVlLCB0YiBpbiB0cmFjZWJhY2suX2l0ZXJfY2hhaW4oKmVpWzE6XSk6Ci0gICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgc3RyKToKLSAgICAgICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKHZhbHVlKQotICAgICAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQoJ1xuJykKLSAgICAgICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgICAgICBpZiB0YjoKLSAgICAgICAgICAgICAgICAgICAgdGJsaXN0ID0gdHJhY2ViYWNrLmV4dHJhY3RfdGIodGIpCi0gICAgICAgICAgICAgICAgICAgIGlmIHRiIGlzIGxhc3RfdGI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBsYXN0IHRyYWNlYmFjayBpbmNsdWRlcyB0aGUgZnJhbWUgd2UKLSAgICAgICAgICAgICAgICAgICAgICAgICMgZXhlYydkIGluCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWwgdGJsaXN0WzoxXQotICAgICAgICAgICAgICAgICAgICB0YmxpbmVzID0gdHJhY2ViYWNrLmZvcm1hdF9saXN0KHRibGlzdCkKLSAgICAgICAgICAgICAgICAgICAgaWYgdGJsaW5lczoKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZCgiVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOlxuIikKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzLmV4dGVuZCh0YmxpbmVzKQotICAgICAgICAgICAgICAgIGxpbmVzLmV4dGVuZCh0cmFjZWJhY2suZm9ybWF0X2V4Y2VwdGlvbl9vbmx5KHR5cGUodmFsdWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKSkKKyAgICAgICAgICAgIGxpbmVzID0gdHJhY2ViYWNrLmZvcm1hdF9leGNlcHRpb24oZWlbMF0sIGVpWzFdLCBsYXN0X3RiLnRiX25leHQpCisgICAgICAgICAgICBpZiBzeXMuZXhjZXB0aG9vayBpcyBzeXMuX19leGNlcHRob29rX186CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZSgnJy5qb2luKGxpbmVzKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBJZiBzb21lb25lIGhhcyBzZXQgc3lzLmV4Y2VwdGhvb2ssIHdlIGxldCB0aGF0IHRha2UgcHJlY2VkZW5jZQorICAgICAgICAgICAgICAgICMgb3ZlciBzZWxmLndyaXRlCisgICAgICAgICAgICAgICAgc3lzLmV4Y2VwdGhvb2soZWlbMF0sIGVpWzFdLCBsYXN0X3RiKQogICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgdGJsaXN0ID0gbGFzdF90YiA9IGVpID0gTm9uZQotICAgICAgICBpZiBzeXMuZXhjZXB0aG9vayBpcyBzeXMuX19leGNlcHRob29rX186Ci0gICAgICAgICAgICBzZWxmLndyaXRlKCcnLmpvaW4obGluZXMpKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgIyBJZiBzb21lb25lIGhhcyBzZXQgc3lzLmV4Y2VwdGhvb2ssIHdlIGxldCB0aGF0IHRha2UgcHJlY2VkZW5jZQotICAgICAgICAgICAgIyBvdmVyIHNlbGYud3JpdGUKLSAgICAgICAgICAgIHN5cy5leGNlcHRob29rKHR5cGUsIHZhbHVlLCBsYXN0X3RiKQorICAgICAgICAgICAgbGFzdF90YiA9IGVpID0gTm9uZQogCiAgICAgZGVmIHdyaXRlKHNlbGYsIGRhdGEpOgogICAgICAgICAiIiJXcml0ZSBhIHN0cmluZy4KZGlmZiAtLWdpdCBhL0xpYi9kYXRldGltZS5weSBiL0xpYi9kYXRldGltZS5weQppbmRleCA0YWZlOWE1Li5kZTU3NDcyIDEwMDY0NAotLS0gYS9MaWIvZGF0ZXRpbWUucHkKKysrIGIvTGliL2RhdGV0aW1lLnB5CkBAIC0yOTcsNiArMjk3LDI1IEBACiAgICAgcmFpc2UgVHlwZUVycm9yKCJjYW4ndCBjb21wYXJlICclcycgdG8gJyVzJyIgJSAoCiAgICAgICAgICAgICAgICAgICAgIHR5cGUoeCkuX19uYW1lX18sIHR5cGUoeSkuX19uYW1lX18pKQogCitkZWYgX2RpdmlkZV9hbmRfcm91bmQoYSwgYik6CisgICAgIiIiZGl2aWRlIGEgYnkgYiBhbmQgcm91bmQgcmVzdWx0IHRvIHRoZSBuZWFyZXN0IGludGVnZXIKKworICAgIFdoZW4gdGhlIHJhdGlvIGlzIGV4YWN0bHkgaGFsZi13YXkgYmV0d2VlbiB0d28gaW50ZWdlcnMsCisgICAgdGhlIGV2ZW4gaW50ZWdlciBpcyByZXR1cm5lZC4KKyAgICAiIiIKKyAgICAjIEJhc2VkIG9uIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZm9yIGRpdm1vZF9uZWFyCisgICAgIyBpbiBPYmplY3RzL2xvbmdvYmplY3QuYy4KKyAgICBxLCByID0gZGl2bW9kKGEsIGIpCisgICAgIyByb3VuZCB1cCBpZiBlaXRoZXIgciAvIGIgPiAwLjUsIG9yIHIgLyBiID09IDAuNSBhbmQgcSBpcyBvZGQuCisgICAgIyBUaGUgZXhwcmVzc2lvbiByIC8gYiA+IDAuNSBpcyBlcXVpdmFsZW50IHRvIDIgKiByID4gYiBpZiBiIGlzCisgICAgIyBwb3NpdGl2ZSwgMiAqIHIgPCBiIGlmIGIgbmVnYXRpdmUuCisgICAgciAqPSAyCisgICAgZ3JlYXRlcl90aGFuX2hhbGYgPSByID4gYiBpZiBiID4gMCBlbHNlIHIgPCBiCisgICAgaWYgZ3JlYXRlcl90aGFuX2hhbGYgb3IgciA9PSBiIGFuZCBxICUgMiA9PSAxOgorICAgICAgICBxICs9IDEKKworICAgIHJldHVybiBxCisKIGNsYXNzIHRpbWVkZWx0YToKICAgICAiIiJSZXByZXNlbnQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gZGF0ZXRpbWUgb2JqZWN0cy4KIApAQCAtNTE1LDggKzUzNCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3NlY29uZHMgKiBvdGhlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmRzICogb3RoZXIpCiAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGZsb2F0KToKKyAgICAgICAgICAgIHVzZWMgPSBzZWxmLl90b19taWNyb3NlY29uZHMoKQogICAgICAgICAgICAgYSwgYiA9IG90aGVyLmFzX2ludGVnZXJfcmF0aW8oKQotICAgICAgICAgICAgcmV0dXJuIHNlbGYgKiBhIC8gYgorICAgICAgICAgICAgcmV0dXJuIHRpbWVkZWx0YSgwLCAwLCBfZGl2aWRlX2FuZF9yb3VuZCh1c2VjICogYSwgYikpCiAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogCiAgICAgX19ybXVsX18gPSBfX211bF9fCkBAIC01NDEsMTAgKzU2MSwxMCBAQAogICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0aW1lZGVsdGEpOgogICAgICAgICAgICAgcmV0dXJuIHVzZWMgLyBvdGhlci5fdG9fbWljcm9zZWNvbmRzKCkKICAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgaW50KToKLSAgICAgICAgICAgIHJldHVybiB0aW1lZGVsdGEoMCwgMCwgdXNlYyAvIG90aGVyKQorICAgICAgICAgICAgcmV0dXJuIHRpbWVkZWx0YSgwLCAwLCBfZGl2aWRlX2FuZF9yb3VuZCh1c2VjLCBvdGhlcikpCiAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGZsb2F0KToKICAgICAgICAgICAgIGEsIGIgPSBvdGhlci5hc19pbnRlZ2VyX3JhdGlvKCkKLSAgICAgICAgICAgIHJldHVybiB0aW1lZGVsdGEoMCwgMCwgYiAqIHVzZWMgLyBhKQorICAgICAgICAgICAgcmV0dXJuIHRpbWVkZWx0YSgwLCAwLCBfZGl2aWRlX2FuZF9yb3VuZChiICogdXNlYywgYSkpCiAKICAgICBkZWYgX19tb2RfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHRpbWVkZWx0YSk6CkBAIC0xMzczLDcgKzEzOTMsNyBAQAogCiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIHV0Y2Zyb210aW1lc3RhbXAoY2xzLCB0KToKLSAgICAgICAgIkNvbnN0cnVjdCBhIFVUQyBkYXRldGltZSBmcm9tIGEgUE9TSVggdGltZXN0YW1wIChsaWtlIHRpbWUudGltZSgpKS4iCisgICAgICAgICIiIkNvbnN0cnVjdCBhIG5haXZlIFVUQyBkYXRldGltZSBmcm9tIGEgUE9TSVggdGltZXN0YW1wLiIiIgogICAgICAgICB0LCBmcmFjID0gZGl2bW9kKHQsIDEuMCkKICAgICAgICAgdXMgPSBpbnQoZnJhYyAqIDFlNikKIApkaWZmIC0tZ2l0IGEvTGliL2RibS9kdW1iLnB5IGIvTGliL2RibS9kdW1iLnB5CmluZGV4IGY5NWFiODUuLjM0MjQwOTYgMTAwNjQ0Ci0tLSBhL0xpYi9kYm0vZHVtYi5weQorKysgYi9MaWIvZGJtL2R1bWIucHkKQEAgLTIxLDYgKzIxLDcgQEAKIAogIiIiCiAKK2ltcG9ydCBhc3QgYXMgX2FzdAogaW1wb3J0IGlvIGFzIF9pbwogaW1wb3J0IG9zIGFzIF9vcwogaW1wb3J0IGNvbGxlY3Rpb25zCkBAIC05NSw3ICs5Niw3IEBACiAgICAgICAgICAgICB3aXRoIGY6CiAgICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gZjoKICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUucnN0cmlwKCkKLSAgICAgICAgICAgICAgICAgICAga2V5LCBwb3NfYW5kX3Npel9wYWlyID0gZXZhbChsaW5lKQorICAgICAgICAgICAgICAgICAgICBrZXksIHBvc19hbmRfc2l6X3BhaXIgPSBfYXN0LmxpdGVyYWxfZXZhbChsaW5lKQogICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXkuZW5jb2RlKCdMYXRpbi0xJykKICAgICAgICAgICAgICAgICAgICAgc2VsZi5faW5kZXhba2V5XSA9IHBvc19hbmRfc2l6X3BhaXIKIApkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9fX2luaXRfXy5weSBiL0xpYi9kaXN0dXRpbHMvX19pbml0X18ucHkKaW5kZXggNjdlYzc4Yi4uNDUxYzVmYiAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9fX2luaXRfXy5weQorKysgYi9MaWIvZGlzdHV0aWxzL19faW5pdF9fLnB5CkBAIC0xMyw1ICsxMyw1IEBACiAjIFVwZGF0ZWQgYXV0b21hdGljYWxseSBieSB0aGUgUHl0aG9uIHJlbGVhc2UgcHJvY2Vzcy4KICMKICMtLXN0YXJ0IGNvbnN0YW50cy0tCi1fX3ZlcnNpb25fXyA9ICIzLjUuMGExIgorX192ZXJzaW9uX18gPSAiMy41LjBhMiIKICMtLWVuZCBjb25zdGFudHMtLQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGwucHkgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbC5weQppbmRleCBkNzY4ZGM1Li42N2RiMDA3IDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbC5weQorKysgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbC5weQpAQCAtNTEsNyArNTEsNyBAQAogICAgICAgICAncHVyZWxpYic6ICckdXNlcnNpdGUnLAogICAgICAgICAncGxhdGxpYic6ICckdXNlcnNpdGUnLAogICAgICAgICAnaGVhZGVycyc6ICckdXNlcmJhc2UvUHl0aG9uJHB5X3ZlcnNpb25fbm9kb3QvSW5jbHVkZS8kZGlzdF9uYW1lJywKLSAgICAgICAgJ3NjcmlwdHMnOiAnJHVzZXJiYXNlL1NjcmlwdHMnLAorICAgICAgICAnc2NyaXB0cyc6ICckdXNlcmJhc2UvUHl0aG9uJHB5X3ZlcnNpb25fbm9kb3QvU2NyaXB0cycsCiAgICAgICAgICdkYXRhJyAgIDogJyR1c2VyYmFzZScsCiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvTGliL2Z1bmN0b29scy5weSBiL0xpYi9mdW5jdG9vbHMucHkKaW5kZXggMjBhMjZmOS4uOTFlOTY4NSAxMDA2NDQKLS0tIGEvTGliL2Z1bmN0b29scy5weQorKysgYi9MaWIvZnVuY3Rvb2xzLnB5CkBAIC0yNDEsNiArMjQxLDE0IEBACiAgICAgIiIiTmV3IGZ1bmN0aW9uIHdpdGggcGFydGlhbCBhcHBsaWNhdGlvbiBvZiB0aGUgZ2l2ZW4gYXJndW1lbnRzCiAgICAgYW5kIGtleXdvcmRzLgogICAgICIiIgorICAgIGlmIGhhc2F0dHIoZnVuYywgJ2Z1bmMnKToKKyAgICAgICAgYXJncyA9IGZ1bmMuYXJncyArIGFyZ3MKKyAgICAgICAgdG1wa3cgPSBmdW5jLmtleXdvcmRzLmNvcHkoKQorICAgICAgICB0bXBrdy51cGRhdGUoa2V5d29yZHMpCisgICAgICAgIGtleXdvcmRzID0gdG1wa3cKKyAgICAgICAgZGVsIHRtcGt3CisgICAgICAgIGZ1bmMgPSBmdW5jLmZ1bmMKKwogICAgIGRlZiBuZXdmdW5jKCpmYXJncywgKipma2V5d29yZHMpOgogICAgICAgICBuZXdrZXl3b3JkcyA9IGtleXdvcmRzLmNvcHkoKQogICAgICAgICBuZXdrZXl3b3Jkcy51cGRhdGUoZmtleXdvcmRzKQpkaWZmIC0tZ2l0IGEvTGliL2h0dHAvX19pbml0X18ucHkgYi9MaWIvaHR0cC9fX2luaXRfXy5weQppbmRleCA0NzVmMWMwLi5kNDMzNGNjIDEwMDY0NAotLS0gYS9MaWIvaHR0cC9fX2luaXRfXy5weQorKysgYi9MaWIvaHR0cC9fX2luaXRfXy5weQpAQCAtOTMsOCArOTMsOCBAQAogICAgICAgICAnVVJJIGlzIHRvbyBsb25nJykKICAgICBVTlNVUFBPUlRFRF9NRURJQV9UWVBFID0gKDQxNSwgJ1Vuc3VwcG9ydGVkIE1lZGlhIFR5cGUnLAogICAgICAgICAnRW50aXR5IGJvZHkgaW4gdW5zdXBwb3J0ZWQgZm9ybWF0JykKLSAgICBSRVFVRVNUX1JBTkdFX05PVF9TQVRJU0ZJQUJMRSA9ICg0MTYsCi0gICAgICAgICdSZXF1ZXN0IFJhbmdlIE5vdCBTYXRpc2ZpYWJsZScsCisgICAgUkVRVUVTVEVEX1JBTkdFX05PVF9TQVRJU0ZJQUJMRSA9ICg0MTYsCisgICAgICAgICdSZXF1ZXN0ZWQgUmFuZ2UgTm90IFNhdGlzZmlhYmxlJywKICAgICAgICAgJ0Nhbm5vdCBzYXRpc2Z5IHJlcXVlc3QgcmFuZ2UnKQogICAgIEVYUEVDVEFUSU9OX0ZBSUxFRCA9ICg0MTcsICdFeHBlY3RhdGlvbiBGYWlsZWQnLAogICAgICAgICAnRXhwZWN0IGNvbmRpdGlvbiBjb3VsZCBub3QgYmUgc2F0aXNmaWVkJykKQEAgLTEwNyw4ICsxMDcsOCBAQAogICAgIFRPT19NQU5ZX1JFUVVFU1RTID0gKDQyOSwgJ1RvbyBNYW55IFJlcXVlc3RzJywKICAgICAgICAgJ1RoZSB1c2VyIGhhcyBzZW50IHRvbyBtYW55IHJlcXVlc3RzIGluICcKICAgICAgICAgJ2EgZ2l2ZW4gYW1vdW50IG9mIHRpbWUgKCJyYXRlIGxpbWl0aW5nIiknKQotICAgIFJFUVVFU1RfSEVBREVSX0ZJRUxEX1RPT19MQVJHRSA9ICg0MzEsCi0gICAgICAgICdSZXF1ZXN0IEhlYWRlciBGaWVsZCBUb28gTGFyZ2UnLAorICAgIFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0UgPSAoNDMxLAorICAgICAgICAnUmVxdWVzdCBIZWFkZXIgRmllbGRzIFRvbyBMYXJnZScsCiAgICAgICAgICdUaGUgc2VydmVyIGlzIHVud2lsbGluZyB0byBwcm9jZXNzIHRoZSByZXF1ZXN0IGJlY2F1c2UgaXRzIGhlYWRlciAnCiAgICAgICAgICdmaWVsZHMgYXJlIHRvbyBsYXJnZScpCiAKZGlmZiAtLWdpdCBhL0xpYi9odHRwL2NsaWVudC5weSBiL0xpYi9odHRwL2NsaWVudC5weQppbmRleCBhNzdlNTAxLi41ZTEyYTg1IDEwMDY0NAotLS0gYS9MaWIvaHR0cC9jbGllbnQucHkKKysrIGIvTGliL2h0dHAvY2xpZW50LnB5CkBAIC03NSwxMiArNzUsMTQgQEAKIGltcG9ydCBjb2xsZWN0aW9ucwogZnJvbSB1cmxsaWIucGFyc2UgaW1wb3J0IHVybHNwbGl0CiAKKyMgSFRUUE1lc3NhZ2UsIHBhcnNlX2hlYWRlcnMoKSwgYW5kIHRoZSBIVFRQIHN0YXR1cyBjb2RlIGNvbnN0YW50cyBhcmUKKyMgaW50ZW50aW9uYWxseSBvbWl0dGVkIGZvciBzaW1wbGljaXR5CiBfX2FsbF9fID0gWyJIVFRQUmVzcG9uc2UiLCAiSFRUUENvbm5lY3Rpb24iLAogICAgICAgICAgICAiSFRUUEV4Y2VwdGlvbiIsICJOb3RDb25uZWN0ZWQiLCAiVW5rbm93blByb3RvY29sIiwKICAgICAgICAgICAgIlVua25vd25UcmFuc2ZlckVuY29kaW5nIiwgIlVuaW1wbGVtZW50ZWRGaWxlTW9kZSIsCiAgICAgICAgICAgICJJbmNvbXBsZXRlUmVhZCIsICJJbnZhbGlkVVJMIiwgIkltcHJvcGVyQ29ubmVjdGlvblN0YXRlIiwKICAgICAgICAgICAgIkNhbm5vdFNlbmRSZXF1ZXN0IiwgIkNhbm5vdFNlbmRIZWFkZXIiLCAiUmVzcG9uc2VOb3RSZWFkeSIsCi0gICAgICAgICAgICJCYWRTdGF0dXNMaW5lIiwgImVycm9yIiwgInJlc3BvbnNlcyJdCisgICAgICAgICAgICJCYWRTdGF0dXNMaW5lIiwgIkxpbmVUb29Mb25nIiwgImVycm9yIiwgInJlc3BvbnNlcyJdCiAKIEhUVFBfUE9SVCA9IDgwCiBIVFRQU19QT1JUID0gNDQzCmRpZmYgLS1naXQgYS9MaWIvaHR0cC9zZXJ2ZXIucHkgYi9MaWIvaHR0cC9zZXJ2ZXIucHkKaW5kZXggYWM1MzU1MC4uZmQxM2JlMyAxMDA2NDQKLS0tIGEvTGliL2h0dHAvc2VydmVyLnB5CisrKyBiL0xpYi9odHRwL3NlcnZlci5weQpAQCAtODIsNyArODIsMTAgQEAKIAogX192ZXJzaW9uX18gPSAiMC42IgogCi1fX2FsbF9fID0gWyJIVFRQU2VydmVyIiwgIkJhc2VIVFRQUmVxdWVzdEhhbmRsZXIiXQorX19hbGxfXyA9IFsKKyAgICAiSFRUUFNlcnZlciIsICJCYXNlSFRUUFJlcXVlc3RIYW5kbGVyIiwKKyAgICAiU2ltcGxlSFRUUFJlcXVlc3RIYW5kbGVyIiwgIkNHSUhUVFBSZXF1ZXN0SGFuZGxlciIsCitdCiAKIGltcG9ydCBodG1sCiBpbXBvcnQgaHR0cC5jbGllbnQKQEAgLTI3Miw3ICsyNzUsNyBAQAogICAgICAgICAiIiIKICAgICAgICAgc2VsZi5jb21tYW5kID0gTm9uZSAgIyBzZXQgaW4gY2FzZSBvZiBlcnJvciBvbiB0aGUgZmlyc3QgbGluZQogICAgICAgICBzZWxmLnJlcXVlc3RfdmVyc2lvbiA9IHZlcnNpb24gPSBzZWxmLmRlZmF1bHRfcmVxdWVzdF92ZXJzaW9uCi0gICAgICAgIHNlbGYuY2xvc2VfY29ubmVjdGlvbiA9IDEKKyAgICAgICAgc2VsZi5jbG9zZV9jb25uZWN0aW9uID0gVHJ1ZQogICAgICAgICByZXF1ZXN0bGluZSA9IHN0cihzZWxmLnJhd19yZXF1ZXN0bGluZSwgJ2lzby04ODU5LTEnKQogICAgICAgICByZXF1ZXN0bGluZSA9IHJlcXVlc3RsaW5lLnJzdHJpcCgnXHJcbicpCiAgICAgICAgIHNlbGYucmVxdWVzdGxpbmUgPSByZXF1ZXN0bGluZQpAQCAtMzAyLDcgKzMwNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICJCYWQgcmVxdWVzdCB2ZXJzaW9uICglcikiICUgdmVyc2lvbikKICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgICAgIGlmIHZlcnNpb25fbnVtYmVyID49ICgxLCAxKSBhbmQgc2VsZi5wcm90b2NvbF92ZXJzaW9uID49ICJIVFRQLzEuMSI6Ci0gICAgICAgICAgICAgICAgc2VsZi5jbG9zZV9jb25uZWN0aW9uID0gMAorICAgICAgICAgICAgICAgIHNlbGYuY2xvc2VfY29ubmVjdGlvbiA9IEZhbHNlCiAgICAgICAgICAgICBpZiB2ZXJzaW9uX251bWJlciA+PSAoMiwgMCk6CiAgICAgICAgICAgICAgICAgc2VsZi5zZW5kX2Vycm9yKAogICAgICAgICAgICAgICAgICAgICBIVFRQU3RhdHVzLkhUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVELApAQCAtMzEwLDcgKzMxMyw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgIGVsaWYgbGVuKHdvcmRzKSA9PSAyOgogICAgICAgICAgICAgY29tbWFuZCwgcGF0aCA9IHdvcmRzCi0gICAgICAgICAgICBzZWxmLmNsb3NlX2Nvbm5lY3Rpb24gPSAxCisgICAgICAgICAgICBzZWxmLmNsb3NlX2Nvbm5lY3Rpb24gPSBUcnVlCiAgICAgICAgICAgICBpZiBjb21tYW5kICE9ICdHRVQnOgogICAgICAgICAgICAgICAgIHNlbGYuc2VuZF9lcnJvcigKICAgICAgICAgICAgICAgICAgICAgSFRUUFN0YXR1cy5CQURfUkVRVUVTVCwKQEAgLTMzNywxMCArMzQwLDEwIEBACiAKICAgICAgICAgY29ubnR5cGUgPSBzZWxmLmhlYWRlcnMuZ2V0KCdDb25uZWN0aW9uJywgIiIpCiAgICAgICAgIGlmIGNvbm50eXBlLmxvd2VyKCkgPT0gJ2Nsb3NlJzoKLSAgICAgICAgICAgIHNlbGYuY2xvc2VfY29ubmVjdGlvbiA9IDEKKyAgICAgICAgICAgIHNlbGYuY2xvc2VfY29ubmVjdGlvbiA9IFRydWUKICAgICAgICAgZWxpZiAoY29ubnR5cGUubG93ZXIoKSA9PSAna2VlcC1hbGl2ZScgYW5kCiAgICAgICAgICAgICAgIHNlbGYucHJvdG9jb2xfdmVyc2lvbiA+PSAiSFRUUC8xLjEiKToKLSAgICAgICAgICAgIHNlbGYuY2xvc2VfY29ubmVjdGlvbiA9IDAKKyAgICAgICAgICAgIHNlbGYuY2xvc2VfY29ubmVjdGlvbiA9IEZhbHNlCiAgICAgICAgICMgRXhhbWluZSB0aGUgaGVhZGVycyBhbmQgbG9vayBmb3IgYW4gRXhwZWN0IGRpcmVjdGl2ZQogICAgICAgICBleHBlY3QgPSBzZWxmLmhlYWRlcnMuZ2V0KCdFeHBlY3QnLCAiIikKICAgICAgICAgaWYgKGV4cGVjdC5sb3dlcigpID09ICIxMDAtY29udGludWUiIGFuZApAQCAtMzg1LDcgKzM4OCw3IEBACiAgICAgICAgICAgICAgICAgc2VsZi5zZW5kX2Vycm9yKEhUVFBTdGF0dXMuUkVRVUVTVF9VUklfVE9PX0xPTkcpCiAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICBpZiBub3Qgc2VsZi5yYXdfcmVxdWVzdGxpbmU6Ci0gICAgICAgICAgICAgICAgc2VsZi5jbG9zZV9jb25uZWN0aW9uID0gMQorICAgICAgICAgICAgICAgIHNlbGYuY2xvc2VfY29ubmVjdGlvbiA9IFRydWUKICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnBhcnNlX3JlcXVlc3QoKToKICAgICAgICAgICAgICAgICAjIEFuIGVycm9yIGNvZGUgaGFzIGJlZW4gc2VudCwganVzdCBleGl0CkBAIC00MDIsMTIgKzQwNSwxMiBAQAogICAgICAgICBleGNlcHQgc29ja2V0LnRpbWVvdXQgYXMgZToKICAgICAgICAgICAgICNhIHJlYWQgb3IgYSB3cml0ZSB0aW1lZCBvdXQuICBEaXNjYXJkIHRoaXMgY29ubmVjdGlvbgogICAgICAgICAgICAgc2VsZi5sb2dfZXJyb3IoIlJlcXVlc3QgdGltZWQgb3V0OiAlciIsIGUpCi0gICAgICAgICAgICBzZWxmLmNsb3NlX2Nvbm5lY3Rpb24gPSAxCisgICAgICAgICAgICBzZWxmLmNsb3NlX2Nvbm5lY3Rpb24gPSBUcnVlCiAgICAgICAgICAgICByZXR1cm4KIAogICAgIGRlZiBoYW5kbGUoc2VsZik6CiAgICAgICAgICIiIkhhbmRsZSBtdWx0aXBsZSByZXF1ZXN0cyBpZiBuZWNlc3NhcnkuIiIiCi0gICAgICAgIHNlbGYuY2xvc2VfY29ubmVjdGlvbiA9IDEKKyAgICAgICAgc2VsZi5jbG9zZV9jb25uZWN0aW9uID0gVHJ1ZQogCiAgICAgICAgIHNlbGYuaGFuZGxlX29uZV9yZXF1ZXN0KCkKICAgICAgICAgd2hpbGUgbm90IHNlbGYuY2xvc2VfY29ubmVjdGlvbjoKQEAgLTQ5Myw5ICs0OTYsOSBAQAogCiAgICAgICAgIGlmIGtleXdvcmQubG93ZXIoKSA9PSAnY29ubmVjdGlvbic6CiAgICAgICAgICAgICBpZiB2YWx1ZS5sb3dlcigpID09ICdjbG9zZSc6Ci0gICAgICAgICAgICAgICAgc2VsZi5jbG9zZV9jb25uZWN0aW9uID0gMQorICAgICAgICAgICAgICAgIHNlbGYuY2xvc2VfY29ubmVjdGlvbiA9IFRydWUKICAgICAgICAgICAgIGVsaWYgdmFsdWUubG93ZXIoKSA9PSAna2VlcC1hbGl2ZSc6Ci0gICAgICAgICAgICAgICAgc2VsZi5jbG9zZV9jb25uZWN0aW9uID0gMAorICAgICAgICAgICAgICAgIHNlbGYuY2xvc2VfY29ubmVjdGlvbiA9IEZhbHNlCiAKICAgICBkZWYgZW5kX2hlYWRlcnMoc2VsZik6CiAgICAgICAgICIiIlNlbmQgdGhlIGJsYW5rIGxpbmUgZW5kaW5nIHRoZSBNSU1FIGhlYWRlcnMuIiIiCkBAIC01MTQsNyArNTE3LDggQEAKICAgICAgICAgVGhpcyBpcyBjYWxsZWQgYnkgc2VuZF9yZXNwb25zZSgpLgogCiAgICAgICAgICIiIgotCisgICAgICAgIGlmIGlzaW5zdGFuY2UoY29kZSwgSFRUUFN0YXR1cyk6CisgICAgICAgICAgICBjb2RlID0gY29kZS52YWx1ZQogICAgICAgICBzZWxmLmxvZ19tZXNzYWdlKCciJXMiICVzICVzJywKICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlcXVlc3RsaW5lLCBzdHIoY29kZSksIHN0cihzaXplKSkKIApkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZXZlci5weSBiL0xpYi9pZGxlbGliL2lkbGV2ZXIucHkKaW5kZXggMWZmYmM3Ni4uN2Q5YWM2NyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZXZlci5weQorKysgYi9MaWIvaWRsZWxpYi9pZGxldmVyLnB5CkBAIC0xICsxIEBACi1JRExFX1ZFUlNJT04gPSAiMy41LjBhMSIKK0lETEVfVkVSU0lPTiA9ICIzLjUuMGEyIgpkaWZmIC0tZ2l0IGEvTGliL2lwYWRkcmVzcy5weSBiL0xpYi9pcGFkZHJlc3MucHkKaW5kZXggNmMyMjVmMy4uYmUxZWM1MiAxMDA2NDQKLS0tIGEvTGliL2lwYWRkcmVzcy5weQorKysgYi9MaWIvaXBhZGRyZXNzLnB5CkBAIC0zODYsNiArMzg2LDggQEAKIAogICAgICIiIlRoZSBtb3RoZXIgY2xhc3MuIiIiCiAKKyAgICBfX3Nsb3RzX18gPSAoKQorCiAgICAgQHByb3BlcnR5CiAgICAgZGVmIGV4cGxvZGVkKHNlbGYpOgogICAgICAgICAiIiJSZXR1cm4gdGhlIGxvbmdoYW5kIHZlcnNpb24gb2YgdGhlIElQIGFkZHJlc3MgYXMgYSBzdHJpbmcuIiIiCkBAIC01NDMsNiArNTQ1LDggQEAKICAgICB1c2VkIGJ5IHNpbmdsZSBJUCBhZGRyZXNzZXMuCiAgICAgIiIiCiAKKyAgICBfX3Nsb3RzX18gPSAoKQorCiAgICAgZGVmIF9faW50X18oc2VsZik6CiAgICAgICAgIHJldHVybiBzZWxmLl9pcAogCkBAIC0xMDUxLDYgKzEwNTUsOCBAQAogCiAgICAgIiIiCiAKKyAgICBfX3Nsb3RzX18gPSAoKQorICAgIF92ZXJzaW9uID0gNAogICAgICMgRXF1aXZhbGVudCB0byAyNTUuMjU1LjI1NS4yNTUgb3IgMzIgYml0cyBvZiAxJ3MuCiAgICAgX0FMTF9PTkVTID0gKDIqKklQVjRMRU5HVEgpIC0gMQogICAgIF9ERUNJTUFMX0RJR0lUUyA9IGZyb3plbnNldCgnMDEyMzQ1Njc4OScpCkBAIC0xMDYzLDkgKzEwNjksNiBAQAogICAgICMgd2hlbiBjb25zdHJ1Y3RlZCAoc2VlIF9tYWtlX25ldG1hc2soKSkuCiAgICAgX25ldG1hc2tfY2FjaGUgPSB7fQogCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGFkZHJlc3MpOgotICAgICAgICBzZWxmLl92ZXJzaW9uID0gNAotCiAgICAgZGVmIF9leHBsb2RlX3Nob3J0aGFuZF9pcF9zdHJpbmcoc2VsZik6CiAgICAgICAgIHJldHVybiBzdHIoc2VsZikKIApAQCAtMTI0Myw2ICsxMjQ2LDggQEAKIAogICAgICIiIlJlcHJlc2VudCBhbmQgbWFuaXB1bGF0ZSBzaW5nbGUgSVB2NCBBZGRyZXNzZXMuIiIiCiAKKyAgICBfX3Nsb3RzX18gPSAoJ19pcCcsICdfX3dlYWtyZWZfXycpCisKICAgICBkZWYgX19pbml0X18oc2VsZiwgYWRkcmVzcyk6CiAKICAgICAgICAgIiIiCkBAIC0xMjU5LDggKzEyNjQsNiBAQAogICAgICAgICAgICAgQWRkcmVzc1ZhbHVlRXJyb3I6IElmIGlwYWRkcmVzcyBpc24ndCBhIHZhbGlkIElQdjQgYWRkcmVzcy4KIAogICAgICAgICAiIiIKLSAgICAgICAgX0Jhc2VWNC5fX2luaXRfXyhzZWxmLCBhZGRyZXNzKQotCiAgICAgICAgICMgRWZmaWNpZW50IGNvbnN0cnVjdG9yIGZyb20gaW50ZWdlci4KICAgICAgICAgaWYgaXNpbnN0YW5jZShhZGRyZXNzLCBpbnQpOgogICAgICAgICAgICAgc2VsZi5fY2hlY2tfaW50X2FkZHJlc3MoYWRkcmVzcykKQEAgLTE0ODUsOCArMTQ4OCw2IEBACiAgICAgICAgICAgICAgIHN1cHBsaWVkLgogCiAgICAgICAgICIiIgotCi0gICAgICAgIF9CYXNlVjQuX19pbml0X18oc2VsZiwgYWRkcmVzcykKICAgICAgICAgX0Jhc2VOZXR3b3JrLl9faW5pdF9fKHNlbGYsIGFkZHJlc3MpCiAKICAgICAgICAgIyBDb25zdHJ1Y3RpbmcgZnJvbSBhIHBhY2tlZCBhZGRyZXNzIG9yIGludGVnZXIKQEAgLTE1OTAsNiArMTU5MSw4IEBACiAKICAgICAiIiIKIAorICAgIF9fc2xvdHNfXyA9ICgpCisgICAgX3ZlcnNpb24gPSA2CiAgICAgX0FMTF9PTkVTID0gKDIqKklQVjZMRU5HVEgpIC0gMQogICAgIF9IRVhURVRfQ09VTlQgPSA4CiAgICAgX0hFWF9ESUdJVFMgPSBmcm96ZW5zZXQoJzAxMjM0NTY3ODlBQkNERUZhYmNkZWYnKQpAQCAtMTU5OSw5ICsxNjAyLDYgQEAKICAgICAjIHdoZW4gY29uc3RydWN0ZWQgKHNlZSBfbWFrZV9uZXRtYXNrKCkpLgogICAgIF9uZXRtYXNrX2NhY2hlID0ge30KIAotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhZGRyZXNzKToKLSAgICAgICAgc2VsZi5fdmVyc2lvbiA9IDYKLQogICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiBfbWFrZV9uZXRtYXNrKGNscywgYXJnKToKICAgICAgICAgIiIiTWFrZSBhIChuZXRtYXNrLCBwcmVmaXhfbGVuKSB0dXBsZSBmcm9tIHRoZSBnaXZlbiBhcmd1bWVudC4KQEAgLTE4NzAsNiArMTg3MCw4IEBACiAKICAgICAiIiJSZXByZXNlbnQgYW5kIG1hbmlwdWxhdGUgc2luZ2xlIElQdjYgQWRkcmVzc2VzLiIiIgogCisgICAgX19zbG90c19fID0gKCdfaXAnLCAnX193ZWFrcmVmX18nKQorCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFkZHJlc3MpOgogICAgICAgICAiIiJJbnN0YW50aWF0ZSBhIG5ldyBJUHY2IGFkZHJlc3Mgb2JqZWN0LgogCkBAIC0xODg3LDggKzE4ODksNiBAQAogICAgICAgICAgICAgQWRkcmVzc1ZhbHVlRXJyb3I6IElmIGFkZHJlc3MgaXNuJ3QgYSB2YWxpZCBJUHY2IGFkZHJlc3MuCiAKICAgICAgICAgIiIiCi0gICAgICAgIF9CYXNlVjYuX19pbml0X18oc2VsZiwgYWRkcmVzcykKLQogICAgICAgICAjIEVmZmljaWVudCBjb25zdHJ1Y3RvciBmcm9tIGludGVnZXIuCiAgICAgICAgIGlmIGlzaW5zdGFuY2UoYWRkcmVzcywgaW50KToKICAgICAgICAgICAgIHNlbGYuX2NoZWNrX2ludF9hZGRyZXNzKGFkZHJlc3MpCkBAIC0yMTgwLDcgKzIxODAsNiBAQAogICAgICAgICAgICAgICBzdXBwbGllZC4KIAogICAgICAgICAiIiIKLSAgICAgICAgX0Jhc2VWNi5fX2luaXRfXyhzZWxmLCBhZGRyZXNzKQogICAgICAgICBfQmFzZU5ldHdvcmsuX19pbml0X18oc2VsZiwgYWRkcmVzcykKIAogICAgICAgICAjIEVmZmljaWVudCBjb25zdHJ1Y3RvciBmcm9tIGludGVnZXIgb3IgcGFja2VkIGFkZHJlc3MKZGlmZiAtLWdpdCBhL0xpYi9saW5lY2FjaGUucHkgYi9MaWIvbGluZWNhY2hlLnB5CmluZGV4IDAyYTllYjUuLjMzYjBhZjcgMTAwNjQ0Ci0tLSBhL0xpYi9saW5lY2FjaGUucHkKKysrIGIvTGliL2xpbmVjYWNoZS5weQpAQCAtNSw2ICs1LDcgQEAKIHRoYXQgbmFtZS4KICIiIgogCitpbXBvcnQgZnVuY3Rvb2xzCiBpbXBvcnQgc3lzCiBpbXBvcnQgb3MKIGltcG9ydCB0b2tlbml6ZQpAQCAtMjEsNyArMjIsOSBAQAogCiAjIFRoZSBjYWNoZQogCi1jYWNoZSA9IHt9ICMgVGhlIGNhY2hlCisjIFRoZSBjYWNoZS4gTWFwcyBmaWxlbmFtZXMgdG8gZWl0aGVyIGEgdGh1bmsgd2hpY2ggd2lsbCBwcm92aWRlIHNvdXJjZSBjb2RlLAorIyBvciBhIHR1cGxlIChzaXplLCBtdGltZSwgbGluZXMsIGZ1bGxuYW1lKSBvbmNlIGxvYWRlZC4KK2NhY2hlID0ge30KIAogCiBkZWYgY2xlYXJjYWNoZSgpOgpAQCAtMzYsNiArMzksOSBAQAogICAgIFVwZGF0ZSB0aGUgY2FjaGUgaWYgaXQgZG9lc24ndCBjb250YWluIGFuIGVudHJ5IGZvciB0aGlzIGZpbGUgYWxyZWFkeS4iIiIKIAogICAgIGlmIGZpbGVuYW1lIGluIGNhY2hlOgorICAgICAgICBlbnRyeSA9IGNhY2hlW2ZpbGVuYW1lXQorICAgICAgICBpZiBsZW4oZW50cnkpID09IDE6CisgICAgICAgICAgICByZXR1cm4gdXBkYXRlY2FjaGUoZmlsZW5hbWUsIG1vZHVsZV9nbG9iYWxzKQogICAgICAgICByZXR1cm4gY2FjaGVbZmlsZW5hbWVdWzJdCiAgICAgZWxzZToKICAgICAgICAgcmV0dXJuIHVwZGF0ZWNhY2hlKGZpbGVuYW1lLCBtb2R1bGVfZ2xvYmFscykKQEAgLTU0LDcgKzYwLDExIEBACiAgICAgICAgICAgICByZXR1cm4KIAogICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlbmFtZXM6Ci0gICAgICAgIHNpemUsIG10aW1lLCBsaW5lcywgZnVsbG5hbWUgPSBjYWNoZVtmaWxlbmFtZV0KKyAgICAgICAgZW50cnkgPSBjYWNoZVtmaWxlbmFtZV0KKyAgICAgICAgaWYgbGVuKGVudHJ5KSA9PSAxOgorICAgICAgICAgICAgIyBsYXp5IGNhY2hlIGVudHJ5LCBsZWF2ZSBpdCBsYXp5LgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgc2l6ZSwgbXRpbWUsIGxpbmVzLCBmdWxsbmFtZSA9IGVudHJ5CiAgICAgICAgIGlmIG10aW1lIGlzIE5vbmU6CiAgICAgICAgICAgICBjb250aW51ZSAgICMgbm8tb3AgZm9yIGZpbGVzIGxvYWRlZCB2aWEgYSBfX2xvYWRlcl9fCiAgICAgICAgIHRyeToKQEAgLTcyLDcgKzgyLDggQEAKICAgICBhbmQgcmV0dXJuIGFuIGVtcHR5IGxpc3QuIiIiCiAKICAgICBpZiBmaWxlbmFtZSBpbiBjYWNoZToKLSAgICAgICAgZGVsIGNhY2hlW2ZpbGVuYW1lXQorICAgICAgICBpZiBsZW4oY2FjaGVbZmlsZW5hbWVdKSAhPSAxOgorICAgICAgICAgICAgZGVsIGNhY2hlW2ZpbGVuYW1lXQogICAgIGlmIG5vdCBmaWxlbmFtZSBvciAoZmlsZW5hbWUuc3RhcnRzd2l0aCgnPCcpIGFuZCBmaWxlbmFtZS5lbmRzd2l0aCgnPicpKToKICAgICAgICAgcmV0dXJuIFtdCiAKQEAgLTgyLDI3ICs5MywyMyBAQAogICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICBiYXNlbmFtZSA9IGZpbGVuYW1lCiAKLSAgICAgICAgIyBUcnkgZm9yIGEgX19sb2FkZXJfXywgaWYgYXZhaWxhYmxlCi0gICAgICAgIGlmIG1vZHVsZV9nbG9iYWxzIGFuZCAnX19sb2FkZXJfXycgaW4gbW9kdWxlX2dsb2JhbHM6Ci0gICAgICAgICAgICBuYW1lID0gbW9kdWxlX2dsb2JhbHMuZ2V0KCdfX25hbWVfXycpCi0gICAgICAgICAgICBsb2FkZXIgPSBtb2R1bGVfZ2xvYmFsc1snX19sb2FkZXJfXyddCi0gICAgICAgICAgICBnZXRfc291cmNlID0gZ2V0YXR0cihsb2FkZXIsICdnZXRfc291cmNlJywgTm9uZSkKLQotICAgICAgICAgICAgaWYgbmFtZSBhbmQgZ2V0X3NvdXJjZToKLSAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBnZXRfc291cmNlKG5hbWUpCi0gICAgICAgICAgICAgICAgZXhjZXB0IChJbXBvcnRFcnJvciwgT1NFcnJvcik6Ci0gICAgICAgICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBpZiBkYXRhIGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAjIE5vIGx1Y2ssIHRoZSBQRVAzMDIgbG9hZGVyIGNhbm5vdCBmaW5kIHRoZSBzb3VyY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICMgZm9yIHRoaXMgbW9kdWxlLgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdCi0gICAgICAgICAgICAgICAgICAgIGNhY2hlW2ZpbGVuYW1lXSA9ICgKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlbihkYXRhKSwgTm9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFtsaW5lKydcbicgZm9yIGxpbmUgaW4gZGF0YS5zcGxpdGxpbmVzKCldLCBmdWxsbmFtZQotICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZVtmaWxlbmFtZV1bMl0KKyAgICAgICAgIyBSZWFsaXNlIGEgbGF6eSBsb2FkZXIgYmFzZWQgbG9va3VwIGlmIHRoZXJlIGlzIG9uZQorICAgICAgICAjIG90aGVyd2lzZSB0cnkgdG8gbG9va3VwIHJpZ2h0IG5vdy4KKyAgICAgICAgaWYgbGF6eWNhY2hlKGZpbGVuYW1lLCBtb2R1bGVfZ2xvYmFscyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZGF0YSA9IGNhY2hlW2ZpbGVuYW1lXVswXSgpCisgICAgICAgICAgICBleGNlcHQgKEltcG9ydEVycm9yLCBPU0Vycm9yKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIGRhdGEgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgIyBObyBsdWNrLCB0aGUgUEVQMzAyIGxvYWRlciBjYW5ub3QgZmluZCB0aGUgc291cmNlCisgICAgICAgICAgICAgICAgICAgICMgZm9yIHRoaXMgbW9kdWxlLgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gW10KKyAgICAgICAgICAgICAgICBjYWNoZVtmaWxlbmFtZV0gPSAoCisgICAgICAgICAgICAgICAgICAgIGxlbihkYXRhKSwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgW2xpbmUrJ1xuJyBmb3IgbGluZSBpbiBkYXRhLnNwbGl0bGluZXMoKV0sIGZ1bGxuYW1lCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZVtmaWxlbmFtZV1bMl0KIAogICAgICAgICAjIFRyeSBsb29raW5nIHRocm91Z2ggdGhlIG1vZHVsZSBzZWFyY2ggcGF0aCwgd2hpY2ggaXMgb25seSB1c2VmdWwKICAgICAgICAgIyB3aGVuIGhhbmRsaW5nIGEgcmVsYXRpdmUgZmlsZW5hbWUuCkBAIC0xMzIsMyArMTM5LDM2IEBACiAgICAgc2l6ZSwgbXRpbWUgPSBzdGF0LnN0X3NpemUsIHN0YXQuc3RfbXRpbWUKICAgICBjYWNoZVtmaWxlbmFtZV0gPSBzaXplLCBtdGltZSwgbGluZXMsIGZ1bGxuYW1lCiAgICAgcmV0dXJuIGxpbmVzCisKKworZGVmIGxhenljYWNoZShmaWxlbmFtZSwgbW9kdWxlX2dsb2JhbHMpOgorICAgICIiIlNlZWQgdGhlIGNhY2hlIGZvciBmaWxlbmFtZSB3aXRoIG1vZHVsZV9nbG9iYWxzLgorCisgICAgVGhlIG1vZHVsZSBsb2FkZXIgd2lsbCBiZSBhc2tlZCBmb3IgdGhlIHNvdXJjZSBvbmx5IHdoZW4gZ2V0bGluZXMgaXMKKyAgICBjYWxsZWQsIG5vdCBpbW1lZGlhdGVseS4KKworICAgIElmIHRoZXJlIGlzIGFuIGVudHJ5IGluIHRoZSBjYWNoZSBhbHJlYWR5LCBpdCBpcyBub3QgYWx0ZXJlZC4KKworICAgIDpyZXR1cm46IFRydWUgaWYgYSBsYXp5IGxvYWQgaXMgcmVnaXN0ZXJlZCBpbiB0aGUgY2FjaGUsCisgICAgICAgIG90aGVyd2lzZSBGYWxzZS4gVG8gcmVnaXN0ZXIgc3VjaCBhIGxvYWQgYSBtb2R1bGUgbG9hZGVyIHdpdGggYQorICAgICAgICBnZXRfc291cmNlIG1ldGhvZCBtdXN0IGJlIGZvdW5kLCB0aGUgZmlsZW5hbWUgbXVzdCBiZSBhIGNhY2hhYmxlCisgICAgICAgIGZpbGVuYW1lLCBhbmQgdGhlIGZpbGVuYW1lIG11c3Qgbm90IGJlIGFscmVhZHkgY2FjaGVkLgorICAgICIiIgorICAgIGlmIGZpbGVuYW1lIGluIGNhY2hlOgorICAgICAgICBpZiBsZW4oY2FjaGVbZmlsZW5hbWVdKSA9PSAxOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgIGlmIG5vdCBmaWxlbmFtZSBvciAoZmlsZW5hbWUuc3RhcnRzd2l0aCgnPCcpIGFuZCBmaWxlbmFtZS5lbmRzd2l0aCgnPicpKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgIyBUcnkgZm9yIGEgX19sb2FkZXJfXywgaWYgYXZhaWxhYmxlCisgICAgaWYgbW9kdWxlX2dsb2JhbHMgYW5kICdfX2xvYWRlcl9fJyBpbiBtb2R1bGVfZ2xvYmFsczoKKyAgICAgICAgbmFtZSA9IG1vZHVsZV9nbG9iYWxzLmdldCgnX19uYW1lX18nKQorICAgICAgICBsb2FkZXIgPSBtb2R1bGVfZ2xvYmFsc1snX19sb2FkZXJfXyddCisgICAgICAgIGdldF9zb3VyY2UgPSBnZXRhdHRyKGxvYWRlciwgJ2dldF9zb3VyY2UnLCBOb25lKQorCisgICAgICAgIGlmIG5hbWUgYW5kIGdldF9zb3VyY2U6CisgICAgICAgICAgICBnZXRfbGluZXMgPSBmdW5jdG9vbHMucGFydGlhbChnZXRfc291cmNlLCBuYW1lKQorICAgICAgICAgICAgY2FjaGVbZmlsZW5hbWVdID0gKGdldF9saW5lcywpCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgIHJldHVybiBGYWxzZQpkaWZmIC0tZ2l0IGEvTGliL2xvZ2dpbmcvaGFuZGxlcnMucHkgYi9MaWIvbG9nZ2luZy9oYW5kbGVycy5weQppbmRleCBjNjdhYzk5Li5kNGY4YWVmIDEwMDY0NAotLS0gYS9MaWIvbG9nZ2luZy9oYW5kbGVycy5weQorKysgYi9MaWIvbG9nZ2luZy9oYW5kbGVycy5weQpAQCAtMSw0ICsxLDQgQEAKLSMgQ29weXJpZ2h0IDIwMDEtMjAxMyBieSBWaW5heSBTYWppcC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgQ29weXJpZ2h0IDIwMDEtMjAxNSBieSBWaW5heSBTYWppcC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICMKICMgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCiAjIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKQEAgLTE4LDcgKzE4LDcgQEAKIEFkZGl0aW9uYWwgaGFuZGxlcnMgZm9yIHRoZSBsb2dnaW5nIHBhY2thZ2UgZm9yIFB5dGhvbi4gVGhlIGNvcmUgcGFja2FnZSBpcwogYmFzZWQgb24gUEVQIDI4MiBhbmQgY29tbWVudHMgdGhlcmV0byBpbiBjb21wLmxhbmcucHl0aG9uLgogCi1Db3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBWaW5heSBTYWppcC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK0NvcHlyaWdodCAoQykgMjAwMS0yMDE1IFZpbmF5IFNhamlwLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogCiBUbyB1c2UsIHNpbXBseSAnaW1wb3J0IGxvZ2dpbmcuaGFuZGxlcnMnIGFuZCBsb2cgYXdheSEKICIiIgpAQCAtMTM1MCw3ICsxMzUwLDcgQEAKICAgICAgICAgIiIiCiAgICAgICAgIF9zZW50aW5lbCA9IE5vbmUKIAotICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcXVldWUsICpoYW5kbGVycyk6CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBxdWV1ZSwgKmhhbmRsZXJzLCByZXNwZWN0X2hhbmRsZXJfbGV2ZWw9RmFsc2UpOgogICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICBJbml0aWFsaXNlIGFuIGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZCBxdWV1ZSBhbmQKICAgICAgICAgICAgIGhhbmRsZXJzLgpAQCAtMTM1OSw2ICsxMzU5LDcgQEAKICAgICAgICAgICAgIHNlbGYuaGFuZGxlcnMgPSBoYW5kbGVycwogICAgICAgICAgICAgc2VsZi5fc3RvcCA9IHRocmVhZGluZy5FdmVudCgpCiAgICAgICAgICAgICBzZWxmLl90aHJlYWQgPSBOb25lCisgICAgICAgICAgICBzZWxmLnJlc3BlY3RfaGFuZGxlcl9sZXZlbCA9IHJlc3BlY3RfaGFuZGxlcl9sZXZlbAogCiAgICAgICAgIGRlZiBkZXF1ZXVlKHNlbGYsIGJsb2NrKToKICAgICAgICAgICAgICIiIgpAQCAtMTM5OSw3ICsxNDAwLDEyIEBACiAgICAgICAgICAgICAiIiIKICAgICAgICAgICAgIHJlY29yZCA9IHNlbGYucHJlcGFyZShyZWNvcmQpCiAgICAgICAgICAgICBmb3IgaGFuZGxlciBpbiBzZWxmLmhhbmRsZXJzOgotICAgICAgICAgICAgICAgIGhhbmRsZXIuaGFuZGxlKHJlY29yZCkKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5yZXNwZWN0X2hhbmRsZXJfbGV2ZWw6CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MgPSBUcnVlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcHJvY2VzcyA9IHJlY29yZC5sZXZlbG5vID49IGhhbmRsZXIubGV2ZWwKKyAgICAgICAgICAgICAgICBpZiBwcm9jZXNzOgorICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLmhhbmRsZShyZWNvcmQpCiAKICAgICAgICAgZGVmIF9tb25pdG9yKHNlbGYpOgogICAgICAgICAgICAgIiIiCmRpZmYgLS1naXQgYS9MaWIvbXVsdGlwcm9jZXNzaW5nL2Nvbm5lY3Rpb24ucHkgYi9MaWIvbXVsdGlwcm9jZXNzaW5nL2Nvbm5lY3Rpb24ucHkKaW5kZXggOWE4YWUyOS4uMDdkMTlkZSAxMDA2NDQKLS0tIGEvTGliL211bHRpcHJvY2Vzc2luZy9jb25uZWN0aW9uLnB5CisrKyBiL0xpYi9tdWx0aXByb2Nlc3NpbmcvY29ubmVjdGlvbi5weQpAQCAtODI5LDcgKzgyOSw3IEBACiAgICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgIG92LCBlcnIgPSBfd2luYXBpLlJlYWRGaWxlKGZpbGVubygpLCAwLCBUcnVlKQogICAgICAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBlOgotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gZS53aW5lcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgb3YsIGVyciA9IE5vbmUsIGUud2luZXJyb3IKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGVyciBub3QgaW4gX3JlYWR5X2Vycm9yczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICAgICAgICAgICBpZiBlcnIgPT0gX3dpbmFwaS5FUlJPUl9JT19QRU5ESU5HOgpAQCAtODM4LDcgKzgzOCwxNiBAQAogICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgIyBJZiBvLmZpbGVubygpIGlzIGFuIG92ZXJsYXBwZWQgcGlwZSBoYW5kbGUgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAjIGVyciA9PSAwIHRoZW4gdGhlcmUgaXMgYSB6ZXJvIGxlbmd0aCBtZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICAjIGluIHRoZSBwaXBlLCBidXQgaXQgSEFTIE5PVCBiZWVuIGNvbnN1bWVkLgorICAgICAgICAgICAgICAgICAgICAgICAgIyBpbiB0aGUgcGlwZSwgYnV0IGl0IEhBUyBOT1QgYmVlbiBjb25zdW1lZC4uLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgb3YgYW5kIHN5cy5nZXR3aW5kb3dzdmVyc2lvbigpWzoyXSA+PSAoNiwgMik6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAuLi4gZXhjZXB0IG9uIFdpbmRvd3MgOCBhbmQgbGF0ZXIsIHdoZXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgbWVzc2FnZSBIQVMgYmVlbiBjb25zdW1lZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8sIGVyciA9IG92LkdldE92ZXJsYXBwZWRSZXN1bHQoRmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gZS53aW5lcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBlcnIgYW5kIGhhc2F0dHIobywgJ19nb3RfZW1wdHlfbWVzc2FnZScpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLl9nb3RfZW1wdHlfbWVzc2FnZSA9IFRydWUKICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWR5X29iamVjdHMuYWRkKG8pCiAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0ID0gMAogCmRpZmYgLS1naXQgYS9MaWIvcGF0aGxpYi5weSBiL0xpYi9wYXRobGliLnB5CmluZGV4IGUxYjA3Y2EuLjAxZTY2YTAgMTAwNjQ0Ci0tLSBhL0xpYi9wYXRobGliLnB5CisrKyBiL0xpYi9wYXRobGliLnB5CkBAIC03Myw2ICs3MywxMCBAQAogICAgICAgICAgICAgICAgICAgICAjIHBhcnRzLiBUaGlzIG1ha2VzIHRoZSByZXN1bHQgb2YgcGFyc2luZyBlLmcuCiAgICAgICAgICAgICAgICAgICAgICMgKCJDOiIsICIvIiwgImEiKSByZWFzb25hYmx5IGludHVpdGl2ZS4KICAgICAgICAgICAgICAgICAgICAgZm9yIHBhcnQgaW4gaXQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgcGFydDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgYWx0c2VwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQgPSBwYXJ0LnJlcGxhY2UoYWx0c2VwLCBzZXApCiAgICAgICAgICAgICAgICAgICAgICAgICBkcnYgPSBzZWxmLnNwbGl0cm9vdChwYXJ0KVswXQogICAgICAgICAgICAgICAgICAgICAgICAgaWYgZHJ2OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCmRpZmYgLS1naXQgYS9MaWIvcHByaW50LnB5IGIvTGliL3BwcmludC5weQppbmRleCAyY2JmZmVkLi4wMDkxZTY5IDEwMDY0NAotLS0gYS9MaWIvcHByaW50LnB5CisrKyBiL0xpYi9wcHJpbnQucHkKQEAgLTE2MSw3ICsxNjEsNyBAQAogICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIHJlcCA9IHNlbGYuX3JlcHIob2JqZWN0LCBjb250ZXh0LCBsZXZlbCAtIDEpCiAgICAgICAgIHR5cCA9IHR5cGUob2JqZWN0KQotICAgICAgICBtYXhfd2lkdGggPSBzZWxmLl93aWR0aCAtIDEgLSBpbmRlbnQgLSBhbGxvd2FuY2UKKyAgICAgICAgbWF4X3dpZHRoID0gc2VsZi5fd2lkdGggLSBpbmRlbnQgLSBhbGxvd2FuY2UKICAgICAgICAgc2VwTGluZXMgPSBsZW4ocmVwKSA+IG1heF93aWR0aAogICAgICAgICB3cml0ZSA9IHN0cmVhbS53cml0ZQogCkBAIC0xNzQsMjQgKzE3NCwxNCBAQAogICAgICAgICAgICAgICAgIGxlbmd0aCA9IGxlbihvYmplY3QpCiAgICAgICAgICAgICAgICAgaWYgbGVuZ3RoOgogICAgICAgICAgICAgICAgICAgICBjb250ZXh0W29iamlkXSA9IDEKLSAgICAgICAgICAgICAgICAgICAgaW5kZW50ID0gaW5kZW50ICsgc2VsZi5faW5kZW50X3Blcl9sZXZlbAogICAgICAgICAgICAgICAgICAgICBpZiBpc3N1YmNsYXNzKHR5cCwgX09yZGVyZWREaWN0KToKICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zID0gbGlzdChvYmplY3QuaXRlbXMoKSkKICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zID0gc29ydGVkKG9iamVjdC5pdGVtcygpLCBrZXk9X3NhZmVfdHVwbGUpCi0gICAgICAgICAgICAgICAgICAgIGtleSwgZW50ID0gaXRlbXNbMF0KLSAgICAgICAgICAgICAgICAgICAgcmVwID0gc2VsZi5fcmVwcihrZXksIGNvbnRleHQsIGxldmVsKQotICAgICAgICAgICAgICAgICAgICB3cml0ZShyZXApCi0gICAgICAgICAgICAgICAgICAgIHdyaXRlKCc6ICcpCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuX2Zvcm1hdChlbnQsIHN0cmVhbSwgaW5kZW50ICsgbGVuKHJlcCkgKyAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93YW5jZSArIDEsIGNvbnRleHQsIGxldmVsKQotICAgICAgICAgICAgICAgICAgICBpZiBsZW5ndGggPiAxOgotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGtleSwgZW50IGluIGl0ZW1zWzE6XToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXAgPSBzZWxmLl9yZXByKGtleSwgY29udGV4dCwgbGV2ZWwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGUoJyxcbiVzJXM6ICcgJSAoJyAnKmluZGVudCwgcmVwKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9mb3JtYXQoZW50LCBzdHJlYW0sIGluZGVudCArIGxlbihyZXApICsgMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93YW5jZSArIDEsIGNvbnRleHQsIGxldmVsKQotICAgICAgICAgICAgICAgICAgICBpbmRlbnQgPSBpbmRlbnQgLSBzZWxmLl9pbmRlbnRfcGVyX2xldmVsCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2Zvcm1hdF9kaWN0X2l0ZW1zKGl0ZW1zLCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCArIHNlbGYuX2luZGVudF9wZXJfbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93YW5jZSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGxldmVsKQogICAgICAgICAgICAgICAgICAgICBkZWwgY29udGV4dFtvYmppZF0KICAgICAgICAgICAgICAgICB3cml0ZSgnfScpCiAgICAgICAgICAgICAgICAgcmV0dXJuCkBAIC0yMDcsNyArMTk3LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIGVuZGNoYXIgPSAnXScKICAgICAgICAgICAgICAgICBlbGlmIGlzc3ViY2xhc3ModHlwLCB0dXBsZSk6CiAgICAgICAgICAgICAgICAgICAgIHdyaXRlKCcoJykKLSAgICAgICAgICAgICAgICAgICAgZW5kY2hhciA9ICcpJworICAgICAgICAgICAgICAgICAgICBpZiBsZW5ndGggPT0gMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZGNoYXIgPSAnLCknCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBlbmRjaGFyID0gJyknCiAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGxlbmd0aDoKICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlKHJlcCkKQEAgLTIyNywxMCArMjIwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgY29udGV4dFtvYmppZF0gPSAxCiAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2Zvcm1hdF9pdGVtcyhvYmplY3QsIHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCArIHNlbGYuX2luZGVudF9wZXJfbGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2FuY2UgKyAxLCBjb250ZXh0LCBsZXZlbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93YW5jZSArIGxlbihlbmRjaGFyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGxldmVsKQogICAgICAgICAgICAgICAgICAgICBkZWwgY29udGV4dFtvYmppZF0KLSAgICAgICAgICAgICAgICBpZiBpc3N1YmNsYXNzKHR5cCwgdHVwbGUpIGFuZCBsZW5ndGggPT0gMToKLSAgICAgICAgICAgICAgICAgICAgd3JpdGUoJywnKQogICAgICAgICAgICAgICAgIHdyaXRlKGVuZGNoYXIpCiAgICAgICAgICAgICAgICAgcmV0dXJuCiAKQEAgLTIzOSwxOSArMjMxLDI3IEBACiAgICAgICAgICAgICAgICAgbGluZXMgPSBvYmplY3Quc3BsaXRsaW5lcyhUcnVlKQogICAgICAgICAgICAgICAgIGlmIGxldmVsID09IDE6CiAgICAgICAgICAgICAgICAgICAgIGluZGVudCArPSAxCi0gICAgICAgICAgICAgICAgICAgIG1heF93aWR0aCAtPSAyCisgICAgICAgICAgICAgICAgICAgIGFsbG93YW5jZSArPSAxCisgICAgICAgICAgICAgICAgbWF4X3dpZHRoMSA9IG1heF93aWR0aCA9IHNlbGYuX3dpZHRoIC0gaW5kZW50CiAgICAgICAgICAgICAgICAgZm9yIGksIGxpbmUgaW4gZW51bWVyYXRlKGxpbmVzKToKICAgICAgICAgICAgICAgICAgICAgcmVwID0gcmVwcihsaW5lKQotICAgICAgICAgICAgICAgICAgICBpZiBsZW4ocmVwKSA8PSBtYXhfd2lkdGg6CisgICAgICAgICAgICAgICAgICAgIGlmIGkgPT0gbGVuKGxpbmVzKSAtIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhfd2lkdGgxIC09IGFsbG93YW5jZQorICAgICAgICAgICAgICAgICAgICBpZiBsZW4ocmVwKSA8PSBtYXhfd2lkdGgxOgogICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtzLmFwcGVuZChyZXApCiAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAjIEEgbGlzdCBvZiBhbHRlcm5hdGluZyAobm9uLXNwYWNlLCBzcGFjZSkgc3RyaW5ncwotICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMgPSByZS5zcGxpdChyJyhccyspJywgbGluZSkgKyBbJyddCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0cyA9IHJlLmZpbmRhbGwocidcUypccyonLCBsaW5lKQorICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHBhcnRzCisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgbm90IHBhcnRzWy0xXQorICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMucG9wKCkgICMgZHJvcCBlbXB0eSBsYXN0IHBhcnQKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heF93aWR0aDIgPSBtYXhfd2lkdGgKICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSAnJwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKHBhcnRzKSwgMik6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCA9IHBhcnRzW2ldICsgcGFydHNbaSsxXQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGosIHBhcnQgaW4gZW51bWVyYXRlKHBhcnRzKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGUgPSBjdXJyZW50ICsgcGFydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxlbihyZXByKGNhbmRpZGF0ZSkpID4gbWF4X3dpZHRoOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGogPT0gbGVuKHBhcnRzKSAtIDEgYW5kIGkgPT0gbGVuKGxpbmVzKSAtIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF93aWR0aDIgLT0gYWxsb3dhbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGVuKHJlcHIoY2FuZGlkYXRlKSkgPiBtYXhfd2lkdGgyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBjdXJyZW50OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtzLmFwcGVuZChyZXByKGN1cnJlbnQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gcGFydApAQCAtMjczLDEyICsyNzMsNDEgQEAKICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgd3JpdGUocmVwKQogCisgICAgZGVmIF9mb3JtYXRfZGljdF9pdGVtcyhzZWxmLCBpdGVtcywgc3RyZWFtLCBpbmRlbnQsIGFsbG93YW5jZSwgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsKToKKyAgICAgICAgd3JpdGUgPSBzdHJlYW0ud3JpdGUKKyAgICAgICAgZGVsaW1ubCA9ICcsXG4nICsgJyAnICogaW5kZW50CisgICAgICAgIGxhc3RfaW5kZXggPSBsZW4oaXRlbXMpIC0gMQorICAgICAgICBmb3IgaSwgKGtleSwgZW50KSBpbiBlbnVtZXJhdGUoaXRlbXMpOgorICAgICAgICAgICAgbGFzdCA9IGkgPT0gbGFzdF9pbmRleAorICAgICAgICAgICAgcmVwID0gc2VsZi5fcmVwcihrZXksIGNvbnRleHQsIGxldmVsKQorICAgICAgICAgICAgd3JpdGUocmVwKQorICAgICAgICAgICAgd3JpdGUoJzogJykKKyAgICAgICAgICAgIHNlbGYuX2Zvcm1hdChlbnQsIHN0cmVhbSwgaW5kZW50ICsgbGVuKHJlcCkgKyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93YW5jZSBpZiBsYXN0IGVsc2UgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LCBsZXZlbCkKKyAgICAgICAgICAgIGlmIG5vdCBsYXN0OgorICAgICAgICAgICAgICAgIHdyaXRlKGRlbGltbmwpCisKICAgICBkZWYgX2Zvcm1hdF9pdGVtcyhzZWxmLCBpdGVtcywgc3RyZWFtLCBpbmRlbnQsIGFsbG93YW5jZSwgY29udGV4dCwgbGV2ZWwpOgogICAgICAgICB3cml0ZSA9IHN0cmVhbS53cml0ZQogICAgICAgICBkZWxpbW5sID0gJyxcbicgKyAnICcgKiBpbmRlbnQKICAgICAgICAgZGVsaW0gPSAnJwotICAgICAgICB3aWR0aCA9IG1heF93aWR0aCA9IHNlbGYuX3dpZHRoIC0gaW5kZW50IC0gYWxsb3dhbmNlICsgMgotICAgICAgICBmb3IgZW50IGluIGl0ZW1zOgorICAgICAgICB3aWR0aCA9IG1heF93aWR0aCA9IHNlbGYuX3dpZHRoIC0gaW5kZW50ICsgMQorICAgICAgICBpdCA9IGl0ZXIoaXRlbXMpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG5leHRfZW50ID0gbmV4dChpdCkKKyAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgbGFzdCA9IEZhbHNlCisgICAgICAgIHdoaWxlIG5vdCBsYXN0OgorICAgICAgICAgICAgZW50ID0gbmV4dF9lbnQKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBuZXh0X2VudCA9IG5leHQoaXQpCisgICAgICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgICAgICBsYXN0ID0gVHJ1ZQorICAgICAgICAgICAgICAgIG1heF93aWR0aCAtPSBhbGxvd2FuY2UKKyAgICAgICAgICAgICAgICB3aWR0aCAtPSBhbGxvd2FuY2UKICAgICAgICAgICAgIGlmIHNlbGYuX2NvbXBhY3Q6CiAgICAgICAgICAgICAgICAgcmVwID0gc2VsZi5fcmVwcihlbnQsIGNvbnRleHQsIGxldmVsKQogICAgICAgICAgICAgICAgIHcgPSBsZW4ocmVwKSArIDIKQEAgLTI5NCw3ICszMjMsOSBAQAogICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgd3JpdGUoZGVsaW0pCiAgICAgICAgICAgICBkZWxpbSA9IGRlbGltbmwKLSAgICAgICAgICAgIHNlbGYuX2Zvcm1hdChlbnQsIHN0cmVhbSwgaW5kZW50LCBhbGxvd2FuY2UsIGNvbnRleHQsIGxldmVsKQorICAgICAgICAgICAgc2VsZi5fZm9ybWF0KGVudCwgc3RyZWFtLCBpbmRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dhbmNlIGlmIGxhc3QgZWxzZSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGxldmVsKQogCiAgICAgZGVmIF9yZXByKHNlbGYsIG9iamVjdCwgY29udGV4dCwgbGV2ZWwpOgogICAgICAgICByZXByLCByZWFkYWJsZSwgcmVjdXJzaXZlID0gc2VsZi5mb3JtYXQob2JqZWN0LCBjb250ZXh0LmNvcHkoKSwKZGlmZiAtLWdpdCBhL0xpYi9weWRvYy5weSBiL0xpYi9weWRvYy5weQppbmRleCA2MGIwYTllNS4uYzkyYjMyNCAxMDA3NTUKLS0tIGEvTGliL3B5ZG9jLnB5CisrKyBiL0xpYi9weWRvYy5weQpAQCAtMjY5LDcgKzI2OSw3IEBACiAgICAgICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAgICAgIGRlbCBzeXMubW9kdWxlc1snX190ZW1wX18nXQotICAgICAgICAgICAgcmVzdWx0ID0gKG1vZHVsZS5fX2RvY19fIG9yICcnKS5zcGxpdGxpbmVzKClbMF0KKyAgICAgICAgICAgIHJlc3VsdCA9IG1vZHVsZS5fX2RvY19fLnNwbGl0bGluZXMoKVswXSBpZiBtb2R1bGUuX19kb2NfXyBlbHNlIE5vbmUKICAgICAgICAgIyBDYWNoZSB0aGUgcmVzdWx0LgogICAgICAgICBjYWNoZVtmaWxlbmFtZV0gPSAobXRpbWUsIHJlc3VsdCkKICAgICByZXR1cm4gcmVzdWx0CkBAIC0xNDA1LDkgKzE0MDUsNiBAQAogZGVmIHBhZ2VyKHRleHQpOgogICAgICIiIlRoZSBmaXJzdCB0aW1lIHRoaXMgaXMgY2FsbGVkLCBkZXRlcm1pbmUgd2hhdCBraW5kIG9mIHBhZ2VyIHRvIHVzZS4iIiIKICAgICBnbG9iYWwgcGFnZXIKLSAgICAjIEVzY2FwZSBub24tZW5jb2RhYmxlIGNoYXJhY3RlcnMgdG8gYXZvaWQgZW5jb2RpbmcgZXJyb3JzIGxhdGVyCi0gICAgZW5jb2RpbmcgPSBzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkKLSAgICB0ZXh0ID0gdGV4dC5lbmNvZGUoZW5jb2RpbmcsICdiYWNrc2xhc2hyZXBsYWNlJykuZGVjb2RlKGVuY29kaW5nKQogICAgIHBhZ2VyID0gZ2V0cGFnZXIoKQogICAgIHBhZ2VyKHRleHQpCiAKQEAgLTE0NTAsMTAgKzE0NDcsMTIgQEAKIAogZGVmIHBpcGVwYWdlcih0ZXh0LCBjbWQpOgogICAgICIiIlBhZ2UgdGhyb3VnaCB0ZXh0IGJ5IGZlZWRpbmcgaXQgdG8gYW5vdGhlciBwcm9ncmFtLiIiIgotICAgIHBpcGUgPSBvcy5wb3BlbihjbWQsICd3JykKKyAgICBpbXBvcnQgc3VicHJvY2VzcworICAgIHByb2MgPSBzdWJwcm9jZXNzLlBvcGVuKGNtZCwgc2hlbGw9VHJ1ZSwgc3RkaW49c3VicHJvY2Vzcy5QSVBFKQogICAgIHRyeToKLSAgICAgICAgcGlwZS53cml0ZSh0ZXh0KQotICAgICAgICBwaXBlLmNsb3NlKCkKKyAgICAgICAgd2l0aCBwcm9jOgorICAgICAgICAgICAgd2l0aCBpby5UZXh0SU9XcmFwcGVyKHByb2Muc3RkaW4sIGVycm9ycz0nYmFja3NsYXNocmVwbGFjZScpIGFzIHBpcGU6CisgICAgICAgICAgICAgICAgcGlwZS53cml0ZSh0ZXh0KQogICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICBwYXNzICMgSWdub3JlIGJyb2tlbiBwaXBlcyBjYXVzZWQgYnkgcXVpdHRpbmcgdGhlIHBhZ2VyIHByb2dyYW0uCiAKQEAgLTE0NjEsMTYgKzE0NjAsMjEgQEAKICAgICAiIiJQYWdlIHRocm91Z2ggdGV4dCBieSBpbnZva2luZyBhIHByb2dyYW0gb24gYSB0ZW1wb3JhcnkgZmlsZS4iIiIKICAgICBpbXBvcnQgdGVtcGZpbGUKICAgICBmaWxlbmFtZSA9IHRlbXBmaWxlLm1rdGVtcCgpCi0gICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAndycpIGFzIGZpbGU6CisgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAndycsIGVycm9ycz0nYmFja3NsYXNocmVwbGFjZScpIGFzIGZpbGU6CiAgICAgICAgIGZpbGUud3JpdGUodGV4dCkKICAgICB0cnk6CiAgICAgICAgIG9zLnN5c3RlbShjbWQgKyAnICInICsgZmlsZW5hbWUgKyAnIicpCiAgICAgZmluYWxseToKICAgICAgICAgb3MudW5saW5rKGZpbGVuYW1lKQogCitkZWYgX2VzY2FwZV9zdGRvdXQodGV4dCk6CisgICAgIyBFc2NhcGUgbm9uLWVuY29kYWJsZSBjaGFyYWN0ZXJzIHRvIGF2b2lkIGVuY29kaW5nIGVycm9ycyBsYXRlcgorICAgIGVuY29kaW5nID0gZ2V0YXR0cihzeXMuc3Rkb3V0LCAnZW5jb2RpbmcnLCBOb25lKSBvciAndXRmLTgnCisgICAgcmV0dXJuIHRleHQuZW5jb2RlKGVuY29kaW5nLCAnYmFja3NsYXNocmVwbGFjZScpLmRlY29kZShlbmNvZGluZykKKwogZGVmIHR0eXBhZ2VyKHRleHQpOgogICAgICIiIlBhZ2UgdGhyb3VnaCB0ZXh0IG9uIGEgdGV4dCB0ZXJtaW5hbC4iIiIKLSAgICBsaW5lcyA9IHBsYWluKHRleHQpLnNwbGl0KCdcbicpCisgICAgbGluZXMgPSBwbGFpbihfZXNjYXBlX3N0ZG91dCh0ZXh0KSkuc3BsaXQoJ1xuJykKICAgICB0cnk6CiAgICAgICAgIGltcG9ydCB0dHkKICAgICAgICAgZmQgPSBzeXMuc3RkaW4uZmlsZW5vKCkKQEAgLTE1MTQsNyArMTUxOCw3IEBACiAKIGRlZiBwbGFpbnBhZ2VyKHRleHQpOgogICAgICIiIlNpbXBseSBwcmludCB1bmZvcm1hdHRlZCB0ZXh0LiAgVGhpcyBpcyB0aGUgdWx0aW1hdGUgZmFsbGJhY2suIiIiCi0gICAgc3lzLnN0ZG91dC53cml0ZShwbGFpbih0ZXh0KSkKKyAgICBzeXMuc3Rkb3V0LndyaXRlKHBsYWluKF9lc2NhcGVfc3Rkb3V0KHRleHQpKSkKIAogZGVmIGRlc2NyaWJlKHRoaW5nKToKICAgICAiIiJQcm9kdWNlIGEgc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhlIGdpdmVuIHRoaW5nLiIiIgpAQCAtMTU3Myw3ICsxNTc3LDEwIEBACiAgICAgaWYgaXNpbnN0YW5jZSh0aGluZywgc3RyKToKICAgICAgICAgb2JqZWN0ID0gbG9jYXRlKHRoaW5nLCBmb3JjZWxvYWQpCiAgICAgICAgIGlmIG5vdCBvYmplY3Q6Ci0gICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcignbm8gUHl0aG9uIGRvY3VtZW50YXRpb24gZm91bmQgZm9yICVyJyAlIHRoaW5nKQorICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoJycnXAorTm8gUHl0aG9uIGRvY3VtZW50YXRpb24gZm91bmQgZm9yICVyLgorVXNlIGhlbHAoKSB0byBnZXQgdGhlIGludGVyYWN0aXZlIGhlbHAgdXRpbGl0eS4KK1VzZSBoZWxwKHN0cikgZm9yIGhlbHAgb24gdGhlIHN0ciBjbGFzcy4nJycgJSB0aGluZykKICAgICAgICAgcmV0dXJuIG9iamVjdCwgdGhpbmcKICAgICBlbHNlOgogICAgICAgICBuYW1lID0gZ2V0YXR0cih0aGluZywgJ19fbmFtZV9fJywgTm9uZSkKQEAgLTE4NDQsNyArMTg1MSwxMCBAQAogICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICByZXF1ZXN0ID0gcmVwbGFjZShyZXF1ZXN0LCAnIicsICcnLCAiJyIsICcnKS5zdHJpcCgpCiAgICAgICAgICAgICBpZiByZXF1ZXN0Lmxvd2VyKCkgaW4gKCdxJywgJ3F1aXQnKTogYnJlYWsKLSAgICAgICAgICAgIHNlbGYuaGVscChyZXF1ZXN0KQorICAgICAgICAgICAgaWYgcmVxdWVzdCA9PSAnaGVscCc6CisgICAgICAgICAgICAgICAgc2VsZi5pbnRybygpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuaGVscChyZXF1ZXN0KQogCiAgICAgZGVmIGdldGxpbmUoc2VsZiwgcHJvbXB0KToKICAgICAgICAgIiIiUmVhZCBvbmUgbGluZSwgdXNpbmcgaW5wdXQoKSB3aGVuIGFwcHJvcHJpYXRlLiIiIgpAQCAtMTg1OCw4ICsxODY4LDcgQEAKICAgICBkZWYgaGVscChzZWxmLCByZXF1ZXN0KToKICAgICAgICAgaWYgdHlwZShyZXF1ZXN0KSBpcyB0eXBlKCcnKToKICAgICAgICAgICAgIHJlcXVlc3QgPSByZXF1ZXN0LnN0cmlwKCkKLSAgICAgICAgICAgIGlmIHJlcXVlc3QgPT0gJ2hlbHAnOiBzZWxmLmludHJvKCkKLSAgICAgICAgICAgIGVsaWYgcmVxdWVzdCA9PSAna2V5d29yZHMnOiBzZWxmLmxpc3RrZXl3b3JkcygpCisgICAgICAgICAgICBpZiByZXF1ZXN0ID09ICdrZXl3b3Jkcyc6IHNlbGYubGlzdGtleXdvcmRzKCkKICAgICAgICAgICAgIGVsaWYgcmVxdWVzdCA9PSAnc3ltYm9scyc6IHNlbGYubGlzdHN5bWJvbHMoKQogICAgICAgICAgICAgZWxpZiByZXF1ZXN0ID09ICd0b3BpY3MnOiBzZWxmLmxpc3R0b3BpY3MoKQogICAgICAgICAgICAgZWxpZiByZXF1ZXN0ID09ICdtb2R1bGVzJzogc2VsZi5saXN0bW9kdWxlcygpCkBAIC0xODcyLDYgKzE4ODEsNyBAQAogICAgICAgICAgICAgZWxpZiByZXF1ZXN0IGluIHNlbGYua2V5d29yZHM6IHNlbGYuc2hvd3RvcGljKHJlcXVlc3QpCiAgICAgICAgICAgICBlbGlmIHJlcXVlc3QgaW4gc2VsZi50b3BpY3M6IHNlbGYuc2hvd3RvcGljKHJlcXVlc3QpCiAgICAgICAgICAgICBlbGlmIHJlcXVlc3Q6IGRvYyhyZXF1ZXN0LCAnSGVscCBvbiAlczonLCBvdXRwdXQ9c2VsZi5fb3V0cHV0KQorICAgICAgICAgICAgZWxzZTogZG9jKHN0ciwgJ0hlbHAgb24gJXM6Jywgb3V0cHV0PXNlbGYuX291dHB1dCkKICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHJlcXVlc3QsIEhlbHBlcik6IHNlbGYoKQogICAgICAgICBlbHNlOiBkb2MocmVxdWVzdCwgJ0hlbHAgb24gJXM6Jywgb3V0cHV0PXNlbGYuX291dHB1dCkKICAgICAgICAgc2VsZi5vdXRwdXQud3JpdGUoJ1xuJykKQEAgLTIwNzMsNyArMjA4Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpZiBvbmVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZXJyb3IobW9kbmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgICAgIGRlc2MgPSAobW9kdWxlLl9fZG9jX18gb3IgJycpLnNwbGl0bGluZXMoKVswXQorICAgICAgICAgICAgICAgICAgICBkZXNjID0gbW9kdWxlLl9fZG9jX18uc3BsaXRsaW5lcygpWzBdIGlmIG1vZHVsZS5fX2RvY19fIGVsc2UgJycKICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IGdldGF0dHIobW9kdWxlLCdfX2ZpbGVfXycsTm9uZSkKICAgICAgICAgICAgICAgICBuYW1lID0gbW9kbmFtZSArICcgLSAnICsgZGVzYwogICAgICAgICAgICAgICAgIGlmIG5hbWUubG93ZXIoKS5maW5kKGtleSkgPj0gMDoKZGlmZiAtLWdpdCBhL0xpYi9weWRvY19kYXRhL3RvcGljcy5weSBiL0xpYi9weWRvY19kYXRhL3RvcGljcy5weQppbmRleCA0ODkyNTllLi42MzFhZDMzIDEwMDY0NAotLS0gYS9MaWIvcHlkb2NfZGF0YS90b3BpY3MucHkKKysrIGIvTGliL3B5ZG9jX2RhdGEvdG9waWNzLnB5CkBAIC0xLDUgKzEsNSBAQAogIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KLSMgQXV0b2dlbmVyYXRlZCBieSBTcGhpbnggb24gU2F0IEZlYiAgNyAxNTo1Mzo1NiAyMDE1CisjIEF1dG9nZW5lcmF0ZWQgYnkgU3BoaW54IG9uIFN1biBNYXIgIDggMDA6MjE6MzMgMjAxNQogdG9waWNzID0geydhc3NlcnQnOiB1J1xuVGhlICJhc3NlcnQiIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKioqKlxuXG5Bc3NlcnQgc3RhdGVtZW50cyBhcmUgYSBjb252ZW5pZW50IHdheSB0byBpbnNlcnQgZGVidWdnaW5nIGFzc2VydGlvbnNcbmludG8gYSBwcm9ncmFtOlxuXG4gICBhc3NlcnRfc3RtdCA6Oj0gImFzc2VydCIgZXhwcmVzc2lvbiBbIiwiIGV4cHJlc3Npb25dXG5cblRoZSBzaW1wbGUgZm9ybSwgImFzc2VydCBleHByZXNzaW9uIiwgaXMgZXF1aXZhbGVudCB0b1xuXG4gICBpZiBfX2RlYnVnX186XG4gICAgICBpZiBub3QgZXhwcmVzc2lvbjogcmFpc2UgQXNzZXJ0aW9uRXJyb3JcblxuVGhlIGV4dGVuZGVkIGZvcm0sICJhc3NlcnQgZXhwcmVzc2lvbjEsIGV4cHJlc3Npb24yIiwgaXMgZXF1aXZhbGVudCB0b1xuXG4gICBpZiBfX2RlYnVnX186XG4gICAgICBpZiBub3QgZXhwcmVzc2lvbjE6IHJhaXNlIEFzc2VydGlvbkVycm9yKGV4cHJlc3Npb24yKVxuXG5UaGVzZSBlcXVpdmFsZW5jZXMgYXNzdW1lIHRoYXQgIl9fZGVidWdfXyIgYW5kICJBc3NlcnRpb25FcnJvciIgcmVmZXJcbnRvIHRoZSBidWlsdC1pbiB2YXJpYWJsZXMgd2l0aCB0aG9zZSBuYW1lcy4gIEluIHRoZSBjdXJyZW50XG5pbXBsZW1lbnRhdGlvbiwgdGhlIGJ1aWx0LWluIHZhcmlhYmxlICJfX2RlYnVnX18iIGlzICJUcnVlIiB1bmRlclxubm9ybWFsIGNpcmN1bXN0YW5jZXMsICJGYWxzZSIgd2hlbiBvcHRpbWl6YXRpb24gaXMgcmVxdWVzdGVkIChjb21tYW5kXG5saW5lIG9wdGlvbiAtTykuICBUaGUgY3VycmVudCBjb2RlIGdlbmVyYXRvciBlbWl0cyBubyBjb2RlIGZvciBhblxuYXNzZXJ0IHN0YXRlbWVudCB3aGVuIG9wdGltaXphdGlvbiBpcyByZXF1ZXN0ZWQgYXQgY29tcGlsZSB0aW1lLiAgTm90ZVxudGhhdCBpdCBpcyB1bm5lY2Vzc2FyeSB0byBpbmNsdWRlIHRoZSBzb3VyY2UgY29kZSBmb3IgdGhlIGV4cHJlc3Npb25cbnRoYXQgZmFpbGVkIGluIHRoZSBlcnJvciBtZXNzYWdlOyBpdCB3aWxsIGJlIGRpc3BsYXllZCBhcyBwYXJ0IG9mIHRoZVxuc3RhY2sgdHJhY2UuXG5cbkFzc2lnbm1lbnRzIHRvICJfX2RlYnVnX18iIGFyZSBpbGxlZ2FsLiAgVGhlIHZhbHVlIGZvciB0aGUgYnVpbHQtaW5cbnZhcmlhYmxlIGlzIGRldGVybWluZWQgd2hlbiB0aGUgaW50ZXJwcmV0ZXIgc3RhcnRzLlxuJywKICAnYXNzaWdubWVudCc6IHUnXG5Bc3NpZ25tZW50IHN0YXRlbWVudHNcbioqKioqKioqKioqKioqKioqKioqKlxuXG5Bc3NpZ25tZW50IHN0YXRlbWVudHMgYXJlIHVzZWQgdG8gKHJlKWJpbmQgbmFtZXMgdG8gdmFsdWVzIGFuZCB0b1xubW9kaWZ5IGF0dHJpYnV0ZXMgb3IgaXRlbXMgb2YgbXV0YWJsZSBvYmplY3RzOlxuXG4gICBhc3NpZ25tZW50X3N0bXQgOjo9ICh0YXJnZXRfbGlzdCAiPSIpKyAoZXhwcmVzc2lvbl9saXN0IHwgeWllbGRfZXhwcmVzc2lvbilcbiAgIHRhcmdldF9saXN0ICAgICA6Oj0gdGFyZ2V0ICgiLCIgdGFyZ2V0KSogWyIsIl1cbiAgIHRhcmdldCAgICAgICAgICA6Oj0gaWRlbnRpZmllclxuICAgICAgICAgICAgICB8ICIoIiB0YXJnZXRfbGlzdCAiKSJcbiAgICAgICAgICAgICAgfCAiWyIgdGFyZ2V0X2xpc3QgIl0iXG4gICAgICAgICAgICAgIHwgYXR0cmlidXRlcmVmXG4gICAgICAgICAgICAgIHwgc3Vic2NyaXB0aW9uXG4gICAgICAgICAgICAgIHwgc2xpY2luZ1xuICAgICAgICAgICAgICB8ICIqIiB0YXJnZXRcblxuKFNlZSBzZWN0aW9uICpQcmltYXJpZXMqIGZvciB0aGUgc3ludGF4IGRlZmluaXRpb25zIGZvclxuKmF0dHJpYnV0ZXJlZiosICpzdWJzY3JpcHRpb24qLCBhbmQgKnNsaWNpbmcqLilcblxuQW4gYXNzaWdubWVudCBzdGF0ZW1lbnQgZXZhbHVhdGVzIHRoZSBleHByZXNzaW9uIGxpc3QgKHJlbWVtYmVyIHRoYXRcbnRoaXMgY2FuIGJlIGEgc2luZ2xlIGV4cHJlc3Npb24gb3IgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCwgdGhlIGxhdHRlclxueWllbGRpbmcgYSB0dXBsZSkgYW5kIGFzc2lnbnMgdGhlIHNpbmdsZSByZXN1bHRpbmcgb2JqZWN0IHRvIGVhY2ggb2ZcbnRoZSB0YXJnZXQgbGlzdHMsIGZyb20gbGVmdCB0byByaWdodC5cblxuQXNzaWdubWVudCBpcyBkZWZpbmVkIHJlY3Vyc2l2ZWx5IGRlcGVuZGluZyBvbiB0aGUgZm9ybSBvZiB0aGUgdGFyZ2V0XG4obGlzdCkuIFdoZW4gYSB0YXJnZXQgaXMgcGFydCBvZiBhIG11dGFibGUgb2JqZWN0IChhbiBhdHRyaWJ1dGVcbnJlZmVyZW5jZSwgc3Vic2NyaXB0aW9uIG9yIHNsaWNpbmcpLCB0aGUgbXV0YWJsZSBvYmplY3QgbXVzdFxudWx0aW1hdGVseSBwZXJmb3JtIHRoZSBhc3NpZ25tZW50IGFuZCBkZWNpZGUgYWJvdXQgaXRzIHZhbGlkaXR5LCBhbmRcbm1heSByYWlzZSBhbiBleGNlcHRpb24gaWYgdGhlIGFzc2lnbm1lbnQgaXMgdW5hY2NlcHRhYmxlLiAgVGhlIHJ1bGVzXG5vYnNlcnZlZCBieSB2YXJpb3VzIHR5cGVzIGFuZCB0aGUgZXhjZXB0aW9ucyByYWlzZWQgYXJlIGdpdmVuIHdpdGggdGhlXG5kZWZpbml0aW9uIG9mIHRoZSBvYmplY3QgdHlwZXMgKHNlZSBzZWN0aW9uICpUaGUgc3RhbmRhcmQgdHlwZVxuaGllcmFyY2h5KikuXG5cbkFzc2lnbm1lbnQgb2YgYW4gb2JqZWN0IHRvIGEgdGFyZ2V0IGxpc3QsIG9wdGlvbmFsbHkgZW5jbG9zZWQgaW5cbnBhcmVudGhlc2VzIG9yIHNxdWFyZSBicmFja2V0cywgaXMgcmVjdXJzaXZlbHkgZGVmaW5lZCBhcyBmb2xsb3dzLlxuXG4qIElmIHRoZSB0YXJnZXQgbGlzdCBpcyBhIHNpbmdsZSB0YXJnZXQ6IFRoZSBvYmplY3QgaXMgYXNzaWduZWQgdG9cbiAgdGhhdCB0YXJnZXQuXG5cbiogSWYgdGhlIHRhcmdldCBsaXN0IGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGFyZ2V0czogVGhlXG4gIG9iamVjdCBtdXN0IGJlIGFuIGl0ZXJhYmxlIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIGl0ZW1zIGFzIHRoZXJlXG4gIGFyZSB0YXJnZXRzIGluIHRoZSB0YXJnZXQgbGlzdCwgYW5kIHRoZSBpdGVtcyBhcmUgYXNzaWduZWQsIGZyb21cbiAgbGVmdCB0byByaWdodCwgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdGFyZ2V0cy5cblxuICAqIElmIHRoZSB0YXJnZXQgbGlzdCBjb250YWlucyBvbmUgdGFyZ2V0IHByZWZpeGVkIHdpdGggYW5cbiAgICBhc3RlcmlzaywgY2FsbGVkIGEgInN0YXJyZWQiIHRhcmdldDogVGhlIG9iamVjdCBtdXN0IGJlIGEgc2VxdWVuY2VcbiAgICB3aXRoIGF0IGxlYXN0IGFzIG1hbnkgaXRlbXMgYXMgdGhlcmUgYXJlIHRhcmdldHMgaW4gdGhlIHRhcmdldFxuICAgIGxpc3QsIG1pbnVzIG9uZS4gIFRoZSBmaXJzdCBpdGVtcyBvZiB0aGUgc2VxdWVuY2UgYXJlIGFzc2lnbmVkLFxuICAgIGZyb20gbGVmdCB0byByaWdodCwgdG8gdGhlIHRhcmdldHMgYmVmb3JlIHRoZSBzdGFycmVkIHRhcmdldC4gIFRoZVxuICAgIGZpbmFsIGl0ZW1zIG9mIHRoZSBzZXF1ZW5jZSBhcmUgYXNzaWduZWQgdG8gdGhlIHRhcmdldHMgYWZ0ZXIgdGhlXG4gICAgc3RhcnJlZCB0YXJnZXQuICBBIGxpc3Qgb2YgdGhlIHJlbWFpbmluZyBpdGVtcyBpbiB0aGUgc2VxdWVuY2UgaXNcbiAgICB0aGVuIGFzc2lnbmVkIHRvIHRoZSBzdGFycmVkIHRhcmdldCAodGhlIGxpc3QgY2FuIGJlIGVtcHR5KS5cblxuICAqIEVsc2U6IFRoZSBvYmplY3QgbXVzdCBiZSBhIHNlcXVlbmNlIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mXG4gICAgaXRlbXMgYXMgdGhlcmUgYXJlIHRhcmdldHMgaW4gdGhlIHRhcmdldCBsaXN0LCBhbmQgdGhlIGl0ZW1zIGFyZVxuICAgIGFzc2lnbmVkLCBmcm9tIGxlZnQgdG8gcmlnaHQsIHRvIHRoZSBjb3JyZXNwb25kaW5nIHRhcmdldHMuXG5cbkFzc2lnbm1lbnQgb2YgYW4gb2JqZWN0IHRvIGEgc2luZ2xlIHRhcmdldCBpcyByZWN1cnNpdmVseSBkZWZpbmVkIGFzXG5mb2xsb3dzLlxuXG4qIElmIHRoZSB0YXJnZXQgaXMgYW4gaWRlbnRpZmllciAobmFtZSk6XG5cbiAgKiBJZiB0aGUgbmFtZSBkb2VzIG5vdCBvY2N1ciBpbiBhICJnbG9iYWwiIG9yICJub25sb2NhbCIgc3RhdGVtZW50XG4gICAgaW4gdGhlIGN1cnJlbnQgY29kZSBibG9jazogdGhlIG5hbWUgaXMgYm91bmQgdG8gdGhlIG9iamVjdCBpbiB0aGVcbiAgICBjdXJyZW50IGxvY2FsIG5hbWVzcGFjZS5cblxuICAqIE90aGVyd2lzZTogdGhlIG5hbWUgaXMgYm91bmQgdG8gdGhlIG9iamVjdCBpbiB0aGUgZ2xvYmFsXG4gICAgbmFtZXNwYWNlIG9yIHRoZSBvdXRlciBuYW1lc3BhY2UgZGV0ZXJtaW5lZCBieSAibm9ubG9jYWwiLFxuICAgIHJlc3BlY3RpdmVseS5cblxuICBUaGUgbmFtZSBpcyByZWJvdW5kIGlmIGl0IHdhcyBhbHJlYWR5IGJvdW5kLiAgVGhpcyBtYXkgY2F1c2UgdGhlXG4gIHJlZmVyZW5jZSBjb3VudCBmb3IgdGhlIG9iamVjdCBwcmV2aW91c2x5IGJvdW5kIHRvIHRoZSBuYW1lIHRvIHJlYWNoXG4gIHplcm8sIGNhdXNpbmcgdGhlIG9iamVjdCB0byBiZSBkZWFsbG9jYXRlZCBhbmQgaXRzIGRlc3RydWN0b3IgKGlmIGl0XG4gIGhhcyBvbmUpIHRvIGJlIGNhbGxlZC5cblxuKiBJZiB0aGUgdGFyZ2V0IGlzIGEgdGFyZ2V0IGxpc3QgZW5jbG9zZWQgaW4gcGFyZW50aGVzZXMgb3IgaW5cbiAgc3F1YXJlIGJyYWNrZXRzOiBUaGUgb2JqZWN0IG11c3QgYmUgYW4gaXRlcmFibGUgd2l0aCB0aGUgc2FtZSBudW1iZXJcbiAgb2YgaXRlbXMgYXMgdGhlcmUgYXJlIHRhcmdldHMgaW4gdGhlIHRhcmdldCBsaXN0LCBhbmQgaXRzIGl0ZW1zIGFyZVxuICBhc3NpZ25lZCwgZnJvbSBsZWZ0IHRvIHJpZ2h0LCB0byB0aGUgY29ycmVzcG9uZGluZyB0YXJnZXRzLlxuXG4qIElmIHRoZSB0YXJnZXQgaXMgYW4gYXR0cmlidXRlIHJlZmVyZW5jZTogVGhlIHByaW1hcnkgZXhwcmVzc2lvbiBpblxuICB0aGUgcmVmZXJlbmNlIGlzIGV2YWx1YXRlZC4gIEl0IHNob3VsZCB5aWVsZCBhbiBvYmplY3Qgd2l0aFxuICBhc3NpZ25hYmxlIGF0dHJpYnV0ZXM7IGlmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCAiVHlwZUVycm9yIiBpc1xuICByYWlzZWQuICBUaGF0IG9iamVjdCBpcyB0aGVuIGFza2VkIHRvIGFzc2lnbiB0aGUgYXNzaWduZWQgb2JqZWN0IHRvXG4gIHRoZSBnaXZlbiBhdHRyaWJ1dGU7IGlmIGl0IGNhbm5vdCBwZXJmb3JtIHRoZSBhc3NpZ25tZW50LCBpdCByYWlzZXNcbiAgYW4gZXhjZXB0aW9uICh1c3VhbGx5IGJ1dCBub3QgbmVjZXNzYXJpbHkgIkF0dHJpYnV0ZUVycm9yIikuXG5cbiAgTm90ZTogSWYgdGhlIG9iamVjdCBpcyBhIGNsYXNzIGluc3RhbmNlIGFuZCB0aGUgYXR0cmlidXRlIHJlZmVyZW5jZVxuICBvY2N1cnMgb24gYm90aCBzaWRlcyBvZiB0aGUgYXNzaWdubWVudCBvcGVyYXRvciwgdGhlIFJIUyBleHByZXNzaW9uLFxuICAiYS54IiBjYW4gYWNjZXNzIGVpdGhlciBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUgb3IgKGlmIG5vIGluc3RhbmNlXG4gIGF0dHJpYnV0ZSBleGlzdHMpIGEgY2xhc3MgYXR0cmlidXRlLiAgVGhlIExIUyB0YXJnZXQgImEueCIgaXMgYWx3YXlzXG4gIHNldCBhcyBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUsIGNyZWF0aW5nIGl0IGlmIG5lY2Vzc2FyeS4gIFRodXMsIHRoZVxuICB0d28gb2NjdXJyZW5jZXMgb2YgImEueCIgZG8gbm90IG5lY2Vzc2FyaWx5IHJlZmVyIHRvIHRoZSBzYW1lXG4gIGF0dHJpYnV0ZTogaWYgdGhlIFJIUyBleHByZXNzaW9uIHJlZmVycyB0byBhIGNsYXNzIGF0dHJpYnV0ZSwgdGhlXG4gIExIUyBjcmVhdGVzIGEgbmV3IGluc3RhbmNlIGF0dHJpYnV0ZSBhcyB0aGUgdGFyZ2V0IG9mIHRoZVxuICBhc3NpZ25tZW50OlxuXG4gICAgIGNsYXNzIENsczpcbiAgICAgICAgIHggPSAzICAgICAgICAgICAgICMgY2xhc3MgdmFyaWFibGVcbiAgICAgaW5zdCA9IENscygpXG4gICAgIGluc3QueCA9IGluc3QueCArIDEgICAjIHdyaXRlcyBpbnN0LnggYXMgNCBsZWF2aW5nIENscy54IGFzIDNcblxuICBUaGlzIGRlc2NyaXB0aW9uIGRvZXMgbm90IG5lY2Vzc2FyaWx5IGFwcGx5IHRvIGRlc2NyaXB0b3JcbiAgYXR0cmlidXRlcywgc3VjaCBhcyBwcm9wZXJ0aWVzIGNyZWF0ZWQgd2l0aCAicHJvcGVydHkoKSIuXG5cbiogSWYgdGhlIHRhcmdldCBpcyBhIHN1YnNjcmlwdGlvbjogVGhlIHByaW1hcnkgZXhwcmVzc2lvbiBpbiB0aGVcbiAgcmVmZXJlbmNlIGlzIGV2YWx1YXRlZC4gIEl0IHNob3VsZCB5aWVsZCBlaXRoZXIgYSBtdXRhYmxlIHNlcXVlbmNlXG4gIG9iamVjdCAoc3VjaCBhcyBhIGxpc3QpIG9yIGEgbWFwcGluZyBvYmplY3QgKHN1Y2ggYXMgYSBkaWN0aW9uYXJ5KS5cbiAgTmV4dCwgdGhlIHN1YnNjcmlwdCBleHByZXNzaW9uIGlzIGV2YWx1YXRlZC5cblxuICBJZiB0aGUgcHJpbWFyeSBpcyBhIG11dGFibGUgc2VxdWVuY2Ugb2JqZWN0IChzdWNoIGFzIGEgbGlzdCksIHRoZVxuICBzdWJzY3JpcHQgbXVzdCB5aWVsZCBhbiBpbnRlZ2VyLiAgSWYgaXQgaXMgbmVnYXRpdmUsIHRoZSBzZXF1ZW5jZVwnc1xuICBsZW5ndGggaXMgYWRkZWQgdG8gaXQuICBUaGUgcmVzdWx0aW5nIHZhbHVlIG11c3QgYmUgYSBub25uZWdhdGl2ZVxuICBpbnRlZ2VyIGxlc3MgdGhhbiB0aGUgc2VxdWVuY2VcJ3MgbGVuZ3RoLCBhbmQgdGhlIHNlcXVlbmNlIGlzIGFza2VkXG4gIHRvIGFzc2lnbiB0aGUgYXNzaWduZWQgb2JqZWN0IHRvIGl0cyBpdGVtIHdpdGggdGhhdCBpbmRleC4gIElmIHRoZVxuICBpbmRleCBpcyBvdXQgb2YgcmFuZ2UsICJJbmRleEVycm9yIiBpcyByYWlzZWQgKGFzc2lnbm1lbnQgdG8gYVxuICBzdWJzY3JpcHRlZCBzZXF1ZW5jZSBjYW5ub3QgYWRkIG5ldyBpdGVtcyB0byBhIGxpc3QpLlxuXG4gIElmIHRoZSBwcmltYXJ5IGlzIGEgbWFwcGluZyBvYmplY3QgKHN1Y2ggYXMgYSBkaWN0aW9uYXJ5KSwgdGhlXG4gIHN1YnNjcmlwdCBtdXN0IGhhdmUgYSB0eXBlIGNvbXBhdGlibGUgd2l0aCB0aGUgbWFwcGluZ1wncyBrZXkgdHlwZSxcbiAgYW5kIHRoZSBtYXBwaW5nIGlzIHRoZW4gYXNrZWQgdG8gY3JlYXRlIGEga2V5L2RhdHVtIHBhaXIgd2hpY2ggbWFwc1xuICB0aGUgc3Vic2NyaXB0IHRvIHRoZSBhc3NpZ25lZCBvYmplY3QuICBUaGlzIGNhbiBlaXRoZXIgcmVwbGFjZSBhblxuICBleGlzdGluZyBrZXkvdmFsdWUgcGFpciB3aXRoIHRoZSBzYW1lIGtleSB2YWx1ZSwgb3IgaW5zZXJ0IGEgbmV3XG4gIGtleS92YWx1ZSBwYWlyIChpZiBubyBrZXkgd2l0aCB0aGUgc2FtZSB2YWx1ZSBleGlzdGVkKS5cblxuICBGb3IgdXNlci1kZWZpbmVkIG9iamVjdHMsIHRoZSAiX19zZXRpdGVtX18oKSIgbWV0aG9kIGlzIGNhbGxlZCB3aXRoXG4gIGFwcHJvcHJpYXRlIGFyZ3VtZW50cy5cblxuKiBJZiB0aGUgdGFyZ2V0IGlzIGEgc2xpY2luZzogVGhlIHByaW1hcnkgZXhwcmVzc2lvbiBpbiB0aGVcbiAgcmVmZXJlbmNlIGlzIGV2YWx1YXRlZC4gIEl0IHNob3VsZCB5aWVsZCBhIG11dGFibGUgc2VxdWVuY2Ugb2JqZWN0XG4gIChzdWNoIGFzIGEgbGlzdCkuICBUaGUgYXNzaWduZWQgb2JqZWN0IHNob3VsZCBiZSBhIHNlcXVlbmNlIG9iamVjdFxuICBvZiB0aGUgc2FtZSB0eXBlLiAgTmV4dCwgdGhlIGxvd2VyIGFuZCB1cHBlciBib3VuZCBleHByZXNzaW9ucyBhcmVcbiAgZXZhbHVhdGVkLCBpbnNvZmFyIHRoZXkgYXJlIHByZXNlbnQ7IGRlZmF1bHRzIGFyZSB6ZXJvIGFuZCB0aGVcbiAgc2VxdWVuY2VcJ3MgbGVuZ3RoLiAgVGhlIGJvdW5kcyBzaG91bGQgZXZhbHVhdGUgdG8gaW50ZWdlcnMuIElmXG4gIGVpdGhlciBib3VuZCBpcyBuZWdhdGl2ZSwgdGhlIHNlcXVlbmNlXCdzIGxlbmd0aCBpcyBhZGRlZCB0byBpdC4gIFRoZVxuICByZXN1bHRpbmcgYm91bmRzIGFyZSBjbGlwcGVkIHRvIGxpZSBiZXR3ZWVuIHplcm8gYW5kIHRoZSBzZXF1ZW5jZVwnc1xuICBsZW5ndGgsIGluY2x1c2l2ZS4gIEZpbmFsbHksIHRoZSBzZXF1ZW5jZSBvYmplY3QgaXMgYXNrZWQgdG8gcmVwbGFjZVxuICB0aGUgc2xpY2Ugd2l0aCB0aGUgaXRlbXMgb2YgdGhlIGFzc2lnbmVkIHNlcXVlbmNlLiAgVGhlIGxlbmd0aCBvZlxuICB0aGUgc2xpY2UgbWF5IGJlIGRpZmZlcmVudCBmcm9tIHRoZSBsZW5ndGggb2YgdGhlIGFzc2lnbmVkIHNlcXVlbmNlLFxuICB0aHVzIGNoYW5naW5nIHRoZSBsZW5ndGggb2YgdGhlIHRhcmdldCBzZXF1ZW5jZSwgaWYgdGhlIHRhcmdldFxuICBzZXF1ZW5jZSBhbGxvd3MgaXQuXG5cbioqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIHRoZVxuc3ludGF4IGZvciB0YXJnZXRzIGlzIHRha2VuIHRvIGJlIHRoZSBzYW1lIGFzIGZvciBleHByZXNzaW9ucywgYW5kXG5pbnZhbGlkIHN5bnRheCBpcyByZWplY3RlZCBkdXJpbmcgdGhlIGNvZGUgZ2VuZXJhdGlvbiBwaGFzZSwgY2F1c2luZ1xubGVzcyBkZXRhaWxlZCBlcnJvciBtZXNzYWdlcy5cblxuQWx0aG91Z2ggdGhlIGRlZmluaXRpb24gb2YgYXNzaWdubWVudCBpbXBsaWVzIHRoYXQgb3ZlcmxhcHMgYmV0d2VlblxudGhlIGxlZnQtaGFuZCBzaWRlIGFuZCB0aGUgcmlnaHQtaGFuZCBzaWRlIGFyZSBcJ3NpbXVsdGFuZW5vdXNcJyAoZm9yXG5leGFtcGxlICJhLCBiID0gYiwgYSIgc3dhcHMgdHdvIHZhcmlhYmxlcyksIG92ZXJsYXBzICp3aXRoaW4qIHRoZVxuY29sbGVjdGlvbiBvZiBhc3NpZ25lZC10byB2YXJpYWJsZXMgb2NjdXIgbGVmdC10by1yaWdodCwgc29tZXRpbWVzXG5yZXN1bHRpbmcgaW4gY29uZnVzaW9uLiAgRm9yIGluc3RhbmNlLCB0aGUgZm9sbG93aW5nIHByb2dyYW0gcHJpbnRzXG4iWzAsIDJdIjpcblxuICAgeCA9IFswLCAxXVxuICAgaSA9IDBcbiAgIGksIHhbaV0gPSAxLCAyICAgICAgICAgIyBpIGlzIHVwZGF0ZWQsIHRoZW4geFtpXSBpcyB1cGRhdGVkXG4gICBwcmludCh4KVxuXG5TZWUgYWxzbzogKipQRVAgMzEzMioqIC0gRXh0ZW5kZWQgSXRlcmFibGUgVW5wYWNraW5nXG5cbiAgICAgVGhlIHNwZWNpZmljYXRpb24gZm9yIHRoZSAiKnRhcmdldCIgZmVhdHVyZS5cblxuXG5BdWdtZW50ZWQgYXNzaWdubWVudCBzdGF0ZW1lbnRzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbkF1Z21lbnRlZCBhc3NpZ25tZW50IGlzIHRoZSBjb21iaW5hdGlvbiwgaW4gYSBzaW5nbGUgc3RhdGVtZW50LCBvZiBhXG5iaW5hcnkgb3BlcmF0aW9uIGFuZCBhbiBhc3NpZ25tZW50IHN0YXRlbWVudDpcblxuICAgYXVnbWVudGVkX2Fzc2lnbm1lbnRfc3RtdCA6Oj0gYXVndGFyZ2V0IGF1Z29wIChleHByZXNzaW9uX2xpc3QgfCB5aWVsZF9leHByZXNzaW9uKVxuICAgYXVndGFyZ2V0ICAgICAgICAgICAgICAgICA6Oj0gaWRlbnRpZmllciB8IGF0dHJpYnV0ZXJlZiB8IHN1YnNjcmlwdGlvbiB8IHNsaWNpbmdcbiAgIGF1Z29wICAgICAgICAgICAgICAgICAgICAgOjo9ICIrPSIgfCAiLT0iIHwgIio9IiB8ICJAPSIgfCAiLz0iIHwgIi8vPSIgfCAiJT0iIHwgIioqPSJcbiAgICAgICAgICAgICB8ICI+Pj0iIHwgIjw8PSIgfCAiJj0iIHwgIl49IiB8ICJ8PSJcblxuKFNlZSBzZWN0aW9uICpQcmltYXJpZXMqIGZvciB0aGUgc3ludGF4IGRlZmluaXRpb25zIG9mIHRoZSBsYXN0IHRocmVlXG5zeW1ib2xzLilcblxuQW4gYXVnbWVudGVkIGFzc2lnbm1lbnQgZXZhbHVhdGVzIHRoZSB0YXJnZXQgKHdoaWNoLCB1bmxpa2Ugbm9ybWFsXG5hc3NpZ25tZW50IHN0YXRlbWVudHMsIGNhbm5vdCBiZSBhbiB1bnBhY2tpbmcpIGFuZCB0aGUgZXhwcmVzc2lvblxubGlzdCwgcGVyZm9ybXMgdGhlIGJpbmFyeSBvcGVyYXRpb24gc3BlY2lmaWMgdG8gdGhlIHR5cGUgb2YgYXNzaWdubWVudFxub24gdGhlIHR3byBvcGVyYW5kcywgYW5kIGFzc2lnbnMgdGhlIHJlc3VsdCB0byB0aGUgb3JpZ2luYWwgdGFyZ2V0LlxuVGhlIHRhcmdldCBpcyBvbmx5IGV2YWx1YXRlZCBvbmNlLlxuXG5BbiBhdWdtZW50ZWQgYXNzaWdubWVudCBleHByZXNzaW9uIGxpa2UgInggKz0gMSIgY2FuIGJlIHJld3JpdHRlbiBhc1xuInggPSB4ICsgMSIgdG8gYWNoaWV2ZSBhIHNpbWlsYXIsIGJ1dCBub3QgZXhhY3RseSBlcXVhbCBlZmZlY3QuIEluIHRoZVxuYXVnbWVudGVkIHZlcnNpb24sICJ4IiBpcyBvbmx5IGV2YWx1YXRlZCBvbmNlLiBBbHNvLCB3aGVuIHBvc3NpYmxlLFxudGhlIGFjdHVhbCBvcGVyYXRpb24gaXMgcGVyZm9ybWVkICppbi1wbGFjZSosIG1lYW5pbmcgdGhhdCByYXRoZXIgdGhhblxuY3JlYXRpbmcgYSBuZXcgb2JqZWN0IGFuZCBhc3NpZ25pbmcgdGhhdCB0byB0aGUgdGFyZ2V0LCB0aGUgb2xkIG9iamVjdFxuaXMgbW9kaWZpZWQgaW5zdGVhZC5cblxuVW5saWtlIG5vcm1hbCBhc3NpZ25tZW50cywgYXVnbWVudGVkIGFzc2lnbm1lbnRzIGV2YWx1YXRlIHRoZSBsZWZ0LVxuaGFuZCBzaWRlICpiZWZvcmUqIGV2YWx1YXRpbmcgdGhlIHJpZ2h0LWhhbmQgc2lkZS4gIEZvciBleGFtcGxlLCAiYVtpXVxuKz0gZih4KSIgZmlyc3QgbG9va3MtdXAgImFbaV0iLCB0aGVuIGl0IGV2YWx1YXRlcyAiZih4KSIgYW5kIHBlcmZvcm1zXG50aGUgYWRkaXRpb24sIGFuZCBsYXN0bHksIGl0IHdyaXRlcyB0aGUgcmVzdWx0IGJhY2sgdG8gImFbaV0iLlxuXG5XaXRoIHRoZSBleGNlcHRpb24gb2YgYXNzaWduaW5nIHRvIHR1cGxlcyBhbmQgbXVsdGlwbGUgdGFyZ2V0cyBpbiBhXG5zaW5nbGUgc3RhdGVtZW50LCB0aGUgYXNzaWdubWVudCBkb25lIGJ5IGF1Z21lbnRlZCBhc3NpZ25tZW50XG5zdGF0ZW1lbnRzIGlzIGhhbmRsZWQgdGhlIHNhbWUgd2F5IGFzIG5vcm1hbCBhc3NpZ25tZW50cy4gU2ltaWxhcmx5LFxud2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBwb3NzaWJsZSAqaW4tcGxhY2UqIGJlaGF2aW9yLCB0aGUgYmluYXJ5XG5vcGVyYXRpb24gcGVyZm9ybWVkIGJ5IGF1Z21lbnRlZCBhc3NpZ25tZW50IGlzIHRoZSBzYW1lIGFzIHRoZSBub3JtYWxcbmJpbmFyeSBvcGVyYXRpb25zLlxuXG5Gb3IgdGFyZ2V0cyB3aGljaCBhcmUgYXR0cmlidXRlIHJlZmVyZW5jZXMsIHRoZSBzYW1lICpjYXZlYXQgYWJvdXRcbmNsYXNzIGFuZCBpbnN0YW5jZSBhdHRyaWJ1dGVzKiBhcHBsaWVzIGFzIGZvciByZWd1bGFyIGFzc2lnbm1lbnRzLlxuJywKICAnYXRvbS1pZGVudGlmaWVycyc6IHUnXG5JZGVudGlmaWVycyAoTmFtZXMpXG4qKioqKioqKioqKioqKioqKioqXG5cbkFuIGlkZW50aWZpZXIgb2NjdXJyaW5nIGFzIGFuIGF0b20gaXMgYSBuYW1lLiAgU2VlIHNlY3Rpb25cbipJZGVudGlmaWVycyBhbmQga2V5d29yZHMqIGZvciBsZXhpY2FsIGRlZmluaXRpb24gYW5kIHNlY3Rpb24gKk5hbWluZ1xuYW5kIGJpbmRpbmcqIGZvciBkb2N1bWVudGF0aW9uIG9mIG5hbWluZyBhbmQgYmluZGluZy5cblxuV2hlbiB0aGUgbmFtZSBpcyBib3VuZCB0byBhbiBvYmplY3QsIGV2YWx1YXRpb24gb2YgdGhlIGF0b20geWllbGRzXG50aGF0IG9iamVjdC4gV2hlbiBhIG5hbWUgaXMgbm90IGJvdW5kLCBhbiBhdHRlbXB0IHRvIGV2YWx1YXRlIGl0XG5yYWlzZXMgYSAiTmFtZUVycm9yIiBleGNlcHRpb24uXG5cbioqUHJpdmF0ZSBuYW1lIG1hbmdsaW5nOioqIFdoZW4gYW4gaWRlbnRpZmllciB0aGF0IHRleHR1YWxseSBvY2N1cnMgaW5cbmEgY2xhc3MgZGVmaW5pdGlvbiBiZWdpbnMgd2l0aCB0d28gb3IgbW9yZSB1bmRlcnNjb3JlIGNoYXJhY3RlcnMgYW5kXG5kb2VzIG5vdCBlbmQgaW4gdHdvIG9yIG1vcmUgdW5kZXJzY29yZXMsIGl0IGlzIGNvbnNpZGVyZWQgYSAqcHJpdmF0ZVxubmFtZSogb2YgdGhhdCBjbGFzcy4gUHJpdmF0ZSBuYW1lcyBhcmUgdHJhbnNmb3JtZWQgdG8gYSBsb25nZXIgZm9ybVxuYmVmb3JlIGNvZGUgaXMgZ2VuZXJhdGVkIGZvciB0aGVtLiAgVGhlIHRyYW5zZm9ybWF0aW9uIGluc2VydHMgdGhlXG5jbGFzcyBuYW1lLCB3aXRoIGxlYWRpbmcgdW5kZXJzY29yZXMgcmVtb3ZlZCBhbmQgYSBzaW5nbGUgdW5kZXJzY29yZVxuaW5zZXJ0ZWQsIGluIGZyb250IG9mIHRoZSBuYW1lLiAgRm9yIGV4YW1wbGUsIHRoZSBpZGVudGlmaWVyICJfX3NwYW0iXG5vY2N1cnJpbmcgaW4gYSBjbGFzcyBuYW1lZCAiSGFtIiB3aWxsIGJlIHRyYW5zZm9ybWVkIHRvICJfSGFtX19zcGFtIi5cblRoaXMgdHJhbnNmb3JtYXRpb24gaXMgaW5kZXBlbmRlbnQgb2YgdGhlIHN5bnRhY3RpY2FsIGNvbnRleHQgaW4gd2hpY2hcbnRoZSBpZGVudGlmaWVyIGlzIHVzZWQuICBJZiB0aGUgdHJhbnNmb3JtZWQgbmFtZSBpcyBleHRyZW1lbHkgbG9uZ1xuKGxvbmdlciB0aGFuIDI1NSBjaGFyYWN0ZXJzKSwgaW1wbGVtZW50YXRpb24gZGVmaW5lZCB0cnVuY2F0aW9uIG1heVxuaGFwcGVuLiBJZiB0aGUgY2xhc3MgbmFtZSBjb25zaXN0cyBvbmx5IG9mIHVuZGVyc2NvcmVzLCBub1xudHJhbnNmb3JtYXRpb24gaXMgZG9uZS5cbicsCkBAIC0xOCw3ICsxOCw3IEBACiAgJ2NhbGxhYmxlLXR5cGVzJzogdSdcbkVtdWxhdGluZyBjYWxsYWJsZSBvYmplY3RzXG4qKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5vYmplY3QuX19jYWxsX18oc2VsZlssIGFyZ3MuLi5dKVxuXG4gICBDYWxsZWQgd2hlbiB0aGUgaW5zdGFuY2UgaXMgImNhbGxlZCIgYXMgYSBmdW5jdGlvbjsgaWYgdGhpcyBtZXRob2RcbiAgIGlzIGRlZmluZWQsICJ4KGFyZzEsIGFyZzIsIC4uLikiIGlzIGEgc2hvcnRoYW5kIGZvclxuICAgInguX19jYWxsX18oYXJnMSwgYXJnMiwgLi4uKSIuXG4nLAogICdjYWxscyc6IHUnXG5DYWxsc1xuKioqKipcblxuQSBjYWxsIGNhbGxzIGEgY2FsbGFibGUgb2JqZWN0IChlLmcuLCBhICpmdW5jdGlvbiopIHdpdGggYSBwb3NzaWJseVxuZW1wdHkgc2VyaWVzIG9mICphcmd1bWVudHMqOlxuXG4gICBjYWxsICAgICAgICAgICAgICAgICA6Oj0gcHJpbWFyeSAiKCIgW2FyZ3VtZW50X2xpc3QgWyIsIl0gfCBjb21wcmVoZW5zaW9uXSAiKSJcbiAgIGFyZ3VtZW50X2xpc3QgICAgICAgIDo6PSBwb3NpdGlvbmFsX2FyZ3VtZW50cyBbIiwiIGtleXdvcmRfYXJndW1lbnRzXVxuICAgICAgICAgICAgICAgICAgICAgICBbIiwiICIqIiBleHByZXNzaW9uXSBbIiwiIGtleXdvcmRfYXJndW1lbnRzXVxuICAgICAgICAgICAgICAgICAgICAgICBbIiwiICIqKiIgZXhwcmVzc2lvbl1cbiAgICAgICAgICAgICAgICAgICAgIHwga2V5d29yZF9hcmd1bWVudHMgWyIsIiAiKiIgZXhwcmVzc2lvbl1cbiAgICAgICAgICAgICAgICAgICAgICAgWyIsIiBrZXl3b3JkX2FyZ3VtZW50c10gWyIsIiAiKioiIGV4cHJlc3Npb25dXG4gICAgICAgICAgICAgICAgICAgICB8ICIqIiBleHByZXNzaW9uIFsiLCIga2V5d29yZF9hcmd1bWVudHNdIFsiLCIgIioqIiBleHByZXNzaW9uXVxuICAgICAgICAgICAgICAgICAgICAgfCAiKioiIGV4cHJlc3Npb25cbiAgIHBvc2l0aW9uYWxfYXJndW1lbnRzIDo6PSBleHByZXNzaW9uICgiLCIgZXhwcmVzc2lvbikqXG4gICBrZXl3b3JkX2FyZ3VtZW50cyAgICA6Oj0ga2V5d29yZF9pdGVtICgiLCIga2V5d29yZF9pdGVtKSpcbiAgIGtleXdvcmRfaXRlbSAgICAgICAgIDo6PSBpZGVudGlmaWVyICI9IiBleHByZXNzaW9uXG5cbkFuIG9wdGlvbmFsIHRyYWlsaW5nIGNvbW1hIG1heSBiZSBwcmVzZW50IGFmdGVyIHRoZSBwb3NpdGlvbmFsIGFuZFxua2V5d29yZCBhcmd1bWVudHMgYnV0IGRvZXMgbm90IGFmZmVjdCB0aGUgc2VtYW50aWNzLlxuXG5UaGUgcHJpbWFyeSBtdXN0IGV2YWx1YXRlIHRvIGEgY2FsbGFibGUgb2JqZWN0ICh1c2VyLWRlZmluZWRcbmZ1bmN0aW9ucywgYnVpbHQtaW4gZnVuY3Rpb25zLCBtZXRob2RzIG9mIGJ1aWx0LWluIG9iamVjdHMsIGNsYXNzXG5vYmplY3RzLCBtZXRob2RzIG9mIGNsYXNzIGluc3RhbmNlcywgYW5kIGFsbCBvYmplY3RzIGhhdmluZyBhXG4iX19jYWxsX18oKSIgbWV0aG9kIGFyZSBjYWxsYWJsZSkuICBBbGwgYXJndW1lbnQgZXhwcmVzc2lvbnMgYXJlXG5ldmFsdWF0ZWQgYmVmb3JlIHRoZSBjYWxsIGlzIGF0dGVtcHRlZC4gIFBsZWFzZSByZWZlciB0byBzZWN0aW9uXG4qRnVuY3Rpb24gZGVmaW5pdGlvbnMqIGZvciB0aGUgc3ludGF4IG9mIGZvcm1hbCAqcGFyYW1ldGVyKiBsaXN0cy5cblxuSWYga2V5d29yZCBhcmd1bWVudHMgYXJlIHByZXNlbnQsIHRoZXkgYXJlIGZpcnN0IGNvbnZlcnRlZCB0b1xucG9zaXRpb25hbCBhcmd1bWVudHMsIGFzIGZvbGxvd3MuICBGaXJzdCwgYSBsaXN0IG9mIHVuZmlsbGVkIHNsb3RzIGlzXG5jcmVhdGVkIGZvciB0aGUgZm9ybWFsIHBhcmFtZXRlcnMuICBJZiB0aGVyZSBhcmUgTiBwb3NpdGlvbmFsXG5hcmd1bWVudHMsIHRoZXkgYXJlIHBsYWNlZCBpbiB0aGUgZmlyc3QgTiBzbG90cy4gIE5leHQsIGZvciBlYWNoXG5rZXl3b3JkIGFyZ3VtZW50LCB0aGUgaWRlbnRpZmllciBpcyB1c2VkIHRvIGRldGVybWluZSB0aGVcbmNvcnJlc3BvbmRpbmcgc2xvdCAoaWYgdGhlIGlkZW50aWZpZXIgaXMgdGhlIHNhbWUgYXMgdGhlIGZpcnN0IGZvcm1hbFxucGFyYW1ldGVyIG5hbWUsIHRoZSBmaXJzdCBzbG90IGlzIHVzZWQsIGFuZCBzbyBvbikuICBJZiB0aGUgc2xvdCBpc1xuYWxyZWFkeSBmaWxsZWQsIGEgIlR5cGVFcnJvciIgZXhjZXB0aW9uIGlzIHJhaXNlZC4gT3RoZXJ3aXNlLCB0aGVcbnZhbHVlIG9mIHRoZSBhcmd1bWVudCBpcyBwbGFjZWQgaW4gdGhlIHNsb3QsIGZpbGxpbmcgaXQgKGV2ZW4gaWYgdGhlXG5leHByZXNzaW9uIGlzICJOb25lIiwgaXQgZmlsbHMgdGhlIHNsb3QpLiAgV2hlbiBhbGwgYXJndW1lbnRzIGhhdmVcbmJlZW4gcHJvY2Vzc2VkLCB0aGUgc2xvdHMgdGhhdCBhcmUgc3RpbGwgdW5maWxsZWQgYXJlIGZpbGxlZCB3aXRoIHRoZVxuY29ycmVzcG9uZGluZyBkZWZhdWx0IHZhbHVlIGZyb20gdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24uICAoRGVmYXVsdFxudmFsdWVzIGFyZSBjYWxjdWxhdGVkLCBvbmNlLCB3aGVuIHRoZSBmdW5jdGlvbiBpcyBkZWZpbmVkOyB0aHVzLCBhXG5tdXRhYmxlIG9iamVjdCBzdWNoIGFzIGEgbGlzdCBvciBkaWN0aW9uYXJ5IHVzZWQgYXMgZGVmYXVsdCB2YWx1ZSB3aWxsXG5iZSBzaGFyZWQgYnkgYWxsIGNhbGxzIHRoYXQgZG9uXCd0IHNwZWNpZnkgYW4gYXJndW1lbnQgdmFsdWUgZm9yIHRoZVxuY29ycmVzcG9uZGluZyBzbG90OyB0aGlzIHNob3VsZCB1c3VhbGx5IGJlIGF2b2lkZWQuKSAgSWYgdGhlcmUgYXJlIGFueVxudW5maWxsZWQgc2xvdHMgZm9yIHdoaWNoIG5vIGRlZmF1bHQgdmFsdWUgaXMgc3BlY2lmaWVkLCBhICJUeXBlRXJyb3IiXG5leGNlcHRpb24gaXMgcmFpc2VkLiAgT3RoZXJ3aXNlLCB0aGUgbGlzdCBvZiBmaWxsZWQgc2xvdHMgaXMgdXNlZCBhc1xudGhlIGFyZ3VtZW50IGxpc3QgZm9yIHRoZSBjYWxsLlxuXG4qKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIEFuIGltcGxlbWVudGF0aW9uIG1heSBwcm92aWRlXG5idWlsdC1pbiBmdW5jdGlvbnMgd2hvc2UgcG9zaXRpb25hbCBwYXJhbWV0ZXJzIGRvIG5vdCBoYXZlIG5hbWVzLCBldmVuXG5pZiB0aGV5IGFyZSBcJ25hbWVkXCcgZm9yIHRoZSBwdXJwb3NlIG9mIGRvY3VtZW50YXRpb24sIGFuZCB3aGljaFxudGhlcmVmb3JlIGNhbm5vdCBiZSBzdXBwbGllZCBieSBrZXl3b3JkLiAgSW4gQ1B5dGhvbiwgdGhpcyBpcyB0aGUgY2FzZVxuZm9yIGZ1bmN0aW9ucyBpbXBsZW1lbnRlZCBpbiBDIHRoYXQgdXNlICJQeUFyZ19QYXJzZVR1cGxlKCkiIHRvIHBhcnNlXG50aGVpciBhcmd1bWVudHMuXG5cbklmIHRoZXJlIGFyZSBtb3JlIHBvc2l0aW9uYWwgYXJndW1lbnRzIHRoYW4gdGhlcmUgYXJlIGZvcm1hbCBwYXJhbWV0ZXJcbnNsb3RzLCBhICJUeXBlRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQsIHVubGVzcyBhIGZvcm1hbCBwYXJhbWV0ZXJcbnVzaW5nIHRoZSBzeW50YXggIippZGVudGlmaWVyIiBpcyBwcmVzZW50OyBpbiB0aGlzIGNhc2UsIHRoYXQgZm9ybWFsXG5wYXJhbWV0ZXIgcmVjZWl2ZXMgYSB0dXBsZSBjb250YWluaW5nIHRoZSBleGNlc3MgcG9zaXRpb25hbCBhcmd1bWVudHNcbihvciBhbiBlbXB0eSB0dXBsZSBpZiB0aGVyZSB3ZXJlIG5vIGV4Y2VzcyBwb3NpdGlvbmFsIGFyZ3VtZW50cykuXG5cbklmIGFueSBrZXl3b3JkIGFyZ3VtZW50IGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYSBmb3JtYWwgcGFyYW1ldGVyXG5uYW1lLCBhICJUeXBlRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQsIHVubGVzcyBhIGZvcm1hbCBwYXJhbWV0ZXJcbnVzaW5nIHRoZSBzeW50YXggIioqaWRlbnRpZmllciIgaXMgcHJlc2VudDsgaW4gdGhpcyBjYXNlLCB0aGF0IGZvcm1hbFxucGFyYW1ldGVyIHJlY2VpdmVzIGEgZGljdGlvbmFyeSBjb250YWluaW5nIHRoZSBleGNlc3Mga2V5d29yZFxuYXJndW1lbnRzICh1c2luZyB0aGUga2V5d29yZHMgYXMga2V5cyBhbmQgdGhlIGFyZ3VtZW50IHZhbHVlcyBhc1xuY29ycmVzcG9uZGluZyB2YWx1ZXMpLCBvciBhIChuZXcpIGVtcHR5IGRpY3Rpb25hcnkgaWYgdGhlcmUgd2VyZSBub1xuZXhjZXNzIGtleXdvcmQgYXJndW1lbnRzLlxuXG5JZiB0aGUgc3ludGF4ICIqZXhwcmVzc2lvbiIgYXBwZWFycyBpbiB0aGUgZnVuY3Rpb24gY2FsbCwgImV4cHJlc3Npb24iXG5tdXN0IGV2YWx1YXRlIHRvIGFuIGl0ZXJhYmxlLiAgRWxlbWVudHMgZnJvbSB0aGlzIGl0ZXJhYmxlIGFyZSB0cmVhdGVkXG5hcyBpZiB0aGV5IHdlcmUgYWRkaXRpb25hbCBwb3NpdGlvbmFsIGFyZ3VtZW50czsgaWYgdGhlcmUgYXJlXG5wb3NpdGlvbmFsIGFyZ3VtZW50cyAqeDEqLCAuLi4sICp4TiosIGFuZCAiZXhwcmVzc2lvbiIgZXZhbHVhdGVzIHRvIGFcbnNlcXVlbmNlICp5MSosIC4uLiwgKnlNKiwgdGhpcyBpcyBlcXVpdmFsZW50IHRvIGEgY2FsbCB3aXRoIE0rTlxucG9zaXRpb25hbCBhcmd1bWVudHMgKngxKiwgLi4uLCAqeE4qLCAqeTEqLCAuLi4sICp5TSouXG5cbkEgY29uc2VxdWVuY2Ugb2YgdGhpcyBpcyB0aGF0IGFsdGhvdWdoIHRoZSAiKmV4cHJlc3Npb24iIHN5bnRheCBtYXlcbmFwcGVhciAqYWZ0ZXIqIHNvbWUga2V5d29yZCBhcmd1bWVudHMsIGl0IGlzIHByb2Nlc3NlZCAqYmVmb3JlKiB0aGVcbmtleXdvcmQgYXJndW1lbnRzIChhbmQgdGhlICIqKmV4cHJlc3Npb24iIGFyZ3VtZW50LCBpZiBhbnkgLS0gc2VlXG5iZWxvdykuICBTbzpcblxuICAgPj4+IGRlZiBmKGEsIGIpOlxuICAgLi4uICBwcmludChhLCBiKVxuICAgLi4uXG4gICA+Pj4gZihiPTEsICooMiwpKVxuICAgMiAxXG4gICA+Pj4gZihhPTEsICooMiwpKVxuICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOlxuICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/XG4gICBUeXBlRXJyb3I6IGYoKSBnb3QgbXVsdGlwbGUgdmFsdWVzIGZvciBrZXl3b3JkIGFyZ3VtZW50IFwnYVwnXG4gICA+Pj4gZigxLCAqKDIsKSlcbiAgIDEgMlxuXG5JdCBpcyB1bnVzdWFsIGZvciBib3RoIGtleXdvcmQgYXJndW1lbnRzIGFuZCB0aGUgIipleHByZXNzaW9uIiBzeW50YXhcbnRvIGJlIHVzZWQgaW4gdGhlIHNhbWUgY2FsbCwgc28gaW4gcHJhY3RpY2UgdGhpcyBjb25mdXNpb24gZG9lcyBub3RcbmFyaXNlLlxuXG5JZiB0aGUgc3ludGF4ICIqKmV4cHJlc3Npb24iIGFwcGVhcnMgaW4gdGhlIGZ1bmN0aW9uIGNhbGwsXG4iZXhwcmVzc2lvbiIgbXVzdCBldmFsdWF0ZSB0byBhIG1hcHBpbmcsIHRoZSBjb250ZW50cyBvZiB3aGljaCBhcmVcbnRyZWF0ZWQgYXMgYWRkaXRpb25hbCBrZXl3b3JkIGFyZ3VtZW50cy4gIEluIHRoZSBjYXNlIG9mIGEga2V5d29yZFxuYXBwZWFyaW5nIGluIGJvdGggImV4cHJlc3Npb24iIGFuZCBhcyBhbiBleHBsaWNpdCBrZXl3b3JkIGFyZ3VtZW50LCBhXG4iVHlwZUVycm9yIiBleGNlcHRpb24gaXMgcmFpc2VkLlxuXG5Gb3JtYWwgcGFyYW1ldGVycyB1c2luZyB0aGUgc3ludGF4ICIqaWRlbnRpZmllciIgb3IgIioqaWRlbnRpZmllciJcbmNhbm5vdCBiZSB1c2VkIGFzIHBvc2l0aW9uYWwgYXJndW1lbnQgc2xvdHMgb3IgYXMga2V5d29yZCBhcmd1bWVudFxubmFtZXMuXG5cbkEgY2FsbCBhbHdheXMgcmV0dXJucyBzb21lIHZhbHVlLCBwb3NzaWJseSAiTm9uZSIsIHVubGVzcyBpdCByYWlzZXMgYW5cbmV4Y2VwdGlvbi4gIEhvdyB0aGlzIHZhbHVlIGlzIGNvbXB1dGVkIGRlcGVuZHMgb24gdGhlIHR5cGUgb2YgdGhlXG5jYWxsYWJsZSBvYmplY3QuXG5cbklmIGl0IGlzLS0tXG5cbmEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uOlxuICAgVGhlIGNvZGUgYmxvY2sgZm9yIHRoZSBmdW5jdGlvbiBpcyBleGVjdXRlZCwgcGFzc2luZyBpdCB0aGVcbiAgIGFyZ3VtZW50IGxpc3QuICBUaGUgZmlyc3QgdGhpbmcgdGhlIGNvZGUgYmxvY2sgd2lsbCBkbyBpcyBiaW5kIHRoZVxuICAgZm9ybWFsIHBhcmFtZXRlcnMgdG8gdGhlIGFyZ3VtZW50czsgdGhpcyBpcyBkZXNjcmliZWQgaW4gc2VjdGlvblxuICAgKkZ1bmN0aW9uIGRlZmluaXRpb25zKi4gIFdoZW4gdGhlIGNvZGUgYmxvY2sgZXhlY3V0ZXMgYSAicmV0dXJuIlxuICAgc3RhdGVtZW50LCB0aGlzIHNwZWNpZmllcyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBmdW5jdGlvbiBjYWxsLlxuXG5hIGJ1aWx0LWluIGZ1bmN0aW9uIG9yIG1ldGhvZDpcbiAgIFRoZSByZXN1bHQgaXMgdXAgdG8gdGhlIGludGVycHJldGVyOyBzZWUgKkJ1aWx0LWluIEZ1bmN0aW9ucyogZm9yXG4gICB0aGUgZGVzY3JpcHRpb25zIG9mIGJ1aWx0LWluIGZ1bmN0aW9ucyBhbmQgbWV0aG9kcy5cblxuYSBjbGFzcyBvYmplY3Q6XG4gICBBIG5ldyBpbnN0YW5jZSBvZiB0aGF0IGNsYXNzIGlzIHJldHVybmVkLlxuXG5hIGNsYXNzIGluc3RhbmNlIG1ldGhvZDpcbiAgIFRoZSBjb3JyZXNwb25kaW5nIHVzZXItZGVmaW5lZCBmdW5jdGlvbiBpcyBjYWxsZWQsIHdpdGggYW4gYXJndW1lbnRcbiAgIGxpc3QgdGhhdCBpcyBvbmUgbG9uZ2VyIHRoYW4gdGhlIGFyZ3VtZW50IGxpc3Qgb2YgdGhlIGNhbGw6IHRoZVxuICAgaW5zdGFuY2UgYmVjb21lcyB0aGUgZmlyc3QgYXJndW1lbnQuXG5cbmEgY2xhc3MgaW5zdGFuY2U6XG4gICBUaGUgY2xhc3MgbXVzdCBkZWZpbmUgYSAiX19jYWxsX18oKSIgbWV0aG9kOyB0aGUgZWZmZWN0IGlzIHRoZW4gdGhlXG4gICBzYW1lIGFzIGlmIHRoYXQgbWV0aG9kIHdhcyBjYWxsZWQuXG4nLAogICdjbGFzcyc6IHUnXG5DbGFzcyBkZWZpbml0aW9uc1xuKioqKioqKioqKioqKioqKipcblxuQSBjbGFzcyBkZWZpbml0aW9uIGRlZmluZXMgYSBjbGFzcyBvYmplY3QgKHNlZSBzZWN0aW9uICpUaGUgc3RhbmRhcmRcbnR5cGUgaGllcmFyY2h5Kik6XG5cbiAgIGNsYXNzZGVmICAgIDo6PSBbZGVjb3JhdG9yc10gImNsYXNzIiBjbGFzc25hbWUgW2luaGVyaXRhbmNlXSAiOiIgc3VpdGVcbiAgIGluaGVyaXRhbmNlIDo6PSAiKCIgW3BhcmFtZXRlcl9saXN0XSAiKSJcbiAgIGNsYXNzbmFtZSAgIDo6PSBpZGVudGlmaWVyXG5cbkEgY2xhc3MgZGVmaW5pdGlvbiBpcyBhbiBleGVjdXRhYmxlIHN0YXRlbWVudC4gIFRoZSBpbmhlcml0YW5jZSBsaXN0XG51c3VhbGx5IGdpdmVzIGEgbGlzdCBvZiBiYXNlIGNsYXNzZXMgKHNlZSAqQ3VzdG9taXppbmcgY2xhc3MgY3JlYXRpb24qXG5mb3IgbW9yZSBhZHZhbmNlZCB1c2VzKSwgc28gZWFjaCBpdGVtIGluIHRoZSBsaXN0IHNob3VsZCBldmFsdWF0ZSB0byBhXG5jbGFzcyBvYmplY3Qgd2hpY2ggYWxsb3dzIHN1YmNsYXNzaW5nLiAgQ2xhc3NlcyB3aXRob3V0IGFuIGluaGVyaXRhbmNlXG5saXN0IGluaGVyaXQsIGJ5IGRlZmF1bHQsIGZyb20gdGhlIGJhc2UgY2xhc3MgIm9iamVjdCI7IGhlbmNlLFxuXG4gICBjbGFzcyBGb286XG4gICAgICAgcGFzc1xuXG5pcyBlcXVpdmFsZW50IHRvXG5cbiAgIGNsYXNzIEZvbyhvYmplY3QpOlxuICAgICAgIHBhc3NcblxuVGhlIGNsYXNzXCdzIHN1aXRlIGlzIHRoZW4gZXhlY3V0ZWQgaW4gYSBuZXcgZXhlY3V0aW9uIGZyYW1lIChzZWVcbipOYW1pbmcgYW5kIGJpbmRpbmcqKSwgdXNpbmcgYSBuZXdseSBjcmVhdGVkIGxvY2FsIG5hbWVzcGFjZSBhbmQgdGhlXG5vcmlnaW5hbCBnbG9iYWwgbmFtZXNwYWNlLiAoVXN1YWxseSwgdGhlIHN1aXRlIGNvbnRhaW5zIG1vc3RseVxuZnVuY3Rpb24gZGVmaW5pdGlvbnMuKSAgV2hlbiB0aGUgY2xhc3NcJ3Mgc3VpdGUgZmluaXNoZXMgZXhlY3V0aW9uLCBpdHNcbmV4ZWN1dGlvbiBmcmFtZSBpcyBkaXNjYXJkZWQgYnV0IGl0cyBsb2NhbCBuYW1lc3BhY2UgaXMgc2F2ZWQuIFs0XSBBXG5jbGFzcyBvYmplY3QgaXMgdGhlbiBjcmVhdGVkIHVzaW5nIHRoZSBpbmhlcml0YW5jZSBsaXN0IGZvciB0aGUgYmFzZVxuY2xhc3NlcyBhbmQgdGhlIHNhdmVkIGxvY2FsIG5hbWVzcGFjZSBmb3IgdGhlIGF0dHJpYnV0ZSBkaWN0aW9uYXJ5LlxuVGhlIGNsYXNzIG5hbWUgaXMgYm91bmQgdG8gdGhpcyBjbGFzcyBvYmplY3QgaW4gdGhlIG9yaWdpbmFsIGxvY2FsXG5uYW1lc3BhY2UuXG5cbkNsYXNzIGNyZWF0aW9uIGNhbiBiZSBjdXN0b21pemVkIGhlYXZpbHkgdXNpbmcgKm1ldGFjbGFzc2VzKi5cblxuQ2xhc3NlcyBjYW4gYWxzbyBiZSBkZWNvcmF0ZWQ6IGp1c3QgbGlrZSB3aGVuIGRlY29yYXRpbmcgZnVuY3Rpb25zLFxuXG4gICBAZjEoYXJnKVxuICAgQGYyXG4gICBjbGFzcyBGb286IHBhc3NcblxuaXMgZXF1aXZhbGVudCB0b1xuXG4gICBjbGFzcyBGb286IHBhc3NcbiAgIEZvbyA9IGYxKGFyZykoZjIoRm9vKSlcblxuVGhlIGV2YWx1YXRpb24gcnVsZXMgZm9yIHRoZSBkZWNvcmF0b3IgZXhwcmVzc2lvbnMgYXJlIHRoZSBzYW1lIGFzIGZvclxuZnVuY3Rpb24gZGVjb3JhdG9ycy4gIFRoZSByZXN1bHQgbXVzdCBiZSBhIGNsYXNzIG9iamVjdCwgd2hpY2ggaXMgdGhlblxuYm91bmQgdG8gdGhlIGNsYXNzIG5hbWUuXG5cbioqUHJvZ3JhbW1lclwncyBub3RlOioqIFZhcmlhYmxlcyBkZWZpbmVkIGluIHRoZSBjbGFzcyBkZWZpbml0aW9uIGFyZVxuY2xhc3MgYXR0cmlidXRlczsgdGhleSBhcmUgc2hhcmVkIGJ5IGluc3RhbmNlcy4gIEluc3RhbmNlIGF0dHJpYnV0ZXNcbmNhbiBiZSBzZXQgaW4gYSBtZXRob2Qgd2l0aCAic2VsZi5uYW1lID0gdmFsdWUiLiAgQm90aCBjbGFzcyBhbmRcbmluc3RhbmNlIGF0dHJpYnV0ZXMgYXJlIGFjY2Vzc2libGUgdGhyb3VnaCB0aGUgbm90YXRpb24gIiJzZWxmLm5hbWUiIixcbmFuZCBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUgaGlkZXMgYSBjbGFzcyBhdHRyaWJ1dGUgd2l0aCB0aGUgc2FtZSBuYW1lXG53aGVuIGFjY2Vzc2VkIGluIHRoaXMgd2F5LiAgQ2xhc3MgYXR0cmlidXRlcyBjYW4gYmUgdXNlZCBhcyBkZWZhdWx0c1xuZm9yIGluc3RhbmNlIGF0dHJpYnV0ZXMsIGJ1dCB1c2luZyBtdXRhYmxlIHZhbHVlcyB0aGVyZSBjYW4gbGVhZCB0b1xudW5leHBlY3RlZCByZXN1bHRzLiAgKkRlc2NyaXB0b3JzKiBjYW4gYmUgdXNlZCB0byBjcmVhdGUgaW5zdGFuY2VcbnZhcmlhYmxlcyB3aXRoIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLlxuXG5TZWUgYWxzbzogKipQRVAgMzExNSoqIC0gTWV0YWNsYXNzZXMgaW4gUHl0aG9uIDMgKipQRVAgMzEyOSoqIC1cbiAgQ2xhc3MgRGVjb3JhdG9yc1xuXG4tWyBGb290bm90ZXMgXS1cblxuWzFdIFRoZSBleGNlcHRpb24gaXMgcHJvcGFnYXRlZCB0byB0aGUgaW52b2NhdGlvbiBzdGFjayB1bmxlc3NcbiAgICB0aGVyZSBpcyBhICJmaW5hbGx5IiBjbGF1c2Ugd2hpY2ggaGFwcGVucyB0byByYWlzZSBhbm90aGVyXG4gICAgZXhjZXB0aW9uLiBUaGF0IG5ldyBleGNlcHRpb24gY2F1c2VzIHRoZSBvbGQgb25lIHRvIGJlIGxvc3QuXG5cblsyXSBDdXJyZW50bHksIGNvbnRyb2wgImZsb3dzIG9mZiB0aGUgZW5kIiBleGNlcHQgaW4gdGhlIGNhc2Ugb2ZcbiAgICBhbiBleGNlcHRpb24gb3IgdGhlIGV4ZWN1dGlvbiBvZiBhICJyZXR1cm4iLCAiY29udGludWUiLCBvclxuICAgICJicmVhayIgc3RhdGVtZW50LlxuXG5bM10gQSBzdHJpbmcgbGl0ZXJhbCBhcHBlYXJpbmcgYXMgdGhlIGZpcnN0IHN0YXRlbWVudCBpbiB0aGVcbiAgICBmdW5jdGlvbiBib2R5IGlzIHRyYW5zZm9ybWVkIGludG8gdGhlIGZ1bmN0aW9uXCdzICJfX2RvY19fIlxuICAgIGF0dHJpYnV0ZSBhbmQgdGhlcmVmb3JlIHRoZSBmdW5jdGlvblwncyAqZG9jc3RyaW5nKi5cblxuWzRdIEEgc3RyaW5nIGxpdGVyYWwgYXBwZWFyaW5nIGFzIHRoZSBmaXJzdCBzdGF0ZW1lbnQgaW4gdGhlIGNsYXNzXG4gICAgYm9keSBpcyB0cmFuc2Zvcm1lZCBpbnRvIHRoZSBuYW1lc3BhY2VcJ3MgIl9fZG9jX18iIGl0ZW0gYW5kXG4gICAgdGhlcmVmb3JlIHRoZSBjbGFzc1wncyAqZG9jc3RyaW5nKi5cbicsCi0gJ2NvbXBhcmlzb25zJzogdSdcbkNvbXBhcmlzb25zXG4qKioqKioqKioqKlxuXG5Vbmxpa2UgQywgYWxsIGNvbXBhcmlzb24gb3BlcmF0aW9ucyBpbiBQeXRob24gaGF2ZSB0aGUgc2FtZSBwcmlvcml0eSxcbndoaWNoIGlzIGxvd2VyIHRoYW4gdGhhdCBvZiBhbnkgYXJpdGhtZXRpYywgc2hpZnRpbmcgb3IgYml0d2lzZVxub3BlcmF0aW9uLiAgQWxzbyB1bmxpa2UgQywgZXhwcmVzc2lvbnMgbGlrZSAiYSA8IGIgPCBjIiBoYXZlIHRoZVxuaW50ZXJwcmV0YXRpb24gdGhhdCBpcyBjb252ZW50aW9uYWwgaW4gbWF0aGVtYXRpY3M6XG5cbiAgIGNvbXBhcmlzb24gICAgOjo9IG9yX2V4cHIgKCBjb21wX29wZXJhdG9yIG9yX2V4cHIgKSpcbiAgIGNvbXBfb3BlcmF0b3IgOjo9ICI8IiB8ICI+IiB8ICI9PSIgfCAiPj0iIHwgIjw9IiB8ICIhPSJcbiAgICAgICAgICAgICAgICAgICAgIHwgImlzIiBbIm5vdCJdIHwgWyJub3QiXSAiaW4iXG5cbkNvbXBhcmlzb25zIHlpZWxkIGJvb2xlYW4gdmFsdWVzOiAiVHJ1ZSIgb3IgIkZhbHNlIi5cblxuQ29tcGFyaXNvbnMgY2FuIGJlIGNoYWluZWQgYXJiaXRyYXJpbHksIGUuZy4sICJ4IDwgeSA8PSB6IiBpc1xuZXF1aXZhbGVudCB0byAieCA8IHkgYW5kIHkgPD0geiIsIGV4Y2VwdCB0aGF0ICJ5IiBpcyBldmFsdWF0ZWQgb25seVxub25jZSAoYnV0IGluIGJvdGggY2FzZXMgInoiIGlzIG5vdCBldmFsdWF0ZWQgYXQgYWxsIHdoZW4gInggPCB5IiBpc1xuZm91bmQgdG8gYmUgZmFsc2UpLlxuXG5Gb3JtYWxseSwgaWYgKmEqLCAqYiosICpjKiwgLi4uLCAqeSosICp6KiBhcmUgZXhwcmVzc2lvbnMgYW5kICpvcDEqLFxuKm9wMiosIC4uLiwgKm9wTiogYXJlIGNvbXBhcmlzb24gb3BlcmF0b3JzLCB0aGVuICJhIG9wMSBiIG9wMiBjIC4uLiB5XG5vcE4geiIgaXMgZXF1aXZhbGVudCB0byAiYSBvcDEgYiBhbmQgYiBvcDIgYyBhbmQgLi4uIHkgb3BOIHoiLCBleGNlcHRcbnRoYXQgZWFjaCBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCBhdCBtb3N0IG9uY2UuXG5cbk5vdGUgdGhhdCAiYSBvcDEgYiBvcDIgYyIgZG9lc25cJ3QgaW1wbHkgYW55IGtpbmQgb2YgY29tcGFyaXNvbiBiZXR3ZWVuXG4qYSogYW5kICpjKiwgc28gdGhhdCwgZS5nLiwgInggPCB5ID4geiIgaXMgcGVyZmVjdGx5IGxlZ2FsICh0aG91Z2hcbnBlcmhhcHMgbm90IHByZXR0eSkuXG5cblRoZSBvcGVyYXRvcnMgIjwiLCAiPiIsICI9PSIsICI+PSIsICI8PSIsIGFuZCAiIT0iIGNvbXBhcmUgdGhlIHZhbHVlc1xub2YgdHdvIG9iamVjdHMuICBUaGUgb2JqZWN0cyBuZWVkIG5vdCBoYXZlIHRoZSBzYW1lIHR5cGUuIElmIGJvdGggYXJlXG5udW1iZXJzLCB0aGV5IGFyZSBjb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZS4gIE90aGVyd2lzZSwgdGhlICI9PSIgYW5kXG4iIT0iIG9wZXJhdG9ycyAqYWx3YXlzKiBjb25zaWRlciBvYmplY3RzIG9mIGRpZmZlcmVudCB0eXBlcyB0byBiZVxudW5lcXVhbCwgd2hpbGUgdGhlICI8IiwgIj4iLCAiPj0iIGFuZCAiPD0iIG9wZXJhdG9ycyByYWlzZSBhXG4iVHlwZUVycm9yIiB3aGVuIGNvbXBhcmluZyBvYmplY3RzIG9mIGRpZmZlcmVudCB0eXBlcyB0aGF0IGRvIG5vdFxuaW1wbGVtZW50IHRoZXNlIG9wZXJhdG9ycyBmb3IgdGhlIGdpdmVuIHBhaXIgb2YgdHlwZXMuICBZb3UgY2FuXG5jb250cm9sIGNvbXBhcmlzb24gYmVoYXZpb3Igb2Ygb2JqZWN0cyBvZiBub24tYnVpbHQtaW4gdHlwZXMgYnlcbmRlZmluaW5nIHJpY2ggY29tcGFyaXNvbiBtZXRob2RzIGxpa2UgIl9fZ3RfXygpIiwgZGVzY3JpYmVkIGluIHNlY3Rpb25cbipCYXNpYyBjdXN0b21pemF0aW9uKi5cblxuQ29tcGFyaXNvbiBvZiBvYmplY3RzIG9mIHRoZSBzYW1lIHR5cGUgZGVwZW5kcyBvbiB0aGUgdHlwZTpcblxuKiBOdW1iZXJzIGFyZSBjb21wYXJlZCBhcml0aG1ldGljYWxseS5cblxuKiBUaGUgdmFsdWVzICJmbG9hdChcJ05hTlwnKSIgYW5kICJEZWNpbWFsKFwnTmFOXCcpIiBhcmUgc3BlY2lhbC4gVGhlXG4gIGFyZSBpZGVudGljYWwgdG8gdGhlbXNlbHZlcywgInggaXMgeCIgYnV0IGFyZSBub3QgZXF1YWwgdG9cbiAgdGhlbXNlbHZlcywgInggIT0geCIuICBBZGRpdGlvbmFsbHksIGNvbXBhcmluZyBhbnkgdmFsdWUgdG8gYVxuICBub3QtYS1udW1iZXIgdmFsdWUgd2lsbCByZXR1cm4gIkZhbHNlIi4gIEZvciBleGFtcGxlLCBib3RoICIzIDxcbiAgZmxvYXQoXCdOYU5cJykiIGFuZCAiZmxvYXQoXCdOYU5cJykgPCAzIiB3aWxsIHJldHVybiAiRmFsc2UiLlxuXG4qIEJ5dGVzIG9iamVjdHMgYXJlIGNvbXBhcmVkIGxleGljb2dyYXBoaWNhbGx5IHVzaW5nIHRoZSBudW1lcmljXG4gIHZhbHVlcyBvZiB0aGVpciBlbGVtZW50cy5cblxuKiBTdHJpbmdzIGFyZSBjb21wYXJlZCBsZXhpY29ncmFwaGljYWxseSB1c2luZyB0aGUgbnVtZXJpY1xuICBlcXVpdmFsZW50cyAodGhlIHJlc3VsdCBvZiB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gIm9yZCgpIikgb2YgdGhlaXJcbiAgY2hhcmFjdGVycy4gWzNdIFN0cmluZyBhbmQgYnl0ZXMgb2JqZWN0IGNhblwndCBiZSBjb21wYXJlZCFcblxuKiBUdXBsZXMgYW5kIGxpc3RzIGFyZSBjb21wYXJlZCBsZXhpY29ncmFwaGljYWxseSB1c2luZyBjb21wYXJpc29uXG4gIG9mIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMuICBUaGlzIG1lYW5zIHRoYXQgdG8gY29tcGFyZSBlcXVhbCwgZWFjaFxuICBlbGVtZW50IG11c3QgY29tcGFyZSBlcXVhbCBhbmQgdGhlIHR3byBzZXF1ZW5jZXMgbXVzdCBiZSBvZiB0aGUgc2FtZVxuICB0eXBlIGFuZCBoYXZlIHRoZSBzYW1lIGxlbmd0aC5cblxuICBJZiBub3QgZXF1YWwsIHRoZSBzZXF1ZW5jZXMgYXJlIG9yZGVyZWQgdGhlIHNhbWUgYXMgdGhlaXIgZmlyc3RcbiAgZGlmZmVyaW5nIGVsZW1lbnRzLiAgRm9yIGV4YW1wbGUsICJbMSwyLHhdIDw9IFsxLDIseV0iIGhhcyB0aGUgc2FtZVxuICB2YWx1ZSBhcyAieCA8PSB5Ii4gIElmIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QsIHRoZVxuICBzaG9ydGVyIHNlcXVlbmNlIGlzIG9yZGVyZWQgZmlyc3QgKGZvciBleGFtcGxlLCAiWzEsMl0gPCBbMSwyLDNdIikuXG5cbiogTWFwcGluZ3MgKGRpY3Rpb25hcmllcykgY29tcGFyZSBlcXVhbCBpZiBhbmQgb25seSBpZiB0aGV5IGhhdmUgdGhlXG4gIHNhbWUgIihrZXksIHZhbHVlKSIgcGFpcnMuIE9yZGVyIGNvbXBhcmlzb25zICIoXCc8XCcsIFwnPD1cJywgXCc+PVwnLFxuICBcJz5cJykiIHJhaXNlICJUeXBlRXJyb3IiLlxuXG4qIFNldHMgYW5kIGZyb3plbnNldHMgZGVmaW5lIGNvbXBhcmlzb24gb3BlcmF0b3JzIHRvIG1lYW4gc3Vic2V0IGFuZFxuICBzdXBlcnNldCB0ZXN0cy4gIFRob3NlIHJlbGF0aW9ucyBkbyBub3QgZGVmaW5lIHRvdGFsIG9yZGVyaW5ncyAodGhlXG4gIHR3byBzZXRzICJ7MSwyfSIgYW5kIHsyLDN9IGFyZSBub3QgZXF1YWwsIG5vciBzdWJzZXRzIG9mIG9uZVxuICBhbm90aGVyLCBub3Igc3VwZXJzZXRzIG9mIG9uZSBhbm90aGVyKS4gIEFjY29yZGluZ2x5LCBzZXRzIGFyZSBub3RcbiAgYXBwcm9wcmlhdGUgYXJndW1lbnRzIGZvciBmdW5jdGlvbnMgd2hpY2ggZGVwZW5kIG9uIHRvdGFsIG9yZGVyaW5nLlxuICBGb3IgZXhhbXBsZSwgIm1pbigpIiwgIm1heCgpIiwgYW5kICJzb3J0ZWQoKSIgcHJvZHVjZSB1bmRlZmluZWRcbiAgcmVzdWx0cyBnaXZlbiBhIGxpc3Qgb2Ygc2V0cyBhcyBpbnB1dHMuXG5cbiogTW9zdCBvdGhlciBvYmplY3RzIG9mIGJ1aWx0LWluIHR5cGVzIGNvbXBhcmUgdW5lcXVhbCB1bmxlc3MgdGhleVxuICBhcmUgdGhlIHNhbWUgb2JqZWN0OyB0aGUgY2hvaWNlIHdoZXRoZXIgb25lIG9iamVjdCBpcyBjb25zaWRlcmVkXG4gIHNtYWxsZXIgb3IgbGFyZ2VyIHRoYW4gYW5vdGhlciBvbmUgaXMgbWFkZSBhcmJpdHJhcmlseSBidXRcbiAgY29uc2lzdGVudGx5IHdpdGhpbiBvbmUgZXhlY3V0aW9uIG9mIGEgcHJvZ3JhbS5cblxuQ29tcGFyaXNvbiBvZiBvYmplY3RzIG9mIGRpZmZlcmluZyB0eXBlcyBkZXBlbmRzIG9uIHdoZXRoZXIgZWl0aGVyIG9mXG50aGUgdHlwZXMgcHJvdmlkZSBleHBsaWNpdCBzdXBwb3J0IGZvciB0aGUgY29tcGFyaXNvbi4gIE1vc3QgbnVtZXJpY1xudHlwZXMgY2FuIGJlIGNvbXBhcmVkIHdpdGggb25lIGFub3RoZXIuICBXaGVuIGNyb3NzLXR5cGUgY29tcGFyaXNvbiBpc1xubm90IHN1cHBvcnRlZCwgdGhlIGNvbXBhcmlzb24gbWV0aG9kIHJldHVybnMgIk5vdEltcGxlbWVudGVkIi5cblxuVGhlIG9wZXJhdG9ycyAiaW4iIGFuZCAibm90IGluIiB0ZXN0IGZvciBtZW1iZXJzaGlwLiAgInggaW4gcyJcbmV2YWx1YXRlcyB0byB0cnVlIGlmICp4KiBpcyBhIG1lbWJlciBvZiAqcyosIGFuZCBmYWxzZSBvdGhlcndpc2UuICAieFxubm90IGluIHMiIHJldHVybnMgdGhlIG5lZ2F0aW9uIG9mICJ4IGluIHMiLiAgQWxsIGJ1aWx0LWluIHNlcXVlbmNlc1xuYW5kIHNldCB0eXBlcyBzdXBwb3J0IHRoaXMgYXMgd2VsbCBhcyBkaWN0aW9uYXJ5LCBmb3Igd2hpY2ggImluIiB0ZXN0c1xud2hldGhlciB0aGUgZGljdGlvbmFyeSBoYXMgYSBnaXZlbiBrZXkuIEZvciBjb250YWluZXIgdHlwZXMgc3VjaCBhc1xubGlzdCwgdHVwbGUsIHNldCwgZnJvemVuc2V0LCBkaWN0LCBvciBjb2xsZWN0aW9ucy5kZXF1ZSwgdGhlXG5leHByZXNzaW9uICJ4IGluIHkiIGlzIGVxdWl2YWxlbnQgdG8gImFueSh4IGlzIGUgb3IgeCA9PSBlIGZvciBlIGluXG55KSIuXG5cbkZvciB0aGUgc3RyaW5nIGFuZCBieXRlcyB0eXBlcywgInggaW4geSIgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiAqeCogaXNcbmEgc3Vic3RyaW5nIG9mICp5Ki4gIEFuIGVxdWl2YWxlbnQgdGVzdCBpcyAieS5maW5kKHgpICE9IC0xIi4gIEVtcHR5XG5zdHJpbmdzIGFyZSBhbHdheXMgY29uc2lkZXJlZCB0byBiZSBhIHN1YnN0cmluZyBvZiBhbnkgb3RoZXIgc3RyaW5nLFxuc28gIiIiIGluICJhYmMiIiB3aWxsIHJldHVybiAiVHJ1ZSIuXG5cbkZvciB1c2VyLWRlZmluZWQgY2xhc3NlcyB3aGljaCBkZWZpbmUgdGhlICJfX2NvbnRhaW5zX18oKSIgbWV0aG9kLCAieFxuaW4geSIgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiAieS5fX2NvbnRhaW5zX18oeCkiIGlzIHRydWUuXG5cbkZvciB1c2VyLWRlZmluZWQgY2xhc3NlcyB3aGljaCBkbyBub3QgZGVmaW5lICJfX2NvbnRhaW5zX18oKSIgYnV0IGRvXG5kZWZpbmUgIl9faXRlcl9fKCkiLCAieCBpbiB5IiBpcyB0cnVlIGlmIHNvbWUgdmFsdWUgInoiIHdpdGggInggPT0geiJcbmlzIHByb2R1Y2VkIHdoaWxlIGl0ZXJhdGluZyBvdmVyICJ5Ii4gIElmIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWRcbmR1cmluZyB0aGUgaXRlcmF0aW9uLCBpdCBpcyBhcyBpZiAiaW4iIHJhaXNlZCB0aGF0IGV4Y2VwdGlvbi5cblxuTGFzdGx5LCB0aGUgb2xkLXN0eWxlIGl0ZXJhdGlvbiBwcm90b2NvbCBpcyB0cmllZDogaWYgYSBjbGFzcyBkZWZpbmVzXG4iX19nZXRpdGVtX18oKSIsICJ4IGluIHkiIGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlcmUgaXMgYSBub24tXG5uZWdhdGl2ZSBpbnRlZ2VyIGluZGV4ICppKiBzdWNoIHRoYXQgInggPT0geVtpXSIsIGFuZCBhbGwgbG93ZXJcbmludGVnZXIgaW5kaWNlcyBkbyBub3QgcmFpc2UgIkluZGV4RXJyb3IiIGV4Y2VwdGlvbi4gIChJZiBhbnkgb3RoZXJcbmV4Y2VwdGlvbiBpcyByYWlzZWQsIGl0IGlzIGFzIGlmICJpbiIgcmFpc2VkIHRoYXQgZXhjZXB0aW9uKS5cblxuVGhlIG9wZXJhdG9yICJub3QgaW4iIGlzIGRlZmluZWQgdG8gaGF2ZSB0aGUgaW52ZXJzZSB0cnVlIHZhbHVlIG9mXG4iaW4iLlxuXG5UaGUgb3BlcmF0b3JzICJpcyIgYW5kICJpcyBub3QiIHRlc3QgZm9yIG9iamVjdCBpZGVudGl0eTogInggaXMgeSIgaXNcbnRydWUgaWYgYW5kIG9ubHkgaWYgKngqIGFuZCAqeSogYXJlIHRoZSBzYW1lIG9iamVjdC4gICJ4IGlzIG5vdCB5IlxueWllbGRzIHRoZSBpbnZlcnNlIHRydXRoIHZhbHVlLiBbNF1cbicsCisgJ2NvbXBhcmlzb25zJzogdSdcbkNvbXBhcmlzb25zXG4qKioqKioqKioqKlxuXG5Vbmxpa2UgQywgYWxsIGNvbXBhcmlzb24gb3BlcmF0aW9ucyBpbiBQeXRob24gaGF2ZSB0aGUgc2FtZSBwcmlvcml0eSxcbndoaWNoIGlzIGxvd2VyIHRoYW4gdGhhdCBvZiBhbnkgYXJpdGhtZXRpYywgc2hpZnRpbmcgb3IgYml0d2lzZVxub3BlcmF0aW9uLiAgQWxzbyB1bmxpa2UgQywgZXhwcmVzc2lvbnMgbGlrZSAiYSA8IGIgPCBjIiBoYXZlIHRoZVxuaW50ZXJwcmV0YXRpb24gdGhhdCBpcyBjb252ZW50aW9uYWwgaW4gbWF0aGVtYXRpY3M6XG5cbiAgIGNvbXBhcmlzb24gICAgOjo9IG9yX2V4cHIgKCBjb21wX29wZXJhdG9yIG9yX2V4cHIgKSpcbiAgIGNvbXBfb3BlcmF0b3IgOjo9ICI8IiB8ICI+IiB8ICI9PSIgfCAiPj0iIHwgIjw9IiB8ICIhPSJcbiAgICAgICAgICAgICAgICAgICAgIHwgImlzIiBbIm5vdCJdIHwgWyJub3QiXSAiaW4iXG5cbkNvbXBhcmlzb25zIHlpZWxkIGJvb2xlYW4gdmFsdWVzOiAiVHJ1ZSIgb3IgIkZhbHNlIi5cblxuQ29tcGFyaXNvbnMgY2FuIGJlIGNoYWluZWQgYXJiaXRyYXJpbHksIGUuZy4sICJ4IDwgeSA8PSB6IiBpc1xuZXF1aXZhbGVudCB0byAieCA8IHkgYW5kIHkgPD0geiIsIGV4Y2VwdCB0aGF0ICJ5IiBpcyBldmFsdWF0ZWQgb25seVxub25jZSAoYnV0IGluIGJvdGggY2FzZXMgInoiIGlzIG5vdCBldmFsdWF0ZWQgYXQgYWxsIHdoZW4gInggPCB5IiBpc1xuZm91bmQgdG8gYmUgZmFsc2UpLlxuXG5Gb3JtYWxseSwgaWYgKmEqLCAqYiosICpjKiwgLi4uLCAqeSosICp6KiBhcmUgZXhwcmVzc2lvbnMgYW5kICpvcDEqLFxuKm9wMiosIC4uLiwgKm9wTiogYXJlIGNvbXBhcmlzb24gb3BlcmF0b3JzLCB0aGVuICJhIG9wMSBiIG9wMiBjIC4uLiB5XG5vcE4geiIgaXMgZXF1aXZhbGVudCB0byAiYSBvcDEgYiBhbmQgYiBvcDIgYyBhbmQgLi4uIHkgb3BOIHoiLCBleGNlcHRcbnRoYXQgZWFjaCBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCBhdCBtb3N0IG9uY2UuXG5cbk5vdGUgdGhhdCAiYSBvcDEgYiBvcDIgYyIgZG9lc25cJ3QgaW1wbHkgYW55IGtpbmQgb2YgY29tcGFyaXNvbiBiZXR3ZWVuXG4qYSogYW5kICpjKiwgc28gdGhhdCwgZS5nLiwgInggPCB5ID4geiIgaXMgcGVyZmVjdGx5IGxlZ2FsICh0aG91Z2hcbnBlcmhhcHMgbm90IHByZXR0eSkuXG5cblRoZSBvcGVyYXRvcnMgIjwiLCAiPiIsICI9PSIsICI+PSIsICI8PSIsIGFuZCAiIT0iIGNvbXBhcmUgdGhlIHZhbHVlc1xub2YgdHdvIG9iamVjdHMuICBUaGUgb2JqZWN0cyBuZWVkIG5vdCBoYXZlIHRoZSBzYW1lIHR5cGUuIElmIGJvdGggYXJlXG5udW1iZXJzLCB0aGV5IGFyZSBjb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZS4gIE90aGVyd2lzZSwgdGhlICI9PSIgYW5kXG4iIT0iIG9wZXJhdG9ycyAqYWx3YXlzKiBjb25zaWRlciBvYmplY3RzIG9mIGRpZmZlcmVudCB0eXBlcyB0byBiZVxudW5lcXVhbCwgd2hpbGUgdGhlICI8IiwgIj4iLCAiPj0iIGFuZCAiPD0iIG9wZXJhdG9ycyByYWlzZSBhXG4iVHlwZUVycm9yIiB3aGVuIGNvbXBhcmluZyBvYmplY3RzIG9mIGRpZmZlcmVudCB0eXBlcyB0aGF0IGRvIG5vdFxuaW1wbGVtZW50IHRoZXNlIG9wZXJhdG9ycyBmb3IgdGhlIGdpdmVuIHBhaXIgb2YgdHlwZXMuICBZb3UgY2FuXG5jb250cm9sIGNvbXBhcmlzb24gYmVoYXZpb3Igb2Ygb2JqZWN0cyBvZiBub24tYnVpbHQtaW4gdHlwZXMgYnlcbmRlZmluaW5nIHJpY2ggY29tcGFyaXNvbiBtZXRob2RzIGxpa2UgIl9fZ3RfXygpIiwgZGVzY3JpYmVkIGluIHNlY3Rpb25cbipCYXNpYyBjdXN0b21pemF0aW9uKi5cblxuQ29tcGFyaXNvbiBvZiBvYmplY3RzIG9mIHRoZSBzYW1lIHR5cGUgZGVwZW5kcyBvbiB0aGUgdHlwZTpcblxuKiBOdW1iZXJzIGFyZSBjb21wYXJlZCBhcml0aG1ldGljYWxseS5cblxuKiBUaGUgdmFsdWVzICJmbG9hdChcJ05hTlwnKSIgYW5kICJEZWNpbWFsKFwnTmFOXCcpIiBhcmUgc3BlY2lhbC4gVGhleVxuICBhcmUgaWRlbnRpY2FsIHRvIHRoZW1zZWx2ZXMsICJ4IGlzIHgiIGJ1dCBhcmUgbm90IGVxdWFsIHRvXG4gIHRoZW1zZWx2ZXMsICJ4ICE9IHgiLiAgQWRkaXRpb25hbGx5LCBjb21wYXJpbmcgYW55IHZhbHVlIHRvIGFcbiAgbm90LWEtbnVtYmVyIHZhbHVlIHdpbGwgcmV0dXJuICJGYWxzZSIuICBGb3IgZXhhbXBsZSwgYm90aCAiMyA8XG4gIGZsb2F0KFwnTmFOXCcpIiBhbmQgImZsb2F0KFwnTmFOXCcpIDwgMyIgd2lsbCByZXR1cm4gIkZhbHNlIi5cblxuKiBCeXRlcyBvYmplY3RzIGFyZSBjb21wYXJlZCBsZXhpY29ncmFwaGljYWxseSB1c2luZyB0aGUgbnVtZXJpY1xuICB2YWx1ZXMgb2YgdGhlaXIgZWxlbWVudHMuXG5cbiogU3RyaW5ncyBhcmUgY29tcGFyZWQgbGV4aWNvZ3JhcGhpY2FsbHkgdXNpbmcgdGhlIG51bWVyaWNcbiAgZXF1aXZhbGVudHMgKHRoZSByZXN1bHQgb2YgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uICJvcmQoKSIpIG9mIHRoZWlyXG4gIGNoYXJhY3RlcnMuIFszXSBTdHJpbmcgYW5kIGJ5dGVzIG9iamVjdCBjYW5cJ3QgYmUgY29tcGFyZWQhXG5cbiogVHVwbGVzIGFuZCBsaXN0cyBhcmUgY29tcGFyZWQgbGV4aWNvZ3JhcGhpY2FsbHkgdXNpbmcgY29tcGFyaXNvblxuICBvZiBjb3JyZXNwb25kaW5nIGVsZW1lbnRzLiAgVGhpcyBtZWFucyB0aGF0IHRvIGNvbXBhcmUgZXF1YWwsIGVhY2hcbiAgZWxlbWVudCBtdXN0IGNvbXBhcmUgZXF1YWwgYW5kIHRoZSB0d28gc2VxdWVuY2VzIG11c3QgYmUgb2YgdGhlIHNhbWVcbiAgdHlwZSBhbmQgaGF2ZSB0aGUgc2FtZSBsZW5ndGguXG5cbiAgSWYgbm90IGVxdWFsLCB0aGUgc2VxdWVuY2VzIGFyZSBvcmRlcmVkIHRoZSBzYW1lIGFzIHRoZWlyIGZpcnN0XG4gIGRpZmZlcmluZyBlbGVtZW50cy4gIEZvciBleGFtcGxlLCAiWzEsMix4XSA8PSBbMSwyLHldIiBoYXMgdGhlIHNhbWVcbiAgdmFsdWUgYXMgInggPD0geSIuICBJZiB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IGRvZXMgbm90IGV4aXN0LCB0aGVcbiAgc2hvcnRlciBzZXF1ZW5jZSBpcyBvcmRlcmVkIGZpcnN0IChmb3IgZXhhbXBsZSwgIlsxLDJdIDwgWzEsMiwzXSIpLlxuXG4qIE1hcHBpbmdzIChkaWN0aW9uYXJpZXMpIGNvbXBhcmUgZXF1YWwgaWYgYW5kIG9ubHkgaWYgdGhleSBoYXZlIHRoZVxuICBzYW1lICIoa2V5LCB2YWx1ZSkiIHBhaXJzLiBPcmRlciBjb21wYXJpc29ucyAiKFwnPFwnLCBcJzw9XCcsIFwnPj1cJyxcbiAgXCc+XCcpIiByYWlzZSAiVHlwZUVycm9yIi5cblxuKiBTZXRzIGFuZCBmcm96ZW5zZXRzIGRlZmluZSBjb21wYXJpc29uIG9wZXJhdG9ycyB0byBtZWFuIHN1YnNldCBhbmRcbiAgc3VwZXJzZXQgdGVzdHMuICBUaG9zZSByZWxhdGlvbnMgZG8gbm90IGRlZmluZSB0b3RhbCBvcmRlcmluZ3MgKHRoZVxuICB0d28gc2V0cyAiezEsMn0iIGFuZCB7MiwzfSBhcmUgbm90IGVxdWFsLCBub3Igc3Vic2V0cyBvZiBvbmVcbiAgYW5vdGhlciwgbm9yIHN1cGVyc2V0cyBvZiBvbmUgYW5vdGhlcikuICBBY2NvcmRpbmdseSwgc2V0cyBhcmUgbm90XG4gIGFwcHJvcHJpYXRlIGFyZ3VtZW50cyBmb3IgZnVuY3Rpb25zIHdoaWNoIGRlcGVuZCBvbiB0b3RhbCBvcmRlcmluZy5cbiAgRm9yIGV4YW1wbGUsICJtaW4oKSIsICJtYXgoKSIsIGFuZCAic29ydGVkKCkiIHByb2R1Y2UgdW5kZWZpbmVkXG4gIHJlc3VsdHMgZ2l2ZW4gYSBsaXN0IG9mIHNldHMgYXMgaW5wdXRzLlxuXG4qIE1vc3Qgb3RoZXIgb2JqZWN0cyBvZiBidWlsdC1pbiB0eXBlcyBjb21wYXJlIHVuZXF1YWwgdW5sZXNzIHRoZXlcbiAgYXJlIHRoZSBzYW1lIG9iamVjdDsgdGhlIGNob2ljZSB3aGV0aGVyIG9uZSBvYmplY3QgaXMgY29uc2lkZXJlZFxuICBzbWFsbGVyIG9yIGxhcmdlciB0aGFuIGFub3RoZXIgb25lIGlzIG1hZGUgYXJiaXRyYXJpbHkgYnV0XG4gIGNvbnNpc3RlbnRseSB3aXRoaW4gb25lIGV4ZWN1dGlvbiBvZiBhIHByb2dyYW0uXG5cbkNvbXBhcmlzb24gb2Ygb2JqZWN0cyBvZiBkaWZmZXJpbmcgdHlwZXMgZGVwZW5kcyBvbiB3aGV0aGVyIGVpdGhlciBvZlxudGhlIHR5cGVzIHByb3ZpZGUgZXhwbGljaXQgc3VwcG9ydCBmb3IgdGhlIGNvbXBhcmlzb24uICBNb3N0IG51bWVyaWNcbnR5cGVzIGNhbiBiZSBjb21wYXJlZCB3aXRoIG9uZSBhbm90aGVyLiAgV2hlbiBjcm9zcy10eXBlIGNvbXBhcmlzb24gaXNcbm5vdCBzdXBwb3J0ZWQsIHRoZSBjb21wYXJpc29uIG1ldGhvZCByZXR1cm5zICJOb3RJbXBsZW1lbnRlZCIuXG5cblRoZSBvcGVyYXRvcnMgImluIiBhbmQgIm5vdCBpbiIgdGVzdCBmb3IgbWVtYmVyc2hpcC4gICJ4IGluIHMiXG5ldmFsdWF0ZXMgdG8gdHJ1ZSBpZiAqeCogaXMgYSBtZW1iZXIgb2YgKnMqLCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLiAgInhcbm5vdCBpbiBzIiByZXR1cm5zIHRoZSBuZWdhdGlvbiBvZiAieCBpbiBzIi4gIEFsbCBidWlsdC1pbiBzZXF1ZW5jZXNcbmFuZCBzZXQgdHlwZXMgc3VwcG9ydCB0aGlzIGFzIHdlbGwgYXMgZGljdGlvbmFyeSwgZm9yIHdoaWNoICJpbiIgdGVzdHNcbndoZXRoZXIgdGhlIGRpY3Rpb25hcnkgaGFzIGEgZ2l2ZW4ga2V5LiBGb3IgY29udGFpbmVyIHR5cGVzIHN1Y2ggYXNcbmxpc3QsIHR1cGxlLCBzZXQsIGZyb3plbnNldCwgZGljdCwgb3IgY29sbGVjdGlvbnMuZGVxdWUsIHRoZVxuZXhwcmVzc2lvbiAieCBpbiB5IiBpcyBlcXVpdmFsZW50IHRvICJhbnkoeCBpcyBlIG9yIHggPT0gZSBmb3IgZSBpblxueSkiLlxuXG5Gb3IgdGhlIHN0cmluZyBhbmQgYnl0ZXMgdHlwZXMsICJ4IGluIHkiIGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgKngqIGlzXG5hIHN1YnN0cmluZyBvZiAqeSouICBBbiBlcXVpdmFsZW50IHRlc3QgaXMgInkuZmluZCh4KSAhPSAtMSIuICBFbXB0eVxuc3RyaW5ncyBhcmUgYWx3YXlzIGNvbnNpZGVyZWQgdG8gYmUgYSBzdWJzdHJpbmcgb2YgYW55IG90aGVyIHN0cmluZyxcbnNvICIiIiBpbiAiYWJjIiIgd2lsbCByZXR1cm4gIlRydWUiLlxuXG5Gb3IgdXNlci1kZWZpbmVkIGNsYXNzZXMgd2hpY2ggZGVmaW5lIHRoZSAiX19jb250YWluc19fKCkiIG1ldGhvZCwgInhcbmluIHkiIGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgInkuX19jb250YWluc19fKHgpIiBpcyB0cnVlLlxuXG5Gb3IgdXNlci1kZWZpbmVkIGNsYXNzZXMgd2hpY2ggZG8gbm90IGRlZmluZSAiX19jb250YWluc19fKCkiIGJ1dCBkb1xuZGVmaW5lICJfX2l0ZXJfXygpIiwgInggaW4geSIgaXMgdHJ1ZSBpZiBzb21lIHZhbHVlICJ6IiB3aXRoICJ4ID09IHoiXG5pcyBwcm9kdWNlZCB3aGlsZSBpdGVyYXRpbmcgb3ZlciAieSIuICBJZiBhbiBleGNlcHRpb24gaXMgcmFpc2VkXG5kdXJpbmcgdGhlIGl0ZXJhdGlvbiwgaXQgaXMgYXMgaWYgImluIiByYWlzZWQgdGhhdCBleGNlcHRpb24uXG5cbkxhc3RseSwgdGhlIG9sZC1zdHlsZSBpdGVyYXRpb24gcHJvdG9jb2wgaXMgdHJpZWQ6IGlmIGEgY2xhc3MgZGVmaW5lc1xuIl9fZ2V0aXRlbV9fKCkiLCAieCBpbiB5IiBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZXJlIGlzIGEgbm9uLVxubmVnYXRpdmUgaW50ZWdlciBpbmRleCAqaSogc3VjaCB0aGF0ICJ4ID09IHlbaV0iLCBhbmQgYWxsIGxvd2VyXG5pbnRlZ2VyIGluZGljZXMgZG8gbm90IHJhaXNlICJJbmRleEVycm9yIiBleGNlcHRpb24uICAoSWYgYW55IG90aGVyXG5leGNlcHRpb24gaXMgcmFpc2VkLCBpdCBpcyBhcyBpZiAiaW4iIHJhaXNlZCB0aGF0IGV4Y2VwdGlvbikuXG5cblRoZSBvcGVyYXRvciAibm90IGluIiBpcyBkZWZpbmVkIHRvIGhhdmUgdGhlIGludmVyc2UgdHJ1ZSB2YWx1ZSBvZlxuImluIi5cblxuVGhlIG9wZXJhdG9ycyAiaXMiIGFuZCAiaXMgbm90IiB0ZXN0IGZvciBvYmplY3QgaWRlbnRpdHk6ICJ4IGlzIHkiIGlzXG50cnVlIGlmIGFuZCBvbmx5IGlmICp4KiBhbmQgKnkqIGFyZSB0aGUgc2FtZSBvYmplY3QuICAieCBpcyBub3QgeSJcbnlpZWxkcyB0aGUgaW52ZXJzZSB0cnV0aCB2YWx1ZS4gWzRdXG4nLAogICdjb21wb3VuZCc6IHUnXG5Db21wb3VuZCBzdGF0ZW1lbnRzXG4qKioqKioqKioqKioqKioqKioqXG5cbkNvbXBvdW5kIHN0YXRlbWVudHMgY29udGFpbiAoZ3JvdXBzIG9mKSBvdGhlciBzdGF0ZW1lbnRzOyB0aGV5IGFmZmVjdFxub3IgY29udHJvbCB0aGUgZXhlY3V0aW9uIG9mIHRob3NlIG90aGVyIHN0YXRlbWVudHMgaW4gc29tZSB3YXkuICBJblxuZ2VuZXJhbCwgY29tcG91bmQgc3RhdGVtZW50cyBzcGFuIG11bHRpcGxlIGxpbmVzLCBhbHRob3VnaCBpbiBzaW1wbGVcbmluY2FybmF0aW9ucyBhIHdob2xlIGNvbXBvdW5kIHN0YXRlbWVudCBtYXkgYmUgY29udGFpbmVkIGluIG9uZSBsaW5lLlxuXG5UaGUgImlmIiwgIndoaWxlIiBhbmQgImZvciIgc3RhdGVtZW50cyBpbXBsZW1lbnQgdHJhZGl0aW9uYWwgY29udHJvbFxuZmxvdyBjb25zdHJ1Y3RzLiAgInRyeSIgc3BlY2lmaWVzIGV4Y2VwdGlvbiBoYW5kbGVycyBhbmQvb3IgY2xlYW51cFxuY29kZSBmb3IgYSBncm91cCBvZiBzdGF0ZW1lbnRzLCB3aGlsZSB0aGUgIndpdGgiIHN0YXRlbWVudCBhbGxvd3MgdGhlXG5leGVjdXRpb24gb2YgaW5pdGlhbGl6YXRpb24gYW5kIGZpbmFsaXphdGlvbiBjb2RlIGFyb3VuZCBhIGJsb2NrIG9mXG5jb2RlLiAgRnVuY3Rpb24gYW5kIGNsYXNzIGRlZmluaXRpb25zIGFyZSBhbHNvIHN5bnRhY3RpY2FsbHkgY29tcG91bmRcbnN0YXRlbWVudHMuXG5cbkEgY29tcG91bmQgc3RhdGVtZW50IGNvbnNpc3RzIG9mIG9uZSBvciBtb3JlIFwnY2xhdXNlcy5cJyAgQSBjbGF1c2VcbmNvbnNpc3RzIG9mIGEgaGVhZGVyIGFuZCBhIFwnc3VpdGUuXCcgIFRoZSBjbGF1c2UgaGVhZGVycyBvZiBhXG5wYXJ0aWN1bGFyIGNvbXBvdW5kIHN0YXRlbWVudCBhcmUgYWxsIGF0IHRoZSBzYW1lIGluZGVudGF0aW9uIGxldmVsLlxuRWFjaCBjbGF1c2UgaGVhZGVyIGJlZ2lucyB3aXRoIGEgdW5pcXVlbHkgaWRlbnRpZnlpbmcga2V5d29yZCBhbmQgZW5kc1xud2l0aCBhIGNvbG9uLiAgQSBzdWl0ZSBpcyBhIGdyb3VwIG9mIHN0YXRlbWVudHMgY29udHJvbGxlZCBieSBhXG5jbGF1c2UuICBBIHN1aXRlIGNhbiBiZSBvbmUgb3IgbW9yZSBzZW1pY29sb24tc2VwYXJhdGVkIHNpbXBsZVxuc3RhdGVtZW50cyBvbiB0aGUgc2FtZSBsaW5lIGFzIHRoZSBoZWFkZXIsIGZvbGxvd2luZyB0aGUgaGVhZGVyXCdzXG5jb2xvbiwgb3IgaXQgY2FuIGJlIG9uZSBvciBtb3JlIGluZGVudGVkIHN0YXRlbWVudHMgb24gc3Vic2VxdWVudFxubGluZXMuICBPbmx5IHRoZSBsYXR0ZXIgZm9ybSBvZiBhIHN1aXRlIGNhbiBjb250YWluIG5lc3RlZCBjb21wb3VuZFxuc3RhdGVtZW50czsgdGhlIGZvbGxvd2luZyBpcyBpbGxlZ2FsLCBtb3N0bHkgYmVjYXVzZSBpdCB3b3VsZG5cJ3QgYmVcbmNsZWFyIHRvIHdoaWNoICJpZiIgY2xhdXNlIGEgZm9sbG93aW5nICJlbHNlIiBjbGF1c2Ugd291bGQgYmVsb25nOlxuXG4gICBpZiB0ZXN0MTogaWYgdGVzdDI6IHByaW50KHgpXG5cbkFsc28gbm90ZSB0aGF0IHRoZSBzZW1pY29sb24gYmluZHMgdGlnaHRlciB0aGFuIHRoZSBjb2xvbiBpbiB0aGlzXG5jb250ZXh0LCBzbyB0aGF0IGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgZWl0aGVyIGFsbCBvciBub25lIG9mIHRoZVxuInByaW50KCkiIGNhbGxzIGFyZSBleGVjdXRlZDpcblxuICAgaWYgeCA8IHkgPCB6OiBwcmludCh4KTsgcHJpbnQoeSk7IHByaW50KHopXG5cblN1bW1hcml6aW5nOlxuXG4gICBjb21wb3VuZF9zdG10IDo6PSBpZl9zdG10XG4gICAgICAgICAgICAgICAgICAgICB8IHdoaWxlX3N0bXRcbiAgICAgICAgICAgICAgICAgICAgIHwgZm9yX3N0bXRcbiAgICAgICAgICAgICAgICAgICAgIHwgdHJ5X3N0bXRcbiAgICAgICAgICAgICAgICAgICAgIHwgd2l0aF9zdG10XG4gICAgICAgICAgICAgICAgICAgICB8IGZ1bmNkZWZcbiAgICAgICAgICAgICAgICAgICAgIHwgY2xhc3NkZWZcbiAgIHN1aXRlICAgICAgICAgOjo9IHN0bXRfbGlzdCBORVdMSU5FIHwgTkVXTElORSBJTkRFTlQgc3RhdGVtZW50KyBERURFTlRcbiAgIHN0YXRlbWVudCAgICAgOjo9IHN0bXRfbGlzdCBORVdMSU5FIHwgY29tcG91bmRfc3RtdFxuICAgc3RtdF9saXN0ICAgICA6Oj0gc2ltcGxlX3N0bXQgKCI7IiBzaW1wbGVfc3RtdCkqIFsiOyJdXG5cbk5vdGUgdGhhdCBzdGF0ZW1lbnRzIGFsd2F5cyBlbmQgaW4gYSAiTkVXTElORSIgcG9zc2libHkgZm9sbG93ZWQgYnkgYVxuIkRFREVOVCIuICBBbHNvIG5vdGUgdGhhdCBvcHRpb25hbCBjb250aW51YXRpb24gY2xhdXNlcyBhbHdheXMgYmVnaW5cbndpdGggYSBrZXl3b3JkIHRoYXQgY2Fubm90IHN0YXJ0IGEgc3RhdGVtZW50LCB0aHVzIHRoZXJlIGFyZSBub1xuYW1iaWd1aXRpZXMgKHRoZSBcJ2RhbmdsaW5nICJlbHNlIlwnIHByb2JsZW0gaXMgc29sdmVkIGluIFB5dGhvbiBieVxucmVxdWlyaW5nIG5lc3RlZCAiaWYiIHN0YXRlbWVudHMgdG8gYmUgaW5kZW50ZWQpLlxuXG5UaGUgZm9ybWF0dGluZyBvZiB0aGUgZ3JhbW1hciBydWxlcyBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb25zIHBsYWNlc1xuZWFjaCBjbGF1c2Ugb24gYSBzZXBhcmF0ZSBsaW5lIGZvciBjbGFyaXR5LlxuXG5cblRoZSAiaWYiIHN0YXRlbWVudFxuPT09PT09PT09PT09PT09PT09XG5cblRoZSAiaWYiIHN0YXRlbWVudCBpcyB1c2VkIGZvciBjb25kaXRpb25hbCBleGVjdXRpb246XG5cbiAgIGlmX3N0bXQgOjo9ICJpZiIgZXhwcmVzc2lvbiAiOiIgc3VpdGVcbiAgICAgICAgICAgICAgICggImVsaWYiIGV4cHJlc3Npb24gIjoiIHN1aXRlICkqXG4gICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV1cblxuSXQgc2VsZWN0cyBleGFjdGx5IG9uZSBvZiB0aGUgc3VpdGVzIGJ5IGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb25zIG9uZVxuYnkgb25lIHVudGlsIG9uZSBpcyBmb3VuZCB0byBiZSB0cnVlIChzZWUgc2VjdGlvbiAqQm9vbGVhbiBvcGVyYXRpb25zKlxuZm9yIHRoZSBkZWZpbml0aW9uIG9mIHRydWUgYW5kIGZhbHNlKTsgdGhlbiB0aGF0IHN1aXRlIGlzIGV4ZWN1dGVkXG4oYW5kIG5vIG90aGVyIHBhcnQgb2YgdGhlICJpZiIgc3RhdGVtZW50IGlzIGV4ZWN1dGVkIG9yIGV2YWx1YXRlZCkuXG5JZiBhbGwgZXhwcmVzc2lvbnMgYXJlIGZhbHNlLCB0aGUgc3VpdGUgb2YgdGhlICJlbHNlIiBjbGF1c2UsIGlmXG5wcmVzZW50LCBpcyBleGVjdXRlZC5cblxuXG5UaGUgIndoaWxlIiBzdGF0ZW1lbnRcbj09PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgIndoaWxlIiBzdGF0ZW1lbnQgaXMgdXNlZCBmb3IgcmVwZWF0ZWQgZXhlY3V0aW9uIGFzIGxvbmcgYXMgYW5cbmV4cHJlc3Npb24gaXMgdHJ1ZTpcblxuICAgd2hpbGVfc3RtdCA6Oj0gIndoaWxlIiBleHByZXNzaW9uICI6IiBzdWl0ZVxuICAgICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG5cblRoaXMgcmVwZWF0ZWRseSB0ZXN0cyB0aGUgZXhwcmVzc2lvbiBhbmQsIGlmIGl0IGlzIHRydWUsIGV4ZWN1dGVzIHRoZVxuZmlyc3Qgc3VpdGU7IGlmIHRoZSBleHByZXNzaW9uIGlzIGZhbHNlICh3aGljaCBtYXkgYmUgdGhlIGZpcnN0IHRpbWVcbml0IGlzIHRlc3RlZCkgdGhlIHN1aXRlIG9mIHRoZSAiZWxzZSIgY2xhdXNlLCBpZiBwcmVzZW50LCBpcyBleGVjdXRlZFxuYW5kIHRoZSBsb29wIHRlcm1pbmF0ZXMuXG5cbkEgImJyZWFrIiBzdGF0ZW1lbnQgZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHRlcm1pbmF0ZXMgdGhlIGxvb3BcbndpdGhvdXQgZXhlY3V0aW5nIHRoZSAiZWxzZSIgY2xhdXNlXCdzIHN1aXRlLiAgQSAiY29udGludWUiIHN0YXRlbWVudFxuZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHNraXBzIHRoZSByZXN0IG9mIHRoZSBzdWl0ZSBhbmQgZ29lcyBiYWNrXG50byB0ZXN0aW5nIHRoZSBleHByZXNzaW9uLlxuXG5cblRoZSAiZm9yIiBzdGF0ZW1lbnRcbj09PT09PT09PT09PT09PT09PT1cblxuVGhlICJmb3IiIHN0YXRlbWVudCBpcyB1c2VkIHRvIGl0ZXJhdGUgb3ZlciB0aGUgZWxlbWVudHMgb2YgYSBzZXF1ZW5jZVxuKHN1Y2ggYXMgYSBzdHJpbmcsIHR1cGxlIG9yIGxpc3QpIG9yIG90aGVyIGl0ZXJhYmxlIG9iamVjdDpcblxuICAgZm9yX3N0bXQgOjo9ICJmb3IiIHRhcmdldF9saXN0ICJpbiIgZXhwcmVzc2lvbl9saXN0ICI6IiBzdWl0ZVxuICAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXVxuXG5UaGUgZXhwcmVzc2lvbiBsaXN0IGlzIGV2YWx1YXRlZCBvbmNlOyBpdCBzaG91bGQgeWllbGQgYW4gaXRlcmFibGVcbm9iamVjdC4gIEFuIGl0ZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIHRoZSByZXN1bHQgb2YgdGhlXG4iZXhwcmVzc2lvbl9saXN0Ii4gIFRoZSBzdWl0ZSBpcyB0aGVuIGV4ZWN1dGVkIG9uY2UgZm9yIGVhY2ggaXRlbVxucHJvdmlkZWQgYnkgdGhlIGl0ZXJhdG9yLCBpbiB0aGUgb3JkZXIgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yLiAgRWFjaFxuaXRlbSBpbiB0dXJuIGlzIGFzc2lnbmVkIHRvIHRoZSB0YXJnZXQgbGlzdCB1c2luZyB0aGUgc3RhbmRhcmQgcnVsZXNcbmZvciBhc3NpZ25tZW50cyAoc2VlICpBc3NpZ25tZW50IHN0YXRlbWVudHMqKSwgYW5kIHRoZW4gdGhlIHN1aXRlIGlzXG5leGVjdXRlZC4gIFdoZW4gdGhlIGl0ZW1zIGFyZSBleGhhdXN0ZWQgKHdoaWNoIGlzIGltbWVkaWF0ZWx5IHdoZW4gdGhlXG5zZXF1ZW5jZSBpcyBlbXB0eSBvciBhbiBpdGVyYXRvciByYWlzZXMgYSAiU3RvcEl0ZXJhdGlvbiIgZXhjZXB0aW9uKSxcbnRoZSBzdWl0ZSBpbiB0aGUgImVsc2UiIGNsYXVzZSwgaWYgcHJlc2VudCwgaXMgZXhlY3V0ZWQsIGFuZCB0aGUgbG9vcFxudGVybWluYXRlcy5cblxuQSAiYnJlYWsiIHN0YXRlbWVudCBleGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgdGVybWluYXRlcyB0aGUgbG9vcFxud2l0aG91dCBleGVjdXRpbmcgdGhlICJlbHNlIiBjbGF1c2VcJ3Mgc3VpdGUuICBBICJjb250aW51ZSIgc3RhdGVtZW50XG5leGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgc2tpcHMgdGhlIHJlc3Qgb2YgdGhlIHN1aXRlIGFuZCBjb250aW51ZXNcbndpdGggdGhlIG5leHQgaXRlbSwgb3Igd2l0aCB0aGUgImVsc2UiIGNsYXVzZSBpZiB0aGVyZSBpcyBubyBuZXh0XG5pdGVtLlxuXG5UaGUgZm9yLWxvb3AgbWFrZXMgYXNzaWdubWVudHMgdG8gdGhlIHZhcmlhYmxlcyhzKSBpbiB0aGUgdGFyZ2V0IGxpc3QuXG5UaGlzIG92ZXJ3cml0ZXMgYWxsIHByZXZpb3VzIGFzc2lnbm1lbnRzIHRvIHRob3NlIHZhcmlhYmxlcyBpbmNsdWRpbmdcbnRob3NlIG1hZGUgaW4gdGhlIHN1aXRlIG9mIHRoZSBmb3ItbG9vcDpcblxuICAgZm9yIGkgaW4gcmFuZ2UoMTApOlxuICAgICAgIHByaW50KGkpXG4gICAgICAgaSA9IDUgICAgICAgICAgICAgIyB0aGlzIHdpbGwgbm90IGFmZmVjdCB0aGUgZm9yLWxvb3BcbiAgICAgICAgICAgICAgICAgICAgICAgICAjIGJlY2F1c2UgaSB3aWxsIGJlIG92ZXJ3cml0dGVuIHdpdGggdGhlIG5leHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAjIGluZGV4IGluIHRoZSByYW5nZVxuXG5OYW1lcyBpbiB0aGUgdGFyZ2V0IGxpc3QgYXJlIG5vdCBkZWxldGVkIHdoZW4gdGhlIGxvb3AgaXMgZmluaXNoZWQsXG5idXQgaWYgdGhlIHNlcXVlbmNlIGlzIGVtcHR5LCB0aGV5IHdpbGwgbm90IGhhdmUgYmVlbiBhc3NpZ25lZCB0byBhdFxuYWxsIGJ5IHRoZSBsb29wLiAgSGludDogdGhlIGJ1aWx0LWluIGZ1bmN0aW9uICJyYW5nZSgpIiByZXR1cm5zIGFuXG5pdGVyYXRvciBvZiBpbnRlZ2VycyBzdWl0YWJsZSB0byBlbXVsYXRlIHRoZSBlZmZlY3Qgb2YgUGFzY2FsXCdzICJmb3IgaVxuOj0gYSB0byBiIGRvIjsgZS5nLiwgImxpc3QocmFuZ2UoMykpIiByZXR1cm5zIHRoZSBsaXN0ICJbMCwgMSwgMl0iLlxuXG5Ob3RlOiBUaGVyZSBpcyBhIHN1YnRsZXR5IHdoZW4gdGhlIHNlcXVlbmNlIGlzIGJlaW5nIG1vZGlmaWVkIGJ5IHRoZVxuICBsb29wICh0aGlzIGNhbiBvbmx5IG9jY3VyIGZvciBtdXRhYmxlIHNlcXVlbmNlcywgaS5lLiBsaXN0cykuICBBblxuICBpbnRlcm5hbCBjb3VudGVyIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB3aGljaCBpdGVtIGlzIHVzZWQgbmV4dCxcbiAgYW5kIHRoaXMgaXMgaW5jcmVtZW50ZWQgb24gZWFjaCBpdGVyYXRpb24uICBXaGVuIHRoaXMgY291bnRlciBoYXNcbiAgcmVhY2hlZCB0aGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZSB0aGUgbG9vcCB0ZXJtaW5hdGVzLiAgVGhpcyBtZWFuc1xuICB0aGF0IGlmIHRoZSBzdWl0ZSBkZWxldGVzIHRoZSBjdXJyZW50IChvciBhIHByZXZpb3VzKSBpdGVtIGZyb20gdGhlXG4gIHNlcXVlbmNlLCB0aGUgbmV4dCBpdGVtIHdpbGwgYmUgc2tpcHBlZCAoc2luY2UgaXQgZ2V0cyB0aGUgaW5kZXggb2ZcbiAgdGhlIGN1cnJlbnQgaXRlbSB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIHRyZWF0ZWQpLiAgTGlrZXdpc2UsIGlmIHRoZVxuICBzdWl0ZSBpbnNlcnRzIGFuIGl0ZW0gaW4gdGhlIHNlcXVlbmNlIGJlZm9yZSB0aGUgY3VycmVudCBpdGVtLCB0aGVcbiAgY3VycmVudCBpdGVtIHdpbGwgYmUgdHJlYXRlZCBhZ2FpbiB0aGUgbmV4dCB0aW1lIHRocm91Z2ggdGhlIGxvb3AuXG4gIFRoaXMgY2FuIGxlYWQgdG8gbmFzdHkgYnVncyB0aGF0IGNhbiBiZSBhdm9pZGVkIGJ5IG1ha2luZyBhXG4gIHRlbXBvcmFyeSBjb3B5IHVzaW5nIGEgc2xpY2Ugb2YgdGhlIHdob2xlIHNlcXVlbmNlLCBlLmcuLFxuXG4gICAgIGZvciB4IGluIGFbOl06XG4gICAgICAgICBpZiB4IDwgMDogYS5yZW1vdmUoeClcblxuXG5UaGUgInRyeSIgc3RhdGVtZW50XG49PT09PT09PT09PT09PT09PT09XG5cblRoZSAidHJ5IiBzdGF0ZW1lbnQgc3BlY2lmaWVzIGV4Y2VwdGlvbiBoYW5kbGVycyBhbmQvb3IgY2xlYW51cCBjb2RlXG5mb3IgYSBncm91cCBvZiBzdGF0ZW1lbnRzOlxuXG4gICB0cnlfc3RtdCAgOjo9IHRyeTFfc3RtdCB8IHRyeTJfc3RtdFxuICAgdHJ5MV9zdG10IDo6PSAidHJ5IiAiOiIgc3VpdGVcbiAgICAgICAgICAgICAgICAgKCJleGNlcHQiIFtleHByZXNzaW9uIFsiYXMiIGlkZW50aWZpZXJdXSAiOiIgc3VpdGUpK1xuICAgICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV1cbiAgICAgICAgICAgICAgICAgWyJmaW5hbGx5IiAiOiIgc3VpdGVdXG4gICB0cnkyX3N0bXQgOjo9ICJ0cnkiICI6IiBzdWl0ZVxuICAgICAgICAgICAgICAgICAiZmluYWxseSIgIjoiIHN1aXRlXG5cblRoZSAiZXhjZXB0IiBjbGF1c2Uocykgc3BlY2lmeSBvbmUgb3IgbW9yZSBleGNlcHRpb24gaGFuZGxlcnMuIFdoZW4gbm9cbmV4Y2VwdGlvbiBvY2N1cnMgaW4gdGhlICJ0cnkiIGNsYXVzZSwgbm8gZXhjZXB0aW9uIGhhbmRsZXIgaXNcbmV4ZWN1dGVkLiBXaGVuIGFuIGV4Y2VwdGlvbiBvY2N1cnMgaW4gdGhlICJ0cnkiIHN1aXRlLCBhIHNlYXJjaCBmb3IgYW5cbmV4Y2VwdGlvbiBoYW5kbGVyIGlzIHN0YXJ0ZWQuICBUaGlzIHNlYXJjaCBpbnNwZWN0cyB0aGUgZXhjZXB0IGNsYXVzZXNcbmluIHR1cm4gdW50aWwgb25lIGlzIGZvdW5kIHRoYXQgbWF0Y2hlcyB0aGUgZXhjZXB0aW9uLiAgQW4gZXhwcmVzc2lvbi1cbmxlc3MgZXhjZXB0IGNsYXVzZSwgaWYgcHJlc2VudCwgbXVzdCBiZSBsYXN0OyBpdCBtYXRjaGVzIGFueVxuZXhjZXB0aW9uLiAgRm9yIGFuIGV4Y2VwdCBjbGF1c2Ugd2l0aCBhbiBleHByZXNzaW9uLCB0aGF0IGV4cHJlc3Npb25cbmlzIGV2YWx1YXRlZCwgYW5kIHRoZSBjbGF1c2UgbWF0Y2hlcyB0aGUgZXhjZXB0aW9uIGlmIHRoZSByZXN1bHRpbmdcbm9iamVjdCBpcyAiY29tcGF0aWJsZSIgd2l0aCB0aGUgZXhjZXB0aW9uLiAgQW4gb2JqZWN0IGlzIGNvbXBhdGlibGVcbndpdGggYW4gZXhjZXB0aW9uIGlmIGl0IGlzIHRoZSBjbGFzcyBvciBhIGJhc2UgY2xhc3Mgb2YgdGhlIGV4Y2VwdGlvblxub2JqZWN0IG9yIGEgdHVwbGUgY29udGFpbmluZyBhbiBpdGVtIGNvbXBhdGlibGUgd2l0aCB0aGUgZXhjZXB0aW9uLlxuXG5JZiBubyBleGNlcHQgY2xhdXNlIG1hdGNoZXMgdGhlIGV4Y2VwdGlvbiwgdGhlIHNlYXJjaCBmb3IgYW4gZXhjZXB0aW9uXG5oYW5kbGVyIGNvbnRpbnVlcyBpbiB0aGUgc3Vycm91bmRpbmcgY29kZSBhbmQgb24gdGhlIGludm9jYXRpb24gc3RhY2suXG5bMV1cblxuSWYgdGhlIGV2YWx1YXRpb24gb2YgYW4gZXhwcmVzc2lvbiBpbiB0aGUgaGVhZGVyIG9mIGFuIGV4Y2VwdCBjbGF1c2VcbnJhaXNlcyBhbiBleGNlcHRpb24sIHRoZSBvcmlnaW5hbCBzZWFyY2ggZm9yIGEgaGFuZGxlciBpcyBjYW5jZWxlZCBhbmRcbmEgc2VhcmNoIHN0YXJ0cyBmb3IgdGhlIG5ldyBleGNlcHRpb24gaW4gdGhlIHN1cnJvdW5kaW5nIGNvZGUgYW5kIG9uXG50aGUgY2FsbCBzdGFjayAoaXQgaXMgdHJlYXRlZCBhcyBpZiB0aGUgZW50aXJlICJ0cnkiIHN0YXRlbWVudCByYWlzZWRcbnRoZSBleGNlcHRpb24pLlxuXG5XaGVuIGEgbWF0Y2hpbmcgZXhjZXB0IGNsYXVzZSBpcyBmb3VuZCwgdGhlIGV4Y2VwdGlvbiBpcyBhc3NpZ25lZCB0b1xudGhlIHRhcmdldCBzcGVjaWZpZWQgYWZ0ZXIgdGhlICJhcyIga2V5d29yZCBpbiB0aGF0IGV4Y2VwdCBjbGF1c2UsIGlmXG5wcmVzZW50LCBhbmQgdGhlIGV4Y2VwdCBjbGF1c2VcJ3Mgc3VpdGUgaXMgZXhlY3V0ZWQuICBBbGwgZXhjZXB0XG5jbGF1c2VzIG11c3QgaGF2ZSBhbiBleGVjdXRhYmxlIGJsb2NrLiAgV2hlbiB0aGUgZW5kIG9mIHRoaXMgYmxvY2sgaXNcbnJlYWNoZWQsIGV4ZWN1dGlvbiBjb250aW51ZXMgbm9ybWFsbHkgYWZ0ZXIgdGhlIGVudGlyZSB0cnkgc3RhdGVtZW50LlxuKFRoaXMgbWVhbnMgdGhhdCBpZiB0d28gbmVzdGVkIGhhbmRsZXJzIGV4aXN0IGZvciB0aGUgc2FtZSBleGNlcHRpb24sXG5hbmQgdGhlIGV4Y2VwdGlvbiBvY2N1cnMgaW4gdGhlIHRyeSBjbGF1c2Ugb2YgdGhlIGlubmVyIGhhbmRsZXIsIHRoZVxub3V0ZXIgaGFuZGxlciB3aWxsIG5vdCBoYW5kbGUgdGhlIGV4Y2VwdGlvbi4pXG5cbldoZW4gYW4gZXhjZXB0aW9uIGhhcyBiZWVuIGFzc2lnbmVkIHVzaW5nICJhcyB0YXJnZXQiLCBpdCBpcyBjbGVhcmVkXG5hdCB0aGUgZW5kIG9mIHRoZSBleGNlcHQgY2xhdXNlLiAgVGhpcyBpcyBhcyBpZlxuXG4gICBleGNlcHQgRSBhcyBOOlxuICAgICAgIGZvb1xuXG53YXMgdHJhbnNsYXRlZCB0b1xuXG4gICBleGNlcHQgRSBhcyBOOlxuICAgICAgIHRyeTpcbiAgICAgICAgICAgZm9vXG4gICAgICAgZmluYWxseTpcbiAgICAgICAgICAgZGVsIE5cblxuVGhpcyBtZWFucyB0aGUgZXhjZXB0aW9uIG11c3QgYmUgYXNzaWduZWQgdG8gYSBkaWZmZXJlbnQgbmFtZSB0byBiZVxuYWJsZSB0byByZWZlciB0byBpdCBhZnRlciB0aGUgZXhjZXB0IGNsYXVzZS4gIEV4Y2VwdGlvbnMgYXJlIGNsZWFyZWRcbmJlY2F1c2Ugd2l0aCB0aGUgdHJhY2ViYWNrIGF0dGFjaGVkIHRvIHRoZW0sIHRoZXkgZm9ybSBhIHJlZmVyZW5jZVxuY3ljbGUgd2l0aCB0aGUgc3RhY2sgZnJhbWUsIGtlZXBpbmcgYWxsIGxvY2FscyBpbiB0aGF0IGZyYW1lIGFsaXZlXG51bnRpbCB0aGUgbmV4dCBnYXJiYWdlIGNvbGxlY3Rpb24gb2NjdXJzLlxuXG5CZWZvcmUgYW4gZXhjZXB0IGNsYXVzZVwncyBzdWl0ZSBpcyBleGVjdXRlZCwgZGV0YWlscyBhYm91dCB0aGVcbmV4Y2VwdGlvbiBhcmUgc3RvcmVkIGluIHRoZSAic3lzIiBtb2R1bGUgYW5kIGNhbiBiZSBhY2Nlc3NlZCB2aWFcbiJzeXMuZXhjX2luZm8oKSIuICJzeXMuZXhjX2luZm8oKSIgcmV0dXJucyBhIDMtdHVwbGUgY29uc2lzdGluZyBvZiB0aGVcbmV4Y2VwdGlvbiBjbGFzcywgdGhlIGV4Y2VwdGlvbiBpbnN0YW5jZSBhbmQgYSB0cmFjZWJhY2sgb2JqZWN0IChzZWVcbnNlY3Rpb24gKlRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSopIGlkZW50aWZ5aW5nIHRoZSBwb2ludCBpbiB0aGVcbnByb2dyYW0gd2hlcmUgdGhlIGV4Y2VwdGlvbiBvY2N1cnJlZC4gICJzeXMuZXhjX2luZm8oKSIgdmFsdWVzIGFyZVxucmVzdG9yZWQgdG8gdGhlaXIgcHJldmlvdXMgdmFsdWVzIChiZWZvcmUgdGhlIGNhbGwpIHdoZW4gcmV0dXJuaW5nXG5mcm9tIGEgZnVuY3Rpb24gdGhhdCBoYW5kbGVkIGFuIGV4Y2VwdGlvbi5cblxuVGhlIG9wdGlvbmFsICJlbHNlIiBjbGF1c2UgaXMgZXhlY3V0ZWQgaWYgYW5kIHdoZW4gY29udHJvbCBmbG93cyBvZmZcbnRoZSBlbmQgb2YgdGhlICJ0cnkiIGNsYXVzZS4gWzJdIEV4Y2VwdGlvbnMgaW4gdGhlICJlbHNlIiBjbGF1c2UgYXJlXG5ub3QgaGFuZGxlZCBieSB0aGUgcHJlY2VkaW5nICJleGNlcHQiIGNsYXVzZXMuXG5cbklmICJmaW5hbGx5IiBpcyBwcmVzZW50LCBpdCBzcGVjaWZpZXMgYSBcJ2NsZWFudXBcJyBoYW5kbGVyLiAgVGhlICJ0cnkiXG5jbGF1c2UgaXMgZXhlY3V0ZWQsIGluY2x1ZGluZyBhbnkgImV4Y2VwdCIgYW5kICJlbHNlIiBjbGF1c2VzLiAgSWYgYW5cbmV4Y2VwdGlvbiBvY2N1cnMgaW4gYW55IG9mIHRoZSBjbGF1c2VzIGFuZCBpcyBub3QgaGFuZGxlZCwgdGhlXG5leGNlcHRpb24gaXMgdGVtcG9yYXJpbHkgc2F2ZWQuIFRoZSAiZmluYWxseSIgY2xhdXNlIGlzIGV4ZWN1dGVkLiAgSWZcbnRoZXJlIGlzIGEgc2F2ZWQgZXhjZXB0aW9uIGl0IGlzIHJlLXJhaXNlZCBhdCB0aGUgZW5kIG9mIHRoZSAiZmluYWxseSJcbmNsYXVzZS4gIElmIHRoZSAiZmluYWxseSIgY2xhdXNlIHJhaXNlcyBhbm90aGVyIGV4Y2VwdGlvbiwgdGhlIHNhdmVkXG5leGNlcHRpb24gaXMgc2V0IGFzIHRoZSBjb250ZXh0IG9mIHRoZSBuZXcgZXhjZXB0aW9uLiBJZiB0aGUgImZpbmFsbHkiXG5jbGF1c2UgZXhlY3V0ZXMgYSAicmV0dXJuIiBvciAiYnJlYWsiIHN0YXRlbWVudCwgdGhlIHNhdmVkIGV4Y2VwdGlvblxuaXMgZGlzY2FyZGVkOlxuXG4gICA+Pj4gZGVmIGYoKTpcbiAgIC4uLiAgICAgdHJ5OlxuICAgLi4uICAgICAgICAgMS8wXG4gICAuLi4gICAgIGZpbmFsbHk6XG4gICAuLi4gICAgICAgICByZXR1cm4gNDJcbiAgIC4uLlxuICAgPj4+IGYoKVxuICAgNDJcblxuVGhlIGV4Y2VwdGlvbiBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlIHRvIHRoZSBwcm9ncmFtIGR1cmluZ1xuZXhlY3V0aW9uIG9mIHRoZSAiZmluYWxseSIgY2xhdXNlLlxuXG5XaGVuIGEgInJldHVybiIsICJicmVhayIgb3IgImNvbnRpbnVlIiBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQgaW4gdGhlXG4idHJ5IiBzdWl0ZSBvZiBhICJ0cnkiLi4uImZpbmFsbHkiIHN0YXRlbWVudCwgdGhlICJmaW5hbGx5IiBjbGF1c2UgaXNcbmFsc28gZXhlY3V0ZWQgXCdvbiB0aGUgd2F5IG91dC5cJyBBICJjb250aW51ZSIgc3RhdGVtZW50IGlzIGlsbGVnYWwgaW5cbnRoZSAiZmluYWxseSIgY2xhdXNlLiAoVGhlIHJlYXNvbiBpcyBhIHByb2JsZW0gd2l0aCB0aGUgY3VycmVudFxuaW1wbGVtZW50YXRpb24gLS0tIHRoaXMgcmVzdHJpY3Rpb24gbWF5IGJlIGxpZnRlZCBpbiB0aGUgZnV0dXJlKS5cblxuVGhlIHJldHVybiB2YWx1ZSBvZiBhIGZ1bmN0aW9uIGlzIGRldGVybWluZWQgYnkgdGhlIGxhc3QgInJldHVybiJcbnN0YXRlbWVudCBleGVjdXRlZC4gIFNpbmNlIHRoZSAiZmluYWxseSIgY2xhdXNlIGFsd2F5cyBleGVjdXRlcywgYVxuInJldHVybiIgc3RhdGVtZW50IGV4ZWN1dGVkIGluIHRoZSAiZmluYWxseSIgY2xhdXNlIHdpbGwgYWx3YXlzIGJlIHRoZVxubGFzdCBvbmUgZXhlY3V0ZWQ6XG5cbiAgID4+PiBkZWYgZm9vKCk6XG4gICAuLi4gICAgIHRyeTpcbiAgIC4uLiAgICAgICAgIHJldHVybiBcJ3RyeVwnXG4gICAuLi4gICAgIGZpbmFsbHk6XG4gICAuLi4gICAgICAgICByZXR1cm4gXCdmaW5hbGx5XCdcbiAgIC4uLlxuICAgPj4+IGZvbygpXG4gICBcJ2ZpbmFsbHlcJ1xuXG5BZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIGV4Y2VwdGlvbnMgY2FuIGJlIGZvdW5kIGluIHNlY3Rpb25cbipFeGNlcHRpb25zKiwgYW5kIGluZm9ybWF0aW9uIG9uIHVzaW5nIHRoZSAicmFpc2UiIHN0YXRlbWVudCB0b1xuZ2VuZXJhdGUgZXhjZXB0aW9ucyBtYXkgYmUgZm91bmQgaW4gc2VjdGlvbiAqVGhlIHJhaXNlIHN0YXRlbWVudCouXG5cblxuVGhlICJ3aXRoIiBzdGF0ZW1lbnRcbj09PT09PT09PT09PT09PT09PT09XG5cblRoZSAid2l0aCIgc3RhdGVtZW50IGlzIHVzZWQgdG8gd3JhcCB0aGUgZXhlY3V0aW9uIG9mIGEgYmxvY2sgd2l0aFxubWV0aG9kcyBkZWZpbmVkIGJ5IGEgY29udGV4dCBtYW5hZ2VyIChzZWUgc2VjdGlvbiAqV2l0aCBTdGF0ZW1lbnRcbkNvbnRleHQgTWFuYWdlcnMqKS4gVGhpcyBhbGxvd3MgY29tbW9uICJ0cnkiLi4uImV4Y2VwdCIuLi4iZmluYWxseSJcbnVzYWdlIHBhdHRlcm5zIHRvIGJlIGVuY2Fwc3VsYXRlZCBmb3IgY29udmVuaWVudCByZXVzZS5cblxuICAgd2l0aF9zdG10IDo6PSAid2l0aCIgd2l0aF9pdGVtICgiLCIgd2l0aF9pdGVtKSogIjoiIHN1aXRlXG4gICB3aXRoX2l0ZW0gOjo9IGV4cHJlc3Npb24gWyJhcyIgdGFyZ2V0XVxuXG5UaGUgZXhlY3V0aW9uIG9mIHRoZSAid2l0aCIgc3RhdGVtZW50IHdpdGggb25lICJpdGVtIiBwcm9jZWVkcyBhc1xuZm9sbG93czpcblxuMS4gVGhlIGNvbnRleHQgZXhwcmVzc2lvbiAodGhlIGV4cHJlc3Npb24gZ2l2ZW4gaW4gdGhlICJ3aXRoX2l0ZW0iKVxuICAgaXMgZXZhbHVhdGVkIHRvIG9idGFpbiBhIGNvbnRleHQgbWFuYWdlci5cblxuMi4gVGhlIGNvbnRleHQgbWFuYWdlclwncyAiX19leGl0X18oKSIgaXMgbG9hZGVkIGZvciBsYXRlciB1c2UuXG5cbjMuIFRoZSBjb250ZXh0IG1hbmFnZXJcJ3MgIl9fZW50ZXJfXygpIiBtZXRob2QgaXMgaW52b2tlZC5cblxuNC4gSWYgYSB0YXJnZXQgd2FzIGluY2x1ZGVkIGluIHRoZSAid2l0aCIgc3RhdGVtZW50LCB0aGUgcmV0dXJuXG4gICB2YWx1ZSBmcm9tICJfX2VudGVyX18oKSIgaXMgYXNzaWduZWQgdG8gaXQuXG5cbiAgIE5vdGU6IFRoZSAid2l0aCIgc3RhdGVtZW50IGd1YXJhbnRlZXMgdGhhdCBpZiB0aGUgIl9fZW50ZXJfXygpIlxuICAgICBtZXRob2QgcmV0dXJucyB3aXRob3V0IGFuIGVycm9yLCB0aGVuICJfX2V4aXRfXygpIiB3aWxsIGFsd2F5cyBiZVxuICAgICBjYWxsZWQuIFRodXMsIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgdGhlIGFzc2lnbm1lbnQgdG8gdGhlXG4gICAgIHRhcmdldCBsaXN0LCBpdCB3aWxsIGJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgYW4gZXJyb3Igb2NjdXJyaW5nXG4gICAgIHdpdGhpbiB0aGUgc3VpdGUgd291bGQgYmUuIFNlZSBzdGVwIDYgYmVsb3cuXG5cbjUuIFRoZSBzdWl0ZSBpcyBleGVjdXRlZC5cblxuNi4gVGhlIGNvbnRleHQgbWFuYWdlclwncyAiX19leGl0X18oKSIgbWV0aG9kIGlzIGludm9rZWQuICBJZiBhblxuICAgZXhjZXB0aW9uIGNhdXNlZCB0aGUgc3VpdGUgdG8gYmUgZXhpdGVkLCBpdHMgdHlwZSwgdmFsdWUsIGFuZFxuICAgdHJhY2ViYWNrIGFyZSBwYXNzZWQgYXMgYXJndW1lbnRzIHRvICJfX2V4aXRfXygpIi4gT3RoZXJ3aXNlLCB0aHJlZVxuICAgIk5vbmUiIGFyZ3VtZW50cyBhcmUgc3VwcGxpZWQuXG5cbiAgIElmIHRoZSBzdWl0ZSB3YXMgZXhpdGVkIGR1ZSB0byBhbiBleGNlcHRpb24sIGFuZCB0aGUgcmV0dXJuIHZhbHVlXG4gICBmcm9tIHRoZSAiX19leGl0X18oKSIgbWV0aG9kIHdhcyBmYWxzZSwgdGhlIGV4Y2VwdGlvbiBpcyByZXJhaXNlZC5cbiAgIElmIHRoZSByZXR1cm4gdmFsdWUgd2FzIHRydWUsIHRoZSBleGNlcHRpb24gaXMgc3VwcHJlc3NlZCwgYW5kXG4gICBleGVjdXRpb24gY29udGludWVzIHdpdGggdGhlIHN0YXRlbWVudCBmb2xsb3dpbmcgdGhlICJ3aXRoIlxuICAgc3RhdGVtZW50LlxuXG4gICBJZiB0aGUgc3VpdGUgd2FzIGV4aXRlZCBmb3IgYW55IHJlYXNvbiBvdGhlciB0aGFuIGFuIGV4Y2VwdGlvbiwgdGhlXG4gICByZXR1cm4gdmFsdWUgZnJvbSAiX19leGl0X18oKSIgaXMgaWdub3JlZCwgYW5kIGV4ZWN1dGlvbiBwcm9jZWVkc1xuICAgYXQgdGhlIG5vcm1hbCBsb2NhdGlvbiBmb3IgdGhlIGtpbmQgb2YgZXhpdCB0aGF0IHdhcyB0YWtlbi5cblxuV2l0aCBtb3JlIHRoYW4gb25lIGl0ZW0sIHRoZSBjb250ZXh0IG1hbmFnZXJzIGFyZSBwcm9jZXNzZWQgYXMgaWZcbm11bHRpcGxlICJ3aXRoIiBzdGF0ZW1lbnRzIHdlcmUgbmVzdGVkOlxuXG4gICB3aXRoIEEoKSBhcyBhLCBCKCkgYXMgYjpcbiAgICAgICBzdWl0ZVxuXG5pcyBlcXVpdmFsZW50IHRvXG5cbiAgIHdpdGggQSgpIGFzIGE6XG4gICAgICAgd2l0aCBCKCkgYXMgYjpcbiAgICAgICAgICAgc3VpdGVcblxuQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMTogU3VwcG9ydCBmb3IgbXVsdGlwbGUgY29udGV4dCBleHByZXNzaW9ucy5cblxuU2VlIGFsc286ICoqUEVQIDAzNDMqKiAtIFRoZSAid2l0aCIgc3RhdGVtZW50XG5cbiAgICAgVGhlIHNwZWNpZmljYXRpb24sIGJhY2tncm91bmQsIGFuZCBleGFtcGxlcyBmb3IgdGhlIFB5dGhvbiAid2l0aCJcbiAgICAgc3RhdGVtZW50LlxuXG5cbkZ1bmN0aW9uIGRlZmluaXRpb25zXG49PT09PT09PT09PT09PT09PT09PVxuXG5BIGZ1bmN0aW9uIGRlZmluaXRpb24gZGVmaW5lcyBhIHVzZXItZGVmaW5lZCBmdW5jdGlvbiBvYmplY3QgKHNlZVxuc2VjdGlvbiAqVGhlIHN0YW5kYXJkIHR5cGUgaGllcmFyY2h5Kik6XG5cbiAgIGZ1bmNkZWYgICAgICAgIDo6PSBbZGVjb3JhdG9yc10gImRlZiIgZnVuY25hbWUgIigiIFtwYXJhbWV0ZXJfbGlzdF0gIikiIFsiLT4iIGV4cHJlc3Npb25dICI6IiBzdWl0ZVxuICAgZGVjb3JhdG9ycyAgICAgOjo9IGRlY29yYXRvcitcbiAgIGRlY29yYXRvciAgICAgIDo6PSAiQCIgZG90dGVkX25hbWUgWyIoIiBbcGFyYW1ldGVyX2xpc3QgWyIsIl1dICIpIl0gTkVXTElORVxuICAgZG90dGVkX25hbWUgICAgOjo9IGlkZW50aWZpZXIgKCIuIiBpZGVudGlmaWVyKSpcbiAgIHBhcmFtZXRlcl9saXN0IDo6PSAoZGVmcGFyYW1ldGVyICIsIikqXG4gICAgICAgICAgICAgICAgICAgICAgfCAiKiIgW3BhcmFtZXRlcl0gKCIsIiBkZWZwYXJhbWV0ZXIpKiBbIiwiICIqKiIgcGFyYW1ldGVyXVxuICAgICAgICAgICAgICAgICAgICAgIHwgIioqIiBwYXJhbWV0ZXJcbiAgICAgICAgICAgICAgICAgICAgICB8IGRlZnBhcmFtZXRlciBbIiwiXSApXG4gICBwYXJhbWV0ZXIgICAgICA6Oj0gaWRlbnRpZmllciBbIjoiIGV4cHJlc3Npb25dXG4gICBkZWZwYXJhbWV0ZXIgICA6Oj0gcGFyYW1ldGVyIFsiPSIgZXhwcmVzc2lvbl1cbiAgIGZ1bmNuYW1lICAgICAgIDo6PSBpZGVudGlmaWVyXG5cbkEgZnVuY3Rpb24gZGVmaW5pdGlvbiBpcyBhbiBleGVjdXRhYmxlIHN0YXRlbWVudC4gIEl0cyBleGVjdXRpb24gYmluZHNcbnRoZSBmdW5jdGlvbiBuYW1lIGluIHRoZSBjdXJyZW50IGxvY2FsIG5hbWVzcGFjZSB0byBhIGZ1bmN0aW9uIG9iamVjdFxuKGEgd3JhcHBlciBhcm91bmQgdGhlIGV4ZWN1dGFibGUgY29kZSBmb3IgdGhlIGZ1bmN0aW9uKS4gIFRoaXNcbmZ1bmN0aW9uIG9iamVjdCBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBnbG9iYWwgbmFtZXNwYWNlXG5hcyB0aGUgZ2xvYmFsIG5hbWVzcGFjZSB0byBiZSB1c2VkIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZC5cblxuVGhlIGZ1bmN0aW9uIGRlZmluaXRpb24gZG9lcyBub3QgZXhlY3V0ZSB0aGUgZnVuY3Rpb24gYm9keTsgdGhpcyBnZXRzXG5leGVjdXRlZCBvbmx5IHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZC4gWzNdXG5cbkEgZnVuY3Rpb24gZGVmaW5pdGlvbiBtYXkgYmUgd3JhcHBlZCBieSBvbmUgb3IgbW9yZSAqZGVjb3JhdG9yKlxuZXhwcmVzc2lvbnMuIERlY29yYXRvciBleHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkIHdoZW4gdGhlIGZ1bmN0aW9uIGlzXG5kZWZpbmVkLCBpbiB0aGUgc2NvcGUgdGhhdCBjb250YWlucyB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbi4gIFRoZVxucmVzdWx0IG11c3QgYmUgYSBjYWxsYWJsZSwgd2hpY2ggaXMgaW52b2tlZCB3aXRoIHRoZSBmdW5jdGlvbiBvYmplY3RcbmFzIHRoZSBvbmx5IGFyZ3VtZW50LiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgYm91bmQgdG8gdGhlIGZ1bmN0aW9uIG5hbWVcbmluc3RlYWQgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdC4gIE11bHRpcGxlIGRlY29yYXRvcnMgYXJlIGFwcGxpZWQgaW5cbm5lc3RlZCBmYXNoaW9uLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlXG5cbiAgIEBmMShhcmcpXG4gICBAZjJcbiAgIGRlZiBmdW5jKCk6IHBhc3NcblxuaXMgZXF1aXZhbGVudCB0b1xuXG4gICBkZWYgZnVuYygpOiBwYXNzXG4gICBmdW5jID0gZjEoYXJnKShmMihmdW5jKSlcblxuV2hlbiBvbmUgb3IgbW9yZSAqcGFyYW1ldGVycyogaGF2ZSB0aGUgZm9ybSAqcGFyYW1ldGVyKiAiPSJcbipleHByZXNzaW9uKiwgdGhlIGZ1bmN0aW9uIGlzIHNhaWQgdG8gaGF2ZSAiZGVmYXVsdCBwYXJhbWV0ZXIgdmFsdWVzLiJcbkZvciBhIHBhcmFtZXRlciB3aXRoIGEgZGVmYXVsdCB2YWx1ZSwgdGhlIGNvcnJlc3BvbmRpbmcgKmFyZ3VtZW50KiBtYXlcbmJlIG9taXR0ZWQgZnJvbSBhIGNhbGwsIGluIHdoaWNoIGNhc2UgdGhlIHBhcmFtZXRlclwncyBkZWZhdWx0IHZhbHVlIGlzXG5zdWJzdGl0dXRlZC4gIElmIGEgcGFyYW1ldGVyIGhhcyBhIGRlZmF1bHQgdmFsdWUsIGFsbCBmb2xsb3dpbmdcbnBhcmFtZXRlcnMgdXAgdW50aWwgdGhlICIiKiIiIG11c3QgYWxzbyBoYXZlIGEgZGVmYXVsdCB2YWx1ZSAtLS0gdGhpc1xuaXMgYSBzeW50YWN0aWMgcmVzdHJpY3Rpb24gdGhhdCBpcyBub3QgZXhwcmVzc2VkIGJ5IHRoZSBncmFtbWFyLlxuXG4qKkRlZmF1bHQgcGFyYW1ldGVyIHZhbHVlcyBhcmUgZXZhbHVhdGVkIGZyb20gbGVmdCB0byByaWdodCB3aGVuIHRoZVxuZnVuY3Rpb24gZGVmaW5pdGlvbiBpcyBleGVjdXRlZC4qKiBUaGlzIG1lYW5zIHRoYXQgdGhlIGV4cHJlc3Npb24gaXNcbmV2YWx1YXRlZCBvbmNlLCB3aGVuIHRoZSBmdW5jdGlvbiBpcyBkZWZpbmVkLCBhbmQgdGhhdCB0aGUgc2FtZSAicHJlLVxuY29tcHV0ZWQiIHZhbHVlIGlzIHVzZWQgZm9yIGVhY2ggY2FsbC4gIFRoaXMgaXMgZXNwZWNpYWxseSBpbXBvcnRhbnRcbnRvIHVuZGVyc3RhbmQgd2hlbiBhIGRlZmF1bHQgcGFyYW1ldGVyIGlzIGEgbXV0YWJsZSBvYmplY3QsIHN1Y2ggYXMgYVxubGlzdCBvciBhIGRpY3Rpb25hcnk6IGlmIHRoZSBmdW5jdGlvbiBtb2RpZmllcyB0aGUgb2JqZWN0IChlLmcuIGJ5XG5hcHBlbmRpbmcgYW4gaXRlbSB0byBhIGxpc3QpLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBpbiBlZmZlY3QgbW9kaWZpZWQuXG5UaGlzIGlzIGdlbmVyYWxseSBub3Qgd2hhdCB3YXMgaW50ZW5kZWQuICBBIHdheSBhcm91bmQgdGhpcyBpcyB0byB1c2VcbiJOb25lIiBhcyB0aGUgZGVmYXVsdCwgYW5kIGV4cGxpY2l0bHkgdGVzdCBmb3IgaXQgaW4gdGhlIGJvZHkgb2YgdGhlXG5mdW5jdGlvbiwgZS5nLjpcblxuICAgZGVmIHdoYXRzX29uX3RoZV90ZWxseShwZW5ndWluPU5vbmUpOlxuICAgICAgIGlmIHBlbmd1aW4gaXMgTm9uZTpcbiAgICAgICAgICAgcGVuZ3VpbiA9IFtdXG4gICAgICAgcGVuZ3Vpbi5hcHBlbmQoInByb3BlcnR5IG9mIHRoZSB6b28iKVxuICAgICAgIHJldHVybiBwZW5ndWluXG5cbkZ1bmN0aW9uIGNhbGwgc2VtYW50aWNzIGFyZSBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgaW4gc2VjdGlvblxuKkNhbGxzKi4gQSBmdW5jdGlvbiBjYWxsIGFsd2F5cyBhc3NpZ25zIHZhbHVlcyB0byBhbGwgcGFyYW1ldGVyc1xubWVudGlvbmVkIGluIHRoZSBwYXJhbWV0ZXIgbGlzdCwgZWl0aGVyIGZyb20gcG9zaXRpb24gYXJndW1lbnRzLCBmcm9tXG5rZXl3b3JkIGFyZ3VtZW50cywgb3IgZnJvbSBkZWZhdWx0IHZhbHVlcy4gIElmIHRoZSBmb3JtXG4iIippZGVudGlmaWVyIiIgaXMgcHJlc2VudCwgaXQgaXMgaW5pdGlhbGl6ZWQgdG8gYSB0dXBsZSByZWNlaXZpbmcgYW55XG5leGNlc3MgcG9zaXRpb25hbCBwYXJhbWV0ZXJzLCBkZWZhdWx0aW5nIHRvIHRoZSBlbXB0eSB0dXBsZS4gIElmIHRoZVxuZm9ybSAiIioqaWRlbnRpZmllciIiIGlzIHByZXNlbnQsIGl0IGlzIGluaXRpYWxpemVkIHRvIGEgbmV3XG5kaWN0aW9uYXJ5IHJlY2VpdmluZyBhbnkgZXhjZXNzIGtleXdvcmQgYXJndW1lbnRzLCBkZWZhdWx0aW5nIHRvIGEgbmV3XG5lbXB0eSBkaWN0aW9uYXJ5LiBQYXJhbWV0ZXJzIGFmdGVyICIiKiIiIG9yICIiKmlkZW50aWZpZXIiIiBhcmVcbmtleXdvcmQtb25seSBwYXJhbWV0ZXJzIGFuZCBtYXkgb25seSBiZSBwYXNzZWQgdXNlZCBrZXl3b3JkIGFyZ3VtZW50cy5cblxuUGFyYW1ldGVycyBtYXkgaGF2ZSBhbm5vdGF0aW9ucyBvZiB0aGUgZm9ybSAiIjogZXhwcmVzc2lvbiIiIGZvbGxvd2luZ1xudGhlIHBhcmFtZXRlciBuYW1lLiAgQW55IHBhcmFtZXRlciBtYXkgaGF2ZSBhbiBhbm5vdGF0aW9uIGV2ZW4gdGhvc2Vcbm9mIHRoZSBmb3JtICIqaWRlbnRpZmllciIgb3IgIioqaWRlbnRpZmllciIuICBGdW5jdGlvbnMgbWF5IGhhdmVcbiJyZXR1cm4iIGFubm90YXRpb24gb2YgdGhlIGZvcm0gIiItPiBleHByZXNzaW9uIiIgYWZ0ZXIgdGhlIHBhcmFtZXRlclxubGlzdC4gIFRoZXNlIGFubm90YXRpb25zIGNhbiBiZSBhbnkgdmFsaWQgUHl0aG9uIGV4cHJlc3Npb24gYW5kIGFyZVxuZXZhbHVhdGVkIHdoZW4gdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24gaXMgZXhlY3V0ZWQuICBBbm5vdGF0aW9ucyBtYXlcbmJlIGV2YWx1YXRlZCBpbiBhIGRpZmZlcmVudCBvcmRlciB0aGFuIHRoZXkgYXBwZWFyIGluIHRoZSBzb3VyY2UgY29kZS5cblRoZSBwcmVzZW5jZSBvZiBhbm5vdGF0aW9ucyBkb2VzIG5vdCBjaGFuZ2UgdGhlIHNlbWFudGljcyBvZiBhXG5mdW5jdGlvbi4gIFRoZSBhbm5vdGF0aW9uIHZhbHVlcyBhcmUgYXZhaWxhYmxlIGFzIHZhbHVlcyBvZiBhXG5kaWN0aW9uYXJ5IGtleWVkIGJ5IHRoZSBwYXJhbWV0ZXJzXCcgbmFtZXMgaW4gdGhlICJfX2Fubm90YXRpb25zX18iXG5hdHRyaWJ1dGUgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdC5cblxuSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBjcmVhdGUgYW5vbnltb3VzIGZ1bmN0aW9ucyAoZnVuY3Rpb25zIG5vdCBib3VuZFxudG8gYSBuYW1lKSwgZm9yIGltbWVkaWF0ZSB1c2UgaW4gZXhwcmVzc2lvbnMuICBUaGlzIHVzZXMgbGFtYmRhXG5leHByZXNzaW9ucywgZGVzY3JpYmVkIGluIHNlY3Rpb24gKkxhbWJkYXMqLiAgTm90ZSB0aGF0IHRoZSBsYW1iZGFcbmV4cHJlc3Npb24gaXMgbWVyZWx5IGEgc2hvcnRoYW5kIGZvciBhIHNpbXBsaWZpZWQgZnVuY3Rpb24gZGVmaW5pdGlvbjtcbmEgZnVuY3Rpb24gZGVmaW5lZCBpbiBhICIiZGVmIiIgc3RhdGVtZW50IGNhbiBiZSBwYXNzZWQgYXJvdW5kIG9yXG5hc3NpZ25lZCB0byBhbm90aGVyIG5hbWUganVzdCBsaWtlIGEgZnVuY3Rpb24gZGVmaW5lZCBieSBhIGxhbWJkYVxuZXhwcmVzc2lvbi4gIFRoZSAiImRlZiIiIGZvcm0gaXMgYWN0dWFsbHkgbW9yZSBwb3dlcmZ1bCBzaW5jZSBpdFxuYWxsb3dzIHRoZSBleGVjdXRpb24gb2YgbXVsdGlwbGUgc3RhdGVtZW50cyBhbmQgYW5ub3RhdGlvbnMuXG5cbioqUHJvZ3JhbW1lclwncyBub3RlOioqIEZ1bmN0aW9ucyBhcmUgZmlyc3QtY2xhc3Mgb2JqZWN0cy4gIEEgIiJkZWYiIlxuc3RhdGVtZW50IGV4ZWN1dGVkIGluc2lkZSBhIGZ1bmN0aW9uIGRlZmluaXRpb24gZGVmaW5lcyBhIGxvY2FsXG5mdW5jdGlvbiB0aGF0IGNhbiBiZSByZXR1cm5lZCBvciBwYXNzZWQgYXJvdW5kLiAgRnJlZSB2YXJpYWJsZXMgdXNlZFxuaW4gdGhlIG5lc3RlZCBmdW5jdGlvbiBjYW4gYWNjZXNzIHRoZSBsb2NhbCB2YXJpYWJsZXMgb2YgdGhlIGZ1bmN0aW9uXG5jb250YWluaW5nIHRoZSBkZWYuICBTZWUgc2VjdGlvbiAqTmFtaW5nIGFuZCBiaW5kaW5nKiBmb3IgZGV0YWlscy5cblxuU2VlIGFsc286ICoqUEVQIDMxMDcqKiAtIEZ1bmN0aW9uIEFubm90YXRpb25zXG5cbiAgICAgVGhlIG9yaWdpbmFsIHNwZWNpZmljYXRpb24gZm9yIGZ1bmN0aW9uIGFubm90YXRpb25zLlxuXG5cbkNsYXNzIGRlZmluaXRpb25zXG49PT09PT09PT09PT09PT09PVxuXG5BIGNsYXNzIGRlZmluaXRpb24gZGVmaW5lcyBhIGNsYXNzIG9iamVjdCAoc2VlIHNlY3Rpb24gKlRoZSBzdGFuZGFyZFxudHlwZSBoaWVyYXJjaHkqKTpcblxuICAgY2xhc3NkZWYgICAgOjo9IFtkZWNvcmF0b3JzXSAiY2xhc3MiIGNsYXNzbmFtZSBbaW5oZXJpdGFuY2VdICI6IiBzdWl0ZVxuICAgaW5oZXJpdGFuY2UgOjo9ICIoIiBbcGFyYW1ldGVyX2xpc3RdICIpIlxuICAgY2xhc3NuYW1lICAgOjo9IGlkZW50aWZpZXJcblxuQSBjbGFzcyBkZWZpbml0aW9uIGlzIGFuIGV4ZWN1dGFibGUgc3RhdGVtZW50LiAgVGhlIGluaGVyaXRhbmNlIGxpc3RcbnVzdWFsbHkgZ2l2ZXMgYSBsaXN0IG9mIGJhc2UgY2xhc3NlcyAoc2VlICpDdXN0b21pemluZyBjbGFzcyBjcmVhdGlvbipcbmZvciBtb3JlIGFkdmFuY2VkIHVzZXMpLCBzbyBlYWNoIGl0ZW0gaW4gdGhlIGxpc3Qgc2hvdWxkIGV2YWx1YXRlIHRvIGFcbmNsYXNzIG9iamVjdCB3aGljaCBhbGxvd3Mgc3ViY2xhc3NpbmcuICBDbGFzc2VzIHdpdGhvdXQgYW4gaW5oZXJpdGFuY2Vcbmxpc3QgaW5oZXJpdCwgYnkgZGVmYXVsdCwgZnJvbSB0aGUgYmFzZSBjbGFzcyAib2JqZWN0IjsgaGVuY2UsXG5cbiAgIGNsYXNzIEZvbzpcbiAgICAgICBwYXNzXG5cbmlzIGVxdWl2YWxlbnQgdG9cblxuICAgY2xhc3MgRm9vKG9iamVjdCk6XG4gICAgICAgcGFzc1xuXG5UaGUgY2xhc3NcJ3Mgc3VpdGUgaXMgdGhlbiBleGVjdXRlZCBpbiBhIG5ldyBleGVjdXRpb24gZnJhbWUgKHNlZVxuKk5hbWluZyBhbmQgYmluZGluZyopLCB1c2luZyBhIG5ld2x5IGNyZWF0ZWQgbG9jYWwgbmFtZXNwYWNlIGFuZCB0aGVcbm9yaWdpbmFsIGdsb2JhbCBuYW1lc3BhY2UuIChVc3VhbGx5LCB0aGUgc3VpdGUgY29udGFpbnMgbW9zdGx5XG5mdW5jdGlvbiBkZWZpbml0aW9ucy4pICBXaGVuIHRoZSBjbGFzc1wncyBzdWl0ZSBmaW5pc2hlcyBleGVjdXRpb24sIGl0c1xuZXhlY3V0aW9uIGZyYW1lIGlzIGRpc2NhcmRlZCBidXQgaXRzIGxvY2FsIG5hbWVzcGFjZSBpcyBzYXZlZC4gWzRdIEFcbmNsYXNzIG9iamVjdCBpcyB0aGVuIGNyZWF0ZWQgdXNpbmcgdGhlIGluaGVyaXRhbmNlIGxpc3QgZm9yIHRoZSBiYXNlXG5jbGFzc2VzIGFuZCB0aGUgc2F2ZWQgbG9jYWwgbmFtZXNwYWNlIGZvciB0aGUgYXR0cmlidXRlIGRpY3Rpb25hcnkuXG5UaGUgY2xhc3MgbmFtZSBpcyBib3VuZCB0byB0aGlzIGNsYXNzIG9iamVjdCBpbiB0aGUgb3JpZ2luYWwgbG9jYWxcbm5hbWVzcGFjZS5cblxuQ2xhc3MgY3JlYXRpb24gY2FuIGJlIGN1c3RvbWl6ZWQgaGVhdmlseSB1c2luZyAqbWV0YWNsYXNzZXMqLlxuXG5DbGFzc2VzIGNhbiBhbHNvIGJlIGRlY29yYXRlZDoganVzdCBsaWtlIHdoZW4gZGVjb3JhdGluZyBmdW5jdGlvbnMsXG5cbiAgIEBmMShhcmcpXG4gICBAZjJcbiAgIGNsYXNzIEZvbzogcGFzc1xuXG5pcyBlcXVpdmFsZW50IHRvXG5cbiAgIGNsYXNzIEZvbzogcGFzc1xuICAgRm9vID0gZjEoYXJnKShmMihGb28pKVxuXG5UaGUgZXZhbHVhdGlvbiBydWxlcyBmb3IgdGhlIGRlY29yYXRvciBleHByZXNzaW9ucyBhcmUgdGhlIHNhbWUgYXMgZm9yXG5mdW5jdGlvbiBkZWNvcmF0b3JzLiAgVGhlIHJlc3VsdCBtdXN0IGJlIGEgY2xhc3Mgb2JqZWN0LCB3aGljaCBpcyB0aGVuXG5ib3VuZCB0byB0aGUgY2xhc3MgbmFtZS5cblxuKipQcm9ncmFtbWVyXCdzIG5vdGU6KiogVmFyaWFibGVzIGRlZmluZWQgaW4gdGhlIGNsYXNzIGRlZmluaXRpb24gYXJlXG5jbGFzcyBhdHRyaWJ1dGVzOyB0aGV5IGFyZSBzaGFyZWQgYnkgaW5zdGFuY2VzLiAgSW5zdGFuY2UgYXR0cmlidXRlc1xuY2FuIGJlIHNldCBpbiBhIG1ldGhvZCB3aXRoICJzZWxmLm5hbWUgPSB2YWx1ZSIuICBCb3RoIGNsYXNzIGFuZFxuaW5zdGFuY2UgYXR0cmlidXRlcyBhcmUgYWNjZXNzaWJsZSB0aHJvdWdoIHRoZSBub3RhdGlvbiAiInNlbGYubmFtZSIiLFxuYW5kIGFuIGluc3RhbmNlIGF0dHJpYnV0ZSBoaWRlcyBhIGNsYXNzIGF0dHJpYnV0ZSB3aXRoIHRoZSBzYW1lIG5hbWVcbndoZW4gYWNjZXNzZWQgaW4gdGhpcyB3YXkuICBDbGFzcyBhdHRyaWJ1dGVzIGNhbiBiZSB1c2VkIGFzIGRlZmF1bHRzXG5mb3IgaW5zdGFuY2UgYXR0cmlidXRlcywgYnV0IHVzaW5nIG11dGFibGUgdmFsdWVzIHRoZXJlIGNhbiBsZWFkIHRvXG51bmV4cGVjdGVkIHJlc3VsdHMuICAqRGVzY3JpcHRvcnMqIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBpbnN0YW5jZVxudmFyaWFibGVzIHdpdGggZGlmZmVyZW50IGltcGxlbWVudGF0aW9uIGRldGFpbHMuXG5cblNlZSBhbHNvOiAqKlBFUCAzMTE1KiogLSBNZXRhY2xhc3NlcyBpbiBQeXRob24gMyAqKlBFUCAzMTI5KiogLVxuICBDbGFzcyBEZWNvcmF0b3JzXG5cbi1bIEZvb3Rub3RlcyBdLVxuXG5bMV0gVGhlIGV4Y2VwdGlvbiBpcyBwcm9wYWdhdGVkIHRvIHRoZSBpbnZvY2F0aW9uIHN0YWNrIHVubGVzc1xuICAgIHRoZXJlIGlzIGEgImZpbmFsbHkiIGNsYXVzZSB3aGljaCBoYXBwZW5zIHRvIHJhaXNlIGFub3RoZXJcbiAgICBleGNlcHRpb24uIFRoYXQgbmV3IGV4Y2VwdGlvbiBjYXVzZXMgdGhlIG9sZCBvbmUgdG8gYmUgbG9zdC5cblxuWzJdIEN1cnJlbnRseSwgY29udHJvbCAiZmxvd3Mgb2ZmIHRoZSBlbmQiIGV4Y2VwdCBpbiB0aGUgY2FzZSBvZlxuICAgIGFuIGV4Y2VwdGlvbiBvciB0aGUgZXhlY3V0aW9uIG9mIGEgInJldHVybiIsICJjb250aW51ZSIsIG9yXG4gICAgImJyZWFrIiBzdGF0ZW1lbnQuXG5cblszXSBBIHN0cmluZyBsaXRlcmFsIGFwcGVhcmluZyBhcyB0aGUgZmlyc3Qgc3RhdGVtZW50IGluIHRoZVxuICAgIGZ1bmN0aW9uIGJvZHkgaXMgdHJhbnNmb3JtZWQgaW50byB0aGUgZnVuY3Rpb25cJ3MgIl9fZG9jX18iXG4gICAgYXR0cmlidXRlIGFuZCB0aGVyZWZvcmUgdGhlIGZ1bmN0aW9uXCdzICpkb2NzdHJpbmcqLlxuXG5bNF0gQSBzdHJpbmcgbGl0ZXJhbCBhcHBlYXJpbmcgYXMgdGhlIGZpcnN0IHN0YXRlbWVudCBpbiB0aGUgY2xhc3NcbiAgICBib2R5IGlzIHRyYW5zZm9ybWVkIGludG8gdGhlIG5hbWVzcGFjZVwncyAiX19kb2NfXyIgaXRlbSBhbmRcbiAgICB0aGVyZWZvcmUgdGhlIGNsYXNzXCdzICpkb2NzdHJpbmcqLlxuJywKICAnY29udGV4dC1tYW5hZ2Vycyc6IHUnXG5XaXRoIFN0YXRlbWVudCBDb250ZXh0IE1hbmFnZXJzXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbkEgKmNvbnRleHQgbWFuYWdlciogaXMgYW4gb2JqZWN0IHRoYXQgZGVmaW5lcyB0aGUgcnVudGltZSBjb250ZXh0IHRvXG5iZSBlc3RhYmxpc2hlZCB3aGVuIGV4ZWN1dGluZyBhICJ3aXRoIiBzdGF0ZW1lbnQuIFRoZSBjb250ZXh0IG1hbmFnZXJcbmhhbmRsZXMgdGhlIGVudHJ5IGludG8sIGFuZCB0aGUgZXhpdCBmcm9tLCB0aGUgZGVzaXJlZCBydW50aW1lIGNvbnRleHRcbmZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBibG9jayBvZiBjb2RlLiAgQ29udGV4dCBtYW5hZ2VycyBhcmUgbm9ybWFsbHlcbmludm9rZWQgdXNpbmcgdGhlICJ3aXRoIiBzdGF0ZW1lbnQgKGRlc2NyaWJlZCBpbiBzZWN0aW9uICpUaGUgd2l0aFxuc3RhdGVtZW50KiksIGJ1dCBjYW4gYWxzbyBiZSB1c2VkIGJ5IGRpcmVjdGx5IGludm9raW5nIHRoZWlyIG1ldGhvZHMuXG5cblR5cGljYWwgdXNlcyBvZiBjb250ZXh0IG1hbmFnZXJzIGluY2x1ZGUgc2F2aW5nIGFuZCByZXN0b3JpbmcgdmFyaW91c1xua2luZHMgb2YgZ2xvYmFsIHN0YXRlLCBsb2NraW5nIGFuZCB1bmxvY2tpbmcgcmVzb3VyY2VzLCBjbG9zaW5nIG9wZW5lZFxuZmlsZXMsIGV0Yy5cblxuRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gY29udGV4dCBtYW5hZ2Vycywgc2VlICpDb250ZXh0IE1hbmFnZXIgVHlwZXMqLlxuXG5vYmplY3QuX19lbnRlcl9fKHNlbGYpXG5cbiAgIEVudGVyIHRoZSBydW50aW1lIGNvbnRleHQgcmVsYXRlZCB0byB0aGlzIG9iamVjdC4gVGhlICJ3aXRoIlxuICAgc3RhdGVtZW50IHdpbGwgYmluZCB0aGlzIG1ldGhvZFwncyByZXR1cm4gdmFsdWUgdG8gdGhlIHRhcmdldChzKVxuICAgc3BlY2lmaWVkIGluIHRoZSAiYXMiIGNsYXVzZSBvZiB0aGUgc3RhdGVtZW50LCBpZiBhbnkuXG5cbm9iamVjdC5fX2V4aXRfXyhzZWxmLCBleGNfdHlwZSwgZXhjX3ZhbHVlLCB0cmFjZWJhY2spXG5cbiAgIEV4aXQgdGhlIHJ1bnRpbWUgY29udGV4dCByZWxhdGVkIHRvIHRoaXMgb2JqZWN0LiBUaGUgcGFyYW1ldGVyc1xuICAgZGVzY3JpYmUgdGhlIGV4Y2VwdGlvbiB0aGF0IGNhdXNlZCB0aGUgY29udGV4dCB0byBiZSBleGl0ZWQuIElmIHRoZVxuICAgY29udGV4dCB3YXMgZXhpdGVkIHdpdGhvdXQgYW4gZXhjZXB0aW9uLCBhbGwgdGhyZWUgYXJndW1lbnRzIHdpbGxcbiAgIGJlICJOb25lIi5cblxuICAgSWYgYW4gZXhjZXB0aW9uIGlzIHN1cHBsaWVkLCBhbmQgdGhlIG1ldGhvZCB3aXNoZXMgdG8gc3VwcHJlc3MgdGhlXG4gICBleGNlcHRpb24gKGkuZS4sIHByZXZlbnQgaXQgZnJvbSBiZWluZyBwcm9wYWdhdGVkKSwgaXQgc2hvdWxkXG4gICByZXR1cm4gYSB0cnVlIHZhbHVlLiBPdGhlcndpc2UsIHRoZSBleGNlcHRpb24gd2lsbCBiZSBwcm9jZXNzZWRcbiAgIG5vcm1hbGx5IHVwb24gZXhpdCBmcm9tIHRoaXMgbWV0aG9kLlxuXG4gICBOb3RlIHRoYXQgIl9fZXhpdF9fKCkiIG1ldGhvZHMgc2hvdWxkIG5vdCByZXJhaXNlIHRoZSBwYXNzZWQtaW5cbiAgIGV4Y2VwdGlvbjsgdGhpcyBpcyB0aGUgY2FsbGVyXCdzIHJlc3BvbnNpYmlsaXR5LlxuXG5TZWUgYWxzbzogKipQRVAgMDM0MyoqIC0gVGhlICJ3aXRoIiBzdGF0ZW1lbnRcblxuICAgICBUaGUgc3BlY2lmaWNhdGlvbiwgYmFja2dyb3VuZCwgYW5kIGV4YW1wbGVzIGZvciB0aGUgUHl0aG9uICJ3aXRoIlxuICAgICBzdGF0ZW1lbnQuXG4nLAogICdjb250aW51ZSc6IHUnXG5UaGUgImNvbnRpbnVlIiBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqKioqKlxuXG4gICBjb250aW51ZV9zdG10IDo6PSAiY29udGludWUiXG5cbiJjb250aW51ZSIgbWF5IG9ubHkgb2NjdXIgc3ludGFjdGljYWxseSBuZXN0ZWQgaW4gYSAiZm9yIiBvciAid2hpbGUiXG5sb29wLCBidXQgbm90IG5lc3RlZCBpbiBhIGZ1bmN0aW9uIG9yIGNsYXNzIGRlZmluaXRpb24gb3IgImZpbmFsbHkiXG5jbGF1c2Ugd2l0aGluIHRoYXQgbG9vcC4gIEl0IGNvbnRpbnVlcyB3aXRoIHRoZSBuZXh0IGN5Y2xlIG9mIHRoZVxubmVhcmVzdCBlbmNsb3NpbmcgbG9vcC5cblxuV2hlbiAiY29udGludWUiIHBhc3NlcyBjb250cm9sIG91dCBvZiBhICJ0cnkiIHN0YXRlbWVudCB3aXRoIGFcbiJmaW5hbGx5IiBjbGF1c2UsIHRoYXQgImZpbmFsbHkiIGNsYXVzZSBpcyBleGVjdXRlZCBiZWZvcmUgcmVhbGx5XG5zdGFydGluZyB0aGUgbmV4dCBsb29wIGN5Y2xlLlxuJywKQEAgLTQyLDcgKzQyLDcgQEAKICAnaWYnOiB1J1xuVGhlICJpZiIgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKipcblxuVGhlICJpZiIgc3RhdGVtZW50IGlzIHVzZWQgZm9yIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbjpcblxuICAgaWZfc3RtdCA6Oj0gImlmIiBleHByZXNzaW9uICI6IiBzdWl0ZVxuICAgICAgICAgICAgICAgKCAiZWxpZiIgZXhwcmVzc2lvbiAiOiIgc3VpdGUgKSpcbiAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXVxuXG5JdCBzZWxlY3RzIGV4YWN0bHkgb25lIG9mIHRoZSBzdWl0ZXMgYnkgZXZhbHVhdGluZyB0aGUgZXhwcmVzc2lvbnMgb25lXG5ieSBvbmUgdW50aWwgb25lIGlzIGZvdW5kIHRvIGJlIHRydWUgKHNlZSBzZWN0aW9uICpCb29sZWFuIG9wZXJhdGlvbnMqXG5mb3IgdGhlIGRlZmluaXRpb24gb2YgdHJ1ZSBhbmQgZmFsc2UpOyB0aGVuIHRoYXQgc3VpdGUgaXMgZXhlY3V0ZWRcbihhbmQgbm8gb3RoZXIgcGFydCBvZiB0aGUgImlmIiBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQgb3IgZXZhbHVhdGVkKS5cbklmIGFsbCBleHByZXNzaW9ucyBhcmUgZmFsc2UsIHRoZSBzdWl0ZSBvZiB0aGUgImVsc2UiIGNsYXVzZSwgaWZcbnByZXNlbnQsIGlzIGV4ZWN1dGVkLlxuJywKICAnaW1hZ2luYXJ5JzogdSdcbkltYWdpbmFyeSBsaXRlcmFsc1xuKioqKioqKioqKioqKioqKioqXG5cbkltYWdpbmFyeSBsaXRlcmFscyBhcmUgZGVzY3JpYmVkIGJ5IHRoZSBmb2xsb3dpbmcgbGV4aWNhbCBkZWZpbml0aW9uczpcblxuICAgaW1hZ251bWJlciA6Oj0gKGZsb2F0bnVtYmVyIHwgaW50cGFydCkgKCJqIiB8ICJKIilcblxuQW4gaW1hZ2luYXJ5IGxpdGVyYWwgeWllbGRzIGEgY29tcGxleCBudW1iZXIgd2l0aCBhIHJlYWwgcGFydCBvZiAwLjAuXG5Db21wbGV4IG51bWJlcnMgYXJlIHJlcHJlc2VudGVkIGFzIGEgcGFpciBvZiBmbG9hdGluZyBwb2ludCBudW1iZXJzXG5hbmQgaGF2ZSB0aGUgc2FtZSByZXN0cmljdGlvbnMgb24gdGhlaXIgcmFuZ2UuICBUbyBjcmVhdGUgYSBjb21wbGV4XG5udW1iZXIgd2l0aCBhIG5vbnplcm8gcmVhbCBwYXJ0LCBhZGQgYSBmbG9hdGluZyBwb2ludCBudW1iZXIgdG8gaXQsXG5lLmcuLCAiKDMrNGopIi4gIFNvbWUgZXhhbXBsZXMgb2YgaW1hZ2luYXJ5IGxpdGVyYWxzOlxuXG4gICAzLjE0aiAgIDEwLmogICAgMTBqICAgICAuMDAxaiAgIDFlMTAwaiAgMy4xNGUtMTBqXG4nLAogICdpbXBvcnQnOiB1J1xuVGhlICJpbXBvcnQiIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKioqKlxuXG4gICBpbXBvcnRfc3RtdCAgICAgOjo9ICJpbXBvcnQiIG1vZHVsZSBbImFzIiBuYW1lXSAoICIsIiBtb2R1bGUgWyJhcyIgbmFtZV0gKSpcbiAgICAgICAgICAgICAgICAgICB8ICJmcm9tIiByZWxhdGl2ZV9tb2R1bGUgImltcG9ydCIgaWRlbnRpZmllciBbImFzIiBuYW1lXVxuICAgICAgICAgICAgICAgICAgICggIiwiIGlkZW50aWZpZXIgWyJhcyIgbmFtZV0gKSpcbiAgICAgICAgICAgICAgICAgICB8ICJmcm9tIiByZWxhdGl2ZV9tb2R1bGUgImltcG9ydCIgIigiIGlkZW50aWZpZXIgWyJhcyIgbmFtZV1cbiAgICAgICAgICAgICAgICAgICAoICIsIiBpZGVudGlmaWVyIFsiYXMiIG5hbWVdICkqIFsiLCJdICIpIlxuICAgICAgICAgICAgICAgICAgIHwgImZyb20iIG1vZHVsZSAiaW1wb3J0IiAiKiJcbiAgIG1vZHVsZSAgICAgICAgICA6Oj0gKGlkZW50aWZpZXIgIi4iKSogaWRlbnRpZmllclxuICAgcmVsYXRpdmVfbW9kdWxlIDo6PSAiLiIqIG1vZHVsZSB8ICIuIitcbiAgIG5hbWUgICAgICAgICAgICA6Oj0gaWRlbnRpZmllclxuXG5UaGUgYmFzaWMgaW1wb3J0IHN0YXRlbWVudCAobm8gImZyb20iIGNsYXVzZSkgaXMgZXhlY3V0ZWQgaW4gdHdvXG5zdGVwczpcblxuMS4gZmluZCBhIG1vZHVsZSwgbG9hZGluZyBhbmQgaW5pdGlhbGl6aW5nIGl0IGlmIG5lY2Vzc2FyeVxuXG4yLiBkZWZpbmUgYSBuYW1lIG9yIG5hbWVzIGluIHRoZSBsb2NhbCBuYW1lc3BhY2UgZm9yIHRoZSBzY29wZVxuICAgd2hlcmUgdGhlICJpbXBvcnQiIHN0YXRlbWVudCBvY2N1cnMuXG5cbldoZW4gdGhlIHN0YXRlbWVudCBjb250YWlucyBtdWx0aXBsZSBjbGF1c2VzIChzZXBhcmF0ZWQgYnkgY29tbWFzKSB0aGVcbnR3byBzdGVwcyBhcmUgY2FycmllZCBvdXQgc2VwYXJhdGVseSBmb3IgZWFjaCBjbGF1c2UsIGp1c3QgYXMgdGhvdWdoXG50aGUgY2xhdXNlcyBoYWQgYmVlbiBzZXBhcmF0ZWQgb3V0IGludG8gaW5kaXZpZGl1YWwgaW1wb3J0IHN0YXRlbWVudHMuXG5cblRoZSBkZXRhaWxzIG9mIHRoZSBmaXJzdCBzdGVwLCBmaW5kaW5nIGFuZCBsb2FkaW5nIG1vZHVsZXMgYXJlXG5kZXNjcmliZWQgaW4gZ3JlYXRlciBkZXRhaWwgaW4gdGhlIHNlY3Rpb24gb24gdGhlICppbXBvcnQgc3lzdGVtKixcbndoaWNoIGFsc28gZGVzY3JpYmVzIHRoZSB2YXJpb3VzIHR5cGVzIG9mIHBhY2thZ2VzIGFuZCBtb2R1bGVzIHRoYXRcbmNhbiBiZSBpbXBvcnRlZCwgYXMgd2VsbCBhcyBhbGwgdGhlIGhvb2tzIHRoYXQgY2FuIGJlIHVzZWQgdG9cbmN1c3RvbWl6ZSB0aGUgaW1wb3J0IHN5c3RlbS4gTm90ZSB0aGF0IGZhaWx1cmVzIGluIHRoaXMgc3RlcCBtYXlcbmluZGljYXRlIGVpdGhlciB0aGF0IHRoZSBtb2R1bGUgY291bGQgbm90IGJlIGxvY2F0ZWQsICpvciogdGhhdCBhblxuZXJyb3Igb2NjdXJyZWQgd2hpbGUgaW5pdGlhbGl6aW5nIHRoZSBtb2R1bGUsIHdoaWNoIGluY2x1ZGVzIGV4ZWN1dGlvblxub2YgdGhlIG1vZHVsZVwncyBjb2RlLlxuXG5JZiB0aGUgcmVxdWVzdGVkIG1vZHVsZSBpcyByZXRyaWV2ZWQgc3VjY2Vzc2Z1bGx5LCBpdCB3aWxsIGJlIG1hZGVcbmF2YWlsYWJsZSBpbiB0aGUgbG9jYWwgbmFtZXNwYWNlIGluIG9uZSBvZiB0aHJlZSB3YXlzOlxuXG4qIElmIHRoZSBtb2R1bGUgbmFtZSBpcyBmb2xsb3dlZCBieSAiYXMiLCB0aGVuIHRoZSBuYW1lIGZvbGxvd2luZ1xuICAiYXMiIGlzIGJvdW5kIGRpcmVjdGx5IHRvIHRoZSBpbXBvcnRlZCBtb2R1bGUuXG5cbiogSWYgbm8gb3RoZXIgbmFtZSBpcyBzcGVjaWZpZWQsIGFuZCB0aGUgbW9kdWxlIGJlaW5nIGltcG9ydGVkIGlzIGFcbiAgdG9wIGxldmVsIG1vZHVsZSwgdGhlIG1vZHVsZVwncyBuYW1lIGlzIGJvdW5kIGluIHRoZSBsb2NhbCBuYW1lc3BhY2VcbiAgYXMgYSByZWZlcmVuY2UgdG8gdGhlIGltcG9ydGVkIG1vZHVsZVxuXG4qIElmIHRoZSBtb2R1bGUgYmVpbmcgaW1wb3J0ZWQgaXMgKm5vdCogYSB0b3AgbGV2ZWwgbW9kdWxlLCB0aGVuIHRoZVxuICBuYW1lIG9mIHRoZSB0b3AgbGV2ZWwgcGFja2FnZSB0aGF0IGNvbnRhaW5zIHRoZSBtb2R1bGUgaXMgYm91bmQgaW5cbiAgdGhlIGxvY2FsIG5hbWVzcGFjZSBhcyBhIHJlZmVyZW5jZSB0byB0aGUgdG9wIGxldmVsIHBhY2thZ2UuIFRoZVxuICBpbXBvcnRlZCBtb2R1bGUgbXVzdCBiZSBhY2Nlc3NlZCB1c2luZyBpdHMgZnVsbCBxdWFsaWZpZWQgbmFtZVxuICByYXRoZXIgdGhhbiBkaXJlY3RseVxuXG5UaGUgImZyb20iIGZvcm0gdXNlcyBhIHNsaWdodGx5IG1vcmUgY29tcGxleCBwcm9jZXNzOlxuXG4xLiBmaW5kIHRoZSBtb2R1bGUgc3BlY2lmaWVkIGluIHRoZSAiZnJvbSIgY2xhdXNlLCBsb2FkaW5nIGFuZFxuICAgaW5pdGlhbGl6aW5nIGl0IGlmIG5lY2Vzc2FyeTtcblxuMi4gZm9yIGVhY2ggb2YgdGhlIGlkZW50aWZpZXJzIHNwZWNpZmllZCBpbiB0aGUgImltcG9ydCIgY2xhdXNlczpcblxuICAgMS4gY2hlY2sgaWYgdGhlIGltcG9ydGVkIG1vZHVsZSBoYXMgYW4gYXR0cmlidXRlIGJ5IHRoYXQgbmFtZVxuXG4gICAyLiBpZiBub3QsIGF0dGVtcHQgdG8gaW1wb3J0IGEgc3VibW9kdWxlIHdpdGggdGhhdCBuYW1lIGFuZCB0aGVuXG4gICAgICBjaGVjayB0aGUgaW1wb3J0ZWQgbW9kdWxlIGFnYWluIGZvciB0aGF0IGF0dHJpYnV0ZVxuXG4gICAzLiBpZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBmb3VuZCwgIkltcG9ydEVycm9yIiBpcyByYWlzZWQuXG5cbiAgIDQuIG90aGVyd2lzZSwgYSByZWZlcmVuY2UgdG8gdGhhdCB2YWx1ZSBpcyBzdG9yZWQgaW4gdGhlIGxvY2FsXG4gICAgICBuYW1lc3BhY2UsIHVzaW5nIHRoZSBuYW1lIGluIHRoZSAiYXMiIGNsYXVzZSBpZiBpdCBpcyBwcmVzZW50LFxuICAgICAgb3RoZXJ3aXNlIHVzaW5nIHRoZSBhdHRyaWJ1dGUgbmFtZVxuXG5FeGFtcGxlczpcblxuICAgaW1wb3J0IGZvbyAgICAgICAgICAgICAgICAgIyBmb28gaW1wb3J0ZWQgYW5kIGJvdW5kIGxvY2FsbHlcbiAgIGltcG9ydCBmb28uYmFyLmJheiAgICAgICAgICMgZm9vLmJhci5iYXogaW1wb3J0ZWQsIGZvbyBib3VuZCBsb2NhbGx5XG4gICBpbXBvcnQgZm9vLmJhci5iYXogYXMgZmJiICAjIGZvby5iYXIuYmF6IGltcG9ydGVkIGFuZCBib3VuZCBhcyBmYmJcbiAgIGZyb20gZm9vLmJhciBpbXBvcnQgYmF6ICAgICMgZm9vLmJhci5iYXogaW1wb3J0ZWQgYW5kIGJvdW5kIGFzIGJhelxuICAgZnJvbSBmb28gaW1wb3J0IGF0dHIgICAgICAgIyBmb28gaW1wb3J0ZWQgYW5kIGZvby5hdHRyIGJvdW5kIGFzIGF0dHJcblxuSWYgdGhlIGxpc3Qgb2YgaWRlbnRpZmllcnMgaXMgcmVwbGFjZWQgYnkgYSBzdGFyICgiXCcqXCciKSwgYWxsIHB1YmxpY1xubmFtZXMgZGVmaW5lZCBpbiB0aGUgbW9kdWxlIGFyZSBib3VuZCBpbiB0aGUgbG9jYWwgbmFtZXNwYWNlIGZvciB0aGVcbnNjb3BlIHdoZXJlIHRoZSAiaW1wb3J0IiBzdGF0ZW1lbnQgb2NjdXJzLlxuXG5UaGUgKnB1YmxpYyBuYW1lcyogZGVmaW5lZCBieSBhIG1vZHVsZSBhcmUgZGV0ZXJtaW5lZCBieSBjaGVja2luZyB0aGVcbm1vZHVsZVwncyBuYW1lc3BhY2UgZm9yIGEgdmFyaWFibGUgbmFtZWQgIl9fYWxsX18iOyBpZiBkZWZpbmVkLCBpdCBtdXN0XG5iZSBhIHNlcXVlbmNlIG9mIHN0cmluZ3Mgd2hpY2ggYXJlIG5hbWVzIGRlZmluZWQgb3IgaW1wb3J0ZWQgYnkgdGhhdFxubW9kdWxlLiAgVGhlIG5hbWVzIGdpdmVuIGluICJfX2FsbF9fIiBhcmUgYWxsIGNvbnNpZGVyZWQgcHVibGljIGFuZFxuYXJlIHJlcXVpcmVkIHRvIGV4aXN0LiAgSWYgIl9fYWxsX18iIGlzIG5vdCBkZWZpbmVkLCB0aGUgc2V0IG9mIHB1YmxpY1xubmFtZXMgaW5jbHVkZXMgYWxsIG5hbWVzIGZvdW5kIGluIHRoZSBtb2R1bGVcJ3MgbmFtZXNwYWNlIHdoaWNoIGRvIG5vdFxuYmVnaW4gd2l0aCBhbiB1bmRlcnNjb3JlIGNoYXJhY3RlciAoIlwnX1wnIikuICAiX19hbGxfXyIgc2hvdWxkIGNvbnRhaW5cbnRoZSBlbnRpcmUgcHVibGljIEFQSS4gSXQgaXMgaW50ZW5kZWQgdG8gYXZvaWQgYWNjaWRlbnRhbGx5IGV4cG9ydGluZ1xuaXRlbXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIEFQSSAoc3VjaCBhcyBsaWJyYXJ5IG1vZHVsZXMgd2hpY2ggd2VyZVxuaW1wb3J0ZWQgYW5kIHVzZWQgd2l0aGluIHRoZSBtb2R1bGUpLlxuXG5UaGUgd2lsZCBjYXJkIGZvcm0gb2YgaW1wb3J0IC0tLSAiZnJvbSBtb2R1bGUgaW1wb3J0ICoiIC0tLSBpcyBvbmx5XG5hbGxvd2VkIGF0IHRoZSBtb2R1bGUgbGV2ZWwuICBBdHRlbXB0aW5nIHRvIHVzZSBpdCBpbiBjbGFzcyBvclxuZnVuY3Rpb24gZGVmaW5pdGlvbnMgd2lsbCByYWlzZSBhICJTeW50YXhFcnJvciIuXG5cbldoZW4gc3BlY2lmeWluZyB3aGF0IG1vZHVsZSB0byBpbXBvcnQgeW91IGRvIG5vdCBoYXZlIHRvIHNwZWNpZnkgdGhlXG5hYnNvbHV0ZSBuYW1lIG9mIHRoZSBtb2R1bGUuIFdoZW4gYSBtb2R1bGUgb3IgcGFja2FnZSBpcyBjb250YWluZWRcbndpdGhpbiBhbm90aGVyIHBhY2thZ2UgaXQgaXMgcG9zc2libGUgdG8gbWFrZSBhIHJlbGF0aXZlIGltcG9ydCB3aXRoaW5cbnRoZSBzYW1lIHRvcCBwYWNrYWdlIHdpdGhvdXQgaGF2aW5nIHRvIG1lbnRpb24gdGhlIHBhY2thZ2UgbmFtZS4gQnlcbnVzaW5nIGxlYWRpbmcgZG90cyBpbiB0aGUgc3BlY2lmaWVkIG1vZHVsZSBvciBwYWNrYWdlIGFmdGVyICJmcm9tIiB5b3VcbmNhbiBzcGVjaWZ5IGhvdyBoaWdoIHRvIHRyYXZlcnNlIHVwIHRoZSBjdXJyZW50IHBhY2thZ2UgaGllcmFyY2h5XG53aXRob3V0IHNwZWNpZnlpbmcgZXhhY3QgbmFtZXMuIE9uZSBsZWFkaW5nIGRvdCBtZWFucyB0aGUgY3VycmVudFxucGFja2FnZSB3aGVyZSB0aGUgbW9kdWxlIG1ha2luZyB0aGUgaW1wb3J0IGV4aXN0cy4gVHdvIGRvdHMgbWVhbnMgdXBcbm9uZSBwYWNrYWdlIGxldmVsLiBUaHJlZSBkb3RzIGlzIHVwIHR3byBsZXZlbHMsIGV0Yy4gU28gaWYgeW91IGV4ZWN1dGVcbiJmcm9tIC4gaW1wb3J0IG1vZCIgZnJvbSBhIG1vZHVsZSBpbiB0aGUgInBrZyIgcGFja2FnZSB0aGVuIHlvdSB3aWxsXG5lbmQgdXAgaW1wb3J0aW5nICJwa2cubW9kIi4gSWYgeW91IGV4ZWN1dGUgImZyb20gLi5zdWJwa2cyIGltcG9ydCBtb2QiXG5mcm9tIHdpdGhpbiAicGtnLnN1YnBrZzEiIHlvdSB3aWxsIGltcG9ydCAicGtnLnN1YnBrZzIubW9kIi4gVGhlXG5zcGVjaWZpY2F0aW9uIGZvciByZWxhdGl2ZSBpbXBvcnRzIGlzIGNvbnRhaW5lZCB3aXRoaW4gKipQRVAgMzI4KiouXG5cbiJpbXBvcnRsaWIuaW1wb3J0X21vZHVsZSgpIiBpcyBwcm92aWRlZCB0byBzdXBwb3J0IGFwcGxpY2F0aW9ucyB0aGF0XG5kZXRlcm1pbmUgZHluYW1pY2FsbHkgdGhlIG1vZHVsZXMgdG8gYmUgbG9hZGVkLlxuXG5cbkZ1dHVyZSBzdGF0ZW1lbnRzXG49PT09PT09PT09PT09PT09PVxuXG5BICpmdXR1cmUgc3RhdGVtZW50KiBpcyBhIGRpcmVjdGl2ZSB0byB0aGUgY29tcGlsZXIgdGhhdCBhIHBhcnRpY3VsYXJcbm1vZHVsZSBzaG91bGQgYmUgY29tcGlsZWQgdXNpbmcgc3ludGF4IG9yIHNlbWFudGljcyB0aGF0IHdpbGwgYmVcbmF2YWlsYWJsZSBpbiBhIHNwZWNpZmllZCBmdXR1cmUgcmVsZWFzZSBvZiBQeXRob24gd2hlcmUgdGhlIGZlYXR1cmVcbmJlY29tZXMgc3RhbmRhcmQuXG5cblRoZSBmdXR1cmUgc3RhdGVtZW50IGlzIGludGVuZGVkIHRvIGVhc2UgbWlncmF0aW9uIHRvIGZ1dHVyZSB2ZXJzaW9uc1xub2YgUHl0aG9uIHRoYXQgaW50cm9kdWNlIGluY29tcGF0aWJsZSBjaGFuZ2VzIHRvIHRoZSBsYW5ndWFnZS4gIEl0XG5hbGxvd3MgdXNlIG9mIHRoZSBuZXcgZmVhdHVyZXMgb24gYSBwZXItbW9kdWxlIGJhc2lzIGJlZm9yZSB0aGVcbnJlbGVhc2UgaW4gd2hpY2ggdGhlIGZlYXR1cmUgYmVjb21lcyBzdGFuZGFyZC5cblxuICAgZnV0dXJlX3N0YXRlbWVudCA6Oj0gImZyb20iICJfX2Z1dHVyZV9fIiAiaW1wb3J0IiBmZWF0dXJlIFsiYXMiIG5hbWVdXG4gICAgICAgICAgICAgICAgICAgICAgICAoIiwiIGZlYXR1cmUgWyJhcyIgbmFtZV0pKlxuICAgICAgICAgICAgICAgICAgICAgICAgfCAiZnJvbSIgIl9fZnV0dXJlX18iICJpbXBvcnQiICIoIiBmZWF0dXJlIFsiYXMiIG5hbWVdXG4gICAgICAgICAgICAgICAgICAgICAgICAoIiwiIGZlYXR1cmUgWyJhcyIgbmFtZV0pKiBbIiwiXSAiKSJcbiAgIGZlYXR1cmUgICAgICAgICAgOjo9IGlkZW50aWZpZXJcbiAgIG5hbWUgICAgICAgICAgICAgOjo9IGlkZW50aWZpZXJcblxuQSBmdXR1cmUgc3RhdGVtZW50IG11c3QgYXBwZWFyIG5lYXIgdGhlIHRvcCBvZiB0aGUgbW9kdWxlLiAgVGhlIG9ubHlcbmxpbmVzIHRoYXQgY2FuIGFwcGVhciBiZWZvcmUgYSBmdXR1cmUgc3RhdGVtZW50IGFyZTpcblxuKiB0aGUgbW9kdWxlIGRvY3N0cmluZyAoaWYgYW55KSxcblxuKiBjb21tZW50cyxcblxuKiBibGFuayBsaW5lcywgYW5kXG5cbiogb3RoZXIgZnV0dXJlIHN0YXRlbWVudHMuXG5cblRoZSBmZWF0dXJlcyByZWNvZ25pemVkIGJ5IFB5dGhvbiAzLjAgYXJlICJhYnNvbHV0ZV9pbXBvcnQiLFxuImRpdmlzaW9uIiwgImdlbmVyYXRvcnMiLCAidW5pY29kZV9saXRlcmFscyIsICJwcmludF9mdW5jdGlvbiIsXG4ibmVzdGVkX3Njb3BlcyIgYW5kICJ3aXRoX3N0YXRlbWVudCIuICBUaGV5IGFyZSBhbGwgcmVkdW5kYW50IGJlY2F1c2VcbnRoZXkgYXJlIGFsd2F5cyBlbmFibGVkLCBhbmQgb25seSBrZXB0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cblxuQSBmdXR1cmUgc3RhdGVtZW50IGlzIHJlY29nbml6ZWQgYW5kIHRyZWF0ZWQgc3BlY2lhbGx5IGF0IGNvbXBpbGVcbnRpbWU6IENoYW5nZXMgdG8gdGhlIHNlbWFudGljcyBvZiBjb3JlIGNvbnN0cnVjdHMgYXJlIG9mdGVuXG5pbXBsZW1lbnRlZCBieSBnZW5lcmF0aW5nIGRpZmZlcmVudCBjb2RlLiAgSXQgbWF5IGV2ZW4gYmUgdGhlIGNhc2VcbnRoYXQgYSBuZXcgZmVhdHVyZSBpbnRyb2R1Y2VzIG5ldyBpbmNvbXBhdGlibGUgc3ludGF4IChzdWNoIGFzIGEgbmV3XG5yZXNlcnZlZCB3b3JkKSwgaW4gd2hpY2ggY2FzZSB0aGUgY29tcGlsZXIgbWF5IG5lZWQgdG8gcGFyc2UgdGhlXG5tb2R1bGUgZGlmZmVyZW50bHkuICBTdWNoIGRlY2lzaW9ucyBjYW5ub3QgYmUgcHVzaGVkIG9mZiB1bnRpbFxucnVudGltZS5cblxuRm9yIGFueSBnaXZlbiByZWxlYXNlLCB0aGUgY29tcGlsZXIga25vd3Mgd2hpY2ggZmVhdHVyZSBuYW1lcyBoYXZlXG5iZWVuIGRlZmluZWQsIGFuZCByYWlzZXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgYSBmdXR1cmUgc3RhdGVtZW50XG5jb250YWlucyBhIGZlYXR1cmUgbm90IGtub3duIHRvIGl0LlxuXG5UaGUgZGlyZWN0IHJ1bnRpbWUgc2VtYW50aWNzIGFyZSB0aGUgc2FtZSBhcyBmb3IgYW55IGltcG9ydCBzdGF0ZW1lbnQ6XG50aGVyZSBpcyBhIHN0YW5kYXJkIG1vZHVsZSAiX19mdXR1cmVfXyIsIGRlc2NyaWJlZCBsYXRlciwgYW5kIGl0IHdpbGxcbmJlIGltcG9ydGVkIGluIHRoZSB1c3VhbCB3YXkgYXQgdGhlIHRpbWUgdGhlIGZ1dHVyZSBzdGF0ZW1lbnQgaXNcbmV4ZWN1dGVkLlxuXG5UaGUgaW50ZXJlc3RpbmcgcnVudGltZSBzZW1hbnRpY3MgZGVwZW5kIG9uIHRoZSBzcGVjaWZpYyBmZWF0dXJlXG5lbmFibGVkIGJ5IHRoZSBmdXR1cmUgc3RhdGVtZW50LlxuXG5Ob3RlIHRoYXQgdGhlcmUgaXMgbm90aGluZyBzcGVjaWFsIGFib3V0IHRoZSBzdGF0ZW1lbnQ6XG5cbiAgIGltcG9ydCBfX2Z1dHVyZV9fIFthcyBuYW1lXVxuXG5UaGF0IGlzIG5vdCBhIGZ1dHVyZSBzdGF0ZW1lbnQ7IGl0XCdzIGFuIG9yZGluYXJ5IGltcG9ydCBzdGF0ZW1lbnQgd2l0aFxubm8gc3BlY2lhbCBzZW1hbnRpY3Mgb3Igc3ludGF4IHJlc3RyaWN0aW9ucy5cblxuQ29kZSBjb21waWxlZCBieSBjYWxscyB0byB0aGUgYnVpbHQtaW4gZnVuY3Rpb25zICJleGVjKCkiIGFuZFxuImNvbXBpbGUoKSIgdGhhdCBvY2N1ciBpbiBhIG1vZHVsZSAiTSIgY29udGFpbmluZyBhIGZ1dHVyZSBzdGF0ZW1lbnRcbndpbGwsIGJ5IGRlZmF1bHQsIHVzZSB0aGUgbmV3IHN5bnRheCBvciBzZW1hbnRpY3MgYXNzb2NpYXRlZCB3aXRoIHRoZVxuZnV0dXJlIHN0YXRlbWVudC4gIFRoaXMgY2FuIGJlIGNvbnRyb2xsZWQgYnkgb3B0aW9uYWwgYXJndW1lbnRzIHRvXG4iY29tcGlsZSgpIiAtLS0gc2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoYXQgZnVuY3Rpb24gZm9yIGRldGFpbHMuXG5cbkEgZnV0dXJlIHN0YXRlbWVudCB0eXBlZCBhdCBhbiBpbnRlcmFjdGl2ZSBpbnRlcnByZXRlciBwcm9tcHQgd2lsbFxudGFrZSBlZmZlY3QgZm9yIHRoZSByZXN0IG9mIHRoZSBpbnRlcnByZXRlciBzZXNzaW9uLiAgSWYgYW5cbmludGVycHJldGVyIGlzIHN0YXJ0ZWQgd2l0aCB0aGUgKi1pKiBvcHRpb24sIGlzIHBhc3NlZCBhIHNjcmlwdCBuYW1lXG50byBleGVjdXRlLCBhbmQgdGhlIHNjcmlwdCBpbmNsdWRlcyBhIGZ1dHVyZSBzdGF0ZW1lbnQsIGl0IHdpbGwgYmUgaW5cbmVmZmVjdCBpbiB0aGUgaW50ZXJhY3RpdmUgc2Vzc2lvbiBzdGFydGVkIGFmdGVyIHRoZSBzY3JpcHQgaXNcbmV4ZWN1dGVkLlxuXG5TZWUgYWxzbzogKipQRVAgMjM2KiogLSBCYWNrIHRvIHRoZSBfX2Z1dHVyZV9fXG5cbiAgICAgVGhlIG9yaWdpbmFsIHByb3Bvc2FsIGZvciB0aGUgX19mdXR1cmVfXyBtZWNoYW5pc20uXG4nLAotICdpbic6IHUnXG5Db21wYXJpc29uc1xuKioqKioqKioqKipcblxuVW5saWtlIEMsIGFsbCBjb21wYXJpc29uIG9wZXJhdGlvbnMgaW4gUHl0aG9uIGhhdmUgdGhlIHNhbWUgcHJpb3JpdHksXG53aGljaCBpcyBsb3dlciB0aGFuIHRoYXQgb2YgYW55IGFyaXRobWV0aWMsIHNoaWZ0aW5nIG9yIGJpdHdpc2Vcbm9wZXJhdGlvbi4gIEFsc28gdW5saWtlIEMsIGV4cHJlc3Npb25zIGxpa2UgImEgPCBiIDwgYyIgaGF2ZSB0aGVcbmludGVycHJldGF0aW9uIHRoYXQgaXMgY29udmVudGlvbmFsIGluIG1hdGhlbWF0aWNzOlxuXG4gICBjb21wYXJpc29uICAgIDo6PSBvcl9leHByICggY29tcF9vcGVyYXRvciBvcl9leHByICkqXG4gICBjb21wX29wZXJhdG9yIDo6PSAiPCIgfCAiPiIgfCAiPT0iIHwgIj49IiB8ICI8PSIgfCAiIT0iXG4gICAgICAgICAgICAgICAgICAgICB8ICJpcyIgWyJub3QiXSB8IFsibm90Il0gImluIlxuXG5Db21wYXJpc29ucyB5aWVsZCBib29sZWFuIHZhbHVlczogIlRydWUiIG9yICJGYWxzZSIuXG5cbkNvbXBhcmlzb25zIGNhbiBiZSBjaGFpbmVkIGFyYml0cmFyaWx5LCBlLmcuLCAieCA8IHkgPD0geiIgaXNcbmVxdWl2YWxlbnQgdG8gInggPCB5IGFuZCB5IDw9IHoiLCBleGNlcHQgdGhhdCAieSIgaXMgZXZhbHVhdGVkIG9ubHlcbm9uY2UgKGJ1dCBpbiBib3RoIGNhc2VzICJ6IiBpcyBub3QgZXZhbHVhdGVkIGF0IGFsbCB3aGVuICJ4IDwgeSIgaXNcbmZvdW5kIHRvIGJlIGZhbHNlKS5cblxuRm9ybWFsbHksIGlmICphKiwgKmIqLCAqYyosIC4uLiwgKnkqLCAqeiogYXJlIGV4cHJlc3Npb25zIGFuZCAqb3AxKixcbipvcDIqLCAuLi4sICpvcE4qIGFyZSBjb21wYXJpc29uIG9wZXJhdG9ycywgdGhlbiAiYSBvcDEgYiBvcDIgYyAuLi4geVxub3BOIHoiIGlzIGVxdWl2YWxlbnQgdG8gImEgb3AxIGIgYW5kIGIgb3AyIGMgYW5kIC4uLiB5IG9wTiB6IiwgZXhjZXB0XG50aGF0IGVhY2ggZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQgYXQgbW9zdCBvbmNlLlxuXG5Ob3RlIHRoYXQgImEgb3AxIGIgb3AyIGMiIGRvZXNuXCd0IGltcGx5IGFueSBraW5kIG9mIGNvbXBhcmlzb24gYmV0d2VlblxuKmEqIGFuZCAqYyosIHNvIHRoYXQsIGUuZy4sICJ4IDwgeSA+IHoiIGlzIHBlcmZlY3RseSBsZWdhbCAodGhvdWdoXG5wZXJoYXBzIG5vdCBwcmV0dHkpLlxuXG5UaGUgb3BlcmF0b3JzICI8IiwgIj4iLCAiPT0iLCAiPj0iLCAiPD0iLCBhbmQgIiE9IiBjb21wYXJlIHRoZSB2YWx1ZXNcbm9mIHR3byBvYmplY3RzLiAgVGhlIG9iamVjdHMgbmVlZCBub3QgaGF2ZSB0aGUgc2FtZSB0eXBlLiBJZiBib3RoIGFyZVxubnVtYmVycywgdGhleSBhcmUgY29udmVydGVkIHRvIGEgY29tbW9uIHR5cGUuICBPdGhlcndpc2UsIHRoZSAiPT0iIGFuZFxuIiE9IiBvcGVyYXRvcnMgKmFsd2F5cyogY29uc2lkZXIgb2JqZWN0cyBvZiBkaWZmZXJlbnQgdHlwZXMgdG8gYmVcbnVuZXF1YWwsIHdoaWxlIHRoZSAiPCIsICI+IiwgIj49IiBhbmQgIjw9IiBvcGVyYXRvcnMgcmFpc2UgYVxuIlR5cGVFcnJvciIgd2hlbiBjb21wYXJpbmcgb2JqZWN0cyBvZiBkaWZmZXJlbnQgdHlwZXMgdGhhdCBkbyBub3RcbmltcGxlbWVudCB0aGVzZSBvcGVyYXRvcnMgZm9yIHRoZSBnaXZlbiBwYWlyIG9mIHR5cGVzLiAgWW91IGNhblxuY29udHJvbCBjb21wYXJpc29uIGJlaGF2aW9yIG9mIG9iamVjdHMgb2Ygbm9uLWJ1aWx0LWluIHR5cGVzIGJ5XG5kZWZpbmluZyByaWNoIGNvbXBhcmlzb24gbWV0aG9kcyBsaWtlICJfX2d0X18oKSIsIGRlc2NyaWJlZCBpbiBzZWN0aW9uXG4qQmFzaWMgY3VzdG9taXphdGlvbiouXG5cbkNvbXBhcmlzb24gb2Ygb2JqZWN0cyBvZiB0aGUgc2FtZSB0eXBlIGRlcGVuZHMgb24gdGhlIHR5cGU6XG5cbiogTnVtYmVycyBhcmUgY29tcGFyZWQgYXJpdGhtZXRpY2FsbHkuXG5cbiogVGhlIHZhbHVlcyAiZmxvYXQoXCdOYU5cJykiIGFuZCAiRGVjaW1hbChcJ05hTlwnKSIgYXJlIHNwZWNpYWwuIFRoZVxuICBhcmUgaWRlbnRpY2FsIHRvIHRoZW1zZWx2ZXMsICJ4IGlzIHgiIGJ1dCBhcmUgbm90IGVxdWFsIHRvXG4gIHRoZW1zZWx2ZXMsICJ4ICE9IHgiLiAgQWRkaXRpb25hbGx5LCBjb21wYXJpbmcgYW55IHZhbHVlIHRvIGFcbiAgbm90LWEtbnVtYmVyIHZhbHVlIHdpbGwgcmV0dXJuICJGYWxzZSIuICBGb3IgZXhhbXBsZSwgYm90aCAiMyA8XG4gIGZsb2F0KFwnTmFOXCcpIiBhbmQgImZsb2F0KFwnTmFOXCcpIDwgMyIgd2lsbCByZXR1cm4gIkZhbHNlIi5cblxuKiBCeXRlcyBvYmplY3RzIGFyZSBjb21wYXJlZCBsZXhpY29ncmFwaGljYWxseSB1c2luZyB0aGUgbnVtZXJpY1xuICB2YWx1ZXMgb2YgdGhlaXIgZWxlbWVudHMuXG5cbiogU3RyaW5ncyBhcmUgY29tcGFyZWQgbGV4aWNvZ3JhcGhpY2FsbHkgdXNpbmcgdGhlIG51bWVyaWNcbiAgZXF1aXZhbGVudHMgKHRoZSByZXN1bHQgb2YgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uICJvcmQoKSIpIG9mIHRoZWlyXG4gIGNoYXJhY3RlcnMuIFszXSBTdHJpbmcgYW5kIGJ5dGVzIG9iamVjdCBjYW5cJ3QgYmUgY29tcGFyZWQhXG5cbiogVHVwbGVzIGFuZCBsaXN0cyBhcmUgY29tcGFyZWQgbGV4aWNvZ3JhcGhpY2FsbHkgdXNpbmcgY29tcGFyaXNvblxuICBvZiBjb3JyZXNwb25kaW5nIGVsZW1lbnRzLiAgVGhpcyBtZWFucyB0aGF0IHRvIGNvbXBhcmUgZXF1YWwsIGVhY2hcbiAgZWxlbWVudCBtdXN0IGNvbXBhcmUgZXF1YWwgYW5kIHRoZSB0d28gc2VxdWVuY2VzIG11c3QgYmUgb2YgdGhlIHNhbWVcbiAgdHlwZSBhbmQgaGF2ZSB0aGUgc2FtZSBsZW5ndGguXG5cbiAgSWYgbm90IGVxdWFsLCB0aGUgc2VxdWVuY2VzIGFyZSBvcmRlcmVkIHRoZSBzYW1lIGFzIHRoZWlyIGZpcnN0XG4gIGRpZmZlcmluZyBlbGVtZW50cy4gIEZvciBleGFtcGxlLCAiWzEsMix4XSA8PSBbMSwyLHldIiBoYXMgdGhlIHNhbWVcbiAgdmFsdWUgYXMgInggPD0geSIuICBJZiB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IGRvZXMgbm90IGV4aXN0LCB0aGVcbiAgc2hvcnRlciBzZXF1ZW5jZSBpcyBvcmRlcmVkIGZpcnN0IChmb3IgZXhhbXBsZSwgIlsxLDJdIDwgWzEsMiwzXSIpLlxuXG4qIE1hcHBpbmdzIChkaWN0aW9uYXJpZXMpIGNvbXBhcmUgZXF1YWwgaWYgYW5kIG9ubHkgaWYgdGhleSBoYXZlIHRoZVxuICBzYW1lICIoa2V5LCB2YWx1ZSkiIHBhaXJzLiBPcmRlciBjb21wYXJpc29ucyAiKFwnPFwnLCBcJzw9XCcsIFwnPj1cJyxcbiAgXCc+XCcpIiByYWlzZSAiVHlwZUVycm9yIi5cblxuKiBTZXRzIGFuZCBmcm96ZW5zZXRzIGRlZmluZSBjb21wYXJpc29uIG9wZXJhdG9ycyB0byBtZWFuIHN1YnNldCBhbmRcbiAgc3VwZXJzZXQgdGVzdHMuICBUaG9zZSByZWxhdGlvbnMgZG8gbm90IGRlZmluZSB0b3RhbCBvcmRlcmluZ3MgKHRoZVxuICB0d28gc2V0cyAiezEsMn0iIGFuZCB7MiwzfSBhcmUgbm90IGVxdWFsLCBub3Igc3Vic2V0cyBvZiBvbmVcbiAgYW5vdGhlciwgbm9yIHN1cGVyc2V0cyBvZiBvbmUgYW5vdGhlcikuICBBY2NvcmRpbmdseSwgc2V0cyBhcmUgbm90XG4gIGFwcHJvcHJpYXRlIGFyZ3VtZW50cyBmb3IgZnVuY3Rpb25zIHdoaWNoIGRlcGVuZCBvbiB0b3RhbCBvcmRlcmluZy5cbiAgRm9yIGV4YW1wbGUsICJtaW4oKSIsICJtYXgoKSIsIGFuZCAic29ydGVkKCkiIHByb2R1Y2UgdW5kZWZpbmVkXG4gIHJlc3VsdHMgZ2l2ZW4gYSBsaXN0IG9mIHNldHMgYXMgaW5wdXRzLlxuXG4qIE1vc3Qgb3RoZXIgb2JqZWN0cyBvZiBidWlsdC1pbiB0eXBlcyBjb21wYXJlIHVuZXF1YWwgdW5sZXNzIHRoZXlcbiAgYXJlIHRoZSBzYW1lIG9iamVjdDsgdGhlIGNob2ljZSB3aGV0aGVyIG9uZSBvYmplY3QgaXMgY29uc2lkZXJlZFxuICBzbWFsbGVyIG9yIGxhcmdlciB0aGFuIGFub3RoZXIgb25lIGlzIG1hZGUgYXJiaXRyYXJpbHkgYnV0XG4gIGNvbnNpc3RlbnRseSB3aXRoaW4gb25lIGV4ZWN1dGlvbiBvZiBhIHByb2dyYW0uXG5cbkNvbXBhcmlzb24gb2Ygb2JqZWN0cyBvZiBkaWZmZXJpbmcgdHlwZXMgZGVwZW5kcyBvbiB3aGV0aGVyIGVpdGhlciBvZlxudGhlIHR5cGVzIHByb3ZpZGUgZXhwbGljaXQgc3VwcG9ydCBmb3IgdGhlIGNvbXBhcmlzb24uICBNb3N0IG51bWVyaWNcbnR5cGVzIGNhbiBiZSBjb21wYXJlZCB3aXRoIG9uZSBhbm90aGVyLiAgV2hlbiBjcm9zcy10eXBlIGNvbXBhcmlzb24gaXNcbm5vdCBzdXBwb3J0ZWQsIHRoZSBjb21wYXJpc29uIG1ldGhvZCByZXR1cm5zICJOb3RJbXBsZW1lbnRlZCIuXG5cblRoZSBvcGVyYXRvcnMgImluIiBhbmQgIm5vdCBpbiIgdGVzdCBmb3IgbWVtYmVyc2hpcC4gICJ4IGluIHMiXG5ldmFsdWF0ZXMgdG8gdHJ1ZSBpZiAqeCogaXMgYSBtZW1iZXIgb2YgKnMqLCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLiAgInhcbm5vdCBpbiBzIiByZXR1cm5zIHRoZSBuZWdhdGlvbiBvZiAieCBpbiBzIi4gIEFsbCBidWlsdC1pbiBzZXF1ZW5jZXNcbmFuZCBzZXQgdHlwZXMgc3VwcG9ydCB0aGlzIGFzIHdlbGwgYXMgZGljdGlvbmFyeSwgZm9yIHdoaWNoICJpbiIgdGVzdHNcbndoZXRoZXIgdGhlIGRpY3Rpb25hcnkgaGFzIGEgZ2l2ZW4ga2V5LiBGb3IgY29udGFpbmVyIHR5cGVzIHN1Y2ggYXNcbmxpc3QsIHR1cGxlLCBzZXQsIGZyb3plbnNldCwgZGljdCwgb3IgY29sbGVjdGlvbnMuZGVxdWUsIHRoZVxuZXhwcmVzc2lvbiAieCBpbiB5IiBpcyBlcXVpdmFsZW50IHRvICJhbnkoeCBpcyBlIG9yIHggPT0gZSBmb3IgZSBpblxueSkiLlxuXG5Gb3IgdGhlIHN0cmluZyBhbmQgYnl0ZXMgdHlwZXMsICJ4IGluIHkiIGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgKngqIGlzXG5hIHN1YnN0cmluZyBvZiAqeSouICBBbiBlcXVpdmFsZW50IHRlc3QgaXMgInkuZmluZCh4KSAhPSAtMSIuICBFbXB0eVxuc3RyaW5ncyBhcmUgYWx3YXlzIGNvbnNpZGVyZWQgdG8gYmUgYSBzdWJzdHJpbmcgb2YgYW55IG90aGVyIHN0cmluZyxcbnNvICIiIiBpbiAiYWJjIiIgd2lsbCByZXR1cm4gIlRydWUiLlxuXG5Gb3IgdXNlci1kZWZpbmVkIGNsYXNzZXMgd2hpY2ggZGVmaW5lIHRoZSAiX19jb250YWluc19fKCkiIG1ldGhvZCwgInhcbmluIHkiIGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgInkuX19jb250YWluc19fKHgpIiBpcyB0cnVlLlxuXG5Gb3IgdXNlci1kZWZpbmVkIGNsYXNzZXMgd2hpY2ggZG8gbm90IGRlZmluZSAiX19jb250YWluc19fKCkiIGJ1dCBkb1xuZGVmaW5lICJfX2l0ZXJfXygpIiwgInggaW4geSIgaXMgdHJ1ZSBpZiBzb21lIHZhbHVlICJ6IiB3aXRoICJ4ID09IHoiXG5pcyBwcm9kdWNlZCB3aGlsZSBpdGVyYXRpbmcgb3ZlciAieSIuICBJZiBhbiBleGNlcHRpb24gaXMgcmFpc2VkXG5kdXJpbmcgdGhlIGl0ZXJhdGlvbiwgaXQgaXMgYXMgaWYgImluIiByYWlzZWQgdGhhdCBleGNlcHRpb24uXG5cbkxhc3RseSwgdGhlIG9sZC1zdHlsZSBpdGVyYXRpb24gcHJvdG9jb2wgaXMgdHJpZWQ6IGlmIGEgY2xhc3MgZGVmaW5lc1xuIl9fZ2V0aXRlbV9fKCkiLCAieCBpbiB5IiBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZXJlIGlzIGEgbm9uLVxubmVnYXRpdmUgaW50ZWdlciBpbmRleCAqaSogc3VjaCB0aGF0ICJ4ID09IHlbaV0iLCBhbmQgYWxsIGxvd2VyXG5pbnRlZ2VyIGluZGljZXMgZG8gbm90IHJhaXNlICJJbmRleEVycm9yIiBleGNlcHRpb24uICAoSWYgYW55IG90aGVyXG5leGNlcHRpb24gaXMgcmFpc2VkLCBpdCBpcyBhcyBpZiAiaW4iIHJhaXNlZCB0aGF0IGV4Y2VwdGlvbikuXG5cblRoZSBvcGVyYXRvciAibm90IGluIiBpcyBkZWZpbmVkIHRvIGhhdmUgdGhlIGludmVyc2UgdHJ1ZSB2YWx1ZSBvZlxuImluIi5cblxuVGhlIG9wZXJhdG9ycyAiaXMiIGFuZCAiaXMgbm90IiB0ZXN0IGZvciBvYmplY3QgaWRlbnRpdHk6ICJ4IGlzIHkiIGlzXG50cnVlIGlmIGFuZCBvbmx5IGlmICp4KiBhbmQgKnkqIGFyZSB0aGUgc2FtZSBvYmplY3QuICAieCBpcyBub3QgeSJcbnlpZWxkcyB0aGUgaW52ZXJzZSB0cnV0aCB2YWx1ZS4gWzRdXG4nLAorICdpbic6IHUnXG5Db21wYXJpc29uc1xuKioqKioqKioqKipcblxuVW5saWtlIEMsIGFsbCBjb21wYXJpc29uIG9wZXJhdGlvbnMgaW4gUHl0aG9uIGhhdmUgdGhlIHNhbWUgcHJpb3JpdHksXG53aGljaCBpcyBsb3dlciB0aGFuIHRoYXQgb2YgYW55IGFyaXRobWV0aWMsIHNoaWZ0aW5nIG9yIGJpdHdpc2Vcbm9wZXJhdGlvbi4gIEFsc28gdW5saWtlIEMsIGV4cHJlc3Npb25zIGxpa2UgImEgPCBiIDwgYyIgaGF2ZSB0aGVcbmludGVycHJldGF0aW9uIHRoYXQgaXMgY29udmVudGlvbmFsIGluIG1hdGhlbWF0aWNzOlxuXG4gICBjb21wYXJpc29uICAgIDo6PSBvcl9leHByICggY29tcF9vcGVyYXRvciBvcl9leHByICkqXG4gICBjb21wX29wZXJhdG9yIDo6PSAiPCIgfCAiPiIgfCAiPT0iIHwgIj49IiB8ICI8PSIgfCAiIT0iXG4gICAgICAgICAgICAgICAgICAgICB8ICJpcyIgWyJub3QiXSB8IFsibm90Il0gImluIlxuXG5Db21wYXJpc29ucyB5aWVsZCBib29sZWFuIHZhbHVlczogIlRydWUiIG9yICJGYWxzZSIuXG5cbkNvbXBhcmlzb25zIGNhbiBiZSBjaGFpbmVkIGFyYml0cmFyaWx5LCBlLmcuLCAieCA8IHkgPD0geiIgaXNcbmVxdWl2YWxlbnQgdG8gInggPCB5IGFuZCB5IDw9IHoiLCBleGNlcHQgdGhhdCAieSIgaXMgZXZhbHVhdGVkIG9ubHlcbm9uY2UgKGJ1dCBpbiBib3RoIGNhc2VzICJ6IiBpcyBub3QgZXZhbHVhdGVkIGF0IGFsbCB3aGVuICJ4IDwgeSIgaXNcbmZvdW5kIHRvIGJlIGZhbHNlKS5cblxuRm9ybWFsbHksIGlmICphKiwgKmIqLCAqYyosIC4uLiwgKnkqLCAqeiogYXJlIGV4cHJlc3Npb25zIGFuZCAqb3AxKixcbipvcDIqLCAuLi4sICpvcE4qIGFyZSBjb21wYXJpc29uIG9wZXJhdG9ycywgdGhlbiAiYSBvcDEgYiBvcDIgYyAuLi4geVxub3BOIHoiIGlzIGVxdWl2YWxlbnQgdG8gImEgb3AxIGIgYW5kIGIgb3AyIGMgYW5kIC4uLiB5IG9wTiB6IiwgZXhjZXB0XG50aGF0IGVhY2ggZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQgYXQgbW9zdCBvbmNlLlxuXG5Ob3RlIHRoYXQgImEgb3AxIGIgb3AyIGMiIGRvZXNuXCd0IGltcGx5IGFueSBraW5kIG9mIGNvbXBhcmlzb24gYmV0d2VlblxuKmEqIGFuZCAqYyosIHNvIHRoYXQsIGUuZy4sICJ4IDwgeSA+IHoiIGlzIHBlcmZlY3RseSBsZWdhbCAodGhvdWdoXG5wZXJoYXBzIG5vdCBwcmV0dHkpLlxuXG5UaGUgb3BlcmF0b3JzICI8IiwgIj4iLCAiPT0iLCAiPj0iLCAiPD0iLCBhbmQgIiE9IiBjb21wYXJlIHRoZSB2YWx1ZXNcbm9mIHR3byBvYmplY3RzLiAgVGhlIG9iamVjdHMgbmVlZCBub3QgaGF2ZSB0aGUgc2FtZSB0eXBlLiBJZiBib3RoIGFyZVxubnVtYmVycywgdGhleSBhcmUgY29udmVydGVkIHRvIGEgY29tbW9uIHR5cGUuICBPdGhlcndpc2UsIHRoZSAiPT0iIGFuZFxuIiE9IiBvcGVyYXRvcnMgKmFsd2F5cyogY29uc2lkZXIgb2JqZWN0cyBvZiBkaWZmZXJlbnQgdHlwZXMgdG8gYmVcbnVuZXF1YWwsIHdoaWxlIHRoZSAiPCIsICI+IiwgIj49IiBhbmQgIjw9IiBvcGVyYXRvcnMgcmFpc2UgYVxuIlR5cGVFcnJvciIgd2hlbiBjb21wYXJpbmcgb2JqZWN0cyBvZiBkaWZmZXJlbnQgdHlwZXMgdGhhdCBkbyBub3RcbmltcGxlbWVudCB0aGVzZSBvcGVyYXRvcnMgZm9yIHRoZSBnaXZlbiBwYWlyIG9mIHR5cGVzLiAgWW91IGNhblxuY29udHJvbCBjb21wYXJpc29uIGJlaGF2aW9yIG9mIG9iamVjdHMgb2Ygbm9uLWJ1aWx0LWluIHR5cGVzIGJ5XG5kZWZpbmluZyByaWNoIGNvbXBhcmlzb24gbWV0aG9kcyBsaWtlICJfX2d0X18oKSIsIGRlc2NyaWJlZCBpbiBzZWN0aW9uXG4qQmFzaWMgY3VzdG9taXphdGlvbiouXG5cbkNvbXBhcmlzb24gb2Ygb2JqZWN0cyBvZiB0aGUgc2FtZSB0eXBlIGRlcGVuZHMgb24gdGhlIHR5cGU6XG5cbiogTnVtYmVycyBhcmUgY29tcGFyZWQgYXJpdGhtZXRpY2FsbHkuXG5cbiogVGhlIHZhbHVlcyAiZmxvYXQoXCdOYU5cJykiIGFuZCAiRGVjaW1hbChcJ05hTlwnKSIgYXJlIHNwZWNpYWwuIFRoZXlcbiAgYXJlIGlkZW50aWNhbCB0byB0aGVtc2VsdmVzLCAieCBpcyB4IiBidXQgYXJlIG5vdCBlcXVhbCB0b1xuICB0aGVtc2VsdmVzLCAieCAhPSB4Ii4gIEFkZGl0aW9uYWxseSwgY29tcGFyaW5nIGFueSB2YWx1ZSB0byBhXG4gIG5vdC1hLW51bWJlciB2YWx1ZSB3aWxsIHJldHVybiAiRmFsc2UiLiAgRm9yIGV4YW1wbGUsIGJvdGggIjMgPFxuICBmbG9hdChcJ05hTlwnKSIgYW5kICJmbG9hdChcJ05hTlwnKSA8IDMiIHdpbGwgcmV0dXJuICJGYWxzZSIuXG5cbiogQnl0ZXMgb2JqZWN0cyBhcmUgY29tcGFyZWQgbGV4aWNvZ3JhcGhpY2FsbHkgdXNpbmcgdGhlIG51bWVyaWNcbiAgdmFsdWVzIG9mIHRoZWlyIGVsZW1lbnRzLlxuXG4qIFN0cmluZ3MgYXJlIGNvbXBhcmVkIGxleGljb2dyYXBoaWNhbGx5IHVzaW5nIHRoZSBudW1lcmljXG4gIGVxdWl2YWxlbnRzICh0aGUgcmVzdWx0IG9mIHRoZSBidWlsdC1pbiBmdW5jdGlvbiAib3JkKCkiKSBvZiB0aGVpclxuICBjaGFyYWN0ZXJzLiBbM10gU3RyaW5nIGFuZCBieXRlcyBvYmplY3QgY2FuXCd0IGJlIGNvbXBhcmVkIVxuXG4qIFR1cGxlcyBhbmQgbGlzdHMgYXJlIGNvbXBhcmVkIGxleGljb2dyYXBoaWNhbGx5IHVzaW5nIGNvbXBhcmlzb25cbiAgb2YgY29ycmVzcG9uZGluZyBlbGVtZW50cy4gIFRoaXMgbWVhbnMgdGhhdCB0byBjb21wYXJlIGVxdWFsLCBlYWNoXG4gIGVsZW1lbnQgbXVzdCBjb21wYXJlIGVxdWFsIGFuZCB0aGUgdHdvIHNlcXVlbmNlcyBtdXN0IGJlIG9mIHRoZSBzYW1lXG4gIHR5cGUgYW5kIGhhdmUgdGhlIHNhbWUgbGVuZ3RoLlxuXG4gIElmIG5vdCBlcXVhbCwgdGhlIHNlcXVlbmNlcyBhcmUgb3JkZXJlZCB0aGUgc2FtZSBhcyB0aGVpciBmaXJzdFxuICBkaWZmZXJpbmcgZWxlbWVudHMuICBGb3IgZXhhbXBsZSwgIlsxLDIseF0gPD0gWzEsMix5XSIgaGFzIHRoZSBzYW1lXG4gIHZhbHVlIGFzICJ4IDw9IHkiLiAgSWYgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBkb2VzIG5vdCBleGlzdCwgdGhlXG4gIHNob3J0ZXIgc2VxdWVuY2UgaXMgb3JkZXJlZCBmaXJzdCAoZm9yIGV4YW1wbGUsICJbMSwyXSA8IFsxLDIsM10iKS5cblxuKiBNYXBwaW5ncyAoZGljdGlvbmFyaWVzKSBjb21wYXJlIGVxdWFsIGlmIGFuZCBvbmx5IGlmIHRoZXkgaGF2ZSB0aGVcbiAgc2FtZSAiKGtleSwgdmFsdWUpIiBwYWlycy4gT3JkZXIgY29tcGFyaXNvbnMgIihcJzxcJywgXCc8PVwnLCBcJz49XCcsXG4gIFwnPlwnKSIgcmFpc2UgIlR5cGVFcnJvciIuXG5cbiogU2V0cyBhbmQgZnJvemVuc2V0cyBkZWZpbmUgY29tcGFyaXNvbiBvcGVyYXRvcnMgdG8gbWVhbiBzdWJzZXQgYW5kXG4gIHN1cGVyc2V0IHRlc3RzLiAgVGhvc2UgcmVsYXRpb25zIGRvIG5vdCBkZWZpbmUgdG90YWwgb3JkZXJpbmdzICh0aGVcbiAgdHdvIHNldHMgInsxLDJ9IiBhbmQgezIsM30gYXJlIG5vdCBlcXVhbCwgbm9yIHN1YnNldHMgb2Ygb25lXG4gIGFub3RoZXIsIG5vciBzdXBlcnNldHMgb2Ygb25lIGFub3RoZXIpLiAgQWNjb3JkaW5nbHksIHNldHMgYXJlIG5vdFxuICBhcHByb3ByaWF0ZSBhcmd1bWVudHMgZm9yIGZ1bmN0aW9ucyB3aGljaCBkZXBlbmQgb24gdG90YWwgb3JkZXJpbmcuXG4gIEZvciBleGFtcGxlLCAibWluKCkiLCAibWF4KCkiLCBhbmQgInNvcnRlZCgpIiBwcm9kdWNlIHVuZGVmaW5lZFxuICByZXN1bHRzIGdpdmVuIGEgbGlzdCBvZiBzZXRzIGFzIGlucHV0cy5cblxuKiBNb3N0IG90aGVyIG9iamVjdHMgb2YgYnVpbHQtaW4gdHlwZXMgY29tcGFyZSB1bmVxdWFsIHVubGVzcyB0aGV5XG4gIGFyZSB0aGUgc2FtZSBvYmplY3Q7IHRoZSBjaG9pY2Ugd2hldGhlciBvbmUgb2JqZWN0IGlzIGNvbnNpZGVyZWRcbiAgc21hbGxlciBvciBsYXJnZXIgdGhhbiBhbm90aGVyIG9uZSBpcyBtYWRlIGFyYml0cmFyaWx5IGJ1dFxuICBjb25zaXN0ZW50bHkgd2l0aGluIG9uZSBleGVjdXRpb24gb2YgYSBwcm9ncmFtLlxuXG5Db21wYXJpc29uIG9mIG9iamVjdHMgb2YgZGlmZmVyaW5nIHR5cGVzIGRlcGVuZHMgb24gd2hldGhlciBlaXRoZXIgb2ZcbnRoZSB0eXBlcyBwcm92aWRlIGV4cGxpY2l0IHN1cHBvcnQgZm9yIHRoZSBjb21wYXJpc29uLiAgTW9zdCBudW1lcmljXG50eXBlcyBjYW4gYmUgY29tcGFyZWQgd2l0aCBvbmUgYW5vdGhlci4gIFdoZW4gY3Jvc3MtdHlwZSBjb21wYXJpc29uIGlzXG5ub3Qgc3VwcG9ydGVkLCB0aGUgY29tcGFyaXNvbiBtZXRob2QgcmV0dXJucyAiTm90SW1wbGVtZW50ZWQiLlxuXG5UaGUgb3BlcmF0b3JzICJpbiIgYW5kICJub3QgaW4iIHRlc3QgZm9yIG1lbWJlcnNoaXAuICAieCBpbiBzIlxuZXZhbHVhdGVzIHRvIHRydWUgaWYgKngqIGlzIGEgbWVtYmVyIG9mICpzKiwgYW5kIGZhbHNlIG90aGVyd2lzZS4gICJ4XG5ub3QgaW4gcyIgcmV0dXJucyB0aGUgbmVnYXRpb24gb2YgInggaW4gcyIuICBBbGwgYnVpbHQtaW4gc2VxdWVuY2VzXG5hbmQgc2V0IHR5cGVzIHN1cHBvcnQgdGhpcyBhcyB3ZWxsIGFzIGRpY3Rpb25hcnksIGZvciB3aGljaCAiaW4iIHRlc3RzXG53aGV0aGVyIHRoZSBkaWN0aW9uYXJ5IGhhcyBhIGdpdmVuIGtleS4gRm9yIGNvbnRhaW5lciB0eXBlcyBzdWNoIGFzXG5saXN0LCB0dXBsZSwgc2V0LCBmcm96ZW5zZXQsIGRpY3QsIG9yIGNvbGxlY3Rpb25zLmRlcXVlLCB0aGVcbmV4cHJlc3Npb24gInggaW4geSIgaXMgZXF1aXZhbGVudCB0byAiYW55KHggaXMgZSBvciB4ID09IGUgZm9yIGUgaW5cbnkpIi5cblxuRm9yIHRoZSBzdHJpbmcgYW5kIGJ5dGVzIHR5cGVzLCAieCBpbiB5IiBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmICp4KiBpc1xuYSBzdWJzdHJpbmcgb2YgKnkqLiAgQW4gZXF1aXZhbGVudCB0ZXN0IGlzICJ5LmZpbmQoeCkgIT0gLTEiLiAgRW1wdHlcbnN0cmluZ3MgYXJlIGFsd2F5cyBjb25zaWRlcmVkIHRvIGJlIGEgc3Vic3RyaW5nIG9mIGFueSBvdGhlciBzdHJpbmcsXG5zbyAiIiIgaW4gImFiYyIiIHdpbGwgcmV0dXJuICJUcnVlIi5cblxuRm9yIHVzZXItZGVmaW5lZCBjbGFzc2VzIHdoaWNoIGRlZmluZSB0aGUgIl9fY29udGFpbnNfXygpIiBtZXRob2QsICJ4XG5pbiB5IiBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmICJ5Ll9fY29udGFpbnNfXyh4KSIgaXMgdHJ1ZS5cblxuRm9yIHVzZXItZGVmaW5lZCBjbGFzc2VzIHdoaWNoIGRvIG5vdCBkZWZpbmUgIl9fY29udGFpbnNfXygpIiBidXQgZG9cbmRlZmluZSAiX19pdGVyX18oKSIsICJ4IGluIHkiIGlzIHRydWUgaWYgc29tZSB2YWx1ZSAieiIgd2l0aCAieCA9PSB6IlxuaXMgcHJvZHVjZWQgd2hpbGUgaXRlcmF0aW5nIG92ZXIgInkiLiAgSWYgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZFxuZHVyaW5nIHRoZSBpdGVyYXRpb24sIGl0IGlzIGFzIGlmICJpbiIgcmFpc2VkIHRoYXQgZXhjZXB0aW9uLlxuXG5MYXN0bHksIHRoZSBvbGQtc3R5bGUgaXRlcmF0aW9uIHByb3RvY29sIGlzIHRyaWVkOiBpZiBhIGNsYXNzIGRlZmluZXNcbiJfX2dldGl0ZW1fXygpIiwgInggaW4geSIgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGVyZSBpcyBhIG5vbi1cbm5lZ2F0aXZlIGludGVnZXIgaW5kZXggKmkqIHN1Y2ggdGhhdCAieCA9PSB5W2ldIiwgYW5kIGFsbCBsb3dlclxuaW50ZWdlciBpbmRpY2VzIGRvIG5vdCByYWlzZSAiSW5kZXhFcnJvciIgZXhjZXB0aW9uLiAgKElmIGFueSBvdGhlclxuZXhjZXB0aW9uIGlzIHJhaXNlZCwgaXQgaXMgYXMgaWYgImluIiByYWlzZWQgdGhhdCBleGNlcHRpb24pLlxuXG5UaGUgb3BlcmF0b3IgIm5vdCBpbiIgaXMgZGVmaW5lZCB0byBoYXZlIHRoZSBpbnZlcnNlIHRydWUgdmFsdWUgb2ZcbiJpbiIuXG5cblRoZSBvcGVyYXRvcnMgImlzIiBhbmQgImlzIG5vdCIgdGVzdCBmb3Igb2JqZWN0IGlkZW50aXR5OiAieCBpcyB5IiBpc1xudHJ1ZSBpZiBhbmQgb25seSBpZiAqeCogYW5kICp5KiBhcmUgdGhlIHNhbWUgb2JqZWN0LiAgInggaXMgbm90IHkiXG55aWVsZHMgdGhlIGludmVyc2UgdHJ1dGggdmFsdWUuIFs0XVxuJywKICAnaW50ZWdlcnMnOiB1J1xuSW50ZWdlciBsaXRlcmFsc1xuKioqKioqKioqKioqKioqKlxuXG5JbnRlZ2VyIGxpdGVyYWxzIGFyZSBkZXNjcmliZWQgYnkgdGhlIGZvbGxvd2luZyBsZXhpY2FsIGRlZmluaXRpb25zOlxuXG4gICBpbnRlZ2VyICAgICAgICA6Oj0gZGVjaW1hbGludGVnZXIgfCBvY3RpbnRlZ2VyIHwgaGV4aW50ZWdlciB8IGJpbmludGVnZXJcbiAgIGRlY2ltYWxpbnRlZ2VyIDo6PSBub256ZXJvZGlnaXQgZGlnaXQqIHwgIjAiK1xuICAgbm9uemVyb2RpZ2l0ICAgOjo9ICIxIi4uLiI5IlxuICAgZGlnaXQgICAgICAgICAgOjo9ICIwIi4uLiI5IlxuICAgb2N0aW50ZWdlciAgICAgOjo9ICIwIiAoIm8iIHwgIk8iKSBvY3RkaWdpdCtcbiAgIGhleGludGVnZXIgICAgIDo6PSAiMCIgKCJ4IiB8ICJYIikgaGV4ZGlnaXQrXG4gICBiaW5pbnRlZ2VyICAgICA6Oj0gIjAiICgiYiIgfCAiQiIpIGJpbmRpZ2l0K1xuICAgb2N0ZGlnaXQgICAgICAgOjo9ICIwIi4uLiI3IlxuICAgaGV4ZGlnaXQgICAgICAgOjo9IGRpZ2l0IHwgImEiLi4uImYiIHwgIkEiLi4uIkYiXG4gICBiaW5kaWdpdCAgICAgICA6Oj0gIjAiIHwgIjEiXG5cblRoZXJlIGlzIG5vIGxpbWl0IGZvciB0aGUgbGVuZ3RoIG9mIGludGVnZXIgbGl0ZXJhbHMgYXBhcnQgZnJvbSB3aGF0XG5jYW4gYmUgc3RvcmVkIGluIGF2YWlsYWJsZSBtZW1vcnkuXG5cbk5vdGUgdGhhdCBsZWFkaW5nIHplcm9zIGluIGEgbm9uLXplcm8gZGVjaW1hbCBudW1iZXIgYXJlIG5vdCBhbGxvd2VkLlxuVGhpcyBpcyBmb3IgZGlzYW1iaWd1YXRpb24gd2l0aCBDLXN0eWxlIG9jdGFsIGxpdGVyYWxzLCB3aGljaCBQeXRob25cbnVzZWQgYmVmb3JlIHZlcnNpb24gMy4wLlxuXG5Tb21lIGV4YW1wbGVzIG9mIGludGVnZXIgbGl0ZXJhbHM6XG5cbiAgIDcgICAgIDIxNDc0ODM2NDcgICAgICAgICAgICAgICAgICAgICAgICAwbzE3NyAgICAwYjEwMDExMDExMVxuICAgMyAgICAgNzkyMjgxNjI1MTQyNjQzMzc1OTM1NDM5NTAzMzYgICAgIDBvMzc3ICAgIDB4MTAwMDAwMDAwXG4gICAgICAgICA3OTIyODE2MjUxNDI2NDMzNzU5MzU0Mzk1MDMzNiAgICAgICAgICAgICAgMHhkZWFkYmVlZlxuJywKICAnbGFtYmRhJzogdSdcbkxhbWJkYXNcbioqKioqKipcblxuICAgbGFtYmRhX2V4cHIgICAgICAgIDo6PSAibGFtYmRhIiBbcGFyYW1ldGVyX2xpc3RdOiBleHByZXNzaW9uXG4gICBsYW1iZGFfZXhwcl9ub2NvbmQgOjo9ICJsYW1iZGEiIFtwYXJhbWV0ZXJfbGlzdF06IGV4cHJlc3Npb25fbm9jb25kXG5cbkxhbWJkYSBleHByZXNzaW9ucyAoc29tZXRpbWVzIGNhbGxlZCBsYW1iZGEgZm9ybXMpIGFyZSB1c2VkIHRvIGNyZWF0ZVxuYW5vbnltb3VzIGZ1bmN0aW9ucy4gVGhlIGV4cHJlc3Npb24gImxhbWJkYSBhcmd1bWVudHM6IGV4cHJlc3Npb24iXG55aWVsZHMgYSBmdW5jdGlvbiBvYmplY3QuICBUaGUgdW5uYW1lZCBvYmplY3QgYmVoYXZlcyBsaWtlIGEgZnVuY3Rpb25cbm9iamVjdCBkZWZpbmVkIHdpdGhcblxuICAgZGVmIDxsYW1iZGE+KGFyZ3VtZW50cyk6XG4gICAgICAgcmV0dXJuIGV4cHJlc3Npb25cblxuU2VlIHNlY3Rpb24gKkZ1bmN0aW9uIGRlZmluaXRpb25zKiBmb3IgdGhlIHN5bnRheCBvZiBwYXJhbWV0ZXIgbGlzdHMuXG5Ob3RlIHRoYXQgZnVuY3Rpb25zIGNyZWF0ZWQgd2l0aCBsYW1iZGEgZXhwcmVzc2lvbnMgY2Fubm90IGNvbnRhaW5cbnN0YXRlbWVudHMgb3IgYW5ub3RhdGlvbnMuXG4nLAogICdsaXN0cyc6IHUnXG5MaXN0IGRpc3BsYXlzXG4qKioqKioqKioqKioqXG5cbkEgbGlzdCBkaXNwbGF5IGlzIGEgcG9zc2libHkgZW1wdHkgc2VyaWVzIG9mIGV4cHJlc3Npb25zIGVuY2xvc2VkIGluXG5zcXVhcmUgYnJhY2tldHM6XG5cbiAgIGxpc3RfZGlzcGxheSA6Oj0gIlsiIFtleHByZXNzaW9uX2xpc3QgfCBjb21wcmVoZW5zaW9uXSAiXSJcblxuQSBsaXN0IGRpc3BsYXkgeWllbGRzIGEgbmV3IGxpc3Qgb2JqZWN0LCB0aGUgY29udGVudHMgYmVpbmcgc3BlY2lmaWVkXG5ieSBlaXRoZXIgYSBsaXN0IG9mIGV4cHJlc3Npb25zIG9yIGEgY29tcHJlaGVuc2lvbi4gIFdoZW4gYSBjb21tYS1cbnNlcGFyYXRlZCBsaXN0IG9mIGV4cHJlc3Npb25zIGlzIHN1cHBsaWVkLCBpdHMgZWxlbWVudHMgYXJlIGV2YWx1YXRlZFxuZnJvbSBsZWZ0IHRvIHJpZ2h0IGFuZCBwbGFjZWQgaW50byB0aGUgbGlzdCBvYmplY3QgaW4gdGhhdCBvcmRlci5cbldoZW4gYSBjb21wcmVoZW5zaW9uIGlzIHN1cHBsaWVkLCB0aGUgbGlzdCBpcyBjb25zdHJ1Y3RlZCBmcm9tIHRoZVxuZWxlbWVudHMgcmVzdWx0aW5nIGZyb20gdGhlIGNvbXByZWhlbnNpb24uXG4nLApkaWZmIC0tZ2l0IGEvTGliL3JlLnB5IGIvTGliL3JlLnB5CmluZGV4IGJjMzA1NmYuLjc4OGZhNmIgMTAwNjQ0Ci0tLSBhL0xpYi9yZS5weQorKysgYi9MaWIvcmUucHkKQEAgLTM1MSwxMCArMzUxLDExIEBACiAgICAgICAgIHMgPSBzcmVfcGFyc2UuUGF0dGVybigpCiAgICAgICAgIHMuZmxhZ3MgPSBmbGFncwogICAgICAgICBmb3IgcGhyYXNlLCBhY3Rpb24gaW4gbGV4aWNvbjoKKyAgICAgICAgICAgIGdpZCA9IHMub3Blbmdyb3VwKCkKICAgICAgICAgICAgIHAuYXBwZW5kKHNyZV9wYXJzZS5TdWJQYXR0ZXJuKHMsIFsKLSAgICAgICAgICAgICAgICAoU1VCUEFUVEVSTiwgKGxlbihwKSsxLCBzcmVfcGFyc2UucGFyc2UocGhyYXNlLCBmbGFncykpKSwKKyAgICAgICAgICAgICAgICAoU1VCUEFUVEVSTiwgKGdpZCwgc3JlX3BhcnNlLnBhcnNlKHBocmFzZSwgZmxhZ3MpKSksCiAgICAgICAgICAgICAgICAgXSkpCi0gICAgICAgIHMuZ3JvdXBzID0gbGVuKHApKzEKKyAgICAgICAgICAgIHMuY2xvc2Vncm91cChnaWQsIHBbLTFdKQogICAgICAgICBwID0gc3JlX3BhcnNlLlN1YlBhdHRlcm4ocywgWyhCUkFOQ0gsIChOb25lLCBwKSldKQogICAgICAgICBzZWxmLnNjYW5uZXIgPSBzcmVfY29tcGlsZS5jb21waWxlKHApCiAgICAgZGVmIHNjYW4oc2VsZiwgc3RyaW5nKToKZGlmZiAtLWdpdCBhL0xpYi9zcmVfcGFyc2UucHkgYi9MaWIvc3JlX3BhcnNlLnB5CmluZGV4IDFhN2QzMTYuLjk4YWZkN2MgMTAwNjQ0Ci0tLSBhL0xpYi9zcmVfcGFyc2UucHkKKysrIGIvTGliL3NyZV9wYXJzZS5weQpAQCAtNjgsMTIgKzY4LDE1IEBACiAgICAgIyBtYXN0ZXIgcGF0dGVybiBvYmplY3QuICBrZWVwcyB0cmFjayBvZiBnbG9iYWwgYXR0cmlidXRlcwogICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAgc2VsZi5mbGFncyA9IDAKLSAgICAgICAgc2VsZi5vcGVuID0gW10KLSAgICAgICAgc2VsZi5ncm91cHMgPSAxCiAgICAgICAgIHNlbGYuZ3JvdXBkaWN0ID0ge30KKyAgICAgICAgc2VsZi5zdWJwYXR0ZXJucyA9IFtOb25lXSAgIyBncm91cCAwCisgICAgICAgIHNlbGYubG9va2JlaGluZGdyb3VwcyA9IE5vbmUKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgZ3JvdXBzKHNlbGYpOgorICAgICAgICByZXR1cm4gbGVuKHNlbGYuc3VicGF0dGVybnMpCiAgICAgZGVmIG9wZW5ncm91cChzZWxmLCBuYW1lPU5vbmUpOgogICAgICAgICBnaWQgPSBzZWxmLmdyb3VwcwotICAgICAgICBzZWxmLmdyb3VwcyA9IGdpZCArIDEKKyAgICAgICAgc2VsZi5zdWJwYXR0ZXJucy5hcHBlbmQoTm9uZSkKICAgICAgICAgaWYgc2VsZi5ncm91cHMgPiBNQVhHUk9VUFM6CiAgICAgICAgICAgICByYWlzZSBlcnJvcigiZ3JvdXBzIG51bWJlciBpcyB0b28gbGFyZ2UiKQogICAgICAgICBpZiBuYW1lIGlzIG5vdCBOb25lOgpAQCAtODIsMTIgKzg1LDE5IEBACiAgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IoInJlZGVmaW5pdGlvbiBvZiBncm91cCBuYW1lICVyIGFzIGdyb3VwICVkOyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndhcyBncm91cCAlZCIgJSAobmFtZSwgZ2lkLCAgb2dpZCkpCiAgICAgICAgICAgICBzZWxmLmdyb3VwZGljdFtuYW1lXSA9IGdpZAotICAgICAgICBzZWxmLm9wZW4uYXBwZW5kKGdpZCkKICAgICAgICAgcmV0dXJuIGdpZAotICAgIGRlZiBjbG9zZWdyb3VwKHNlbGYsIGdpZCk6Ci0gICAgICAgIHNlbGYub3Blbi5yZW1vdmUoZ2lkKQorICAgIGRlZiBjbG9zZWdyb3VwKHNlbGYsIGdpZCwgcCk6CisgICAgICAgIHNlbGYuc3VicGF0dGVybnNbZ2lkXSA9IHAKICAgICBkZWYgY2hlY2tncm91cChzZWxmLCBnaWQpOgotICAgICAgICByZXR1cm4gZ2lkIDwgc2VsZi5ncm91cHMgYW5kIGdpZCBub3QgaW4gc2VsZi5vcGVuCisgICAgICAgIHJldHVybiBnaWQgPCBzZWxmLmdyb3VwcyBhbmQgc2VsZi5zdWJwYXR0ZXJuc1tnaWRdIGlzIG5vdCBOb25lCisKKyAgICBkZWYgY2hlY2tsb29rYmVoaW5kZ3JvdXAoc2VsZiwgZ2lkLCBzb3VyY2UpOgorICAgICAgICBpZiBzZWxmLmxvb2tiZWhpbmRncm91cHMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5jaGVja2dyb3VwKGdpZCk6CisgICAgICAgICAgICAgICAgcmFpc2Ugc291cmNlLmVycm9yKCdjYW5ub3QgcmVmZXIgdG8gYW4gb3BlbiBncm91cCcpCisgICAgICAgICAgICBpZiBnaWQgPj0gc2VsZi5sb29rYmVoaW5kZ3JvdXBzOgorICAgICAgICAgICAgICAgIHJhaXNlIHNvdXJjZS5lcnJvcignY2Fubm90IHJlZmVyIHRvIGdyb3VwIGRlZmluZWQgaW4gdGhlIHNhbWUgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbG9va2JlaGluZCBzdWJwYXR0ZXJuJykKIAogY2xhc3MgU3ViUGF0dGVybjoKICAgICAjIGEgc3VicGF0dGVybiwgaW4gaW50ZXJtZWRpYXRlIGZvcm0KQEAgLTE4Myw3ICsxOTMsMjEgQEAKICAgICAgICAgICAgIGVsaWYgb3AgaW4gX1VOSVRDT0RFUzoKICAgICAgICAgICAgICAgICBsbyA9IGxvICsgMQogICAgICAgICAgICAgICAgIGhpID0gaGkgKyAxCi0gICAgICAgICAgICBlbGlmIG9wID09IFNVQ0NFU1M6CisgICAgICAgICAgICBlbGlmIG9wIGlzIEdST1VQUkVGOgorICAgICAgICAgICAgICAgIGksIGogPSBzZWxmLnBhdHRlcm4uc3VicGF0dGVybnNbYXZdLmdldHdpZHRoKCkKKyAgICAgICAgICAgICAgICBsbyA9IGxvICsgaQorICAgICAgICAgICAgICAgIGhpID0gaGkgKyBqCisgICAgICAgICAgICBlbGlmIG9wIGlzIEdST1VQUkVGX0VYSVNUUzoKKyAgICAgICAgICAgICAgICBpLCBqID0gYXZbMV0uZ2V0d2lkdGgoKQorICAgICAgICAgICAgICAgIGlmIGF2WzJdIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBsLCBoID0gYXZbMl0uZ2V0d2lkdGgoKQorICAgICAgICAgICAgICAgICAgICBpID0gbWluKGksIGwpCisgICAgICAgICAgICAgICAgICAgIGogPSBtYXgoaiwgaCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpID0gMAorICAgICAgICAgICAgICAgIGxvID0gbG8gKyBpCisgICAgICAgICAgICAgICAgaGkgPSBoaSArIGoKKyAgICAgICAgICAgIGVsaWYgb3AgaXMgU1VDQ0VTUzoKICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICBzZWxmLndpZHRoID0gbWluKGxvLCBNQVhSRVBFQVQgLSAxKSwgbWluKGhpLCBNQVhSRVBFQVQpCiAgICAgICAgIHJldHVybiBzZWxmLndpZHRoCkBAIC0zNzksNiArNDAzLDcgQEAKICAgICAgICAgICAgICAgICBpZiBub3Qgc3RhdGUuY2hlY2tncm91cChncm91cCk6CiAgICAgICAgICAgICAgICAgICAgIHJhaXNlIHNvdXJjZS5lcnJvcigiY2Fubm90IHJlZmVyIHRvIG9wZW4gZ3JvdXAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuKGVzY2FwZSkpCisgICAgICAgICAgICAgICAgc3RhdGUuY2hlY2tsb29rYmVoaW5kZ3JvdXAoZ3JvdXAsIHNvdXJjZSkKICAgICAgICAgICAgICAgICByZXR1cm4gR1JPVVBSRUYsIGdyb3VwCiAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yCiAgICAgICAgIGlmIGxlbihlc2NhcGUpID09IDI6CkBAIC02NDEsNiArNjY2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGdpZCBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9ICJ1bmtub3duIGdyb3VwIG5hbWU6IHswIXJ9Ii5mb3JtYXQobmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBzb3VyY2UuZXJyb3IobXNnLCBsZW4obmFtZSkgKyAxKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuY2hlY2tsb29rYmVoaW5kZ3JvdXAoZ2lkLCBzb3VyY2UpCiAgICAgICAgICAgICAgICAgICAgICAgICBzdWJwYXR0ZXJuYXBwZW5kKChHUk9VUFJFRiwgZ2lkKSkKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgIGVsc2U6CkBAIC02NjgsNyArNjk0LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpZiBjaGFyIGlzIE5vbmUgb3IgY2hhciBub3QgaW4gIj0hIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBzb3VyY2UuZXJyb3IoInN5bnRheCBlcnJvciIpCiAgICAgICAgICAgICAgICAgICAgICAgICBkaXIgPSAtMSAjIGxvb2tiZWhpbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvb2tiZWhpbmRncm91cHMgPSBzdGF0ZS5sb29rYmVoaW5kZ3JvdXBzCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBsb29rYmVoaW5kZ3JvdXBzIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUubG9va2JlaGluZGdyb3VwcyA9IHN0YXRlLmdyb3VwcwogICAgICAgICAgICAgICAgICAgICBwID0gX3BhcnNlX3N1Yihzb3VyY2UsIHN0YXRlKQorICAgICAgICAgICAgICAgICAgICBpZiBkaXIgPCAwOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbG9va2JlaGluZGdyb3VwcyBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmxvb2tiZWhpbmRncm91cHMgPSBOb25lCiAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzb3VyY2VtYXRjaCgiKSIpOgogICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2Ugc291cmNlLmVycm9yKCJ1bmJhbGFuY2VkIHBhcmVudGhlc2lzIikKICAgICAgICAgICAgICAgICAgICAgaWYgY2hhciA9PSAiPSI6CkBAIC03MDEsNiArNzMzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNvbmRncm91cCA+PSBNQVhHUk9VUFM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2Ugc291cmNlLmVycm9yKCJ0aGUgZ3JvdXAgbnVtYmVyIGlzIHRvbyBsYXJnZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbihjb25kbmFtZSkgKyAxKQorICAgICAgICAgICAgICAgICAgICBzdGF0ZS5jaGVja2xvb2tiZWhpbmRncm91cChjb25kZ3JvdXAsIHNvdXJjZSkKICAgICAgICAgICAgICAgICBlbGlmIGNoYXIgaW4gRkxBR1M6CiAgICAgICAgICAgICAgICAgICAgICMgZmxhZ3MKICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZmxhZ3MgfD0gRkxBR1NbY2hhcl0KQEAgLTcyNiw3ICs3NTksNyBAQAogICAgICAgICAgICAgICAgIGlmIG5vdCBzb3VyY2VtYXRjaCgiKSIpOgogICAgICAgICAgICAgICAgICAgICByYWlzZSBzb3VyY2UuZXJyb3IoInVuYmFsYW5jZWQgcGFyZW50aGVzaXMiKQogICAgICAgICAgICAgICAgIGlmIGdyb3VwIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgICAgICBzdGF0ZS5jbG9zZWdyb3VwKGdyb3VwKQorICAgICAgICAgICAgICAgICAgICBzdGF0ZS5jbG9zZWdyb3VwKGdyb3VwLCBwKQogICAgICAgICAgICAgICAgIHN1YnBhdHRlcm5hcHBlbmQoKFNVQlBBVFRFUk4sIChncm91cCwgcCkpKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgpkaWZmIC0tZ2l0IGEvTGliL3NzbC5weSBiL0xpYi9zc2wucHkKaW5kZXggODA3ZTlmMi4uMTg3MzBjYiAxMDA2NDQKLS0tIGEvTGliL3NzbC5weQorKysgYi9MaWIvc3NsLnB5CkBAIC04Nyw2ICs4Nyw3IEBACiBBTEVSVF9ERVNDUklQVElPTl9VTktOT1dOX1BTS19JREVOVElUWQogIiIiCiAKK2ltcG9ydCBpcGFkZHJlc3MKIGltcG9ydCB0ZXh0d3JhcAogaW1wb3J0IHJlCiBpbXBvcnQgc3lzCkBAIC0xMDMsOCArMTA0LDYgQEAKICAgICBTU0xTeXNjYWxsRXJyb3IsIFNTTEVPRkVycm9yLAogICAgICkKIGZyb20gX3NzbCBpbXBvcnQgQ0VSVF9OT05FLCBDRVJUX09QVElPTkFMLCBDRVJUX1JFUVVJUkVECi1mcm9tIF9zc2wgaW1wb3J0IChWRVJJRllfREVGQVVMVCwgVkVSSUZZX0NSTF9DSEVDS19MRUFGLCBWRVJJRllfQ1JMX0NIRUNLX0NIQUlOLAotICAgIFZFUklGWV9YNTA5X1NUUklDVCkKIGZyb20gX3NzbCBpbXBvcnQgdHh0Mm9iaiBhcyBfdHh0Mm9iaiwgbmlkMm9iaiBhcyBfbmlkMm9iagogZnJvbSBfc3NsIGltcG9ydCBSQU5EX3N0YXR1cywgUkFORF9hZGQsIFJBTkRfYnl0ZXMsIFJBTkRfcHNldWRvX2J5dGVzCiB0cnk6CkBAIC0xMjEsNiArMTIwLDcgQEAKIF9pbXBvcnRfc3ltYm9scygnT1BfJykKIF9pbXBvcnRfc3ltYm9scygnQUxFUlRfREVTQ1JJUFRJT05fJykKIF9pbXBvcnRfc3ltYm9scygnU1NMX0VSUk9SXycpCitfaW1wb3J0X3N5bWJvbHMoJ1ZFUklGWV8nKQogCiBmcm9tIF9zc2wgaW1wb3J0IEhBU19TTkksIEhBU19FQ0RILCBIQVNfTlBOLCBIQVNfQUxQTgogCkBAIC0xNjMsMTQgKzE2MywxMiBAQAogIyAgICogUHJlZmVyIGFueSBBRVMtR0NNIG92ZXIgYW55IEFFUy1DQkMgZm9yIGJldHRlciBwZXJmb3JtYW5jZSBhbmQgc2VjdXJpdHkKICMgICAqIFRoZW4gVXNlIEhJR0ggY2lwaGVyIHN1aXRlcyBhcyBhIGZhbGxiYWNrCiAjICAgKiBUaGVuIFVzZSAzREVTIGFzIGZhbGxiYWNrIHdoaWNoIGlzIHNlY3VyZSBidXQgc2xvdwotIyAgICogRmluYWxseSB1c2UgUkM0IGFzIGEgZmFsbGJhY2sgd2hpY2ggaXMgcHJvYmxlbWF0aWMgYnV0IG5lZWRlZCBmb3IKLSMgICAgIGNvbXBhdGliaWxpdHkgc29tZSB0aW1lcy4KICMgICAqIERpc2FibGUgTlVMTCBhdXRoZW50aWNhdGlvbiwgTlVMTCBlbmNyeXB0aW9uLCBhbmQgTUQ1IE1BQ3MgZm9yIHNlY3VyaXR5CiAjICAgICByZWFzb25zCiBfREVGQVVMVF9DSVBIRVJTID0gKAogICAgICdFQ0RIK0FFU0dDTTpESCtBRVNHQ006RUNESCtBRVMyNTY6REgrQUVTMjU2OkVDREgrQUVTMTI4OkRIK0FFUzpFQ0RIK0hJR0g6JwotICAgICdESCtISUdIOkVDREgrM0RFUzpESCszREVTOlJTQStBRVNHQ006UlNBK0FFUzpSU0ErSElHSDpSU0ErM0RFUzpFQ0RIK1JDNDonCi0gICAgJ0RIK1JDNDpSU0ErUkM0OiFhTlVMTDohZU5VTEw6IU1ENScKKyAgICAnREgrSElHSDpFQ0RIKzNERVM6REgrM0RFUzpSU0ErQUVTR0NNOlJTQStBRVM6UlNBK0hJR0g6UlNBKzNERVM6IWFOVUxMOicKKyAgICAnIWVOVUxMOiFNRDUnCiApCiAKICMgUmVzdHJpY3RlZCBhbmQgbW9yZSBzZWN1cmUgY2lwaGVycyBmb3IgdGhlIHNlcnZlciBzaWRlCkBAIC0yNDIsNiArMjQwLDE3IEBACiAgICAgcmV0dXJuIHBhdC5tYXRjaChob3N0bmFtZSkKIAogCitkZWYgX2lwYWRkcmVzc19tYXRjaChpcG5hbWUsIGhvc3RfaXApOgorICAgICIiIkV4YWN0IG1hdGNoaW5nIG9mIElQIGFkZHJlc3Nlcy4KKworICAgIFJGQyA2MTI1IGV4cGxpY2l0bHkgZG9lc24ndCBkZWZpbmUgYW4gYWxnb3JpdGhtIGZvciB0aGlzCisgICAgKHNlY3Rpb24gMS43LjIgLSAiT3V0IG9mIFNjb3BlIikuCisgICAgIiIiCisgICAgIyBPcGVuU1NMIG1heSBhZGQgYSB0cmFpbGluZyBuZXdsaW5lIHRvIGEgc3ViamVjdEFsdE5hbWUncyBJUCBhZGRyZXNzCisgICAgaXAgPSBpcGFkZHJlc3MuaXBfYWRkcmVzcyhpcG5hbWUucnN0cmlwKCkpCisgICAgcmV0dXJuIGlwID09IGhvc3RfaXAKKworCiBkZWYgbWF0Y2hfaG9zdG5hbWUoY2VydCwgaG9zdG5hbWUpOgogICAgICIiIlZlcmlmeSB0aGF0ICpjZXJ0KiAoaW4gZGVjb2RlZCBmb3JtYXQgYXMgcmV0dXJuZWQgYnkKICAgICBTU0xTb2NrZXQuZ2V0cGVlcmNlcnQoKSkgbWF0Y2hlcyB0aGUgKmhvc3RuYW1lKi4gIFJGQyAyODE4IGFuZCBSRkMgNjEyNQpAQCAtMjU0LDExICsyNjMsMjAgQEAKICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZW1wdHkgb3Igbm8gY2VydGlmaWNhdGUsIG1hdGNoX2hvc3RuYW1lIG5lZWRzIGEgIgogICAgICAgICAgICAgICAgICAgICAgICAgICJTU0wgc29ja2V0IG9yIFNTTCBjb250ZXh0IHdpdGggZWl0aGVyICIKICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0VSVF9PUFRJT05BTCBvciBDRVJUX1JFUVVJUkVEIikKKyAgICB0cnk6CisgICAgICAgIGhvc3RfaXAgPSBpcGFkZHJlc3MuaXBfYWRkcmVzcyhob3N0bmFtZSkKKyAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgIyBOb3QgYW4gSVAgYWRkcmVzcyAoY29tbW9uIGNhc2UpCisgICAgICAgIGhvc3RfaXAgPSBOb25lCiAgICAgZG5zbmFtZXMgPSBbXQogICAgIHNhbiA9IGNlcnQuZ2V0KCdzdWJqZWN0QWx0TmFtZScsICgpKQogICAgIGZvciBrZXksIHZhbHVlIGluIHNhbjoKICAgICAgICAgaWYga2V5ID09ICdETlMnOgotICAgICAgICAgICAgaWYgX2Ruc25hbWVfbWF0Y2godmFsdWUsIGhvc3RuYW1lKToKKyAgICAgICAgICAgIGlmIGhvc3RfaXAgaXMgTm9uZSBhbmQgX2Ruc25hbWVfbWF0Y2godmFsdWUsIGhvc3RuYW1lKToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGRuc25hbWVzLmFwcGVuZCh2YWx1ZSkKKyAgICAgICAgZWxpZiBrZXkgPT0gJ0lQIEFkZHJlc3MnOgorICAgICAgICAgICAgaWYgaG9zdF9pcCBpcyBub3QgTm9uZSBhbmQgX2lwYWRkcmVzc19tYXRjaCh2YWx1ZSwgaG9zdF9pcCk6CiAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICBkbnNuYW1lcy5hcHBlbmQodmFsdWUpCiAgICAgaWYgbm90IGRuc25hbWVzOgpkaWZmIC0tZ2l0IGEvTGliL3N1YnByb2Nlc3MucHkgYi9MaWIvc3VicHJvY2Vzcy5weQppbmRleCAyNWZmZWZmLi42ZDJjNGY1IDEwMDY0NAotLS0gYS9MaWIvc3VicHJvY2Vzcy5weQorKysgYi9MaWIvc3VicHJvY2Vzcy5weQpAQCAtODkyLDEwICs4OTIsMTIgQEAKICAgICAgICAgICAgIHNlbGYuc3Rkb3V0LmNsb3NlKCkKICAgICAgICAgaWYgc2VsZi5zdGRlcnI6CiAgICAgICAgICAgICBzZWxmLnN0ZGVyci5jbG9zZSgpCi0gICAgICAgIGlmIHNlbGYuc3RkaW46Ci0gICAgICAgICAgICBzZWxmLnN0ZGluLmNsb3NlKCkKLSAgICAgICAgIyBXYWl0IGZvciB0aGUgcHJvY2VzcyB0byB0ZXJtaW5hdGUsIHRvIGF2b2lkIHpvbWJpZXMuCi0gICAgICAgIHNlbGYud2FpdCgpCisgICAgICAgIHRyeTogICMgRmx1c2hpbmcgYSBCdWZmZXJlZFdyaXRlciBtYXkgcmFpc2UgYW4gZXJyb3IKKyAgICAgICAgICAgIGlmIHNlbGYuc3RkaW46CisgICAgICAgICAgICAgICAgc2VsZi5zdGRpbi5jbG9zZSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAjIFdhaXQgZm9yIHRoZSBwcm9jZXNzIHRvIHRlcm1pbmF0ZSwgdG8gYXZvaWQgem9tYmllcy4KKyAgICAgICAgICAgIHNlbGYud2FpdCgpCiAKICAgICBkZWYgX19kZWxfXyhzZWxmLCBfbWF4c2l6ZT1zeXMubWF4c2l6ZSk6CiAgICAgICAgIGlmIG5vdCBzZWxmLl9jaGlsZF9jcmVhdGVkOgpkaWZmIC0tZ2l0IGEvTGliL3N5c2NvbmZpZy5weSBiL0xpYi9zeXNjb25maWcucHkKaW5kZXggYzVmNTQxYi4uMTM3OTMyZSAxMDA2NDQKLS0tIGEvTGliL3N5c2NvbmZpZy5weQorKysgYi9MaWIvc3lzY29uZmlnLnB5CkBAIC01Nyw3ICs1Nyw3IEBACiAgICAgICAgICdwdXJlbGliJzogJ3t1c2VyYmFzZX0vUHl0aG9ue3B5X3ZlcnNpb25fbm9kb3R9L3NpdGUtcGFja2FnZXMnLAogICAgICAgICAncGxhdGxpYic6ICd7dXNlcmJhc2V9L1B5dGhvbntweV92ZXJzaW9uX25vZG90fS9zaXRlLXBhY2thZ2VzJywKICAgICAgICAgJ2luY2x1ZGUnOiAne3VzZXJiYXNlfS9QeXRob257cHlfdmVyc2lvbl9ub2RvdH0vSW5jbHVkZScsCi0gICAgICAgICdzY3JpcHRzJzogJ3t1c2VyYmFzZX0vU2NyaXB0cycsCisgICAgICAgICdzY3JpcHRzJzogJ3t1c2VyYmFzZX0vUHl0aG9ue3B5X3ZlcnNpb25fbm9kb3R9L1NjcmlwdHMnLAogICAgICAgICAnZGF0YSc6ICd7dXNlcmJhc2V9JywKICAgICAgICAgfSwKICAgICAncG9zaXhfdXNlcic6IHsKZGlmZiAtLWdpdCBhL0xpYi90YXJmaWxlLnB5IGIvTGliL3RhcmZpbGUucHkKaW5kZXggNGI0ZTBkMy4uZWE3YTg5YSAxMDA3NTUKLS0tIGEvTGliL3RhcmZpbGUucHkKKysrIGIvTGliL3RhcmZpbGUucHkKQEAgLTE0MDksOSArMTQwOSw5IEBACiAgICAgICAgICAgIGNhbiBiZSBkZXRlcm1pbmVkLCBgbW9kZScgaXMgb3ZlcnJpZGRlbiBieSBgZmlsZW9iaidzIG1vZGUuCiAgICAgICAgICAgIGBmaWxlb2JqJyBpcyBub3QgY2xvc2VkLCB3aGVuIFRhckZpbGUgaXMgY2xvc2VkLgogICAgICAgICAiIiIKLSAgICAgICAgbW9kZXMgPSB7InIiOiAicmIiLCAiYSI6ICJyK2IiLCAidyI6ICJ3YiJ9CisgICAgICAgIG1vZGVzID0geyJyIjogInJiIiwgImEiOiAicitiIiwgInciOiAid2IiLCAieCI6ICJ4YiJ9CiAgICAgICAgIGlmIG1vZGUgbm90IGluIG1vZGVzOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibW9kZSBtdXN0IGJlICdyJywgJ2EnIG9yICd3JyIpCisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJtb2RlIG11c3QgYmUgJ3InLCAnYScsICd3JyBvciAneCciKQogICAgICAgICBzZWxmLm1vZGUgPSBtb2RlCiAgICAgICAgIHNlbGYuX21vZGUgPSBtb2Rlc1ttb2RlXQogCkBAIC0xNTI0LDYgKzE1MjQsMTUgQEAKICAgICAgICAgICAgJ3c6YnoyJyAgICAgIG9wZW4gZm9yIHdyaXRpbmcgd2l0aCBiemlwMiBjb21wcmVzc2lvbgogICAgICAgICAgICAndzp4eicgICAgICAgb3BlbiBmb3Igd3JpdGluZyB3aXRoIGx6bWEgY29tcHJlc3Npb24KIAorICAgICAgICAgICAneCcgb3IgJ3g6JyAgY3JlYXRlIGEgdGFyZmlsZSBleGNsdXNpdmVseSB3aXRob3V0IGNvbXByZXNzaW9uLCByYWlzZQorICAgICAgICAgICAgICAgICAgICAgICAgYW4gZXhjZXB0aW9uIGlmIHRoZSBmaWxlIGlzIGFscmVhZHkgY3JlYXRlZAorICAgICAgICAgICAneDpneicgICAgICAgY3JlYXRlIGFuIGd6aXAgY29tcHJlc3NlZCB0YXJmaWxlLCByYWlzZSBhbiBleGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRoZSBmaWxlIGlzIGFscmVhZHkgY3JlYXRlZAorICAgICAgICAgICAneDpiejInICAgICAgY3JlYXRlIGFuIGJ6aXAyIGNvbXByZXNzZWQgdGFyZmlsZSwgcmFpc2UgYW4gZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICBpZiB0aGUgZmlsZSBpcyBhbHJlYWR5IGNyZWF0ZWQKKyAgICAgICAgICAgJ3g6eHonICAgICAgIGNyZWF0ZSBhbiBsem1hIGNvbXByZXNzZWQgdGFyZmlsZSwgcmFpc2UgYW4gZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICBpZiB0aGUgZmlsZSBpcyBhbHJlYWR5IGNyZWF0ZWQKKwogICAgICAgICAgICAncnwqJyAgICAgICAgb3BlbiBhIHN0cmVhbSBvZiB0YXIgYmxvY2tzIHdpdGggdHJhbnNwYXJlbnQgY29tcHJlc3Npb24KICAgICAgICAgICAgJ3J8JyAgICAgICAgIG9wZW4gYW4gdW5jb21wcmVzc2VkIHN0cmVhbSBvZiB0YXIgYmxvY2tzIGZvciByZWFkaW5nCiAgICAgICAgICAgICdyfGd6JyAgICAgICBvcGVuIGEgZ3ppcCBjb21wcmVzc2VkIHN0cmVhbSBvZiB0YXIgYmxvY2tzCkBAIC0xNTgyLDcgKzE1OTEsNyBAQAogICAgICAgICAgICAgdC5fZXh0ZmlsZW9iaiA9IEZhbHNlCiAgICAgICAgICAgICByZXR1cm4gdAogCi0gICAgICAgIGVsaWYgbW9kZSBpbiAoImEiLCAidyIpOgorICAgICAgICBlbGlmIG1vZGUgaW4gKCJhIiwgInciLCAieCIpOgogICAgICAgICAgICAgcmV0dXJuIGNscy50YXJvcGVuKG5hbWUsIG1vZGUsIGZpbGVvYmosICoqa3dhcmdzKQogCiAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInVuZGlzY2VybmlibGUgbW9kZSIpCkBAIC0xNTkxLDggKzE2MDAsOCBAQAogICAgIGRlZiB0YXJvcGVuKGNscywgbmFtZSwgbW9kZT0iciIsIGZpbGVvYmo9Tm9uZSwgKiprd2FyZ3MpOgogICAgICAgICAiIiJPcGVuIHVuY29tcHJlc3NlZCB0YXIgYXJjaGl2ZSBuYW1lIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuCiAgICAgICAgICIiIgotICAgICAgICBpZiBtb2RlIG5vdCBpbiAoInIiLCAiYSIsICJ3Iik6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJtb2RlIG11c3QgYmUgJ3InLCAnYScgb3IgJ3cnIikKKyAgICAgICAgaWYgbW9kZSBub3QgaW4gKCJyIiwgImEiLCAidyIsICJ4Iik6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJtb2RlIG11c3QgYmUgJ3InLCAnYScsICd3JyBvciAneCciKQogICAgICAgICByZXR1cm4gY2xzKG5hbWUsIG1vZGUsIGZpbGVvYmosICoqa3dhcmdzKQogCiAgICAgQGNsYXNzbWV0aG9kCkBAIC0xNjAwLDggKzE2MDksOCBAQAogICAgICAgICAiIiJPcGVuIGd6aXAgY29tcHJlc3NlZCB0YXIgYXJjaGl2ZSBuYW1lIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuCiAgICAgICAgICAgIEFwcGVuZGluZyBpcyBub3QgYWxsb3dlZC4KICAgICAgICAgIiIiCi0gICAgICAgIGlmIG1vZGUgbm90IGluICgiciIsICJ3Iik6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJtb2RlIG11c3QgYmUgJ3InIG9yICd3JyIpCisgICAgICAgIGlmIG1vZGUgbm90IGluICgiciIsICJ3IiwgIngiKToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm1vZGUgbXVzdCBiZSAncicsICd3JyBvciAneCciKQogCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGltcG9ydCBnemlwCkBAIC0xNjM0LDggKzE2NDMsOCBAQAogICAgICAgICAiIiJPcGVuIGJ6aXAyIGNvbXByZXNzZWQgdGFyIGFyY2hpdmUgbmFtZSBmb3IgcmVhZGluZyBvciB3cml0aW5nLgogICAgICAgICAgICBBcHBlbmRpbmcgaXMgbm90IGFsbG93ZWQuCiAgICAgICAgICIiIgotICAgICAgICBpZiBtb2RlIG5vdCBpbiAoInIiLCAidyIpOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibW9kZSBtdXN0IGJlICdyJyBvciAndycuIikKKyAgICAgICAgaWYgbW9kZSBub3QgaW4gKCJyIiwgInciLCAieCIpOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibW9kZSBtdXN0IGJlICdyJywgJ3cnIG9yICd4JyIpCiAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgaW1wb3J0IGJ6MgpAQCAtMTY2Myw4ICsxNjcyLDggQEAKICAgICAgICAgIiIiT3BlbiBsem1hIGNvbXByZXNzZWQgdGFyIGFyY2hpdmUgbmFtZSBmb3IgcmVhZGluZyBvciB3cml0aW5nLgogICAgICAgICAgICBBcHBlbmRpbmcgaXMgbm90IGFsbG93ZWQuCiAgICAgICAgICIiIgotICAgICAgICBpZiBtb2RlIG5vdCBpbiAoInIiLCAidyIpOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibW9kZSBtdXN0IGJlICdyJyBvciAndyciKQorICAgICAgICBpZiBtb2RlIG5vdCBpbiAoInIiLCAidyIsICJ4Iik6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJtb2RlIG11c3QgYmUgJ3InLCAndycgb3IgJ3gnIikKIAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBpbXBvcnQgbHptYQpAQCAtMTc1MSw3ICsxNzYwLDcgQEAKICAgICAgICAgICAgYWRkZmlsZSgpLiBJZiBnaXZlbiwgYGFyY25hbWUnIHNwZWNpZmllcyBhbiBhbHRlcm5hdGl2ZSBuYW1lIGZvciB0aGUKICAgICAgICAgICAgZmlsZSBpbiB0aGUgYXJjaGl2ZS4KICAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX2NoZWNrKCJhdyIpCisgICAgICAgIHNlbGYuX2NoZWNrKCJhd3giKQogCiAgICAgICAgICMgV2hlbiBmaWxlb2JqIGlzIGdpdmVuLCByZXBsYWNlIG5hbWUgYnkKICAgICAgICAgIyBmaWxlb2JqJ3MgcmVhbCBuYW1lLgpAQCAtMTg4NSw3ICsxODk0LDcgQEAKICAgICAgICAgICAgVGFySW5mbyBvYmplY3QsIGlmIGl0IHJldHVybnMgTm9uZSB0aGUgVGFySW5mbyBvYmplY3Qgd2lsbCBiZQogICAgICAgICAgICBleGNsdWRlZCBmcm9tIHRoZSBhcmNoaXZlLgogICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fY2hlY2soImF3IikKKyAgICAgICAgc2VsZi5fY2hlY2soImF3eCIpCiAKICAgICAgICAgaWYgYXJjbmFtZSBpcyBOb25lOgogICAgICAgICAgICAgYXJjbmFtZSA9IG5hbWUKQEAgLTE5NDIsNyArMTk1MSw3IEBACiAgICAgICAgICAgIE9uIFdpbmRvd3MgcGxhdGZvcm1zLCBgZmlsZW9iaicgc2hvdWxkIGFsd2F5cyBiZSBvcGVuZWQgd2l0aCBtb2RlCiAgICAgICAgICAgICdyYicgdG8gYXZvaWQgaXJyaXRhdGlvbiBhYm91dCB0aGUgZmlsZSBzaXplLgogICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fY2hlY2soImF3IikKKyAgICAgICAgc2VsZi5fY2hlY2soImF3eCIpCiAKICAgICAgICAgdGFyaW5mbyA9IGNvcHkuY29weSh0YXJpbmZvKQogCkBAIC0yNDk0LDE2ICsyNTAzLDE2IEBACiAgICAgICAgIF8sIGV4dCA9IG9zLnBhdGguc3BsaXRleHQodGFyX25hbWUpCiAgICAgICAgIGNvbXByZXNzaW9ucyA9IHsKICAgICAgICAgICAgICMgZ3oKLSAgICAgICAgICAgICdneic6ICdneicsCi0gICAgICAgICAgICAndGd6JzogJ2d6JywKKyAgICAgICAgICAgICcuZ3onOiAnZ3onLAorICAgICAgICAgICAgJy50Z3onOiAnZ3onLAogICAgICAgICAgICAgIyB4egotICAgICAgICAgICAgJ3h6JzogJ3h6JywKLSAgICAgICAgICAgICd0eHonOiAneHonLAorICAgICAgICAgICAgJy54eic6ICd4eicsCisgICAgICAgICAgICAnLnR4eic6ICd4eicsCiAgICAgICAgICAgICAjIGJ6MgotICAgICAgICAgICAgJ2J6Mic6ICdiejInLAotICAgICAgICAgICAgJ3Rieic6ICdiejInLAotICAgICAgICAgICAgJ3RiejInOiAnYnoyJywKLSAgICAgICAgICAgICd0YjInOiAnYnoyJywKKyAgICAgICAgICAgICcuYnoyJzogJ2J6MicsCisgICAgICAgICAgICAnLnRieic6ICdiejInLAorICAgICAgICAgICAgJy50YnoyJzogJ2J6MicsCisgICAgICAgICAgICAnLnRiMic6ICdiejInLAogICAgICAgICB9CiAgICAgICAgIHRhcl9tb2RlID0gJ3c6JyArIGNvbXByZXNzaW9uc1tleHRdIGlmIGV4dCBpbiBjb21wcmVzc2lvbnMgZWxzZSAndycKICAgICAgICAgdGFyX2ZpbGVzID0gYXJncy5jcmVhdGUKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L190ZXN0X211bHRpcHJvY2Vzc2luZy5weSBiL0xpYi90ZXN0L190ZXN0X211bHRpcHJvY2Vzc2luZy5weQppbmRleCA1MjU5OGIzLi40NTIwYzZhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC9fdGVzdF9tdWx0aXByb2Nlc3NpbmcucHkKKysrIGIvTGliL3Rlc3QvX3Rlc3RfbXVsdGlwcm9jZXNzaW5nLnB5CkBAIC03MTMsNiArNzEzLDI3IEBACiAgICAgICAgIGZvciBwIGluIHdvcmtlcnM6CiAgICAgICAgICAgICBwLmpvaW4oKQogCisgICAgZGVmIHRlc3Rfbm9faW1wb3J0X2xvY2tfY29udGVudGlvbihzZWxmKToKKyAgICAgICAgd2l0aCB0ZXN0LnN1cHBvcnQudGVtcF9jd2QoKToKKyAgICAgICAgICAgIG1vZHVsZV9uYW1lID0gJ2ltcG9ydGVkX2J5X2FuX2ltcG9ydGVkX21vZHVsZScKKyAgICAgICAgICAgIHdpdGggb3Blbihtb2R1bGVfbmFtZSArICcucHknLCAndycpIGFzIGY6CisgICAgICAgICAgICAgICAgZi53cml0ZSgiIiJpZiAxOgorICAgICAgICAgICAgICAgICAgICBpbXBvcnQgbXVsdGlwcm9jZXNzaW5nCisKKyAgICAgICAgICAgICAgICAgICAgcSA9IG11bHRpcHJvY2Vzc2luZy5RdWV1ZSgpCisgICAgICAgICAgICAgICAgICAgIHEucHV0KCdrbm9jayBrbm9jaycpCisgICAgICAgICAgICAgICAgICAgIHEuZ2V0KHRpbWVvdXQ9MykKKyAgICAgICAgICAgICAgICAgICAgcS5jbG9zZSgpCisgICAgICAgICAgICAgICAgICAgIGRlbCBxCisgICAgICAgICAgICAgICAgIiIiKQorCisgICAgICAgICAgICB3aXRoIHRlc3Quc3VwcG9ydC5EaXJzT25TeXNQYXRoKG9zLmdldGN3ZCgpKToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIF9faW1wb3J0X18obW9kdWxlX25hbWUpCisgICAgICAgICAgICAgICAgZXhjZXB0IHB5cXVldWUuRW1wdHk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiUHJvYmFibGUgcmVncmVzc2lvbiBvbiBpbXBvcnQgbG9jayBjb250ZW50aW9uOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgc2VlIElzc3VlICMyMjg1MyIpCisKICAgICBkZWYgdGVzdF90aW1lb3V0KHNlbGYpOgogICAgICAgICBxID0gbXVsdGlwcm9jZXNzaW5nLlF1ZXVlKCkKICAgICAgICAgc3RhcnQgPSB0aW1lLnRpbWUoKQpAQCAtMjAyMCw2ICsyMDQxLDEyIEBACiBjbGFzcyBfVGVzdFJlbW90ZU1hbmFnZXIoQmFzZVRlc3RDYXNlKToKIAogICAgIEFMTE9XRURfVFlQRVMgPSAoJ21hbmFnZXInLCkKKyAgICB2YWx1ZXMgPSBbJ2hlbGxvIHdvcmxkJywgTm9uZSwgVHJ1ZSwgMi4yNSwKKyAgICAgICAgICAgICAgJ2hhbGxceGU1IHZceGU0cmxkZW4nLAorICAgICAgICAgICAgICAnXHUwNDNmXHUwNDQwXHUwNDM4XHUwNDMyXHUwNDU2XHUwNDQyIFx1MDQ0MVx1MDQzMlx1MDQ1Nlx1MDQ0MicsCisgICAgICAgICAgICAgIGInaGFsbFx4ZTUgdlx4ZTRybGRlbicsCisgICAgICAgICAgICAgXQorICAgIHJlc3VsdCA9IHZhbHVlc1s6XQogCiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIF9wdXR0ZXIoY2xzLCBhZGRyZXNzLCBhdXRoa2V5KToKQEAgLTIwMjgsNyArMjA1NSw4IEBACiAgICAgICAgICAgICApCiAgICAgICAgIG1hbmFnZXIuY29ubmVjdCgpCiAgICAgICAgIHF1ZXVlID0gbWFuYWdlci5nZXRfcXVldWUoKQotICAgICAgICBxdWV1ZS5wdXQoKCdoZWxsbyB3b3JsZCcsIE5vbmUsIFRydWUsIDIuMjUpKQorICAgICAgICAjIE5vdGUgdGhhdCB4bWxycGNsaWIgd2lsbCBkZXNlcmlhbGl6ZSBvYmplY3QgYXMgYSBsaXN0IG5vdCBhIHR1cGxlCisgICAgICAgIHF1ZXVlLnB1dCh0dXBsZShjbHMudmFsdWVzKSkKIAogICAgIGRlZiB0ZXN0X3JlbW90ZShzZWxmKToKICAgICAgICAgYXV0aGtleSA9IG9zLnVyYW5kb20oMzIpCkBAIC0yMDQ4LDggKzIwNzYsNyBAQAogICAgICAgICBtYW5hZ2VyMi5jb25uZWN0KCkKICAgICAgICAgcXVldWUgPSBtYW5hZ2VyMi5nZXRfcXVldWUoKQogCi0gICAgICAgICMgTm90ZSB0aGF0IHhtbHJwY2xpYiB3aWxsIGRlc2VyaWFsaXplIG9iamVjdCBhcyBhIGxpc3Qgbm90IGEgdHVwbGUKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChxdWV1ZS5nZXQoKSwgWydoZWxsbyB3b3JsZCcsIE5vbmUsIFRydWUsIDIuMjVdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHF1ZXVlLmdldCgpLCBzZWxmLnJlc3VsdCkKIAogICAgICAgICAjIEJlY2F1c2Ugd2UgYXJlIHVzaW5nIHhtbHJwY2xpYiBmb3Igc2VyaWFsaXphdGlvbiBpbnN0ZWFkIG9mCiAgICAgICAgICMgcGlja2xlIHRoaXMgd2lsbCBjYXVzZSBhIHNlcmlhbGl6YXRpb24gZXJyb3IuCkBAIC0zNDA1LDEyICszNDMyLDEyIEBACiAgICAgICAgIG5hbWUgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgJ21wX2ZvcmtfYm9tYi5weScpCiAgICAgICAgIGlmIHNtICE9ICdmb3JrJzoKICAgICAgICAgICAgIHJjLCBvdXQsIGVyciA9IHRlc3Quc2NyaXB0X2hlbHBlci5hc3NlcnRfcHl0aG9uX2ZhaWx1cmUobmFtZSwgc20pCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcnLCBvdXQuZGVjb2RlKCdhc2NpaScpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRJbignUnVudGltZUVycm9yJywgZXJyLmRlY29kZSgnYXNjaWknKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0LCBiJycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGInUnVudGltZUVycm9yJywgZXJyKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcmMsIG91dCwgZXJyID0gdGVzdC5zY3JpcHRfaGVscGVyLmFzc2VydF9weXRob25fb2sobmFtZSwgc20pCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcxMjMnLCBvdXQuZGVjb2RlKCdhc2NpaScpLnJzdHJpcCgpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJywgZXJyLmRlY29kZSgnYXNjaWknKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0LnJzdHJpcCgpLCBiJzEyMycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVyciwgYicnKQogCiAjCiAjIElzc3VlICMxNzU1NTogRm9ya0F3YXJlVGhyZWFkTG9jawpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvZGF0ZXRpbWV0ZXN0ZXIucHkgYi9MaWIvdGVzdC9kYXRldGltZXRlc3Rlci5weQppbmRleCA3OTM1Y2YyLi40MGVmMWJhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC9kYXRldGltZXRlc3Rlci5weQorKysgYi9MaWIvdGVzdC9kYXRldGltZXRlc3Rlci5weQpAQCAtNjIsNiArNjIsMzMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgJ3R6aW5mbyddKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5hbWVzIC0gYWxsb3dlZCwgc2V0KFtdKSkKIAorICAgIGRlZiB0ZXN0X2RpdmlkZV9hbmRfcm91bmQoc2VsZik6CisgICAgICAgIGlmICdfRmFzdCcgaW4gc3RyKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGRhciA9IGRhdGV0aW1lX21vZHVsZS5fZGl2aWRlX2FuZF9yb3VuZAorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGFyKC0xMCwgLTMpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhcig1LCAtMiksIC0yKQorCisgICAgICAgICMgZm91ciBjYXNlczogKDIgc2lnbnMgb2YgYSkgeCAoMiBzaWducyBvZiBiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhcig3LCAzKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXIoLTcsIDMpLCAtMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXIoNywgLTMpLCAtMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXIoLTcsIC0zKSwgMikKKworICAgICAgICAjIHRpZXMgdG8gZXZlbiAtIGVpZ2h0IGNhc2VzOgorICAgICAgICAjICgyIHNpZ25zIG9mIGEpIHggKDIgc2lnbnMgb2YgYikgeCAoZXZlbiAvIG9kZCBxdW90aWVudCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXIoMTAsIDQpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhcigtMTAsIDQpLCAtMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXIoMTAsIC00KSwgLTIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGFyKC0xMCwgLTQpLCAyKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGFyKDYsIDQpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhcigtNiwgNCksIC0yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhcig2LCAtNCksIC0yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhcigtNiwgLTQpLCAyKQorCisKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIHR6aW5mbyB0ZXN0cwogCkBAIC0zOTQsNiArNDIxLDEwIEBACiAgICAgICAgIGVxKCgtMyp1cykgKiAwLjUsIC0yKnVzKQogICAgICAgICBlcSgoLTUqdXMpICogMC41LCAtMip1cykKIAorICAgICAgICAjIElzc3VlICMyMzUyMQorICAgICAgICBlcSh0ZChzZWNvbmRzPTEpICogMC4xMjM0NTYsIHRkKG1pY3Jvc2Vjb25kcz0xMjM0NTYpKQorICAgICAgICBlcSh0ZChzZWNvbmRzPTEpICogMC42MTEyMjk1LCB0ZChtaWNyb3NlY29uZHM9NjExMjI5KSkKKwogICAgICAgICAjIERpdmlzaW9uIGJ5IGludCBhbmQgZmxvYXQKICAgICAgICAgZXEoKDMqdXMpIC8gMiwgMip1cykKICAgICAgICAgZXEoKDUqdXMpIC8gMiwgMip1cykKQEAgLTQwOCw2ICs0MzksOSBAQAogICAgICAgICBmb3IgaSBpbiByYW5nZSgtMTAsIDEwKToKICAgICAgICAgICAgIGVxKChpKnVzLy0zKS8vdXMsIHJvdW5kKGkvLTMpKQogCisgICAgICAgICMgSXNzdWUgIzIzNTIxCisgICAgICAgIGVxKHRkKHNlY29uZHM9MSkgLyAoMSAvIDAuNjExMjI5NSksIHRkKG1pY3Jvc2Vjb25kcz02MTEyMjkpKQorCiAgICAgICAgICMgSXNzdWUgIzExNTc2CiAgICAgICAgIGVxKHRkKDk5OTk5OTk5OSwgODYzOTksIDk5OTk5OSkgLSB0ZCg5OTk5OTk5OTksIDg2Mzk5LCA5OTk5OTgpLAogICAgICAgICAgICB0ZCgwLCAwLCAxKSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3BpY2tsZXRlc3Rlci5weSBiL0xpYi90ZXN0L3BpY2tsZXRlc3Rlci5weQppbmRleCA1Y2QwOGQ5Li5mODM3MmUzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC9waWNrbGV0ZXN0ZXIucHkKKysrIGIvTGliL3Rlc3QvcGlja2xldGVzdGVyLnB5CkBAIC0xNDQsMjEgKzE0NCwyMiBAQAogIyB0aGUgb2JqZWN0IHJldHVybmVkIGJ5IGNyZWF0ZV9kYXRhKCkuCiAKIERBVEEwID0gKAotICAgIGInKGxwMFxuTDBMXG5hTDFMXG5hRjIuMFxuYWMnCi0gICAgYididWlsdGluc1xuY29tcGxleFxuJwotICAgIGIncDFcbihGMy4wXG5GMC4wXG50cDJcblJwJwotICAgIGInM1xuYUwxTFxuYUwtMUxcbmFMMjU1TFxuYUwtJwotICAgIGInMjU1TFxuYUwtMjU2TFxuYUw2NTUzNUxcbmEnCi0gICAgYidMLTY1NTM1TFxuYUwtNjU1MzZMXG5hTDInCi0gICAgYicxNDc0ODM2NDdMXG5hTC0yMTQ3NDgzJwotICAgIGInNjQ3TFxuYUwtMjE0NzQ4MzY0OExcbmEoJwotICAgIGInVmFiY1xucDRcbmc0XG5jY29weXJlZycKLSAgICBiJ1xuX3JlY29uc3RydWN0b3JcbnA1XG4oJwotICAgIGInY19fbWFpbl9fXG5DXG5wNlxuY2J1JwotICAgIGInaWx0aW5zXG5vYmplY3RcbnA3XG5OdCcKLSAgICBiJ3A4XG5ScDlcbihkcDEwXG5WZm9vXG5wMScKLSAgICBiJzFcbkwxTFxuc1ZiYXJcbnAxMlxuTDJMXG5zYicKLSAgICBiJ2c5XG50cDEzXG5hZzEzXG5hTDVMXG5hLicKKyAgICBiJyhscDBcbkwwTFxuYUwxTFxuYUYyLjBcbicKKyAgICBiJ2FjX19idWlsdGluX19cbmNvbXBsZScKKyAgICBiJ3hcbnAxXG4oRjMuMFxuRjAuMFxudHAyXG4nCisgICAgYidScDNcbmFMMUxcbmFMLTFMXG5hTDI1NScKKyAgICBiJ0xcbmFMLTI1NUxcbmFMLTI1NkxcbmFMJworICAgIGInNjU1MzVMXG5hTC02NTUzNUxcbmFMLScKKyAgICBiJzY1NTM2TFxuYUwyMTQ3NDgzNjQ3TCcKKyAgICBiJ1xuYUwtMjE0NzQ4MzY0N0xcbmFMLTInCisgICAgYicxNDc0ODM2NDhMXG5hKFZhYmNcbnA0JworICAgIGInXG5nNFxuY2NvcHlfcmVnXG5fcmVjb24nCisgICAgYidzdHJ1Y3RvclxucDVcbihjX19tYWluJworICAgIGInX19cbkNcbnA2XG5jX19idWlsdGluX18nCisgICAgYidcbm9iamVjdFxucDdcbk50cDhcblJwOVxuJworICAgIGInKGRwMTBcblZmb29cbnAxMVxuTDFMXG5zJworICAgIGInVmJhclxucDEyXG5MMkxcbnNiZzlcbnRwJworICAgIGInMTNcbmFnMTNcbmFMNUxcbmEuJwogKQogCiAjIERpc2Fzc2VtYmx5IG9mIERBVEEwCkBAIC0xNzIsODggKzE3Myw4OCBAQAogICAgMTQ6IGEgICAgQVBQRU5ECiAgICAxNTogRiAgICBGTE9BVCAgICAgIDIuMAogICAgMjA6IGEgICAgQVBQRU5ECi0gICAyMTogYyAgICBHTE9CQUwgICAgICdidWlsdGlucyBjb21wbGV4JwotICAgMzk6IHAgICAgUFVUICAgICAgICAxCi0gICA0MjogKCAgICBNQVJLCi0gICA0MzogRiAgICAgICAgRkxPQVQgICAgICAzLjAKLSAgIDQ4OiBGICAgICAgICBGTE9BVCAgICAgIDAuMAotICAgNTM6IHQgICAgICAgIFRVUExFICAgICAgKE1BUksgYXQgNDIpCi0gICA1NDogcCAgICBQVVQgICAgICAgIDIKLSAgIDU3OiBSICAgIFJFRFVDRQotICAgNTg6IHAgICAgUFVUICAgICAgICAzCi0gICA2MTogYSAgICBBUFBFTkQKLSAgIDYyOiBMICAgIExPTkcgICAgICAgMQotICAgNjY6IGEgICAgQVBQRU5ECi0gICA2NzogTCAgICBMT05HICAgICAgIC0xCi0gICA3MjogYSAgICBBUFBFTkQKLSAgIDczOiBMICAgIExPTkcgICAgICAgMjU1Ci0gICA3OTogYSAgICBBUFBFTkQKLSAgIDgwOiBMICAgIExPTkcgICAgICAgLTI1NQotICAgODc6IGEgICAgQVBQRU5ECi0gICA4ODogTCAgICBMT05HICAgICAgIC0yNTYKLSAgIDk1OiBhICAgIEFQUEVORAotICAgOTY6IEwgICAgTE9ORyAgICAgICA2NTUzNQotICAxMDQ6IGEgICAgQVBQRU5ECi0gIDEwNTogTCAgICBMT05HICAgICAgIC02NTUzNQotICAxMTQ6IGEgICAgQVBQRU5ECi0gIDExNTogTCAgICBMT05HICAgICAgIC02NTUzNgotICAxMjQ6IGEgICAgQVBQRU5ECi0gIDEyNTogTCAgICBMT05HICAgICAgIDIxNDc0ODM2NDcKLSAgMTM4OiBhICAgIEFQUEVORAotICAxMzk6IEwgICAgTE9ORyAgICAgICAtMjE0NzQ4MzY0NwotICAxNTM6IGEgICAgQVBQRU5ECi0gIDE1NDogTCAgICBMT05HICAgICAgIC0yMTQ3NDgzNjQ4Ci0gIDE2ODogYSAgICBBUFBFTkQKLSAgMTY5OiAoICAgIE1BUksKLSAgMTcwOiBWICAgICAgICBVTklDT0RFICAgICdhYmMnCi0gIDE3NTogcCAgICAgICAgUFVUICAgICAgICA0Ci0gIDE3ODogZyAgICAgICAgR0VUICAgICAgICA0Ci0gIDE4MTogYyAgICAgICAgR0xPQkFMICAgICAnY29weXJlZyBfcmVjb25zdHJ1Y3RvcicKLSAgMjA1OiBwICAgICAgICBQVVQgICAgICAgIDUKLSAgMjA4OiAoICAgICAgICBNQVJLCi0gIDIwOTogYyAgICAgICAgICAgIEdMT0JBTCAgICAgJ19fbWFpbl9fIEMnCi0gIDIyMTogcCAgICAgICAgICAgIFBVVCAgICAgICAgNgotICAyMjQ6IGMgICAgICAgICAgICBHTE9CQUwgICAgICdidWlsdGlucyBvYmplY3QnCi0gIDI0MTogcCAgICAgICAgICAgIFBVVCAgICAgICAgNwotICAyNDQ6IE4gICAgICAgICAgICBOT05FCi0gIDI0NTogdCAgICAgICAgICAgIFRVUExFICAgICAgKE1BUksgYXQgMjA4KQotICAyNDY6IHAgICAgICAgIFBVVCAgICAgICAgOAotICAyNDk6IFIgICAgICAgIFJFRFVDRQotICAyNTA6IHAgICAgICAgIFBVVCAgICAgICAgOQotICAyNTM6ICggICAgICAgIE1BUksKLSAgMjU0OiBkICAgICAgICAgICAgRElDVCAgICAgICAoTUFSSyBhdCAyNTMpCi0gIDI1NTogcCAgICAgICAgUFVUICAgICAgICAxMAotICAyNTk6IFYgICAgICAgIFVOSUNPREUgICAgJ2ZvbycKLSAgMjY0OiBwICAgICAgICBQVVQgICAgICAgIDExCi0gIDI2ODogTCAgICAgICAgTE9ORyAgICAgICAxCi0gIDI3MjogcyAgICAgICAgU0VUSVRFTQotICAyNzM6IFYgICAgICAgIFVOSUNPREUgICAgJ2JhcicKLSAgMjc4OiBwICAgICAgICBQVVQgICAgICAgIDEyCi0gIDI4MjogTCAgICAgICAgTE9ORyAgICAgICAyCi0gIDI4NjogcyAgICAgICAgU0VUSVRFTQotICAyODc6IGIgICAgICAgIEJVSUxECi0gIDI4ODogZyAgICAgICAgR0VUICAgICAgICA5Ci0gIDI5MTogdCAgICAgICAgVFVQTEUgICAgICAoTUFSSyBhdCAxNjkpCi0gIDI5MjogcCAgICBQVVQgICAgICAgIDEzCi0gIDI5NjogYSAgICBBUFBFTkQKLSAgMjk3OiBnICAgIEdFVCAgICAgICAgMTMKLSAgMzAxOiBhICAgIEFQUEVORAotICAzMDI6IEwgICAgTE9ORyAgICAgICA1Ci0gIDMwNjogYSAgICBBUFBFTkQKLSAgMzA3OiAuICAgIFNUT1AKKyAgIDIxOiBjICAgIEdMT0JBTCAgICAgJ19fYnVpbHRpbl9fIGNvbXBsZXgnCisgICA0MjogcCAgICBQVVQgICAgICAgIDEKKyAgIDQ1OiAoICAgIE1BUksKKyAgIDQ2OiBGICAgICAgICBGTE9BVCAgICAgIDMuMAorICAgNTE6IEYgICAgICAgIEZMT0FUICAgICAgMC4wCisgICA1NjogdCAgICAgICAgVFVQTEUgICAgICAoTUFSSyBhdCA0NSkKKyAgIDU3OiBwICAgIFBVVCAgICAgICAgMgorICAgNjA6IFIgICAgUkVEVUNFCisgICA2MTogcCAgICBQVVQgICAgICAgIDMKKyAgIDY0OiBhICAgIEFQUEVORAorICAgNjU6IEwgICAgTE9ORyAgICAgICAxCisgICA2OTogYSAgICBBUFBFTkQKKyAgIDcwOiBMICAgIExPTkcgICAgICAgLTEKKyAgIDc1OiBhICAgIEFQUEVORAorICAgNzY6IEwgICAgTE9ORyAgICAgICAyNTUKKyAgIDgyOiBhICAgIEFQUEVORAorICAgODM6IEwgICAgTE9ORyAgICAgICAtMjU1CisgICA5MDogYSAgICBBUFBFTkQKKyAgIDkxOiBMICAgIExPTkcgICAgICAgLTI1NgorICAgOTg6IGEgICAgQVBQRU5ECisgICA5OTogTCAgICBMT05HICAgICAgIDY1NTM1CisgIDEwNzogYSAgICBBUFBFTkQKKyAgMTA4OiBMICAgIExPTkcgICAgICAgLTY1NTM1CisgIDExNzogYSAgICBBUFBFTkQKKyAgMTE4OiBMICAgIExPTkcgICAgICAgLTY1NTM2CisgIDEyNzogYSAgICBBUFBFTkQKKyAgMTI4OiBMICAgIExPTkcgICAgICAgMjE0NzQ4MzY0NworICAxNDE6IGEgICAgQVBQRU5ECisgIDE0MjogTCAgICBMT05HICAgICAgIC0yMTQ3NDgzNjQ3CisgIDE1NjogYSAgICBBUFBFTkQKKyAgMTU3OiBMICAgIExPTkcgICAgICAgLTIxNDc0ODM2NDgKKyAgMTcxOiBhICAgIEFQUEVORAorICAxNzI6ICggICAgTUFSSworICAxNzM6IFYgICAgICAgIFVOSUNPREUgICAgJ2FiYycKKyAgMTc4OiBwICAgICAgICBQVVQgICAgICAgIDQKKyAgMTgxOiBnICAgICAgICBHRVQgICAgICAgIDQKKyAgMTg0OiBjICAgICAgICBHTE9CQUwgICAgICdjb3B5X3JlZyBfcmVjb25zdHJ1Y3RvcicKKyAgMjA5OiBwICAgICAgICBQVVQgICAgICAgIDUKKyAgMjEyOiAoICAgICAgICBNQVJLCisgIDIxMzogYyAgICAgICAgICAgIEdMT0JBTCAgICAgJ19fbWFpbl9fIEMnCisgIDIyNTogcCAgICAgICAgICAgIFBVVCAgICAgICAgNgorICAyMjg6IGMgICAgICAgICAgICBHTE9CQUwgICAgICdfX2J1aWx0aW5fXyBvYmplY3QnCisgIDI0ODogcCAgICAgICAgICAgIFBVVCAgICAgICAgNworICAyNTE6IE4gICAgICAgICAgICBOT05FCisgIDI1MjogdCAgICAgICAgICAgIFRVUExFICAgICAgKE1BUksgYXQgMjEyKQorICAyNTM6IHAgICAgICAgIFBVVCAgICAgICAgOAorICAyNTY6IFIgICAgICAgIFJFRFVDRQorICAyNTc6IHAgICAgICAgIFBVVCAgICAgICAgOQorICAyNjA6ICggICAgICAgIE1BUksKKyAgMjYxOiBkICAgICAgICAgICAgRElDVCAgICAgICAoTUFSSyBhdCAyNjApCisgIDI2MjogcCAgICAgICAgUFVUICAgICAgICAxMAorICAyNjY6IFYgICAgICAgIFVOSUNPREUgICAgJ2ZvbycKKyAgMjcxOiBwICAgICAgICBQVVQgICAgICAgIDExCisgIDI3NTogTCAgICAgICAgTE9ORyAgICAgICAxCisgIDI3OTogcyAgICAgICAgU0VUSVRFTQorICAyODA6IFYgICAgICAgIFVOSUNPREUgICAgJ2JhcicKKyAgMjg1OiBwICAgICAgICBQVVQgICAgICAgIDEyCisgIDI4OTogTCAgICAgICAgTE9ORyAgICAgICAyCisgIDI5MzogcyAgICAgICAgU0VUSVRFTQorICAyOTQ6IGIgICAgICAgIEJVSUxECisgIDI5NTogZyAgICAgICAgR0VUICAgICAgICA5CisgIDI5ODogdCAgICAgICAgVFVQTEUgICAgICAoTUFSSyBhdCAxNzIpCisgIDI5OTogcCAgICBQVVQgICAgICAgIDEzCisgIDMwMzogYSAgICBBUFBFTkQKKyAgMzA0OiBnICAgIEdFVCAgICAgICAgMTMKKyAgMzA4OiBhICAgIEFQUEVORAorICAzMDk6IEwgICAgTE9ORyAgICAgICA1CisgIDMxMzogYSAgICBBUFBFTkQKKyAgMzE0OiAuICAgIFNUT1AKIGhpZ2hlc3QgcHJvdG9jb2wgYW1vbmcgb3Bjb2RlcyA9IDAKICIiIgogCiBEQVRBMSA9ICgKLSAgICBiJ11xXHgwMChLXHgwMEtceDAxR0BceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwYycKLSAgICBiJ2J1aWx0aW5zXG5jb21wbGV4XG5xXHgwMScKKyAgICBiJ11xXHgwMChLXHgwMEtceDAxR0BceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwY19fJworICAgIGInYnVpbHRpbl9fXG5jb21wbGV4XG5xXHgwMScKICAgICBiJyhHQFx4MDhceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBHXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDB0JwogICAgIGIncVx4MDJScVx4MDNLXHgwMUpceGZmXHhmZlx4ZmZceGZmS1x4ZmZKXHgwMVx4ZmZceGZmXHhmZkonCiAgICAgYidceDAwXHhmZlx4ZmZceGZmTVx4ZmZceGZmSlx4MDFceDAwXHhmZlx4ZmZKXHgwMFx4MDBceGZmXHhmZkpceGZmXHhmZicKICAgICBiJ1x4ZmZceDdmSlx4MDFceDAwXHgwMFx4ODBKXHgwMFx4MDBceDAwXHg4MChYXHgwM1x4MDBceDAwXHgwMGFiJwotICAgIGInY3FceDA0aFx4MDRjY29weXJlZ1xuX3JlY28nCisgICAgYidjcVx4MDRoXHgwNGNjb3B5X3JlZ1xuX3JlY28nCiAgICAgYiduc3RydWN0b3JcbnFceDA1KGNfX21haW4nCi0gICAgYidfX1xuQ1xucVx4MDZjYnVpbHRpbnNcbicKKyAgICBiJ19fXG5DXG5xXHgwNmNfX2J1aWx0aW5fX1xuJwogICAgIGInb2JqZWN0XG5xXHgwN050cVx4MDhScVx0fXFcbignCiAgICAgYidYXHgwM1x4MDBceDAwXHgwMGZvb3FceDBiS1x4MDFYXHgwM1x4MDBceDAwXHgwMGJhcicKICAgICBiJ3FceDBjS1x4MDJ1YmhcdHRxXHJoXHJLXHgwNWUuJwpAQCAtMjY3LDY2ICsyNjgsNjYgQEAKICAgICA0OiBLICAgICAgICBCSU5JTlQxICAgIDAKICAgICA2OiBLICAgICAgICBCSU5JTlQxICAgIDEKICAgICA4OiBHICAgICAgICBCSU5GTE9BVCAgIDIuMAotICAgMTc6IGMgICAgICAgIEdMT0JBTCAgICAgJ2J1aWx0aW5zIGNvbXBsZXgnCi0gICAzNTogcSAgICAgICAgQklOUFVUICAgICAxCi0gICAzNzogKCAgICAgICAgTUFSSwotICAgMzg6IEcgICAgICAgICAgICBCSU5GTE9BVCAgIDMuMAotICAgNDc6IEcgICAgICAgICAgICBCSU5GTE9BVCAgIDAuMAotICAgNTY6IHQgICAgICAgICAgICBUVVBMRSAgICAgIChNQVJLIGF0IDM3KQotICAgNTc6IHEgICAgICAgIEJJTlBVVCAgICAgMgotICAgNTk6IFIgICAgICAgIFJFRFVDRQotICAgNjA6IHEgICAgICAgIEJJTlBVVCAgICAgMwotICAgNjI6IEsgICAgICAgIEJJTklOVDEgICAgMQotICAgNjQ6IEogICAgICAgIEJJTklOVCAgICAgLTEKLSAgIDY5OiBLICAgICAgICBCSU5JTlQxICAgIDI1NQotICAgNzE6IEogICAgICAgIEJJTklOVCAgICAgLTI1NQotICAgNzY6IEogICAgICAgIEJJTklOVCAgICAgLTI1NgotICAgODE6IE0gICAgICAgIEJJTklOVDIgICAgNjU1MzUKLSAgIDg0OiBKICAgICAgICBCSU5JTlQgICAgIC02NTUzNQotICAgODk6IEogICAgICAgIEJJTklOVCAgICAgLTY1NTM2Ci0gICA5NDogSiAgICAgICAgQklOSU5UICAgICAyMTQ3NDgzNjQ3Ci0gICA5OTogSiAgICAgICAgQklOSU5UICAgICAtMjE0NzQ4MzY0NwotICAxMDQ6IEogICAgICAgIEJJTklOVCAgICAgLTIxNDc0ODM2NDgKLSAgMTA5OiAoICAgICAgICBNQVJLCi0gIDExMDogWCAgICAgICAgICAgIEJJTlVOSUNPREUgJ2FiYycKLSAgMTE4OiBxICAgICAgICAgICAgQklOUFVUICAgICA0Ci0gIDEyMDogaCAgICAgICAgICAgIEJJTkdFVCAgICAgNAotICAxMjI6IGMgICAgICAgICAgICBHTE9CQUwgICAgICdjb3B5cmVnIF9yZWNvbnN0cnVjdG9yJwotICAxNDY6IHEgICAgICAgICAgICBCSU5QVVQgICAgIDUKLSAgMTQ4OiAoICAgICAgICAgICAgTUFSSwotICAxNDk6IGMgICAgICAgICAgICAgICAgR0xPQkFMICAgICAnX19tYWluX18gQycKLSAgMTYxOiBxICAgICAgICAgICAgICAgIEJJTlBVVCAgICAgNgotICAxNjM6IGMgICAgICAgICAgICAgICAgR0xPQkFMICAgICAnYnVpbHRpbnMgb2JqZWN0JwotICAxODA6IHEgICAgICAgICAgICAgICAgQklOUFVUICAgICA3Ci0gIDE4MjogTiAgICAgICAgICAgICAgICBOT05FCi0gIDE4MzogdCAgICAgICAgICAgICAgICBUVVBMRSAgICAgIChNQVJLIGF0IDE0OCkKLSAgMTg0OiBxICAgICAgICAgICAgQklOUFVUICAgICA4Ci0gIDE4NjogUiAgICAgICAgICAgIFJFRFVDRQotICAxODc6IHEgICAgICAgICAgICBCSU5QVVQgICAgIDkKLSAgMTg5OiB9ICAgICAgICAgICAgRU1QVFlfRElDVAotICAxOTA6IHEgICAgICAgICAgICBCSU5QVVQgICAgIDEwCi0gIDE5MjogKCAgICAgICAgICAgIE1BUksKLSAgMTkzOiBYICAgICAgICAgICAgICAgIEJJTlVOSUNPREUgJ2ZvbycKLSAgMjAxOiBxICAgICAgICAgICAgICAgIEJJTlBVVCAgICAgMTEKLSAgMjAzOiBLICAgICAgICAgICAgICAgIEJJTklOVDEgICAgMQotICAyMDU6IFggICAgICAgICAgICAgICAgQklOVU5JQ09ERSAnYmFyJwotICAyMTM6IHEgICAgICAgICAgICAgICAgQklOUFVUICAgICAxMgotICAyMTU6IEsgICAgICAgICAgICAgICAgQklOSU5UMSAgICAyCi0gIDIxNzogdSAgICAgICAgICAgICAgICBTRVRJVEVNUyAgIChNQVJLIGF0IDE5MikKLSAgMjE4OiBiICAgICAgICAgICAgQlVJTEQKLSAgMjE5OiBoICAgICAgICAgICAgQklOR0VUICAgICA5Ci0gIDIyMTogdCAgICAgICAgICAgIFRVUExFICAgICAgKE1BUksgYXQgMTA5KQotICAyMjI6IHEgICAgICAgIEJJTlBVVCAgICAgMTMKLSAgMjI0OiBoICAgICAgICBCSU5HRVQgICAgIDEzCi0gIDIyNjogSyAgICAgICAgQklOSU5UMSAgICA1Ci0gIDIyODogZSAgICAgICAgQVBQRU5EUyAgICAoTUFSSyBhdCAzKQotICAyMjk6IC4gICAgU1RPUAorICAgMTc6IGMgICAgICAgIEdMT0JBTCAgICAgJ19fYnVpbHRpbl9fIGNvbXBsZXgnCisgICAzODogcSAgICAgICAgQklOUFVUICAgICAxCisgICA0MDogKCAgICAgICAgTUFSSworICAgNDE6IEcgICAgICAgICAgICBCSU5GTE9BVCAgIDMuMAorICAgNTA6IEcgICAgICAgICAgICBCSU5GTE9BVCAgIDAuMAorICAgNTk6IHQgICAgICAgICAgICBUVVBMRSAgICAgIChNQVJLIGF0IDQwKQorICAgNjA6IHEgICAgICAgIEJJTlBVVCAgICAgMgorICAgNjI6IFIgICAgICAgIFJFRFVDRQorICAgNjM6IHEgICAgICAgIEJJTlBVVCAgICAgMworICAgNjU6IEsgICAgICAgIEJJTklOVDEgICAgMQorICAgNjc6IEogICAgICAgIEJJTklOVCAgICAgLTEKKyAgIDcyOiBLICAgICAgICBCSU5JTlQxICAgIDI1NQorICAgNzQ6IEogICAgICAgIEJJTklOVCAgICAgLTI1NQorICAgNzk6IEogICAgICAgIEJJTklOVCAgICAgLTI1NgorICAgODQ6IE0gICAgICAgIEJJTklOVDIgICAgNjU1MzUKKyAgIDg3OiBKICAgICAgICBCSU5JTlQgICAgIC02NTUzNQorICAgOTI6IEogICAgICAgIEJJTklOVCAgICAgLTY1NTM2CisgICA5NzogSiAgICAgICAgQklOSU5UICAgICAyMTQ3NDgzNjQ3CisgIDEwMjogSiAgICAgICAgQklOSU5UICAgICAtMjE0NzQ4MzY0NworICAxMDc6IEogICAgICAgIEJJTklOVCAgICAgLTIxNDc0ODM2NDgKKyAgMTEyOiAoICAgICAgICBNQVJLCisgIDExMzogWCAgICAgICAgICAgIEJJTlVOSUNPREUgJ2FiYycKKyAgMTIxOiBxICAgICAgICAgICAgQklOUFVUICAgICA0CisgIDEyMzogaCAgICAgICAgICAgIEJJTkdFVCAgICAgNAorICAxMjU6IGMgICAgICAgICAgICBHTE9CQUwgICAgICdjb3B5X3JlZyBfcmVjb25zdHJ1Y3RvcicKKyAgMTUwOiBxICAgICAgICAgICAgQklOUFVUICAgICA1CisgIDE1MjogKCAgICAgICAgICAgIE1BUksKKyAgMTUzOiBjICAgICAgICAgICAgICAgIEdMT0JBTCAgICAgJ19fbWFpbl9fIEMnCisgIDE2NTogcSAgICAgICAgICAgICAgICBCSU5QVVQgICAgIDYKKyAgMTY3OiBjICAgICAgICAgICAgICAgIEdMT0JBTCAgICAgJ19fYnVpbHRpbl9fIG9iamVjdCcKKyAgMTg3OiBxICAgICAgICAgICAgICAgIEJJTlBVVCAgICAgNworICAxODk6IE4gICAgICAgICAgICAgICAgTk9ORQorICAxOTA6IHQgICAgICAgICAgICAgICAgVFVQTEUgICAgICAoTUFSSyBhdCAxNTIpCisgIDE5MTogcSAgICAgICAgICAgIEJJTlBVVCAgICAgOAorICAxOTM6IFIgICAgICAgICAgICBSRURVQ0UKKyAgMTk0OiBxICAgICAgICAgICAgQklOUFVUICAgICA5CisgIDE5NjogfSAgICAgICAgICAgIEVNUFRZX0RJQ1QKKyAgMTk3OiBxICAgICAgICAgICAgQklOUFVUICAgICAxMAorICAxOTk6ICggICAgICAgICAgICBNQVJLCisgIDIwMDogWCAgICAgICAgICAgICAgICBCSU5VTklDT0RFICdmb28nCisgIDIwODogcSAgICAgICAgICAgICAgICBCSU5QVVQgICAgIDExCisgIDIxMDogSyAgICAgICAgICAgICAgICBCSU5JTlQxICAgIDEKKyAgMjEyOiBYICAgICAgICAgICAgICAgIEJJTlVOSUNPREUgJ2JhcicKKyAgMjIwOiBxICAgICAgICAgICAgICAgIEJJTlBVVCAgICAgMTIKKyAgMjIyOiBLICAgICAgICAgICAgICAgIEJJTklOVDEgICAgMgorICAyMjQ6IHUgICAgICAgICAgICAgICAgU0VUSVRFTVMgICAoTUFSSyBhdCAxOTkpCisgIDIyNTogYiAgICAgICAgICAgIEJVSUxECisgIDIyNjogaCAgICAgICAgICAgIEJJTkdFVCAgICAgOQorICAyMjg6IHQgICAgICAgICAgICBUVVBMRSAgICAgIChNQVJLIGF0IDExMikKKyAgMjI5OiBxICAgICAgICBCSU5QVVQgICAgIDEzCisgIDIzMTogaCAgICAgICAgQklOR0VUICAgICAxMworICAyMzM6IEsgICAgICAgIEJJTklOVDEgICAgNQorICAyMzU6IGUgICAgICAgIEFQUEVORFMgICAgKE1BUksgYXQgMykKKyAgMjM2OiAuICAgIFNUT1AKIGhpZ2hlc3QgcHJvdG9jb2wgYW1vbmcgb3Bjb2RlcyA9IDEKICIiIgogCiBEQVRBMiA9ICgKICAgICBiJ1x4ODBceDAyXXFceDAwKEtceDAwS1x4MDFHQFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBjJwotICAgIGInYnVpbHRpbnNcbmNvbXBsZXhcbicKKyAgICBiJ19fYnVpbHRpbl9fXG5jb21wbGV4XG4nCiAgICAgYidxXHgwMUdAXHgwOFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMEdceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCcKICAgICBiJ1x4ODZxXHgwMlJxXHgwM0tceDAxSlx4ZmZceGZmXHhmZlx4ZmZLXHhmZkpceDAxXHhmZlx4ZmZceGZmJwogICAgIGInSlx4MDBceGZmXHhmZlx4ZmZNXHhmZlx4ZmZKXHgwMVx4MDBceGZmXHhmZkpceDAwXHgwMFx4ZmZceGZmSlx4ZmYnCkBAIC0zNDYsNTIgKzM0Nyw1MiBAQAogICAgIDY6IEsgICAgICAgIEJJTklOVDEgICAgMAogICAgIDg6IEsgICAgICAgIEJJTklOVDEgICAgMQogICAgMTA6IEcgICAgICAgIEJJTkZMT0FUICAgMi4wCi0gICAxOTogYyAgICAgICAgR0xPQkFMICAgICAnYnVpbHRpbnMgY29tcGxleCcKLSAgIDM3OiBxICAgICAgICBCSU5QVVQgICAgIDEKLSAgIDM5OiBHICAgICAgICBCSU5GTE9BVCAgIDMuMAotICAgNDg6IEcgICAgICAgIEJJTkZMT0FUICAgMC4wCi0gICA1NzogXHg4NiAgICAgVFVQTEUyCi0gICA1ODogcSAgICAgICAgQklOUFVUICAgICAyCi0gICA2MDogUiAgICAgICAgUkVEVUNFCi0gICA2MTogcSAgICAgICAgQklOUFVUICAgICAzCi0gICA2MzogSyAgICAgICAgQklOSU5UMSAgICAxCi0gICA2NTogSiAgICAgICAgQklOSU5UICAgICAtMQotICAgNzA6IEsgICAgICAgIEJJTklOVDEgICAgMjU1Ci0gICA3MjogSiAgICAgICAgQklOSU5UICAgICAtMjU1Ci0gICA3NzogSiAgICAgICAgQklOSU5UICAgICAtMjU2Ci0gICA4MjogTSAgICAgICAgQklOSU5UMiAgICA2NTUzNQotICAgODU6IEogICAgICAgIEJJTklOVCAgICAgLTY1NTM1Ci0gICA5MDogSiAgICAgICAgQklOSU5UICAgICAtNjU1MzYKLSAgIDk1OiBKICAgICAgICBCSU5JTlQgICAgIDIxNDc0ODM2NDcKLSAgMTAwOiBKICAgICAgICBCSU5JTlQgICAgIC0yMTQ3NDgzNjQ3Ci0gIDEwNTogSiAgICAgICAgQklOSU5UICAgICAtMjE0NzQ4MzY0OAotICAxMTA6ICggICAgICAgIE1BUksKLSAgMTExOiBYICAgICAgICAgICAgQklOVU5JQ09ERSAnYWJjJwotICAxMTk6IHEgICAgICAgICAgICBCSU5QVVQgICAgIDQKLSAgMTIxOiBoICAgICAgICAgICAgQklOR0VUICAgICA0Ci0gIDEyMzogYyAgICAgICAgICAgIEdMT0JBTCAgICAgJ19fbWFpbl9fIEMnCi0gIDEzNTogcSAgICAgICAgICAgIEJJTlBVVCAgICAgNQotICAxMzc6ICkgICAgICAgICAgICBFTVBUWV9UVVBMRQotICAxMzg6IFx4ODEgICAgICAgICBORVdPQkoKLSAgMTM5OiBxICAgICAgICAgICAgQklOUFVUICAgICA2Ci0gIDE0MTogfSAgICAgICAgICAgIEVNUFRZX0RJQ1QKLSAgMTQyOiBxICAgICAgICAgICAgQklOUFVUICAgICA3Ci0gIDE0NDogKCAgICAgICAgICAgIE1BUksKLSAgMTQ1OiBYICAgICAgICAgICAgICAgIEJJTlVOSUNPREUgJ2ZvbycKLSAgMTUzOiBxICAgICAgICAgICAgICAgIEJJTlBVVCAgICAgOAotICAxNTU6IEsgICAgICAgICAgICAgICAgQklOSU5UMSAgICAxCi0gIDE1NzogWCAgICAgICAgICAgICAgICBCSU5VTklDT0RFICdiYXInCi0gIDE2NTogcSAgICAgICAgICAgICAgICBCSU5QVVQgICAgIDkKLSAgMTY3OiBLICAgICAgICAgICAgICAgIEJJTklOVDEgICAgMgotICAxNjk6IHUgICAgICAgICAgICAgICAgU0VUSVRFTVMgICAoTUFSSyBhdCAxNDQpCi0gIDE3MDogYiAgICAgICAgICAgIEJVSUxECi0gIDE3MTogaCAgICAgICAgICAgIEJJTkdFVCAgICAgNgotICAxNzM6IHQgICAgICAgICAgICBUVVBMRSAgICAgIChNQVJLIGF0IDExMCkKLSAgMTc0OiBxICAgICAgICBCSU5QVVQgICAgIDEwCi0gIDE3NjogaCAgICAgICAgQklOR0VUICAgICAxMAotICAxNzg6IEsgICAgICAgIEJJTklOVDEgICAgNQotICAxODA6IGUgICAgICAgIEFQUEVORFMgICAgKE1BUksgYXQgNSkKLSAgMTgxOiAuICAgIFNUT1AKKyAgIDE5OiBjICAgICAgICBHTE9CQUwgICAgICdfX2J1aWx0aW5fXyBjb21wbGV4JworICAgNDA6IHEgICAgICAgIEJJTlBVVCAgICAgMQorICAgNDI6IEcgICAgICAgIEJJTkZMT0FUICAgMy4wCisgICA1MTogRyAgICAgICAgQklORkxPQVQgICAwLjAKKyAgIDYwOiBceDg2ICAgICBUVVBMRTIKKyAgIDYxOiBxICAgICAgICBCSU5QVVQgICAgIDIKKyAgIDYzOiBSICAgICAgICBSRURVQ0UKKyAgIDY0OiBxICAgICAgICBCSU5QVVQgICAgIDMKKyAgIDY2OiBLICAgICAgICBCSU5JTlQxICAgIDEKKyAgIDY4OiBKICAgICAgICBCSU5JTlQgICAgIC0xCisgICA3MzogSyAgICAgICAgQklOSU5UMSAgICAyNTUKKyAgIDc1OiBKICAgICAgICBCSU5JTlQgICAgIC0yNTUKKyAgIDgwOiBKICAgICAgICBCSU5JTlQgICAgIC0yNTYKKyAgIDg1OiBNICAgICAgICBCSU5JTlQyICAgIDY1NTM1CisgICA4ODogSiAgICAgICAgQklOSU5UICAgICAtNjU1MzUKKyAgIDkzOiBKICAgICAgICBCSU5JTlQgICAgIC02NTUzNgorICAgOTg6IEogICAgICAgIEJJTklOVCAgICAgMjE0NzQ4MzY0NworICAxMDM6IEogICAgICAgIEJJTklOVCAgICAgLTIxNDc0ODM2NDcKKyAgMTA4OiBKICAgICAgICBCSU5JTlQgICAgIC0yMTQ3NDgzNjQ4CisgIDExMzogKCAgICAgICAgTUFSSworICAxMTQ6IFggICAgICAgICAgICBCSU5VTklDT0RFICdhYmMnCisgIDEyMjogcSAgICAgICAgICAgIEJJTlBVVCAgICAgNAorICAxMjQ6IGggICAgICAgICAgICBCSU5HRVQgICAgIDQKKyAgMTI2OiBjICAgICAgICAgICAgR0xPQkFMICAgICAnX19tYWluX18gQycKKyAgMTM4OiBxICAgICAgICAgICAgQklOUFVUICAgICA1CisgIDE0MDogKSAgICAgICAgICAgIEVNUFRZX1RVUExFCisgIDE0MTogXHg4MSAgICAgICAgIE5FV09CSgorICAxNDI6IHEgICAgICAgICAgICBCSU5QVVQgICAgIDYKKyAgMTQ0OiB9ICAgICAgICAgICAgRU1QVFlfRElDVAorICAxNDU6IHEgICAgICAgICAgICBCSU5QVVQgICAgIDcKKyAgMTQ3OiAoICAgICAgICAgICAgTUFSSworICAxNDg6IFggICAgICAgICAgICAgICAgQklOVU5JQ09ERSAnZm9vJworICAxNTY6IHEgICAgICAgICAgICAgICAgQklOUFVUICAgICA4CisgIDE1ODogSyAgICAgICAgICAgICAgICBCSU5JTlQxICAgIDEKKyAgMTYwOiBYICAgICAgICAgICAgICAgIEJJTlVOSUNPREUgJ2JhcicKKyAgMTY4OiBxICAgICAgICAgICAgICAgIEJJTlBVVCAgICAgOQorICAxNzA6IEsgICAgICAgICAgICAgICAgQklOSU5UMSAgICAyCisgIDE3MjogdSAgICAgICAgICAgICAgICBTRVRJVEVNUyAgIChNQVJLIGF0IDE0NykKKyAgMTczOiBiICAgICAgICAgICAgQlVJTEQKKyAgMTc0OiBoICAgICAgICAgICAgQklOR0VUICAgICA2CisgIDE3NjogdCAgICAgICAgICAgIFRVUExFICAgICAgKE1BUksgYXQgMTEzKQorICAxNzc6IHEgICAgICAgIEJJTlBVVCAgICAgMTAKKyAgMTc5OiBoICAgICAgICBCSU5HRVQgICAgIDEwCisgIDE4MTogSyAgICAgICAgQklOSU5UMSAgICA1CisgIDE4MzogZSAgICAgICAgQVBQRU5EUyAgICAoTUFSSyBhdCA1KQorICAxODQ6IC4gICAgU1RPUAogaGlnaGVzdCBwcm90b2NvbCBhbW9uZyBvcGNvZGVzID0gMgogIiIiCiAKQEAgLTU3MCwxNCArNTcxLDE0IEBACiAgICAgICAgICAgICB4bmFtZSA9IFguX19uYW1lX18uZW5jb2RlKCdhc2NpaScpCiAgICAgICAgICAgICAjIFByb3RvY29sIDAgKHRleHQgbW9kZSBwaWNrbGUpOgogICAgICAgICAgICAgIiIiCi0gICAgICAgICAgICAwOiAoICAgIE1BUksKLSAgICAgICAgICAgIDE6IGkgICAgICAgIElOU1QgICAgICAgJ19fbWFpbl9fIFgnIChNQVJLIGF0IDApCi0gICAgICAgICAgICAxNTogcCAgICBQVVQgICAgICAgIDAKLSAgICAgICAgICAgIDE4OiAoICAgIE1BUksKLSAgICAgICAgICAgIDE5OiBkICAgICAgICBESUNUICAgICAgIChNQVJLIGF0IDE4KQotICAgICAgICAgICAgMjA6IHAgICAgUFVUICAgICAgICAxCi0gICAgICAgICAgICAyMzogYiAgICBCVUlMRAotICAgICAgICAgICAgMjQ6IC4gICAgU1RPUAorICAgICAgICAgICAgIDA6ICggICAgTUFSSworICAgICAgICAgICAgIDE6IGkgICAgICAgIElOU1QgICAgICAgJ19fbWFpbl9fIFgnIChNQVJLIGF0IDApCisgICAgICAgICAgICAxMzogcCAgICBQVVQgICAgICAgIDAKKyAgICAgICAgICAgIDE2OiAoICAgIE1BUksKKyAgICAgICAgICAgIDE3OiBkICAgICAgICBESUNUICAgICAgIChNQVJLIGF0IDE2KQorICAgICAgICAgICAgMTg6IHAgICAgUFVUICAgICAgICAxCisgICAgICAgICAgICAyMTogYiAgICBCVUlMRAorICAgICAgICAgICAgMjI6IC4gICAgU1RPUAogICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICBwaWNrbGUwID0gKGIiKGlfX21haW5fX1xuIgogICAgICAgICAgICAgICAgICAgICAgICBiIlhcbiIKQEAgLTU4NywxNSArNTg4LDE1IEBACiAKICAgICAgICAgICAgICMgUHJvdG9jb2wgMSAoYmluYXJ5IG1vZGUgcGlja2xlKQogICAgICAgICAgICAgIiIiCi0gICAgICAgICAgICAwOiAoICAgIE1BUksKLSAgICAgICAgICAgIDE6IGMgICAgICAgIEdMT0JBTCAgICAgJ19fbWFpbl9fIFgnCi0gICAgICAgICAgICAxNTogcSAgICAgICAgQklOUFVUICAgICAwCi0gICAgICAgICAgICAxNzogbyAgICAgICAgT0JKICAgICAgICAoTUFSSyBhdCAwKQotICAgICAgICAgICAgMTg6IHEgICAgQklOUFVUICAgICAxCi0gICAgICAgICAgICAyMDogfSAgICBFTVBUWV9ESUNUCi0gICAgICAgICAgICAyMTogcSAgICBCSU5QVVQgICAgIDIKLSAgICAgICAgICAgIDIzOiBiICAgIEJVSUxECi0gICAgICAgICAgICAyNDogLiAgICBTVE9QCisgICAgICAgICAgICAgMDogKCAgICBNQVJLCisgICAgICAgICAgICAgMTogYyAgICAgICAgR0xPQkFMICAgICAnX19tYWluX18gWCcKKyAgICAgICAgICAgIDEzOiBxICAgICAgICBCSU5QVVQgICAgIDAKKyAgICAgICAgICAgIDE1OiBvICAgICAgICBPQkogICAgICAgIChNQVJLIGF0IDApCisgICAgICAgICAgICAxNjogcSAgICBCSU5QVVQgICAgIDEKKyAgICAgICAgICAgIDE4OiB9ICAgIEVNUFRZX0RJQ1QKKyAgICAgICAgICAgIDE5OiBxICAgIEJJTlBVVCAgICAgMgorICAgICAgICAgICAgMjE6IGIgICAgQlVJTEQKKyAgICAgICAgICAgIDIyOiAuICAgIFNUT1AKICAgICAgICAgICAgICIiIgogICAgICAgICAgICAgcGlja2xlMSA9IChiJyhjX19tYWluX19cbicKICAgICAgICAgICAgICAgICAgICAgICAgYidYXG4nCkBAIC02MDQsMTYgKzYwNSwxNiBAQAogCiAgICAgICAgICAgICAjIFByb3RvY29sIDIgKHBpY2tsZTIgPSBiJ1x4ODBceDAyJyArIHBpY2tsZTEpCiAgICAgICAgICAgICAiIiIKLSAgICAgICAgICAgIDA6IFx4ODAgUFJPVE8gICAgICAyCi0gICAgICAgICAgICAyOiAoICAgIE1BUksKLSAgICAgICAgICAgIDM6IGMgICAgICAgIEdMT0JBTCAgICAgJ19fbWFpbl9fIFgnCi0gICAgICAgICAgICAxNzogcSAgICAgICAgQklOUFVUICAgICAwCi0gICAgICAgICAgICAxOTogbyAgICAgICAgT0JKICAgICAgICAoTUFSSyBhdCAyKQotICAgICAgICAgICAgMjA6IHEgICAgQklOUFVUICAgICAxCi0gICAgICAgICAgICAyMjogfSAgICBFTVBUWV9ESUNUCi0gICAgICAgICAgICAyMzogcSAgICBCSU5QVVQgICAgIDIKLSAgICAgICAgICAgIDI1OiBiICAgIEJVSUxECi0gICAgICAgICAgICAyNjogLiAgICBTVE9QCisgICAgICAgICAgICAgMDogXHg4MCBQUk9UTyAgICAgIDIKKyAgICAgICAgICAgICAyOiAoICAgIE1BUksKKyAgICAgICAgICAgICAzOiBjICAgICAgICBHTE9CQUwgICAgICdfX21haW5fXyBYJworICAgICAgICAgICAgMTU6IHEgICAgICAgIEJJTlBVVCAgICAgMAorICAgICAgICAgICAgMTc6IG8gICAgICAgIE9CSiAgICAgICAgKE1BUksgYXQgMikKKyAgICAgICAgICAgIDE4OiBxICAgIEJJTlBVVCAgICAgMQorICAgICAgICAgICAgMjA6IH0gICAgRU1QVFlfRElDVAorICAgICAgICAgICAgMjE6IHEgICAgQklOUFVUICAgICAyCisgICAgICAgICAgICAyMzogYiAgICBCVUlMRAorICAgICAgICAgICAgMjQ6IC4gICAgU1RPUAogICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICBwaWNrbGUyID0gKGInXHg4MFx4MDIoY19fbWFpbl9fXG4nCiAgICAgICAgICAgICAgICAgICAgICAgIGInWFxuJwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3Qvc3VwcG9ydC9fX2luaXRfXy5weSBiL0xpYi90ZXN0L3N1cHBvcnQvX19pbml0X18ucHkKaW5kZXggMjA1YzQ3Yy4uN2VmNjk4MCAxMDA2NDQKLS0tIGEvTGliL3Rlc3Qvc3VwcG9ydC9fX2luaXRfXy5weQorKysgYi9MaWIvdGVzdC9zdXBwb3J0L19faW5pdF9fLnB5CkBAIC0xMzI1LDYgKzEzMjUsOCBAQAogICAgICAgICBuID0gZ2V0YXR0cihlcnIsICdlcnJubycsIE5vbmUpCiAgICAgICAgIGlmIChpc2luc3RhbmNlKGVyciwgc29ja2V0LnRpbWVvdXQpIG9yCiAgICAgICAgICAgICAoaXNpbnN0YW5jZShlcnIsIHNvY2tldC5nYWllcnJvcikgYW5kIG4gaW4gZ2FpX2Vycm5vcykgb3IKKyAgICAgICAgICAgIChpc2luc3RhbmNlKGVyciwgdXJsbGliLmVycm9yLkhUVFBFcnJvcikgYW5kCisgICAgICAgICAgICAgNTAwIDw9IGVyci5jb2RlIDw9IDU5OSkgb3IKICAgICAgICAgICAgIChpc2luc3RhbmNlKGVyciwgdXJsbGliLmVycm9yLlVSTEVycm9yKSBhbmQKICAgICAgICAgICAgICAiQ29ubmVjdGlvblJlZnVzZWRFcnJvciIgaW4gZXJyLnJlYXNvbikgb3IKICAgICAgICAgICAgIG4gaW4gY2FwdHVyZWRfZXJybm9zKToKQEAgLTIxMzIsMTYgKzIxMzQsMTUgQEAKIAogZGVmIGZzX2lzX2Nhc2VfaW5zZW5zaXRpdmUoZGlyZWN0b3J5KToKICAgICAiIiJEZXRlY3RzIGlmIHRoZSBmaWxlIHN5c3RlbSBmb3IgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgaXMgY2FzZS1pbnNlbnNpdGl2ZS4iIiIKLSAgICBiYXNlX2ZwLCBiYXNlX3BhdGggPSB0ZW1wZmlsZS5ta3N0ZW1wKGRpcj1kaXJlY3RvcnkpCi0gICAgY2FzZV9wYXRoID0gYmFzZV9wYXRoLnVwcGVyKCkKLSAgICBpZiBjYXNlX3BhdGggPT0gYmFzZV9wYXRoOgotICAgICAgICBjYXNlX3BhdGggPSBiYXNlX3BhdGgubG93ZXIoKQotICAgIHRyeToKLSAgICAgICAgcmV0dXJuIG9zLnBhdGguc2FtZWZpbGUoYmFzZV9wYXRoLCBjYXNlX3BhdGgpCi0gICAgZXhjZXB0IEZpbGVOb3RGb3VuZEVycm9yOgotICAgICAgICByZXR1cm4gRmFsc2UKLSAgICBmaW5hbGx5OgotICAgICAgICBvcy51bmxpbmsoYmFzZV9wYXRoKQorICAgIHdpdGggdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKGRpcj1kaXJlY3RvcnkpIGFzIGJhc2U6CisgICAgICAgIGJhc2VfcGF0aCA9IGJhc2UubmFtZQorICAgICAgICBjYXNlX3BhdGggPSBiYXNlX3BhdGgudXBwZXIoKQorICAgICAgICBpZiBjYXNlX3BhdGggPT0gYmFzZV9wYXRoOgorICAgICAgICAgICAgY2FzZV9wYXRoID0gYmFzZV9wYXRoLmxvd2VyKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGguc2FtZWZpbGUoYmFzZV9wYXRoLCBjYXNlX3BhdGgpCisgICAgICAgIGV4Y2VwdCBGaWxlTm90Rm91bmRFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQogCiAKIGNsYXNzIFN1cHByZXNzQ3Jhc2hSZXBvcnQ6CkBAIC0yMTUxLDYgKzIxNTIsNyBAQAogICAgIGRpc2FibGUgdGhlIGNyZWF0aW9uIG9mIGNvcmVkdW1wIGZpbGUuCiAgICAgIiIiCiAgICAgb2xkX3ZhbHVlID0gTm9uZQorICAgIG9sZF9tb2RlcyA9IE5vbmUKIAogICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgICIiIk9uIFdpbmRvd3MsIGRpc2FibGUgV2luZG93cyBFcnJvciBSZXBvcnRpbmcgZGlhbG9ncyB1c2luZwpAQCAtMjE2OCw2ICsyMTcwLDI2IEBACiAgICAgICAgICAgICBTRU1fTk9HUEZBVUxURVJST1JCT1ggPSAweDAyCiAgICAgICAgICAgICBzZWxmLm9sZF92YWx1ZSA9IHNlbGYuX2szMi5TZXRFcnJvck1vZGUoU0VNX05PR1BGQVVMVEVSUk9SQk9YKQogICAgICAgICAgICAgc2VsZi5fazMyLlNldEVycm9yTW9kZShzZWxmLm9sZF92YWx1ZSB8IFNFTV9OT0dQRkFVTFRFUlJPUkJPWCkKKworICAgICAgICAgICAgIyBTdXBwcmVzcyBhc3NlcnQgZGlhbG9ncyBpbiBkZWJ1ZyBidWlsZHMKKyAgICAgICAgICAgICMgKHNlZSBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMjMzMTQpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaW1wb3J0IG1zdmNydAorICAgICAgICAgICAgICAgIG1zdmNydC5DcnRTZXRSZXBvcnRNb2RlCisgICAgICAgICAgICBleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBJbXBvcnRFcnJvcik6CisgICAgICAgICAgICAgICAgIyBubyBtc3ZjcnQgb3IgYSByZWxlYXNlIGJ1aWxkCisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLm9sZF9tb2RlcyA9IHt9CisgICAgICAgICAgICAgICAgZm9yIHJlcG9ydF90eXBlIGluIFttc3ZjcnQuQ1JUX1dBUk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc3ZjcnQuQ1JUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXN2Y3J0LkNSVF9BU1NFUlRdOgorICAgICAgICAgICAgICAgICAgICBvbGRfbW9kZSA9IG1zdmNydC5DcnRTZXRSZXBvcnRNb2RlKHJlcG9ydF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zdmNydC5DUlREQkdfTU9ERV9GSUxFKQorICAgICAgICAgICAgICAgICAgICBvbGRfZmlsZSA9IG1zdmNydC5DcnRTZXRSZXBvcnRGaWxlKHJlcG9ydF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zdmNydC5DUlREQkdfRklMRV9TVERFUlIpCisgICAgICAgICAgICAgICAgICAgIHNlbGYub2xkX21vZGVzW3JlcG9ydF90eXBlXSA9IG9sZF9tb2RlLCBvbGRfZmlsZQorCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBpZiByZXNvdXJjZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICB0cnk6CkBAIC0yMTk5LDYgKzIyMjEsMTIgQEAKIAogICAgICAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnd2luJyk6CiAgICAgICAgICAgICBzZWxmLl9rMzIuU2V0RXJyb3JNb2RlKHNlbGYub2xkX3ZhbHVlKQorCisgICAgICAgICAgICBpZiBzZWxmLm9sZF9tb2RlczoKKyAgICAgICAgICAgICAgICBpbXBvcnQgbXN2Y3J0CisgICAgICAgICAgICAgICAgZm9yIHJlcG9ydF90eXBlLCAob2xkX21vZGUsIG9sZF9maWxlKSBpbiBzZWxmLm9sZF9tb2Rlcy5pdGVtcygpOgorICAgICAgICAgICAgICAgICAgICBtc3ZjcnQuQ3J0U2V0UmVwb3J0TW9kZShyZXBvcnRfdHlwZSwgb2xkX21vZGUpCisgICAgICAgICAgICAgICAgICAgIG1zdmNydC5DcnRTZXRSZXBvcnRGaWxlKHJlcG9ydF90eXBlLCBvbGRfZmlsZSkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIGlmIHJlc291cmNlIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgIHRyeToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfX2xvY2FsZS5weSBiL0xpYi90ZXN0L3Rlc3RfX2xvY2FsZS5weQppbmRleCA0MjMxZjM3Li44ZDFjOGRiIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X19sb2NhbGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9fbG9jYWxlLnB5CkBAIC05LDcgKzksNiBAQAogaW1wb3J0IHN5cwogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIHBsYXRmb3JtIGltcG9ydCB1bmFtZQotZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAogCiBpZiB1bmFtZSgpLnN5c3RlbSA9PSAiRGFyd2luIjoKICAgICBtYWosIG1pbiwgbWljID0gW2ludChwYXJ0KSBmb3IgcGFydCBpbiB1bmFtZSgpLnJlbGVhc2Uuc3BsaXQoIi4iKV0KQEAgLTI0LDQ1ICsyMyw1MiBAQAogICAgICdkYV9ESycsICdubl9OTycsICdjc19DWicsICdkZV9MVScsICdlc19CTycsICdzcV9BTCcsICdza19TSycsICdmcl9DSCcsCiAgICAgJ2RlX0RFJywgJ3NyX1lVJywgJ2JyX0ZSJywgJ25sX0JFJywgJ3N2X0ZJJywgJ3BsX1BMJywgJ2ZyX0NBJywgJ2ZvX0ZPJywKICAgICAnYnNfQkEnLCAnZnJfTFUnLCAna2xfR0wnLCAnZmFfSVInLCAnZGVfQkUnLCAnc3ZfU0UnLCAnaXRfQ0gnLCAndWtfVUEnLAotICAgICdldV9FUycsICd2aV9WTicsICdhZl9aQScsICduYl9OTycsICdlbl9ESycsICd0Z19USicsICdlbl9VUycsCisgICAgJ2V1X0VTJywgJ3ZpX1ZOJywgJ2FmX1pBJywgJ25iX05PJywgJ2VuX0RLJywgJ3RnX1RKJywgJ3BzX0FGJywgJ2VuX1VTJywKICAgICAnZXNfRVMuSVNPODg1OS0xJywgJ2ZyX0ZSLklTTzg4NTktMTUnLCAncnVfUlUuS09JOC1SJywgJ2tvX0tSLmV1Y0tSJ10KIAotIyBJc3N1ZSAjMTM0NDE6IFNraXAgc29tZSBsb2NhbGVzIChlLmcuIGNzX0NaIGFuZCBodV9IVSkgb24gU29sYXJpcyB0bwotIyB3b3JrYXJvdW5kIGEgbWJzdG93Y3MoKSBidWcuIEZvciBleGFtcGxlLCBvbiBTb2xhcmlzLCB0aGUgaHVfSFUgbG9jYWxlIHVzZXMKLSMgdGhlIGxvY2FsZSBlbmNvZGluZyBJU08tODg1OS0yLCB0aGUgdGhvdXNhdWRzIHNlcGFyYXRvciBpcyBiJ1x4QTAnIGFuZCBpdCBpcwotIyBkZWNvZGVkIGFzIFUrMzAwMDAwMjAgKGFuIGludmFsaWQgY2hhcmFjdGVyKSBieSBtYnN0b3djcygpLgotaWYgc3lzLnBsYXRmb3JtID09ICdzdW5vczUnOgotICAgIG9sZF9sb2NhbGUgPSBsb2NhbGUuc2V0bG9jYWxlKGxvY2FsZS5MQ19BTEwpCi0gICAgdHJ5OgotICAgICAgICBsb2NhbGVzID0gW10KLSAgICAgICAgZm9yIGxvYyBpbiBjYW5kaWRhdGVfbG9jYWxlczoKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBsb2NhbGUuc2V0bG9jYWxlKGxvY2FsZS5MQ19BTEwsIGxvYykKLSAgICAgICAgICAgIGV4Y2VwdCBFcnJvcjoKLSAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgZW5jb2RpbmcgPSBsb2NhbGUuZ2V0cHJlZmVycmVkZW5jb2RpbmcoRmFsc2UpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgbG9jYWxlY29udigpCi0gICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGVycjoKLSAgICAgICAgICAgICAgICBwcmludCgiV0FSTklORzogU2tpcCBsb2NhbGUgJXMgKGVuY29kaW5nICVzKTogWyVzXSAlcyIKLSAgICAgICAgICAgICAgICAgICAgICAlIChsb2MsIGVuY29kaW5nLCB0eXBlKGVyciksIGVycikpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIGxvY2FsZXMuYXBwZW5kKGxvYykKLSAgICAgICAgY2FuZGlkYXRlX2xvY2FsZXMgPSBsb2NhbGVzCi0gICAgZmluYWxseToKLSAgICAgICAgbG9jYWxlLnNldGxvY2FsZShsb2NhbGUuTENfQUxMLCBvbGRfbG9jYWxlKQorZGVmIHNldFVwTW9kdWxlKCk6CisgICAgZ2xvYmFsIGNhbmRpZGF0ZV9sb2NhbGVzCisgICAgIyBJc3N1ZSAjMTM0NDE6IFNraXAgc29tZSBsb2NhbGVzIChlLmcuIGNzX0NaIGFuZCBodV9IVSkgb24gU29sYXJpcyB0bworICAgICMgd29ya2Fyb3VuZCBhIG1ic3Rvd2NzKCkgYnVnLiBGb3IgZXhhbXBsZSwgb24gU29sYXJpcywgdGhlIGh1X0hVIGxvY2FsZSB1c2VzCisgICAgIyB0aGUgbG9jYWxlIGVuY29kaW5nIElTTy04ODU5LTIsIHRoZSB0aG91c2F1ZHMgc2VwYXJhdG9yIGlzIGInXHhBMCcgYW5kIGl0IGlzCisgICAgIyBkZWNvZGVkIGFzIFUrMzAwMDAwMjAgKGFuIGludmFsaWQgY2hhcmFjdGVyKSBieSBtYnN0b3djcygpLgorICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnc3Vub3M1JzoKKyAgICAgICAgb2xkX2xvY2FsZSA9IGxvY2FsZS5zZXRsb2NhbGUobG9jYWxlLkxDX0FMTCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbG9jYWxlcyA9IFtdCisgICAgICAgICAgICBmb3IgbG9jIGluIGNhbmRpZGF0ZV9sb2NhbGVzOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxlLnNldGxvY2FsZShsb2NhbGUuTENfQUxMLCBsb2MpCisgICAgICAgICAgICAgICAgZXhjZXB0IEVycm9yOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGVuY29kaW5nID0gbG9jYWxlLmdldHByZWZlcnJlZGVuY29kaW5nKEZhbHNlKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxlY29udigpCisgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlcnI6CisgICAgICAgICAgICAgICAgICAgIHByaW50KCJXQVJOSU5HOiBTa2lwIGxvY2FsZSAlcyAoZW5jb2RpbmcgJXMpOiBbJXNdICVzIgorICAgICAgICAgICAgICAgICAgICAgICAgJSAobG9jLCBlbmNvZGluZywgdHlwZShlcnIpLCBlcnIpKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGxvY2FsZXMuYXBwZW5kKGxvYykKKyAgICAgICAgICAgIGNhbmRpZGF0ZV9sb2NhbGVzID0gbG9jYWxlcworICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgbG9jYWxlLnNldGxvY2FsZShsb2NhbGUuTENfQUxMLCBvbGRfbG9jYWxlKQogCi0jIFdvcmthcm91bmQgZm9yIE1TVkM2KGRlYnVnKSBjcmFzaCBidWcKLWlmICJNU0Mgdi4xMjAwIiBpbiBzeXMudmVyc2lvbjoKLSAgICBkZWYgYWNjZXB0KGxvYyk6Ci0gICAgICAgIGEgPSBsb2Muc3BsaXQoIi4iKQotICAgICAgICByZXR1cm4gbm90KGxlbihhKSA9PSAyIGFuZCBsZW4oYVstMV0pID49IDkpCi0gICAgY2FuZGlkYXRlX2xvY2FsZXMgPSBbbG9jIGZvciBsb2MgaW4gY2FuZGlkYXRlX2xvY2FsZXMgaWYgYWNjZXB0KGxvYyldCisgICAgIyBXb3JrYXJvdW5kIGZvciBNU1ZDNihkZWJ1ZykgY3Jhc2ggYnVnCisgICAgaWYgIk1TQyB2LjEyMDAiIGluIHN5cy52ZXJzaW9uOgorICAgICAgICBkZWYgYWNjZXB0KGxvYyk6CisgICAgICAgICAgICBhID0gbG9jLnNwbGl0KCIuIikKKyAgICAgICAgICAgIHJldHVybiBub3QobGVuKGEpID09IDIgYW5kIGxlbihhWy0xXSkgPj0gOSkKKyAgICAgICAgY2FuZGlkYXRlX2xvY2FsZXMgPSBbbG9jIGZvciBsb2MgaW4gY2FuZGlkYXRlX2xvY2FsZXMgaWYgYWNjZXB0KGxvYyldCiAKICMgTGlzdCBrbm93biBsb2NhbGUgdmFsdWVzIHRvIHRlc3QgYWdhaW5zdCB3aGVuIGF2YWlsYWJsZS4KICMgRGljdCBmb3JtYXR0ZWQgYXMgYGA8bG9jYWxlPiA6ICg8ZGVjaW1hbF9wb2ludD4sIDx0aG91c2FuZHNfc2VwPilgYC4gIElmIGEKICMgdmFsdWUgaXMgbm90IGtub3duLCB1c2UgJycgLgota25vd25fbnVtZXJpY3MgPSB7J2ZyX0ZSJyA6ICgnLCcsICcnKSwgJ2VuX1VTJzooJy4nLCAnLCcpfQora25vd25fbnVtZXJpY3MgPSB7CisgICAgJ2VuX1VTJzogKCcuJywgJywnKSwKKyAgICAnZnJfRlInIDogKCcsJywgJyAnKSwKKyAgICAnZGVfREUnIDogKCcsJywgJy4nKSwKKyAgICAncHNfQUYnOiAoJ1x1MDY2YicsICdcdTA2NmMnKSwKK30KIAogY2xhc3MgX0xvY2FsZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIApAQCAtOTEsMTAgKzk3LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjX3ZhbHVlLCBrbm93bl92YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGNfdHlwZSwgZGF0YV90eXBlLCBzZXRfbG9jYWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZF9sb2NhbGUpKQorICAgICAgICAgICAgcmV0dXJuIFRydWUKIAogICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKG5sX2xhbmdpbmZvLCAibmxfbGFuZ2luZm8gaXMgbm90IGF2YWlsYWJsZSIpCiAgICAgZGVmIHRlc3RfbGNfbnVtZXJpY19ubF9sYW5naW5mbyhzZWxmKToKICAgICAgICAgIyBUZXN0IG5sX2xhbmdpbmZvIGFnYWluc3Qga25vd24gdmFsdWVzCisgICAgICAgIHRlc3RlZCA9IEZhbHNlCiAgICAgICAgIGZvciBsb2MgaW4gY2FuZGlkYXRlX2xvY2FsZXM6CiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgc2V0bG9jYWxlKExDX05VTUVSSUMsIGxvYykKQEAgLTEwMywxMCArMTExLDE0IEBACiAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgIGZvciBsaSwgbGMgaW4gKChSQURJWENIQVIsICJkZWNpbWFsX3BvaW50IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFRIT1VTRVAsICJ0aG91c2FuZHNfc2VwIikpOgotICAgICAgICAgICAgICAgIHNlbGYubnVtZXJpY190ZXN0ZXIoJ25sX2xhbmdpbmZvJywgbmxfbGFuZ2luZm8obGkpLCBsYywgbG9jKQorICAgICAgICAgICAgICAgIGlmIHNlbGYubnVtZXJpY190ZXN0ZXIoJ25sX2xhbmdpbmZvJywgbmxfbGFuZ2luZm8obGkpLCBsYywgbG9jKToKKyAgICAgICAgICAgICAgICAgICAgdGVzdGVkID0gVHJ1ZQorICAgICAgICBpZiBub3QgdGVzdGVkOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgnbm8gc3VpdGFibGUgbG9jYWxlcycpCiAKICAgICBkZWYgdGVzdF9sY19udW1lcmljX2xvY2FsZWNvbnYoc2VsZik6CiAgICAgICAgICMgVGVzdCBsb2NhbGVjb252IGFnYWluc3Qga25vd24gdmFsdWVzCisgICAgICAgIHRlc3RlZCA9IEZhbHNlCiAgICAgICAgIGZvciBsb2MgaW4gY2FuZGlkYXRlX2xvY2FsZXM6CiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgc2V0bG9jYWxlKExDX05VTUVSSUMsIGxvYykKQEAgLTExNiwxMSArMTI4LDE1IEBACiAgICAgICAgICAgICBmb3JtYXR0aW5nID0gbG9jYWxlY29udigpCiAgICAgICAgICAgICBmb3IgbGMgaW4gKCJkZWNpbWFsX3BvaW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICJ0aG91c2FuZHNfc2VwIik6Ci0gICAgICAgICAgICAgICAgc2VsZi5udW1lcmljX3Rlc3RlcignbG9jYWxlY29udicsIGZvcm1hdHRpbmdbbGNdLCBsYywgbG9jKQorICAgICAgICAgICAgICAgIGlmIHNlbGYubnVtZXJpY190ZXN0ZXIoJ2xvY2FsZWNvbnYnLCBmb3JtYXR0aW5nW2xjXSwgbGMsIGxvYyk6CisgICAgICAgICAgICAgICAgICAgIHRlc3RlZCA9IFRydWUKKyAgICAgICAgaWYgbm90IHRlc3RlZDoKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJ25vIHN1aXRhYmxlIGxvY2FsZXMnKQogCiAgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MobmxfbGFuZ2luZm8sICJubF9sYW5naW5mbyBpcyBub3QgYXZhaWxhYmxlIikKICAgICBkZWYgdGVzdF9sY19udW1lcmljX2Jhc2ljKHNlbGYpOgogICAgICAgICAjIFRlc3QgbmxfbGFuZ2luZm8gYWdhaW5zdCBsb2NhbGVjb252CisgICAgICAgIHRlc3RlZCA9IEZhbHNlCiAgICAgICAgIGZvciBsb2MgaW4gY2FuZGlkYXRlX2xvY2FsZXM6CiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgc2V0bG9jYWxlKExDX05VTUVSSUMsIGxvYykKQEAgLTE0MCwxMCArMTU2LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoc2V0IHRvICVzLCB1c2luZyAlcykiICUgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmxfcmFkaXhjaGFyLCBsaV9yYWRpeGNoYXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2MsIHNldF9sb2NhbGUpKQorICAgICAgICAgICAgICAgIHRlc3RlZCA9IFRydWUKKyAgICAgICAgaWYgbm90IHRlc3RlZDoKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJ25vIHN1aXRhYmxlIGxvY2FsZXMnKQogCiAgICAgZGVmIHRlc3RfZmxvYXRfcGFyc2luZyhzZWxmKToKICAgICAgICAgIyBCdWcgIzEzOTE4NzI6IFRlc3Qgd2hldGhlciBmbG9hdCBwYXJzaW5nIGlzIG9rYXkgb24gRXVyb3BlYW4KICAgICAgICAgIyBsb2NhbGVzLgorICAgICAgICB0ZXN0ZWQgPSBGYWxzZQogICAgICAgICBmb3IgbG9jIGluIGNhbmRpZGF0ZV9sb2NhbGVzOgogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIHNldGxvY2FsZShMQ19OVU1FUklDLCBsb2MpCkBAIC0xNjIsOSArMTgyLDEwIEBACiAgICAgICAgICAgICBpZiBsb2NhbGVjb252KClbJ2RlY2ltYWxfcG9pbnQnXSAhPSAnLic6CiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmxvYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlY29udigpWydkZWNpbWFsX3BvaW50J10uam9pbihbJzEnLCAnMjMnXSkpCisgICAgICAgICAgICB0ZXN0ZWQgPSBUcnVlCisgICAgICAgIGlmIG5vdCB0ZXN0ZWQ6CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCdubyBzdWl0YWJsZSBsb2NhbGVzJykKIAotZGVmIHRlc3RfbWFpbigpOgotICAgIHJ1bl91bml0dGVzdChfTG9jYWxlVGVzdHMpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgdGVzdF9tYWluKCkKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYXJncGFyc2UucHkgYi9MaWIvdGVzdC90ZXN0X2FyZ3BhcnNlLnB5CmluZGV4IGEwYjkxNjIuLmQ3ZjkwY2QgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYXJncGFyc2UucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9hcmdwYXJzZS5weQpAQCAtNzUzLDYgKzc1MywzOSBAQAogICAgIF0KIAogCitjbGFzcyBUZXN0T3B0aW9uYWxzQWxsb3dMb25nQWJicmV2aWF0aW9uKFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJBbGxvdyBsb25nIG9wdGlvbnMgdG8gYmUgYWJicmV2aWF0ZWQgdW5hbWJpZ3VvdXNseSIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCctLWZvbycpLAorICAgICAgICBTaWcoJy0tZm9vYmF6JyksCisgICAgICAgIFNpZygnLS1mb29ibGUnLCBhY3Rpb249J3N0b3JlX3RydWUnKSwKKyAgICBdCisgICAgZmFpbHVyZXMgPSBbJy0tZm9vYiA1JywgJy0tZm9vYiddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJycsIE5TKGZvbz1Ob25lLCBmb29iYXo9Tm9uZSwgZm9vYmxlPUZhbHNlKSksCisgICAgICAgICgnLS1mb28gNycsIE5TKGZvbz0nNycsIGZvb2Jhej1Ob25lLCBmb29ibGU9RmFsc2UpKSwKKyAgICAgICAgKCctLWZvb2JhIGEnLCBOUyhmb289Tm9uZSwgZm9vYmF6PSdhJywgZm9vYmxlPUZhbHNlKSksCisgICAgICAgICgnLS1mb29ibCAtLWZvbyBnJywgTlMoZm9vPSdnJywgZm9vYmF6PU5vbmUsIGZvb2JsZT1UcnVlKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RPcHRpb25hbHNEaXNhbGxvd0xvbmdBYmJyZXZpYXRpb24oUGFyc2VyVGVzdENhc2UpOgorICAgICIiIkRvIG5vdCBhbGxvdyBhYmJyZXZpYXRpb25zIG9mIGxvbmcgb3B0aW9ucyBhdCBhbGwiIiIKKworICAgIHBhcnNlcl9zaWduYXR1cmUgPSBTaWcoYWxsb3dfYWJicmV2PUZhbHNlKQorICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnLS1mb28nKSwKKyAgICAgICAgU2lnKCctLWZvb2RsZScsIGFjdGlvbj0nc3RvcmVfdHJ1ZScpLAorICAgICAgICBTaWcoJy0tZm9vbmx5JyksCisgICAgXQorICAgIGZhaWx1cmVzID0gWyctZm9vbiAzJywgJy0tZm9vbiAzJywgJy0tZm9vZCcsICctLWZvb2QgLS1mb28gMiddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJycsIE5TKGZvbz1Ob25lLCBmb29kbGU9RmFsc2UsIGZvb25seT1Ob25lKSksCisgICAgICAgICgnLS1mb28gMycsIE5TKGZvbz0nMycsIGZvb2RsZT1GYWxzZSwgZm9vbmx5PU5vbmUpKSwKKyAgICAgICAgKCctLWZvb25seSA3IC0tZm9vZGxlIC0tZm9vIDInLCBOUyhmb289JzInLCBmb29kbGU9VHJ1ZSwgZm9vbmx5PSc3JykpLAorICAgIF0KKwogIyA9PT09PT09PT09PT09PT09CiAjIFBvc2l0aW9uYWwgdGVzdHMKICMgPT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9hc3luY2lvL3Rlc3RfcXVldWVzLnB5IGIvTGliL3Rlc3QvdGVzdF9hc3luY2lvL3Rlc3RfcXVldWVzLnB5CmluZGV4IDNkNGFjNTEuLmE3MzUzOWQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYXN5bmNpby90ZXN0X3F1ZXVlcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2FzeW5jaW8vdGVzdF9xdWV1ZXMucHkKQEAgLTQwOCwxNCArNDA4LDE0IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzEsIDIsIDNdLCBpdGVtcykKIAogCi1jbGFzcyBKb2luYWJsZVF1ZXVlVGVzdHMoX1F1ZXVlVGVzdEJhc2UpOgorY2xhc3MgUXVldWVKb2luVGVzdHMoX1F1ZXVlVGVzdEJhc2UpOgogCiAgICAgZGVmIHRlc3RfdGFza19kb25lX3VuZGVyZmxvdyhzZWxmKToKLSAgICAgICAgcSA9IGFzeW5jaW8uSm9pbmFibGVRdWV1ZShsb29wPXNlbGYubG9vcCkKKyAgICAgICAgcSA9IGFzeW5jaW8uUXVldWUobG9vcD1zZWxmLmxvb3ApCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHEudGFza19kb25lKQogCiAgICAgZGVmIHRlc3RfdGFza19kb25lKHNlbGYpOgotICAgICAgICBxID0gYXN5bmNpby5Kb2luYWJsZVF1ZXVlKGxvb3A9c2VsZi5sb29wKQorICAgICAgICBxID0gYXN5bmNpby5RdWV1ZShsb29wPXNlbGYubG9vcCkKICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTAwKToKICAgICAgICAgICAgIHEucHV0X25vd2FpdChpKQogCkBAIC00NTIsNyArNDUyLDcgQEAKICAgICAgICAgc2VsZi5sb29wLnJ1bl91bnRpbF9jb21wbGV0ZShhc3luY2lvLndhaXQodGFza3MsIGxvb3A9c2VsZi5sb29wKSkKIAogICAgIGRlZiB0ZXN0X2pvaW5fZW1wdHlfcXVldWUoc2VsZik6Ci0gICAgICAgIHEgPSBhc3luY2lvLkpvaW5hYmxlUXVldWUobG9vcD1zZWxmLmxvb3ApCisgICAgICAgIHEgPSBhc3luY2lvLlF1ZXVlKGxvb3A9c2VsZi5sb29wKQogCiAgICAgICAgICMgVGVzdCB0aGF0IGEgcXVldWUgam9pbigpcyBzdWNjZXNzZnVsbHksIGFuZCBiZWZvcmUgYW55dGhpbmcgZWxzZQogICAgICAgICAjIChkb25lIHR3aWNlIGZvciBpbnN1cmFuY2UpLgpAQCAtNDY1LDcgKzQ2NSw3IEBACiAgICAgICAgIHNlbGYubG9vcC5ydW5fdW50aWxfY29tcGxldGUoam9pbigpKQogCiAgICAgZGVmIHRlc3RfZm9ybWF0KHNlbGYpOgotICAgICAgICBxID0gYXN5bmNpby5Kb2luYWJsZVF1ZXVlKGxvb3A9c2VsZi5sb29wKQorICAgICAgICBxID0gYXN5bmNpby5RdWV1ZShsb29wPXNlbGYubG9vcCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChxLl9mb3JtYXQoKSwgJ21heHNpemU9MCcpCiAKICAgICAgICAgcS5fdW5maW5pc2hlZF90YXNrcyA9IDIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYXN5bmNpby90ZXN0X3N1YnByb2Nlc3MucHkgYi9MaWIvdGVzdC90ZXN0X2FzeW5jaW8vdGVzdF9zdWJwcm9jZXNzLnB5CmluZGV4IGI0NjdiMDQuLjVjY2RhZmIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYXN5bmNpby90ZXN0X3N1YnByb2Nlc3MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9hc3luY2lvL3Rlc3Rfc3VicHJvY2Vzcy5weQpAQCAtMzQ5LDYgKzM0OSw3MCBAQAogICAgICAgICAgICAgc2VsZi5sb29wLnJ1bl91bnRpbF9jb21wbGV0ZShjYW5jZWxfbWFrZV90cmFuc3BvcnQoKSkKICAgICAgICAgICAgIHRlc3RfdXRpbHMucnVuX2JyaWVmbHkoc2VsZi5sb29wKQogCisgICAgZGVmIHRlc3RfY2xvc2Vfa2lsbF9ydW5uaW5nKHNlbGYpOgorICAgICAgICBAYXN5bmNpby5jb3JvdXRpbmUKKyAgICAgICAgZGVmIGtpbGxfcnVubmluZygpOgorICAgICAgICAgICAgY3JlYXRlID0gc2VsZi5sb29wLnN1YnByb2Nlc3NfZXhlYyhhc3luY2lvLlN1YnByb2Nlc3NQcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlBST0dSQU1fQkxPQ0tFRCkKKyAgICAgICAgICAgIHRyYW5zcG9ydCwgcHJvdG9jb2wgPSB5aWVsZCBmcm9tIGNyZWF0ZQorCisgICAgICAgICAgICBraWxsX2NhbGxlZCA9IEZhbHNlCisgICAgICAgICAgICBkZWYga2lsbCgpOgorICAgICAgICAgICAgICAgIG5vbmxvY2FsIGtpbGxfY2FsbGVkCisgICAgICAgICAgICAgICAga2lsbF9jYWxsZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgb3JpZ19raWxsKCkKKworICAgICAgICAgICAgcHJvYyA9IHRyYW5zcG9ydC5nZXRfZXh0cmFfaW5mbygnc3VicHJvY2VzcycpCisgICAgICAgICAgICBvcmlnX2tpbGwgPSBwcm9jLmtpbGwKKyAgICAgICAgICAgIHByb2Mua2lsbCA9IGtpbGwKKyAgICAgICAgICAgIHJldHVybmNvZGUgPSB0cmFuc3BvcnQuZ2V0X3JldHVybmNvZGUoKQorICAgICAgICAgICAgdHJhbnNwb3J0LmNsb3NlKCkKKyAgICAgICAgICAgIHlpZWxkIGZyb20gdHJhbnNwb3J0Ll93YWl0KCkKKyAgICAgICAgICAgIHJldHVybiAocmV0dXJuY29kZSwga2lsbF9jYWxsZWQpCisKKyAgICAgICAgIyBJZ25vcmUgIkNsb3NlIHJ1bm5pbmcgY2hpbGQgcHJvY2Vzczoga2lsbCAuLi4iIGxvZworICAgICAgICB3aXRoIHRlc3RfdXRpbHMuZGlzYWJsZV9sb2dnZXIoKToKKyAgICAgICAgICAgIHJldHVybmNvZGUsIGtpbGxlZCA9IHNlbGYubG9vcC5ydW5fdW50aWxfY29tcGxldGUoa2lsbF9ydW5uaW5nKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHJldHVybmNvZGUpCisKKyAgICAgICAgIyB0cmFuc3BvcnQuY2xvc2UoKSBtdXN0IGtpbGwgdGhlIHByb2Nlc3MgaWYgaXQgaXMgc3RpbGwgcnVubmluZworICAgICAgICBzZWxmLmFzc2VydFRydWUoa2lsbGVkKQorICAgICAgICB0ZXN0X3V0aWxzLnJ1bl9icmllZmx5KHNlbGYubG9vcCkKKworICAgIGRlZiB0ZXN0X2Nsb3NlX2RvbnRfa2lsbF9maW5pc2hlZChzZWxmKToKKyAgICAgICAgQGFzeW5jaW8uY29yb3V0aW5lCisgICAgICAgIGRlZiBraWxsX3J1bm5pbmcoKToKKyAgICAgICAgICAgIGNyZWF0ZSA9IHNlbGYubG9vcC5zdWJwcm9jZXNzX2V4ZWMoYXN5bmNpby5TdWJwcm9jZXNzUHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpQUk9HUkFNX0JMT0NLRUQpCisgICAgICAgICAgICB0cmFuc3BvcnQsIHByb3RvY29sID0geWllbGQgZnJvbSBjcmVhdGUKKyAgICAgICAgICAgIHByb2MgPSB0cmFuc3BvcnQuZ2V0X2V4dHJhX2luZm8oJ3N1YnByb2Nlc3MnKQorCisgICAgICAgICAgICAjIGtpbGwgdGhlIHByb2Nlc3MgKGJ1dCBhc3luY2lvIGlzIG5vdCBub3RpZmllZCBpbW1lZGlhdGx5KQorICAgICAgICAgICAgcHJvYy5raWxsKCkKKyAgICAgICAgICAgIHByb2Mud2FpdCgpCisKKyAgICAgICAgICAgIHByb2Mua2lsbCA9IG1vY2suTW9jaygpCisgICAgICAgICAgICBwcm9jX3JldHVybmNvZGUgPSBwcm9jLnBvbGwoKQorICAgICAgICAgICAgdHJhbnNwb3J0X3JldHVybmNvZGUgPSB0cmFuc3BvcnQuZ2V0X3JldHVybmNvZGUoKQorICAgICAgICAgICAgdHJhbnNwb3J0LmNsb3NlKCkKKyAgICAgICAgICAgIHJldHVybiAocHJvY19yZXR1cm5jb2RlLCB0cmFuc3BvcnRfcmV0dXJuY29kZSwgcHJvYy5raWxsLmNhbGxlZCkKKworICAgICAgICAjIElnbm9yZSAiVW5rbm93biBjaGlsZCBwcm9jZXNzIHBpZCAuLi4iIGxvZyBvZiBTYWZlQ2hpbGRXYXRjaGVyLAorICAgICAgICAjIGVtaXR0ZWQgYmVjYXVzZSB0aGUgdGVzdCBhbHJlYWR5IGNvbnN1bWVzIHRoZSBleGl0IHN0YXR1czoKKyAgICAgICAgIyBwcm9jLndhaXQoKQorICAgICAgICB3aXRoIHRlc3RfdXRpbHMuZGlzYWJsZV9sb2dnZXIoKToKKyAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYubG9vcC5ydW5fdW50aWxfY29tcGxldGUoa2lsbF9ydW5uaW5nKCkpCisgICAgICAgICAgICB0ZXN0X3V0aWxzLnJ1bl9icmllZmx5KHNlbGYubG9vcCkKKworICAgICAgICBwcm9jX3JldHVybmNvZGUsIHRyYW5zcG9ydF9yZXR1cm5fY29kZSwga2lsbGVkID0gcmVzdWx0CisKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdE5vbmUocHJvY19yZXR1cm5jb2RlKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZSh0cmFuc3BvcnRfcmV0dXJuX2NvZGUpCisKKyAgICAgICAgIyB0cmFuc3BvcnQuY2xvc2UoKSBtdXN0IG5vdCBraWxsIHRoZSBwcm9jZXNzIGlmIGl0IGZpbmlzaGVkLCBldmVuIGlmCisgICAgICAgICMgdGhlIHRyYW5zcG9ydCB3YXMgbm90IG5vdGlmaWVkIHlldAorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGtpbGxlZCkKKwogCiBpZiBzeXMucGxhdGZvcm0gIT0gJ3dpbjMyJzoKICAgICAjIFVuaXgKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYXN5bmNpby90ZXN0X3VuaXhfZXZlbnRzLnB5IGIvTGliL3Rlc3QvdGVzdF9hc3luY2lvL3Rlc3RfdW5peF9ldmVudHMucHkKaW5kZXggNDEyNDlmZi4uZGMwODM1YyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9hc3luY2lvL3Rlc3RfdW5peF9ldmVudHMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9hc3luY2lvL3Rlc3RfdW5peF9ldmVudHMucHkKQEAgLTI5NSw3ICsyOTUsNyBAQAogCiAgICAgZGVmIHRlc3RfY3JlYXRlX3VuaXhfY29ubmVjdGlvbl9wYXRoX3NvY2soc2VsZik6CiAgICAgICAgIGNvcm8gPSBzZWxmLmxvb3AuY3JlYXRlX3VuaXhfY29ubmVjdGlvbigKLSAgICAgICAgICAgIGxhbWJkYTogTm9uZSwgJy9kZXYvbnVsbCcsIHNvY2s9b2JqZWN0KCkpCisgICAgICAgICAgICBsYW1iZGE6IE5vbmUsIG9zLmRldm51bGwsIHNvY2s9b2JqZWN0KCkpCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChWYWx1ZUVycm9yLCAncGF0aCBhbmQgc29jayBjYW4gbm90IGJlJyk6CiAgICAgICAgICAgICBzZWxmLmxvb3AucnVuX3VudGlsX2NvbXBsZXRlKGNvcm8pCiAKQEAgLTMwOCwxNCArMzA4LDE0IEBACiAKICAgICBkZWYgdGVzdF9jcmVhdGVfdW5peF9jb25uZWN0aW9uX25vc3NsX3NlcnZlcmhvc3Qoc2VsZik6CiAgICAgICAgIGNvcm8gPSBzZWxmLmxvb3AuY3JlYXRlX3VuaXhfY29ubmVjdGlvbigKLSAgICAgICAgICAgIGxhbWJkYTogTm9uZSwgJy9kZXYvbnVsbCcsIHNlcnZlcl9ob3N0bmFtZT0nc3BhbScpCisgICAgICAgICAgICBsYW1iZGE6IE5vbmUsIG9zLmRldm51bGwsIHNlcnZlcl9ob3N0bmFtZT0nc3BhbScpCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChWYWx1ZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NlcnZlcl9ob3N0bmFtZSBpcyBvbmx5IG1lYW5pbmdmdWwnKToKICAgICAgICAgICAgIHNlbGYubG9vcC5ydW5fdW50aWxfY29tcGxldGUoY29ybykKIAogICAgIGRlZiB0ZXN0X2NyZWF0ZV91bml4X2Nvbm5lY3Rpb25fc3NsX25vc2VydmVyaG9zdChzZWxmKToKICAgICAgICAgY29ybyA9IHNlbGYubG9vcC5jcmVhdGVfdW5peF9jb25uZWN0aW9uKAotICAgICAgICAgICAgbGFtYmRhOiBOb25lLCAnL2Rldi9udWxsJywgc3NsPVRydWUpCisgICAgICAgICAgICBsYW1iZGE6IE5vbmUsIG9zLmRldm51bGwsIHNzbD1UcnVlKQogCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleCgKICAgICAgICAgICAgIFZhbHVlRXJyb3IsICd5b3UgaGF2ZSB0byBwYXNzIHNlcnZlcl9ob3N0bmFtZSB3aGVuIHVzaW5nIHNzbCcpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9iejIucHkgYi9MaWIvdGVzdC90ZXN0X2J6Mi5weQppbmRleCBjZTAxMmQ2Li4yZmUzZjJhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2J6Mi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2J6Mi5weQpAQCAtNSw2ICs1LDcgQEAKIGZyb20gaW8gaW1wb3J0IEJ5dGVzSU8KIGltcG9ydCBvcwogaW1wb3J0IHBpY2tsZQoraW1wb3J0IGdsb2IKIGltcG9ydCByYW5kb20KIGltcG9ydCBzdWJwcm9jZXNzCiBpbXBvcnQgc3lzCkBAIC01MSw2ICs1MiwxOSBAQAogICAgIEVNUFRZX0RBVEEgPSBiJ0JaaDlceDE3ckU4UFx4OTBceDAwXHgwMFx4MDBceDAwJwogICAgIEJBRF9EQVRBID0gYid0aGlzIGlzIG5vdCBhIHZhbGlkIGJ6aXAyIGZpbGUnCiAKKyAgICAjIFNvbWUgdGVzdHMgbmVlZCBtb3JlIHRoYW4gb25lIGJsb2NrIG9mIHVuY29tcHJlc3NlZCBkYXRhLiBTaW5jZSBvbmUgYmxvY2sKKyAgICAjIGlzIGF0IGxlYXN0IDEwMCBrQiwgd2UgZ2F0aGVyIHNvbWUgZGF0YSBkeW5hbWljYWxseSBhbmQgY29tcHJlc3MgaXQuCisgICAgIyBOb3RlIHRoYXQgdGhpcyBhc3N1bWVzIHRoYXQgY29tcHJlc3Npb24gd29ya3MgY29ycmVjdGx5LCBzbyB3ZSBjYW5ub3QKKyAgICAjIHNpbXBseSB1c2UgdGhlIGJpZ2dlciB0ZXN0IGRhdGEgZm9yIGFsbCB0ZXN0cy4KKyAgICB0ZXN0X3NpemUgPSAwCisgICAgQklHX1RFWFQgPSBieXRlYXJyYXkoMTI4KjEwMjQpCisgICAgZm9yIGZuYW1lIGluIGdsb2IuZ2xvYihvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgJyoucHknKSk6CisgICAgICAgIHdpdGggb3BlbihmbmFtZSwgJ3JiJykgYXMgZmg6CisgICAgICAgICAgICB0ZXN0X3NpemUgKz0gZmgucmVhZGludG8obWVtb3J5dmlldyhCSUdfVEVYVClbdGVzdF9zaXplOl0pCisgICAgICAgIGlmIHRlc3Rfc2l6ZSA+IDEyOCoxMDI0OgorICAgICAgICAgICAgYnJlYWsKKyAgICBCSUdfREFUQSA9IGJ6Mi5jb21wcmVzcyhCSUdfVEVYVCwgY29tcHJlc3NsZXZlbD0xKQorCiAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICBzZWxmLmZpbGVuYW1lID0gc3VwcG9ydC5URVNURk4KIApAQCAtODcsMTEgKzEwMSwxMSBAQAogCiAgICAgZGVmIHRlc3RCYWRBcmdzKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIEJaMkZpbGUsIDEyMy40NTYpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIEJaMkZpbGUsICIvZGV2L251bGwiLCAieiIpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIEJaMkZpbGUsICIvZGV2L251bGwiLCAicngiKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBCWjJGaWxlLCAiL2Rldi9udWxsIiwgInJidCIpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIEJaMkZpbGUsICIvZGV2L251bGwiLCBjb21wcmVzc2xldmVsPTApCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIEJaMkZpbGUsICIvZGV2L251bGwiLCBjb21wcmVzc2xldmVsPTEwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBCWjJGaWxlLCBvcy5kZXZudWxsLCAieiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIEJaMkZpbGUsIG9zLmRldm51bGwsICJyeCIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIEJaMkZpbGUsIG9zLmRldm51bGwsICJyYnQiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBCWjJGaWxlLCBvcy5kZXZudWxsLCBjb21wcmVzc2xldmVsPTApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIEJaMkZpbGUsIG9zLmRldm51bGwsIGNvbXByZXNzbGV2ZWw9MTApCiAKICAgICBkZWYgdGVzdFJlYWQoc2VsZik6CiAgICAgICAgIHNlbGYuY3JlYXRlVGVtcEZpbGUoKQpAQCAtNzA3LDYgKzcyMSw5NSBAQAogICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgogICAgICAgICAgICAgICAgIHBpY2tsZS5kdW1wcyhCWjJEZWNvbXByZXNzb3IoKSwgcHJvdG8pCiAKKyAgICBkZWYgdGVzdERlY29tcHJlc3NvckNodW5rc01heHNpemUoc2VsZik6CisgICAgICAgIGJ6ZCA9IEJaMkRlY29tcHJlc3NvcigpCisgICAgICAgIG1heF9sZW5ndGggPSAxMDAKKyAgICAgICAgb3V0ID0gW10KKworICAgICAgICAjIEZlZWQgc29tZSBpbnB1dAorICAgICAgICBsZW5fID0gbGVuKHNlbGYuQklHX0RBVEEpIC0gNjQKKyAgICAgICAgb3V0LmFwcGVuZChiemQuZGVjb21wcmVzcyhzZWxmLkJJR19EQVRBWzpsZW5fXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfbGVuZ3RoPW1heF9sZW5ndGgpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGJ6ZC5uZWVkc19pbnB1dCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ob3V0Wy0xXSksIG1heF9sZW5ndGgpCisKKyAgICAgICAgIyBSZXRyaWV2ZSBtb3JlIGRhdGEgd2l0aG91dCBwcm92aWRpbmcgbW9yZSBpbnB1dAorICAgICAgICBvdXQuYXBwZW5kKGJ6ZC5kZWNvbXByZXNzKGInJywgbWF4X2xlbmd0aD1tYXhfbGVuZ3RoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShiemQubmVlZHNfaW5wdXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG91dFstMV0pLCBtYXhfbGVuZ3RoKQorCisgICAgICAgICMgUmV0cmlldmUgbW9yZSBkYXRhIHdoaWxlIHByb3ZpZGluZyBtb3JlIGlucHV0CisgICAgICAgIG91dC5hcHBlbmQoYnpkLmRlY29tcHJlc3Moc2VsZi5CSUdfREFUQVtsZW5fOl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2xlbmd0aD1tYXhfbGVuZ3RoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRMZXNzRXF1YWwobGVuKG91dFstMV0pLCBtYXhfbGVuZ3RoKQorCisgICAgICAgICMgUmV0cmlldmUgcmVtYWluaW5nIHVuY29tcHJlc3NlZCBkYXRhCisgICAgICAgIHdoaWxlIG5vdCBiemQuZW9mOgorICAgICAgICAgICAgb3V0LmFwcGVuZChiemQuZGVjb21wcmVzcyhiJycsIG1heF9sZW5ndGg9bWF4X2xlbmd0aCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydExlc3NFcXVhbChsZW4ob3V0Wy0xXSksIG1heF9sZW5ndGgpCisKKyAgICAgICAgb3V0ID0gYiIiLmpvaW4ob3V0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dCwgc2VsZi5CSUdfVEVYVCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiemQudW51c2VkX2RhdGEsIGIiIikKKworICAgIGRlZiB0ZXN0X2RlY29tcHJlc3Nvcl9pbnB1dGJ1Zl8xKHNlbGYpOgorICAgICAgICAjIFRlc3QgcmV1c2luZyBpbnB1dCBidWZmZXIgYWZ0ZXIgbW92aW5nIGV4aXN0aW5nCisgICAgICAgICMgY29udGVudHMgdG8gYmVnaW5uaW5nCisgICAgICAgIGJ6ZCA9IEJaMkRlY29tcHJlc3NvcigpCisgICAgICAgIG91dCA9IFtdCisKKyAgICAgICAgIyBDcmVhdGUgaW5wdXQgYnVmZmVyIGFuZCBmaWxsIGl0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnpkLmRlY29tcHJlc3Moc2VsZi5EQVRBWzoxMDBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9sZW5ndGg9MCksIGInJykKKworICAgICAgICAjIFJldHJpZXZlIHNvbWUgcmVzdWx0cywgZnJlZWluZyBjYXBhY2l0eSBhdCBiZWdpbm5pbmcKKyAgICAgICAgIyBvZiBpbnB1dCBidWZmZXIKKyAgICAgICAgb3V0LmFwcGVuZChiemQuZGVjb21wcmVzcyhiJycsIDIpKQorCisgICAgICAgICMgQWRkIG1vcmUgZGF0YSB0aGF0IGZpdHMgaW50byBpbnB1dCBidWZmZXIgYWZ0ZXIKKyAgICAgICAgIyBtb3ZpbmcgZXhpc3RpbmcgZGF0YSB0byBiZWdpbm5pbmcKKyAgICAgICAgb3V0LmFwcGVuZChiemQuZGVjb21wcmVzcyhzZWxmLkRBVEFbMTAwOjEwNV0sIDE1KSkKKworICAgICAgICAjIERlY29tcHJlc3MgcmVzdCBvZiBkYXRhCisgICAgICAgIG91dC5hcHBlbmQoYnpkLmRlY29tcHJlc3Moc2VsZi5EQVRBWzEwNTpdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJycuam9pbihvdXQpLCBzZWxmLlRFWFQpCisKKyAgICBkZWYgdGVzdF9kZWNvbXByZXNzb3JfaW5wdXRidWZfMihzZWxmKToKKyAgICAgICAgIyBUZXN0IHJldXNpbmcgaW5wdXQgYnVmZmVyIGJ5IGFwcGVuZGluZyBkYXRhIGF0IHRoZQorICAgICAgICAjIGVuZCByaWdodCBhd2F5CisgICAgICAgIGJ6ZCA9IEJaMkRlY29tcHJlc3NvcigpCisgICAgICAgIG91dCA9IFtdCisKKyAgICAgICAgIyBDcmVhdGUgaW5wdXQgYnVmZmVyIGFuZCBlbXB0eSBpdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ6ZC5kZWNvbXByZXNzKHNlbGYuREFUQVs6MjAwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfbGVuZ3RoPTApLCBiJycpCisgICAgICAgIG91dC5hcHBlbmQoYnpkLmRlY29tcHJlc3MoYicnKSkKKworICAgICAgICAjIEZpbGwgYnVmZmVyIHdpdGggbmV3IGRhdGEKKyAgICAgICAgb3V0LmFwcGVuZChiemQuZGVjb21wcmVzcyhzZWxmLkRBVEFbMjAwOjI4MF0sIDIpKQorCisgICAgICAgICMgQXBwZW5kIHNvbWUgbW9yZSBkYXRhLCBub3QgZW5vdWdoIHRvIHJlcXVpcmUgcmVzaXplCisgICAgICAgIG91dC5hcHBlbmQoYnpkLmRlY29tcHJlc3Moc2VsZi5EQVRBWzI4MDozMDBdLCAyKSkKKworICAgICAgICAjIERlY29tcHJlc3MgcmVzdCBvZiBkYXRhCisgICAgICAgIG91dC5hcHBlbmQoYnpkLmRlY29tcHJlc3Moc2VsZi5EQVRBWzMwMDpdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJycuam9pbihvdXQpLCBzZWxmLlRFWFQpCisKKyAgICBkZWYgdGVzdF9kZWNvbXByZXNzb3JfaW5wdXRidWZfMyhzZWxmKToKKyAgICAgICAgIyBUZXN0IHJldXNpbmcgaW5wdXQgYnVmZmVyIGFmdGVyIGV4dGVuZGluZyBpdAorCisgICAgICAgIGJ6ZCA9IEJaMkRlY29tcHJlc3NvcigpCisgICAgICAgIG91dCA9IFtdCisKKyAgICAgICAgIyBDcmVhdGUgYWxtb3N0IGZ1bGwgaW5wdXQgYnVmZmVyCisgICAgICAgIG91dC5hcHBlbmQoYnpkLmRlY29tcHJlc3Moc2VsZi5EQVRBWzoyMDBdLCA1KSkKKworICAgICAgICAjIEFkZCBldmVuIG1vcmUgZGF0YSB0byBpdCwgcmVxdWlyaW5nIHJlc2l6ZQorICAgICAgICBvdXQuYXBwZW5kKGJ6ZC5kZWNvbXByZXNzKHNlbGYuREFUQVsyMDA6MzAwXSwgNSkpCisKKyAgICAgICAgIyBEZWNvbXByZXNzIHJlc3Qgb2YgZGF0YQorICAgICAgICBvdXQuYXBwZW5kKGJ6ZC5kZWNvbXByZXNzKHNlbGYuREFUQVszMDA6XSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYicnLmpvaW4ob3V0KSwgc2VsZi5URVhUKQogCiBjbGFzcyBDb21wcmVzc0RlY29tcHJlc3NUZXN0KEJhc2VUZXN0KToKICAgICBkZWYgdGVzdENvbXByZXNzKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jZ2kucHkgYi9MaWIvdGVzdC90ZXN0X2NnaS5weQppbmRleCA4OWE2ZTg0Li43MTViZDczIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NnaS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NnaS5weQpAQCAtMTg2LDkgKzE4Niw5IEBACiAgICAgICAgIGNnaS5pbml0bG9nKCIlcyIsICJUZXN0aW5nIGluaXRsb2cgMSIpCiAgICAgICAgIGNnaS5sb2coIiVzIiwgIlRlc3RpbmcgbG9nIDIiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNnaS5sb2dmcC5nZXR2YWx1ZSgpLCAiVGVzdGluZyBpbml0bG9nIDFcblRlc3RpbmcgbG9nIDJcbiIpCi0gICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKCIvZGV2L251bGwiKToKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMob3MuZGV2bnVsbCk6CiAgICAgICAgICAgICBjZ2kubG9nZnAgPSBOb25lCi0gICAgICAgICAgICBjZ2kubG9nZmlsZSA9ICIvZGV2L251bGwiCisgICAgICAgICAgICBjZ2kubG9nZmlsZSA9IG9zLmRldm51bGwKICAgICAgICAgICAgIGNnaS5pbml0bG9nKCIlcyIsICJUZXN0aW5nIGxvZyAzIikKICAgICAgICAgICAgIHNlbGYuYWRkQ2xlYW51cChjZ2kuY2xvc2Vsb2cpCiAgICAgICAgICAgICBjZ2kubG9nKCJUZXN0aW5nIGxvZyA0IikKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY21kX2xpbmUucHkgYi9MaWIvdGVzdC90ZXN0X2NtZF9saW5lLnB5CmluZGV4IGViZTU1N2UuLmFiYWYzYmIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY21kX2xpbmUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jbWRfbGluZS5weQpAQCAtMzQwLDcgKzM0MCw4IEBACiAgICAgICAgICMgSXNzdWUgIzUzMTk6IGlmIHN0ZG91dC5mbHVzaCgpIGZhaWxzIGF0IHNodXRkb3duLCBhbiBlcnJvciBzaG91bGQKICAgICAgICAgIyBiZSBwcmludGVkIG91dC4KICAgICAgICAgY29kZSA9ICIiImlmIDE6Ci0gICAgICAgICAgICBpbXBvcnQgb3MsIHN5cworICAgICAgICAgICAgaW1wb3J0IG9zLCBzeXMsIHRlc3Quc3VwcG9ydAorICAgICAgICAgICAgdGVzdC5zdXBwb3J0LlN1cHByZXNzQ3Jhc2hSZXBvcnQoKS5fX2VudGVyX18oKQogICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgneCcpCiAgICAgICAgICAgICBvcy5jbG9zZShzeXMuc3Rkb3V0LmZpbGVubygpKSIiIgogICAgICAgICByYywgb3V0LCBlcnIgPSBhc3NlcnRfcHl0aG9uX29rKCctYycsIGNvZGUpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RibV9kdW1iLnB5IGIvTGliL3Rlc3QvdGVzdF9kYm1fZHVtYi5weQppbmRleCBlZTVhMzJmLi5mZjYzYzg4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2RibV9kdW1iLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGJtX2R1bWIucHkKQEAgLTIyNSw2ICsyMjUsMTUgQEAKICAgICAgICAgd2l0aCBkdW1iZGJtLm9wZW4oX2ZuYW1lLCAnbicpIGFzIGY6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYua2V5cygpLCBbXSkKIAorICAgIGRlZiB0ZXN0X2V2YWwoc2VsZik6CisgICAgICAgIHdpdGggb3BlbihfZm5hbWUgKyAnLmRpcicsICd3JykgYXMgc3RyZWFtOgorICAgICAgICAgICAgc3RyZWFtLndyaXRlKCJzdHIocHJpbnQoJ0hhY2tlZCEnKSksIDBcbiIpCisgICAgICAgIHdpdGggc3VwcG9ydC5jYXB0dXJlZF9zdGRvdXQoKSBhcyBzdGRvdXQ6CisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgICAgIHdpdGggZHVtYmRibS5vcGVuKF9mbmFtZSkgYXMgZjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGRvdXQuZ2V0dmFsdWUoKSwgJycpCisKICAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgIF9kZWxldGVfZmlsZXMoKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RlcXVlLnB5IGIvTGliL3Rlc3QvdGVzdF9kZXF1ZS5weQppbmRleCBlMzM2ZTVhLi4wZWViYmZmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2RlcXVlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGVxdWUucHkKQEAgLTU0Miw3ICs1NDIsNyBAQAogCiAgICAgQHN1cHBvcnQuY3B5dGhvbl9vbmx5CiAgICAgZGVmIHRlc3Rfc2l6ZW9mKHNlbGYpOgotICAgICAgICBCTE9DS0xFTiA9IDYyCisgICAgICAgIEJMT0NLTEVOID0gNjQKICAgICAgICAgYmFzZXNpemUgPSBzdXBwb3J0LmNhbGNvYmpzaXplKCcyUDRubFAnKQogICAgICAgICBibG9ja3NpemUgPSBzdHJ1Y3QuY2FsY3NpemUoJzJQJWRQJyAlIEJMT0NLTEVOKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iamVjdC5fX3NpemVvZl9fKGRlcXVlKCkpLCBiYXNlc2l6ZSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZmxvYXQucHkgYi9MaWIvdGVzdC90ZXN0X2Zsb2F0LnB5CmluZGV4IGUxZTFmMDQuLjFiYWE2YTkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZmxvYXQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9mbG9hdC5weQpAQCAtNiw2ICs2LDcgQEAKIGltcG9ydCBtYXRoCiBmcm9tIG1hdGggaW1wb3J0IGlzaW5mLCBpc25hbiwgY29weXNpZ24sIGxkZXhwCiBpbXBvcnQgb3BlcmF0b3IKK2ltcG9ydCB0aW1lCiBpbXBvcnQgcmFuZG9tLCBmcmFjdGlvbnMKIAogSU5GID0gZmxvYXQoImluZiIpCkBAIC05MywxMCArOTQsNiBAQAogCiAgICAgZGVmIHRlc3RfZmxvYXRjb252ZXJzaW9uKHNlbGYpOgogICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IGNhbGxzIHRvIF9fZmxvYXRfXygpIHdvcmsgcHJvcGVybHkKLSAgICAgICAgY2xhc3MgRm9vMDoKLSAgICAgICAgICAgIGRlZiBfX2Zsb2F0X18oc2VsZik6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDQyLgotCiAgICAgICAgIGNsYXNzIEZvbzEob2JqZWN0KToKICAgICAgICAgICAgIGRlZiBfX2Zsb2F0X18oc2VsZik6CiAgICAgICAgICAgICAgICAgcmV0dXJuIDQyLgpAQCAtMTIyLDEzICsxMTksMTcgQEAKICAgICAgICAgICAgIGRlZiBfX2Zsb2F0X18oc2VsZik6CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZsb2F0KHN0cihzZWxmKSkgKyAxCiAKLSAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChmbG9hdChGb28wKCkpLCA0Mi4pCiAgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoZmxvYXQoRm9vMSgpKSwgNDIuKQogICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGZsb2F0KEZvbzIoKSksIDQyLikKICAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChmbG9hdChGb28zKDIxKSksIDQyLikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBmbG9hdCwgRm9vNCg0MikpCiAgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoZmxvYXQoRm9vU3RyKCc4JykpLCA5LikKIAorICAgICAgICBjbGFzcyBGb281OgorICAgICAgICAgICAgZGVmIF9fZmxvYXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gIiIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0aW1lLnNsZWVwLCBGb281KCkpCisKICAgICBkZWYgdGVzdF9pc19pbnRlZ2VyKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEZhbHNlKCgxLjEpLmlzX2ludGVnZXIoKSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgxLikuaXNfaW50ZWdlcigpKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9mdW5jdG9vbHMucHkgYi9MaWIvdGVzdC90ZXN0X2Z1bmN0b29scy5weQppbmRleCBmYmI0M2U0Li5jNTQ5YWM0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Z1bmN0b29scy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Z1bmN0b29scy5weQpAQCAtMTMxLDYgKzEzMSwxNiBAQAogICAgICAgICBqb2luID0gc2VsZi5wYXJ0aWFsKCcnLmpvaW4pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoam9pbihkYXRhKSwgJzAxMjM0NTY3ODknKQogCisgICAgZGVmIHRlc3RfbmVzdGVkX29wdGltaXphdGlvbihzZWxmKToKKyAgICAgICAgcGFydGlhbCA9IHNlbGYucGFydGlhbAorICAgICAgICAjIE9ubHkgInRydWUiIHBhcnRpYWwgaXMgb3B0aW1pemVkCisgICAgICAgIGlmIHBhcnRpYWwuX19uYW1lX18gIT0gJ3BhcnRpYWwnOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlubmVyID0gcGFydGlhbChzaWduYXR1cmUsICdhc2RmJykKKyAgICAgICAgbmVzdGVkID0gcGFydGlhbChpbm5lciwgYmFyPVRydWUpCisgICAgICAgIGZsYXQgPSBwYXJ0aWFsKHNpZ25hdHVyZSwgJ2FzZGYnLCBiYXI9VHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaWduYXR1cmUobmVzdGVkKSwgc2lnbmF0dXJlKGZsYXQpKQorCiAKIEB1bml0dGVzdC5za2lwVW5sZXNzKGNfZnVuY3Rvb2xzLCAncmVxdWlyZXMgdGhlIEMgX2Z1bmN0b29scyBtb2R1bGUnKQogY2xhc3MgVGVzdFBhcnRpYWxDKFRlc3RQYXJ0aWFsLCB1bml0dGVzdC5UZXN0Q2FzZSk6CkBAIC0xNTUsOSArMTY1LDkgQEAKICAgICBkZWYgdGVzdF9yZXByKHNlbGYpOgogICAgICAgICBhcmdzID0gKG9iamVjdCgpLCBvYmplY3QoKSkKICAgICAgICAgYXJnc19yZXByID0gJywgJy5qb2luKHJlcHIoYSkgZm9yIGEgaW4gYXJncykKLSAgICAgICAgI2t3YXJncyA9IHsnYSc6IG9iamVjdCgpLCAnYic6IG9iamVjdCgpfQotICAgICAgICBrd2FyZ3MgPSB7J2EnOiBvYmplY3QoKX0KLSAgICAgICAga3dhcmdzX3JlcHIgPSAnLCAnLmpvaW4oIiVzPSVyIiAlIChrLCB2KSBmb3IgaywgdiBpbiBrd2FyZ3MuaXRlbXMoKSkKKyAgICAgICAga3dhcmdzID0geydhJzogb2JqZWN0KCksICdiJzogb2JqZWN0KCl9CisgICAgICAgIGt3YXJnc19yZXBycyA9IFsnYT17YSFyfSwgYj17YiFyfScuZm9ybWF0X21hcChrd2FyZ3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2I9e2Ihcn0sIGE9e2Ehcn0nLmZvcm1hdF9tYXAoa3dhcmdzKV0KICAgICAgICAgaWYgc2VsZi5wYXJ0aWFsIGlzIGNfZnVuY3Rvb2xzLnBhcnRpYWw6CiAgICAgICAgICAgICBuYW1lID0gJ2Z1bmN0b29scy5wYXJ0aWFsJwogICAgICAgICBlbHNlOgpAQCAtMTcyLDEyICsxODIsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICByZXByKGYpKQogCiAgICAgICAgIGYgPSBzZWxmLnBhcnRpYWwoY2FwdHVyZSwgKiprd2FyZ3MpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3t9KHshcn0sIHt9KScuZm9ybWF0KG5hbWUsIGNhcHR1cmUsIGt3YXJnc19yZXByKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICByZXByKGYpKQorICAgICAgICBzZWxmLmFzc2VydEluKHJlcHIoZiksCisgICAgICAgICAgICAgICAgICAgICAgWyd7fSh7IXJ9LCB7fSknLmZvcm1hdChuYW1lLCBjYXB0dXJlLCBrd2FyZ3NfcmVwcikKKyAgICAgICAgICAgICAgICAgICAgICAgZm9yIGt3YXJnc19yZXByIGluIGt3YXJnc19yZXByc10pCiAKICAgICAgICAgZiA9IHNlbGYucGFydGlhbChjYXB0dXJlLCAqYXJncywgKiprd2FyZ3MpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3t9KHshcn0sIHt9LCB7fSknLmZvcm1hdChuYW1lLCBjYXB0dXJlLCBhcmdzX3JlcHIsIGt3YXJnc19yZXByKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICByZXByKGYpKQorICAgICAgICBzZWxmLmFzc2VydEluKHJlcHIoZiksCisgICAgICAgICAgICAgICAgICAgICAgWyd7fSh7IXJ9LCB7fSwge30pJy5mb3JtYXQobmFtZSwgY2FwdHVyZSwgYXJnc19yZXByLCBrd2FyZ3NfcmVwcikKKyAgICAgICAgICAgICAgICAgICAgICAgZm9yIGt3YXJnc19yZXByIGluIGt3YXJnc19yZXByc10pCiAKICAgICBkZWYgdGVzdF9waWNrbGUoc2VsZik6CiAgICAgICAgIGYgPSBzZWxmLnBhcnRpYWwoc2lnbmF0dXJlLCAnYXNkZicsIGJhcj1UcnVlKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9nZGIucHkgYi9MaWIvdGVzdC90ZXN0X2dkYi5weQppbmRleCBhYWE1YzY5Li5jNTc4NzVjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2dkYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2dkYi5weQpAQCAtMTkwLDYgKzE5MCw4IEBACiAgICAgICAgICAgICAnbGludXgtdmRzby5zbycsCiAgICAgICAgICAgICAnd2FybmluZzogQ291bGQgbm90IGxvYWQgc2hhcmVkIGxpYnJhcnkgc3ltYm9scyBmb3IgJwogICAgICAgICAgICAgJ2xpbnV4LWdhdGUuc28nLAorICAgICAgICAgICAgJ3dhcm5pbmc6IENvdWxkIG5vdCBsb2FkIHNoYXJlZCBsaWJyYXJ5IHN5bWJvbHMgZm9yICcKKyAgICAgICAgICAgICdsaW51eC12ZHNvNjQuc28nLAogICAgICAgICAgICAgJ0RvIHlvdSBuZWVkICJzZXQgc29saWItc2VhcmNoLXBhdGgiIG9yICcKICAgICAgICAgICAgICcic2V0IHN5c3Jvb3QiPycsCiAgICAgICAgICAgICAnd2FybmluZzogU291cmNlIGZpbGUgaXMgbW9yZSByZWNlbnQgdGhhbiBleGVjdXRhYmxlLicsCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2dldGFyZ3MyLnB5IGIvTGliL3Rlc3QvdGVzdF9nZXRhcmdzMi5weQppbmRleCBjZjEyNzlkLi43MTQ3MmNkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2dldGFyZ3MyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZ2V0YXJnczIucHkKQEAgLTM0LDggKzM0LDggQEAKICMgPiAqKiBDaGFuZ2VkIGZyb20gcHJldmlvdXMgInJhbmdlLWFuZC1hLWhhbGYiIHRvICJub25lIjsgdGhlCiAjID4gcmFuZ2UtYW5kLWEtaGFsZiBjaGVja2luZyB3YXNuJ3QgcGFydGljdWxhcmx5IHVzZWZ1bC4KICMKLSMgUGx1cyBhIEMgQVBJIG9yIHR3bywgZS5nLiBQeUludF9Bc0xvbmdNYXNrKCkgLT4KLSMgdW5zaWduZWQgbG9uZyBhbmQgUHlJbnRfQXNMb25nTG9uZ01hc2soKSAtPiB1bnNpZ25lZAorIyBQbHVzIGEgQyBBUEkgb3IgdHdvLCBlLmcuIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ01hc2soKSAtPgorIyB1bnNpZ25lZCBsb25nIGFuZCBQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nTWFzaygpIC0+IHVuc2lnbmVkCiAjIGxvbmcgbG9uZyAoaWYgdGhhdCBleGlzdHMpLgogCiBMQVJHRSA9IDB4N0ZGRkZGRkYKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaHR0cGxpYi5weSBiL0xpYi90ZXN0L3Rlc3RfaHR0cGxpYi5weQppbmRleCA0MGVmMjUwLi45YzE1NTBlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2h0dHBsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9odHRwbGliLnB5CkBAIC05MjAsMTAgKzkyMCw4NiBAQAogICAgICAgICAgICAgc2VsZi5yZW1haW5kZXIgPSBiIiIuam9pbihkYXRhKQogICAgICAgICAgICAgcmFpc2UKIAorCiBjbGFzcyBPZmZsaW5lVGVzdChUZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfYWxsKHNlbGYpOgorICAgICAgICAjIERvY3VtZW50ZWQgb2JqZWN0cyBkZWZpbmVkIGluIHRoZSBtb2R1bGUgc2hvdWxkIGJlIGluIF9fYWxsX18KKyAgICAgICAgZXhwZWN0ZWQgPSB7InJlc3BvbnNlcyJ9ICAjIFdoaXRlLWxpc3QgZG9jdW1lbnRlZCBkaWN0KCkgb2JqZWN0CisgICAgICAgICMgSFRUUE1lc3NhZ2UsIHBhcnNlX2hlYWRlcnMoKSwgYW5kIHRoZSBIVFRQIHN0YXR1cyBjb2RlIGNvbnN0YW50cyBhcmUKKyAgICAgICAgIyBpbnRlbnRpb25hbGx5IG9taXR0ZWQgZm9yIHNpbXBsaWNpdHkKKyAgICAgICAgYmxhY2tsaXN0ID0geyJIVFRQTWVzc2FnZSIsICJwYXJzZV9oZWFkZXJzIn0KKyAgICAgICAgZm9yIG5hbWUgaW4gZGlyKGNsaWVudCk6CisgICAgICAgICAgICBpZiBuYW1lIGluIGJsYWNrbGlzdDoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgbW9kdWxlX29iamVjdCA9IGdldGF0dHIoY2xpZW50LCBuYW1lKQorICAgICAgICAgICAgaWYgZ2V0YXR0cihtb2R1bGVfb2JqZWN0LCAiX19tb2R1bGVfXyIsIE5vbmUpID09ICJodHRwLmNsaWVudCI6CisgICAgICAgICAgICAgICAgZXhwZWN0ZWQuYWRkKG5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0Q291bnRFcXVhbChjbGllbnQuX19hbGxfXywgZXhwZWN0ZWQpCisKICAgICBkZWYgdGVzdF9yZXNwb25zZXMoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2xpZW50LnJlc3BvbnNlc1tjbGllbnQuTk9UX0ZPVU5EXSwgIk5vdCBGb3VuZCIpCiAKKyAgICBkZWYgdGVzdF9jbGllbnRfY29uc3RhbnRzKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSB3ZSBkb24ndCBicmVhayBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggMy40CisgICAgICAgIGV4cGVjdGVkID0gWworICAgICAgICAgICAgJ0NPTlRJTlVFJywKKyAgICAgICAgICAgICdTV0lUQ0hJTkdfUFJPVE9DT0xTJywKKyAgICAgICAgICAgICdQUk9DRVNTSU5HJywKKyAgICAgICAgICAgICdPSycsCisgICAgICAgICAgICAnQ1JFQVRFRCcsCisgICAgICAgICAgICAnQUNDRVBURUQnLAorICAgICAgICAgICAgJ05PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OJywKKyAgICAgICAgICAgICdOT19DT05URU5UJywKKyAgICAgICAgICAgICdSRVNFVF9DT05URU5UJywKKyAgICAgICAgICAgICdQQVJUSUFMX0NPTlRFTlQnLAorICAgICAgICAgICAgJ01VTFRJX1NUQVRVUycsCisgICAgICAgICAgICAnSU1fVVNFRCcsCisgICAgICAgICAgICAnTVVMVElQTEVfQ0hPSUNFUycsCisgICAgICAgICAgICAnTU9WRURfUEVSTUFORU5UTFknLAorICAgICAgICAgICAgJ0ZPVU5EJywKKyAgICAgICAgICAgICdTRUVfT1RIRVInLAorICAgICAgICAgICAgJ05PVF9NT0RJRklFRCcsCisgICAgICAgICAgICAnVVNFX1BST1hZJywKKyAgICAgICAgICAgICdURU1QT1JBUllfUkVESVJFQ1QnLAorICAgICAgICAgICAgJ0JBRF9SRVFVRVNUJywKKyAgICAgICAgICAgICdVTkFVVEhPUklaRUQnLAorICAgICAgICAgICAgJ1BBWU1FTlRfUkVRVUlSRUQnLAorICAgICAgICAgICAgJ0ZPUkJJRERFTicsCisgICAgICAgICAgICAnTk9UX0ZPVU5EJywKKyAgICAgICAgICAgICdNRVRIT0RfTk9UX0FMTE9XRUQnLAorICAgICAgICAgICAgJ05PVF9BQ0NFUFRBQkxFJywKKyAgICAgICAgICAgICdQUk9YWV9BVVRIRU5USUNBVElPTl9SRVFVSVJFRCcsCisgICAgICAgICAgICAnUkVRVUVTVF9USU1FT1VUJywKKyAgICAgICAgICAgICdDT05GTElDVCcsCisgICAgICAgICAgICAnR09ORScsCisgICAgICAgICAgICAnTEVOR1RIX1JFUVVJUkVEJywKKyAgICAgICAgICAgICdQUkVDT05ESVRJT05fRkFJTEVEJywKKyAgICAgICAgICAgICdSRVFVRVNUX0VOVElUWV9UT09fTEFSR0UnLAorICAgICAgICAgICAgJ1JFUVVFU1RfVVJJX1RPT19MT05HJywKKyAgICAgICAgICAgICdVTlNVUFBPUlRFRF9NRURJQV9UWVBFJywKKyAgICAgICAgICAgICdSRVFVRVNURURfUkFOR0VfTk9UX1NBVElTRklBQkxFJywKKyAgICAgICAgICAgICdFWFBFQ1RBVElPTl9GQUlMRUQnLAorICAgICAgICAgICAgJ1VOUFJPQ0VTU0FCTEVfRU5USVRZJywKKyAgICAgICAgICAgICdMT0NLRUQnLAorICAgICAgICAgICAgJ0ZBSUxFRF9ERVBFTkRFTkNZJywKKyAgICAgICAgICAgICdVUEdSQURFX1JFUVVJUkVEJywKKyAgICAgICAgICAgICdQUkVDT05ESVRJT05fUkVRVUlSRUQnLAorICAgICAgICAgICAgJ1RPT19NQU5ZX1JFUVVFU1RTJywKKyAgICAgICAgICAgICdSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFJywKKyAgICAgICAgICAgICdJTlRFUk5BTF9TRVJWRVJfRVJST1InLAorICAgICAgICAgICAgJ05PVF9JTVBMRU1FTlRFRCcsCisgICAgICAgICAgICAnQkFEX0dBVEVXQVknLAorICAgICAgICAgICAgJ1NFUlZJQ0VfVU5BVkFJTEFCTEUnLAorICAgICAgICAgICAgJ0dBVEVXQVlfVElNRU9VVCcsCisgICAgICAgICAgICAnSFRUUF9WRVJTSU9OX05PVF9TVVBQT1JURUQnLAorICAgICAgICAgICAgJ0lOU1VGRklDSUVOVF9TVE9SQUdFJywKKyAgICAgICAgICAgICdOT1RfRVhURU5ERUQnLAorICAgICAgICAgICAgJ05FVFdPUktfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQnLAorICAgICAgICBdCisgICAgICAgIGZvciBjb25zdCBpbiBleHBlY3RlZDoKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KGNvbnN0YW50PWNvbnN0KToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihjbGllbnQsIGNvbnN0KSkKKwogCiBjbGFzcyBTb3VyY2VBZGRyZXNzVGVzdChUZXN0Q2FzZSk6CiAgICAgZGVmIHNldFVwKHNlbGYpOgpAQCAtMTAzNyw2ICsxMTEzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ9Y29udGV4dCkKICAgICAgICAgICAgIGgucmVxdWVzdCgnR0VUJywgJy8nKQogICAgICAgICAgICAgcmVzcCA9IGguZ2V0cmVzcG9uc2UoKQorICAgICAgICAgICAgaC5jbG9zZSgpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEluKCduZ2lueCcsIHJlc3AuZ2V0aGVhZGVyKCdzZXJ2ZXInKSkKIAogICAgIEBzdXBwb3J0LnN5c3RlbV9tdXN0X3ZhbGlkYXRlX2NlcnQKQEAgLTEwNDgsNiArMTEyNSw3IEBACiAgICAgICAgICAgICBoLnJlcXVlc3QoJ0dFVCcsICcvJykKICAgICAgICAgICAgIHJlc3AgPSBoLmdldHJlc3BvbnNlKCkKICAgICAgICAgICAgIGNvbnRlbnRfdHlwZSA9IHJlc3AuZ2V0aGVhZGVyKCdjb250ZW50LXR5cGUnKQorICAgICAgICAgICAgaC5jbG9zZSgpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEluKCd0ZXh0L2h0bWwnLCBjb250ZW50X3R5cGUpCiAKICAgICBkZWYgdGVzdF9uZXR3b3JrZWRfZ29vZF9jZXJ0KHNlbGYpOgpAQCAtMTA2Miw2ICsxMTQwLDcgQEAKICAgICAgICAgICAgIGgucmVxdWVzdCgnR0VUJywgJy8nKQogICAgICAgICAgICAgcmVzcCA9IGguZ2V0cmVzcG9uc2UoKQogICAgICAgICAgICAgc2VydmVyX3N0cmluZyA9IHJlc3AuZ2V0aGVhZGVyKCdzZXJ2ZXInKQorICAgICAgICAgICAgaC5jbG9zZSgpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEluKCduZ2lueCcsIHNlcnZlcl9zdHJpbmcpCiAKICAgICBkZWYgdGVzdF9uZXR3b3JrZWRfYmFkX2NlcnQoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2h0dHBzZXJ2ZXJzLnB5IGIvTGliL3Rlc3QvdGVzdF9odHRwc2VydmVycy5weQppbmRleCA1NjkzNDFkLi5mY2RmZTUxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2h0dHBzZXJ2ZXJzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaHR0cHNlcnZlcnMucHkKQEAgLTYsNyArNiw3IEBACiAKIGZyb20gaHR0cC5zZXJ2ZXIgaW1wb3J0IEJhc2VIVFRQUmVxdWVzdEhhbmRsZXIsIEhUVFBTZXJ2ZXIsIFwKICAgICAgU2ltcGxlSFRUUFJlcXVlc3RIYW5kbGVyLCBDR0lIVFRQUmVxdWVzdEhhbmRsZXIKLWZyb20gaHR0cCBpbXBvcnQgc2VydmVyCitmcm9tIGh0dHAgaW1wb3J0IHNlcnZlciwgSFRUUFN0YXR1cwogCiBpbXBvcnQgb3MKIGltcG9ydCBzeXMKQEAgLTc5LDEzICs3OSwxMyBAQAogICAgICAgICBkZWZhdWx0X3JlcXVlc3RfdmVyc2lvbiA9ICdIVFRQLzEuMScKIAogICAgICAgICBkZWYgZG9fVEVTVChzZWxmKToKLSAgICAgICAgICAgIHNlbGYuc2VuZF9yZXNwb25zZSgyMDQpCisgICAgICAgICAgICBzZWxmLnNlbmRfcmVzcG9uc2UoSFRUUFN0YXR1cy5OT19DT05URU5UKQogICAgICAgICAgICAgc2VsZi5zZW5kX2hlYWRlcignQ29udGVudC1UeXBlJywgJ3RleHQvaHRtbCcpCiAgICAgICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCdDb25uZWN0aW9uJywgJ2Nsb3NlJykKICAgICAgICAgICAgIHNlbGYuZW5kX2hlYWRlcnMoKQogCiAgICAgICAgIGRlZiBkb19LRUVQKHNlbGYpOgotICAgICAgICAgICAgc2VsZi5zZW5kX3Jlc3BvbnNlKDIwNCkKKyAgICAgICAgICAgIHNlbGYuc2VuZF9yZXNwb25zZShIVFRQU3RhdHVzLk5PX0NPTlRFTlQpCiAgICAgICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCdDb250ZW50LVR5cGUnLCAndGV4dC9odG1sJykKICAgICAgICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoJ0Nvbm5lY3Rpb24nLCAna2VlcC1hbGl2ZScpCiAgICAgICAgICAgICBzZWxmLmVuZF9oZWFkZXJzKCkKQEAgLTk0LDcgKzk0LDcgQEAKICAgICAgICAgICAgIHNlbGYuc2VuZF9lcnJvcig5OTkpCiAKICAgICAgICAgZGVmIGRvX05PVEZPVU5EKHNlbGYpOgotICAgICAgICAgICAgc2VsZi5zZW5kX2Vycm9yKDQwNCkKKyAgICAgICAgICAgIHNlbGYuc2VuZF9lcnJvcihIVFRQU3RhdHVzLk5PVF9GT1VORCkKIAogICAgICAgICBkZWYgZG9fRVhQTEFJTkVSUk9SKHNlbGYpOgogICAgICAgICAgICAgc2VsZi5zZW5kX2Vycm9yKDk5OSwgIlNob3J0IE1lc3NhZ2UiLApAQCAtMTIyLDM1ICsxMjIsMzUgQEAKICAgICBkZWYgdGVzdF9jb21tYW5kKHNlbGYpOgogICAgICAgICBzZWxmLmNvbi5yZXF1ZXN0KCdHRVQnLCAnLycpCiAgICAgICAgIHJlcyA9IHNlbGYuY29uLmdldHJlc3BvbnNlKCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMuc3RhdHVzLCA1MDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLnN0YXR1cywgSFRUUFN0YXR1cy5OT1RfSU1QTEVNRU5URUQpCiAKICAgICBkZWYgdGVzdF9yZXF1ZXN0X2xpbmVfdHJpbW1pbmcoc2VsZik6CiAgICAgICAgIHNlbGYuY29uLl9odHRwX3Zzbl9zdHIgPSAnSFRUUC8xLjFcbicKICAgICAgICAgc2VsZi5jb24ucHV0cmVxdWVzdCgnWFlaQk9HVVMnLCAnLycpCiAgICAgICAgIHNlbGYuY29uLmVuZGhlYWRlcnMoKQogICAgICAgICByZXMgPSBzZWxmLmNvbi5nZXRyZXNwb25zZSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLnN0YXR1cywgNTAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcy5zdGF0dXMsIEhUVFBTdGF0dXMuTk9UX0lNUExFTUVOVEVEKQogCiAgICAgZGVmIHRlc3RfdmVyc2lvbl9ib2d1cyhzZWxmKToKICAgICAgICAgc2VsZi5jb24uX2h0dHBfdnNuX3N0ciA9ICdGVUJBUicKICAgICAgICAgc2VsZi5jb24ucHV0cmVxdWVzdCgnR0VUJywgJy8nKQogICAgICAgICBzZWxmLmNvbi5lbmRoZWFkZXJzKCkKICAgICAgICAgcmVzID0gc2VsZi5jb24uZ2V0cmVzcG9uc2UoKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcy5zdGF0dXMsIDQwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMuc3RhdHVzLCBIVFRQU3RhdHVzLkJBRF9SRVFVRVNUKQogCiAgICAgZGVmIHRlc3RfdmVyc2lvbl9kaWdpdHMoc2VsZik6CiAgICAgICAgIHNlbGYuY29uLl9odHRwX3Zzbl9zdHIgPSAnSFRUUC85LjkuOScKICAgICAgICAgc2VsZi5jb24ucHV0cmVxdWVzdCgnR0VUJywgJy8nKQogICAgICAgICBzZWxmLmNvbi5lbmRoZWFkZXJzKCkKICAgICAgICAgcmVzID0gc2VsZi5jb24uZ2V0cmVzcG9uc2UoKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcy5zdGF0dXMsIDQwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMuc3RhdHVzLCBIVFRQU3RhdHVzLkJBRF9SRVFVRVNUKQogCiAgICAgZGVmIHRlc3RfdmVyc2lvbl9ub25lX2dldChzZWxmKToKICAgICAgICAgc2VsZi5jb24uX2h0dHBfdnNuX3N0ciA9ICcnCiAgICAgICAgIHNlbGYuY29uLnB1dHJlcXVlc3QoJ0dFVCcsICcvJykKICAgICAgICAgc2VsZi5jb24uZW5kaGVhZGVycygpCiAgICAgICAgIHJlcyA9IHNlbGYuY29uLmdldHJlc3BvbnNlKCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMuc3RhdHVzLCA1MDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLnN0YXR1cywgSFRUUFN0YXR1cy5OT1RfSU1QTEVNRU5URUQpCiAKICAgICBkZWYgdGVzdF92ZXJzaW9uX25vbmUoc2VsZik6CiAgICAgICAgICMgVGVzdCB0aGF0IGEgdmFsaWQgbWV0aG9kIGlzIHJlamVjdGVkIHdoZW4gbm90IEhUVFAvMS54CkBAIC0xNTgsNyArMTU4LDcgQEAKICAgICAgICAgc2VsZi5jb24ucHV0cmVxdWVzdCgnQ1VTVE9NJywgJy8nKQogICAgICAgICBzZWxmLmNvbi5lbmRoZWFkZXJzKCkKICAgICAgICAgcmVzID0gc2VsZi5jb24uZ2V0cmVzcG9uc2UoKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcy5zdGF0dXMsIDQwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMuc3RhdHVzLCBIVFRQU3RhdHVzLkJBRF9SRVFVRVNUKQogCiAgICAgZGVmIHRlc3RfdmVyc2lvbl9pbnZhbGlkKHNlbGYpOgogICAgICAgICBzZWxmLmNvbi5faHR0cF92c24gPSA5OQpAQCAtMTY2LDIxICsxNjYsMjEgQEAKICAgICAgICAgc2VsZi5jb24ucHV0cmVxdWVzdCgnR0VUJywgJy8nKQogICAgICAgICBzZWxmLmNvbi5lbmRoZWFkZXJzKCkKICAgICAgICAgcmVzID0gc2VsZi5jb24uZ2V0cmVzcG9uc2UoKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcy5zdGF0dXMsIDUwNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMuc3RhdHVzLCBIVFRQU3RhdHVzLkhUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVEKQogCiAgICAgZGVmIHRlc3Rfc2VuZF9ibGFuayhzZWxmKToKICAgICAgICAgc2VsZi5jb24uX2h0dHBfdnNuX3N0ciA9ICcnCiAgICAgICAgIHNlbGYuY29uLnB1dHJlcXVlc3QoJycsICcnKQogICAgICAgICBzZWxmLmNvbi5lbmRoZWFkZXJzKCkKICAgICAgICAgcmVzID0gc2VsZi5jb24uZ2V0cmVzcG9uc2UoKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcy5zdGF0dXMsIDQwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMuc3RhdHVzLCBIVFRQU3RhdHVzLkJBRF9SRVFVRVNUKQogCiAgICAgZGVmIHRlc3RfaGVhZGVyX2Nsb3NlKHNlbGYpOgogICAgICAgICBzZWxmLmNvbi5wdXRyZXF1ZXN0KCdHRVQnLCAnLycpCiAgICAgICAgIHNlbGYuY29uLnB1dGhlYWRlcignQ29ubmVjdGlvbicsICdjbG9zZScpCiAgICAgICAgIHNlbGYuY29uLmVuZGhlYWRlcnMoKQogICAgICAgICByZXMgPSBzZWxmLmNvbi5nZXRyZXNwb25zZSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLnN0YXR1cywgNTAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcy5zdGF0dXMsIEhUVFBTdGF0dXMuTk9UX0lNUExFTUVOVEVEKQogCiAgICAgZGVmIHRlc3RfaGVhZF9rZWVwX2FsaXZlKHNlbGYpOgogICAgICAgICBzZWxmLmNvbi5faHR0cF92c25fc3RyID0gJ0hUVFAvMS4xJwpAQCAtMTg4LDEyICsxODgsMTIgQEAKICAgICAgICAgc2VsZi5jb24ucHV0aGVhZGVyKCdDb25uZWN0aW9uJywgJ2tlZXAtYWxpdmUnKQogICAgICAgICBzZWxmLmNvbi5lbmRoZWFkZXJzKCkKICAgICAgICAgcmVzID0gc2VsZi5jb24uZ2V0cmVzcG9uc2UoKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcy5zdGF0dXMsIDUwMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMuc3RhdHVzLCBIVFRQU3RhdHVzLk5PVF9JTVBMRU1FTlRFRCkKIAogICAgIGRlZiB0ZXN0X2hhbmRsZXIoc2VsZik6CiAgICAgICAgIHNlbGYuY29uLnJlcXVlc3QoJ1RFU1QnLCAnLycpCiAgICAgICAgIHJlcyA9IHNlbGYuY29uLmdldHJlc3BvbnNlKCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMuc3RhdHVzLCAyMDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLnN0YXR1cywgSFRUUFN0YXR1cy5OT19DT05URU5UKQogCiAgICAgZGVmIHRlc3RfcmV0dXJuX2hlYWRlcl9rZWVwX2FsaXZlKHNlbGYpOgogICAgICAgICBzZWxmLmNvbi5yZXF1ZXN0KCdLRUVQJywgJy8nKQpAQCAtMjMwLDExICsyMzAsNDggQEAKICAgICAgICAgIyBJc3N1ZSAjMTYwODg6IHN0YW5kYXJkIGVycm9yIHJlc3BvbnNlcyBzaG91bGQgaGF2ZSBhIGNvbnRlbnQtbGVuZ3RoCiAgICAgICAgIHNlbGYuY29uLnJlcXVlc3QoJ05PVEZPVU5EJywgJy8nKQogICAgICAgICByZXMgPSBzZWxmLmNvbi5nZXRyZXNwb25zZSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLnN0YXR1cywgNDA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcy5zdGF0dXMsIEhUVFBTdGF0dXMuTk9UX0ZPVU5EKQorCiAgICAgICAgIGRhdGEgPSByZXMucmVhZCgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KHJlcy5nZXRoZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoJykpLCBsZW4oZGF0YSkpCiAKIAorY2xhc3MgUmVxdWVzdEhhbmRsZXJMb2dnaW5nVGVzdENhc2UoQmFzZVRlc3RDYXNlKToKKyAgICBjbGFzcyByZXF1ZXN0X2hhbmRsZXIoQmFzZUhUVFBSZXF1ZXN0SGFuZGxlcik6CisgICAgICAgIHByb3RvY29sX3ZlcnNpb24gPSAnSFRUUC8xLjEnCisgICAgICAgIGRlZmF1bHRfcmVxdWVzdF92ZXJzaW9uID0gJ0hUVFAvMS4xJworCisgICAgICAgIGRlZiBkb19HRVQoc2VsZik6CisgICAgICAgICAgICBzZWxmLnNlbmRfcmVzcG9uc2UoSFRUUFN0YXR1cy5PSykKKyAgICAgICAgICAgIHNlbGYuZW5kX2hlYWRlcnMoKQorCisgICAgICAgIGRlZiBkb19FUlJPUihzZWxmKToKKyAgICAgICAgICAgIHNlbGYuc2VuZF9lcnJvcihIVFRQU3RhdHVzLk5PVF9GT1VORCwgJ0ZpbGUgbm90IGZvdW5kJykKKworICAgIGRlZiB0ZXN0X2dldChzZWxmKToKKyAgICAgICAgc2VsZi5jb24gPSBodHRwLmNsaWVudC5IVFRQQ29ubmVjdGlvbihzZWxmLkhPU1QsIHNlbGYuUE9SVCkKKyAgICAgICAgc2VsZi5jb24uY29ubmVjdCgpCisKKyAgICAgICAgd2l0aCBzdXBwb3J0LmNhcHR1cmVkX3N0ZGVycigpIGFzIGVycjoKKyAgICAgICAgICAgIHNlbGYuY29uLnJlcXVlc3QoJ0dFVCcsICcvJykKKyAgICAgICAgICAgIHNlbGYuY29uLmdldHJlc3BvbnNlKCkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICBlcnIuZ2V0dmFsdWUoKS5lbmRzd2l0aCgnIkdFVCAvIEhUVFAvMS4xIiAyMDAgLVxuJykpCisKKyAgICBkZWYgdGVzdF9lcnIoc2VsZik6CisgICAgICAgIHNlbGYuY29uID0gaHR0cC5jbGllbnQuSFRUUENvbm5lY3Rpb24oc2VsZi5IT1NULCBzZWxmLlBPUlQpCisgICAgICAgIHNlbGYuY29uLmNvbm5lY3QoKQorCisgICAgICAgIHdpdGggc3VwcG9ydC5jYXB0dXJlZF9zdGRlcnIoKSBhcyBlcnI6CisgICAgICAgICAgICBzZWxmLmNvbi5yZXF1ZXN0KCdFUlJPUicsICcvJykKKyAgICAgICAgICAgIHNlbGYuY29uLmdldHJlc3BvbnNlKCkKKworICAgICAgICBsaW5lcyA9IGVyci5nZXR2YWx1ZSgpLnNwbGl0KCdcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsaW5lc1swXS5lbmRzd2l0aCgnY29kZSA0MDQsIG1lc3NhZ2UgRmlsZSBub3QgZm91bmQnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxpbmVzWzFdLmVuZHN3aXRoKCciRVJST1IgLyBIVFRQLzEuMSIgNDA0IC0nKSkKKworCiBjbGFzcyBTaW1wbGVIVFRQU2VydmVyVGVzdENhc2UoQmFzZVRlc3RDYXNlKToKICAgICBjbGFzcyByZXF1ZXN0X2hhbmRsZXIoTm9Mb2dSZXF1ZXN0SGFuZGxlciwgU2ltcGxlSFRUUFJlcXVlc3RIYW5kbGVyKToKICAgICAgICAgcGFzcwpAQCAtMjg1LDUyICszMjIsNTIgQEAKICAgICAgICAgICAgICAgICBpZiBuYW1lICE9ICd0ZXN0JzogIyBJZ25vcmUgYSBmaWxlbmFtZSBjcmVhdGVkIGluIHNldFVwKCkuCiAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gbmFtZQogICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICBib2R5ID0gc2VsZi5jaGVja19zdGF0dXNfYW5kX3JlYXNvbihyZXNwb25zZSwgMjAwKQorICAgICAgICBib2R5ID0gc2VsZi5jaGVja19zdGF0dXNfYW5kX3JlYXNvbihyZXNwb25zZSwgSFRUUFN0YXR1cy5PSykKICAgICAgICAgcXVvdGVkbmFtZSA9IHVybGxpYi5wYXJzZS5xdW90ZShmaWxlbmFtZSwgZXJyb3JzPSdzdXJyb2dhdGVwYXNzJykKICAgICAgICAgc2VsZi5hc3NlcnRJbigoJ2hyZWY9IiVzIicgJSBxdW90ZWRuYW1lKQogICAgICAgICAgICAgICAgICAgICAgIC5lbmNvZGUoZW5jLCAnc3Vycm9nYXRlZXNjYXBlJyksIGJvZHkpCiAgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCc+JXM8JyAlIGh0bWwuZXNjYXBlKGZpbGVuYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAuZW5jb2RlKGVuYywgJ3N1cnJvZ2F0ZWVzY2FwZScpLCBib2R5KQogICAgICAgICByZXNwb25zZSA9IHNlbGYucmVxdWVzdChzZWxmLnRlbXBkaXJfbmFtZSArICcvJyArIHF1b3RlZG5hbWUpCi0gICAgICAgIHNlbGYuY2hlY2tfc3RhdHVzX2FuZF9yZWFzb24ocmVzcG9uc2UsIDIwMCwKKyAgICAgICAgc2VsZi5jaGVja19zdGF0dXNfYW5kX3JlYXNvbihyZXNwb25zZSwgSFRUUFN0YXR1cy5PSywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhPXN1cHBvcnQuVEVTVEZOX1VOREVDT0RBQkxFKQogCiAgICAgZGVmIHRlc3RfZ2V0KHNlbGYpOgogICAgICAgICAjY29uc3RydWN0cyB0aGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlIEhUVFBTZXJ2ZXIKICAgICAgICAgcmVzcG9uc2UgPSBzZWxmLnJlcXVlc3Qoc2VsZi50ZW1wZGlyX25hbWUgKyAnL3Rlc3QnKQotICAgICAgICBzZWxmLmNoZWNrX3N0YXR1c19hbmRfcmVhc29uKHJlc3BvbnNlLCAyMDAsIGRhdGE9c2VsZi5kYXRhKQorICAgICAgICBzZWxmLmNoZWNrX3N0YXR1c19hbmRfcmVhc29uKHJlc3BvbnNlLCBIVFRQU3RhdHVzLk9LLCBkYXRhPXNlbGYuZGF0YSkKICAgICAgICAgIyBjaGVjayBmb3IgdHJhaWxpbmcgIi8iIHdoaWNoIHNob3VsZCByZXR1cm4gNDA0LiBTZWUgSXNzdWUxNzMyNAogICAgICAgICByZXNwb25zZSA9IHNlbGYucmVxdWVzdChzZWxmLnRlbXBkaXJfbmFtZSArICcvdGVzdC8nKQotICAgICAgICBzZWxmLmNoZWNrX3N0YXR1c19hbmRfcmVhc29uKHJlc3BvbnNlLCA0MDQpCisgICAgICAgIHNlbGYuY2hlY2tfc3RhdHVzX2FuZF9yZWFzb24ocmVzcG9uc2UsIEhUVFBTdGF0dXMuTk9UX0ZPVU5EKQogICAgICAgICByZXNwb25zZSA9IHNlbGYucmVxdWVzdChzZWxmLnRlbXBkaXJfbmFtZSArICcvJykKLSAgICAgICAgc2VsZi5jaGVja19zdGF0dXNfYW5kX3JlYXNvbihyZXNwb25zZSwgMjAwKQorICAgICAgICBzZWxmLmNoZWNrX3N0YXR1c19hbmRfcmVhc29uKHJlc3BvbnNlLCBIVFRQU3RhdHVzLk9LKQogICAgICAgICByZXNwb25zZSA9IHNlbGYucmVxdWVzdChzZWxmLnRlbXBkaXJfbmFtZSkKLSAgICAgICAgc2VsZi5jaGVja19zdGF0dXNfYW5kX3JlYXNvbihyZXNwb25zZSwgMzAxKQorICAgICAgICBzZWxmLmNoZWNrX3N0YXR1c19hbmRfcmVhc29uKHJlc3BvbnNlLCBIVFRQU3RhdHVzLk1PVkVEX1BFUk1BTkVOVExZKQogICAgICAgICByZXNwb25zZSA9IHNlbGYucmVxdWVzdChzZWxmLnRlbXBkaXJfbmFtZSArICcvP2hpPTInKQotICAgICAgICBzZWxmLmNoZWNrX3N0YXR1c19hbmRfcmVhc29uKHJlc3BvbnNlLCAyMDApCisgICAgICAgIHNlbGYuY2hlY2tfc3RhdHVzX2FuZF9yZWFzb24ocmVzcG9uc2UsIEhUVFBTdGF0dXMuT0spCiAgICAgICAgIHJlc3BvbnNlID0gc2VsZi5yZXF1ZXN0KHNlbGYudGVtcGRpcl9uYW1lICsgJz9oaT0xJykKLSAgICAgICAgc2VsZi5jaGVja19zdGF0dXNfYW5kX3JlYXNvbihyZXNwb25zZSwgMzAxKQorICAgICAgICBzZWxmLmNoZWNrX3N0YXR1c19hbmRfcmVhc29uKHJlc3BvbnNlLCBIVFRQU3RhdHVzLk1PVkVEX1BFUk1BTkVOVExZKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3BvbnNlLmdldGhlYWRlcigiTG9jYXRpb24iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRlbXBkaXJfbmFtZSArICIvP2hpPTEiKQogICAgICAgICByZXNwb25zZSA9IHNlbGYucmVxdWVzdCgnL1RoaXNEb2VzTm90RXhpc3QnKQotICAgICAgICBzZWxmLmNoZWNrX3N0YXR1c19hbmRfcmVhc29uKHJlc3BvbnNlLCA0MDQpCisgICAgICAgIHNlbGYuY2hlY2tfc3RhdHVzX2FuZF9yZWFzb24ocmVzcG9uc2UsIEhUVFBTdGF0dXMuTk9UX0ZPVU5EKQogICAgICAgICByZXNwb25zZSA9IHNlbGYucmVxdWVzdCgnLycgKyAnVGhpc0RvZXNOb3RFeGlzdCcgKyAnLycpCi0gICAgICAgIHNlbGYuY2hlY2tfc3RhdHVzX2FuZF9yZWFzb24ocmVzcG9uc2UsIDQwNCkKKyAgICAgICAgc2VsZi5jaGVja19zdGF0dXNfYW5kX3JlYXNvbihyZXNwb25zZSwgSFRUUFN0YXR1cy5OT1RfRk9VTkQpCiAgICAgICAgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4oc2VsZi50ZW1wZGlyX25hbWUsICdpbmRleC5odG1sJyksICd3JykgYXMgZjoKICAgICAgICAgICAgIHJlc3BvbnNlID0gc2VsZi5yZXF1ZXN0KCcvJyArIHNlbGYudGVtcGRpcl9uYW1lICsgJy8nKQotICAgICAgICAgICAgc2VsZi5jaGVja19zdGF0dXNfYW5kX3JlYXNvbihyZXNwb25zZSwgMjAwKQorICAgICAgICAgICAgc2VsZi5jaGVja19zdGF0dXNfYW5kX3JlYXNvbihyZXNwb25zZSwgSFRUUFN0YXR1cy5PSykKICAgICAgICAgICAgICMgY2htb2QoKSBkb2Vzbid0IHdvcmsgYXMgZXhwZWN0ZWQgb24gV2luZG93cywgYW5kIGZpbGVzeXN0ZW0KICAgICAgICAgICAgICMgcGVybWlzc2lvbnMgYXJlIGlnbm9yZWQgYnkgcm9vdCBvbiBVbml4LgogICAgICAgICAgICAgaWYgb3MubmFtZSA9PSAncG9zaXgnIGFuZCBvcy5nZXRldWlkKCkgIT0gMDoKICAgICAgICAgICAgICAgICBvcy5jaG1vZChzZWxmLnRlbXBkaXIsIDApCiAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBzZWxmLnJlcXVlc3Qoc2VsZi50ZW1wZGlyX25hbWUgKyAnLycpCi0gICAgICAgICAgICAgICAgc2VsZi5jaGVja19zdGF0dXNfYW5kX3JlYXNvbihyZXNwb25zZSwgNDA0KQorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfc3RhdHVzX2FuZF9yZWFzb24ocmVzcG9uc2UsIEhUVFBTdGF0dXMuTk9UX0ZPVU5EKQogICAgICAgICAgICAgICAgIG9zLmNobW9kKHNlbGYudGVtcGRpciwgMG83NTUpCiAKICAgICBkZWYgdGVzdF9oZWFkKHNlbGYpOgogICAgICAgICByZXNwb25zZSA9IHNlbGYucmVxdWVzdCgKICAgICAgICAgICAgIHNlbGYudGVtcGRpcl9uYW1lICsgJy90ZXN0JywgbWV0aG9kPSdIRUFEJykKLSAgICAgICAgc2VsZi5jaGVja19zdGF0dXNfYW5kX3JlYXNvbihyZXNwb25zZSwgMjAwKQorICAgICAgICBzZWxmLmNoZWNrX3N0YXR1c19hbmRfcmVhc29uKHJlc3BvbnNlLCBIVFRQU3RhdHVzLk9LKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3BvbnNlLmdldGhlYWRlcignY29udGVudC1sZW5ndGgnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIobGVuKHNlbGYuZGF0YSkpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3BvbnNlLmdldGhlYWRlcignY29udGVudC10eXBlJyksCkBAIC0zMzgsMTIgKzM3NSwxMiBAQAogCiAgICAgZGVmIHRlc3RfaW52YWxpZF9yZXF1ZXN0cyhzZWxmKToKICAgICAgICAgcmVzcG9uc2UgPSBzZWxmLnJlcXVlc3QoJy8nLCBtZXRob2Q9J0ZPTycpCi0gICAgICAgIHNlbGYuY2hlY2tfc3RhdHVzX2FuZF9yZWFzb24ocmVzcG9uc2UsIDUwMSkKKyAgICAgICAgc2VsZi5jaGVja19zdGF0dXNfYW5kX3JlYXNvbihyZXNwb25zZSwgSFRUUFN0YXR1cy5OT1RfSU1QTEVNRU5URUQpCiAgICAgICAgICMgcmVxdWVzdHMgbXVzdCBiZSBjYXNlIHNlbnNpdGl2ZSxzbyB0aGlzIHNob3VsZCBmYWlsIHRvbwogICAgICAgICByZXNwb25zZSA9IHNlbGYucmVxdWVzdCgnLycsIG1ldGhvZD0nY3VzdG9tJykKLSAgICAgICAgc2VsZi5jaGVja19zdGF0dXNfYW5kX3JlYXNvbihyZXNwb25zZSwgNTAxKQorICAgICAgICBzZWxmLmNoZWNrX3N0YXR1c19hbmRfcmVhc29uKHJlc3BvbnNlLCBIVFRQU3RhdHVzLk5PVF9JTVBMRU1FTlRFRCkKICAgICAgICAgcmVzcG9uc2UgPSBzZWxmLnJlcXVlc3QoJy8nLCBtZXRob2Q9J0dFVHMnKQotICAgICAgICBzZWxmLmNoZWNrX3N0YXR1c19hbmRfcmVhc29uKHJlc3BvbnNlLCA1MDEpCisgICAgICAgIHNlbGYuY2hlY2tfc3RhdHVzX2FuZF9yZWFzb24ocmVzcG9uc2UsIEhUVFBTdGF0dXMuTk9UX0lNUExFTUVOVEVEKQogCiAKIGNnaV9maWxlMSA9ICIiIlwKQEAgLTQ5MCwxMiArNTI3LDEzIEBACiAKICAgICBkZWYgdGVzdF9oZWFkZXJzX2FuZF9jb250ZW50KHNlbGYpOgogICAgICAgICByZXMgPSBzZWxmLnJlcXVlc3QoJy9jZ2ktYmluL2ZpbGUxLnB5JykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYidIZWxsbyBXb3JsZCcgKyBzZWxmLmxpbmVzZXAsICd0ZXh0L2h0bWwnLCAyMDApLAotICAgICAgICAgICAgKHJlcy5yZWFkKCksIHJlcy5nZXRoZWFkZXIoJ0NvbnRlbnQtdHlwZScpLCByZXMuc3RhdHVzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIChyZXMucmVhZCgpLCByZXMuZ2V0aGVhZGVyKCdDb250ZW50LXR5cGUnKSwgcmVzLnN0YXR1cyksCisgICAgICAgICAgICAoYidIZWxsbyBXb3JsZCcgKyBzZWxmLmxpbmVzZXAsICd0ZXh0L2h0bWwnLCBIVFRQU3RhdHVzLk9LKSkKIAogICAgIGRlZiB0ZXN0X2lzc3VlMTk0MzUoc2VsZik6CiAgICAgICAgIHJlcyA9IHNlbGYucmVxdWVzdCgnLy8vLy8vLy8vLy9ub2NnaS5weS8uLi9jZ2ktYmluL25vdGhlcmUuc2gnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcy5zdGF0dXMsIDQwNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMuc3RhdHVzLCBIVFRQU3RhdHVzLk5PVF9GT1VORCkKIAogICAgIGRlZiB0ZXN0X3Bvc3Qoc2VsZik6CiAgICAgICAgIHBhcmFtcyA9IHVybGxpYi5wYXJzZS51cmxlbmNvZGUoCkBAIC01MDgsMzggKzU0Niw0MyBAQAogICAgIGRlZiB0ZXN0X2ludmFsaWR1cmkoc2VsZik6CiAgICAgICAgIHJlcyA9IHNlbGYucmVxdWVzdCgnL2NnaS1iaW4vaW52YWxpZCcpCiAgICAgICAgIHJlcy5yZWFkKCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMuc3RhdHVzLCA0MDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLnN0YXR1cywgSFRUUFN0YXR1cy5OT1RfRk9VTkQpCiAKICAgICBkZWYgdGVzdF9hdXRob3JpemF0aW9uKHNlbGYpOgogICAgICAgICBoZWFkZXJzID0ge2InQXV0aG9yaXphdGlvbicgOiBiJ0Jhc2ljICcgKwogICAgICAgICAgICAgICAgICAgIGJhc2U2NC5iNjRlbmNvZGUoYid1c2VybmFtZTpwYXNzJyl9CiAgICAgICAgIHJlcyA9IHNlbGYucmVxdWVzdCgnL2NnaS1iaW4vZmlsZTEucHknLCAnR0VUJywgaGVhZGVycz1oZWFkZXJzKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChiJ0hlbGxvIFdvcmxkJyArIHNlbGYubGluZXNlcCwgJ3RleHQvaHRtbCcsIDIwMCksCi0gICAgICAgICAgICAgICAgKHJlcy5yZWFkKCksIHJlcy5nZXRoZWFkZXIoJ0NvbnRlbnQtdHlwZScpLCByZXMuc3RhdHVzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIChiJ0hlbGxvIFdvcmxkJyArIHNlbGYubGluZXNlcCwgJ3RleHQvaHRtbCcsIEhUVFBTdGF0dXMuT0spLAorICAgICAgICAgICAgKHJlcy5yZWFkKCksIHJlcy5nZXRoZWFkZXIoJ0NvbnRlbnQtdHlwZScpLCByZXMuc3RhdHVzKSkKIAogICAgIGRlZiB0ZXN0X25vX2xlYWRpbmdfc2xhc2goc2VsZik6CiAgICAgICAgICMgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTIyNTQKICAgICAgICAgcmVzID0gc2VsZi5yZXF1ZXN0KCdjZ2ktYmluL2ZpbGUxLnB5JykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYidIZWxsbyBXb3JsZCcgKyBzZWxmLmxpbmVzZXAsICd0ZXh0L2h0bWwnLCAyMDApLAotICAgICAgICAgICAgIChyZXMucmVhZCgpLCByZXMuZ2V0aGVhZGVyKCdDb250ZW50LXR5cGUnKSwgcmVzLnN0YXR1cykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAoYidIZWxsbyBXb3JsZCcgKyBzZWxmLmxpbmVzZXAsICd0ZXh0L2h0bWwnLCBIVFRQU3RhdHVzLk9LKSwKKyAgICAgICAgICAgIChyZXMucmVhZCgpLCByZXMuZ2V0aGVhZGVyKCdDb250ZW50LXR5cGUnKSwgcmVzLnN0YXR1cykpCiAKICAgICBkZWYgdGVzdF9vc19lbnZpcm9uX2lzX25vdF9hbHRlcmVkKHNlbGYpOgogICAgICAgICBzaWduYXR1cmUgPSAiVGVzdCBDR0kgU2VydmVyIgogICAgICAgICBvcy5lbnZpcm9uWydTRVJWRVJfU09GVFdBUkUnXSA9IHNpZ25hdHVyZQogICAgICAgICByZXMgPSBzZWxmLnJlcXVlc3QoJy9jZ2ktYmluL2ZpbGUxLnB5JykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYidIZWxsbyBXb3JsZCcgKyBzZWxmLmxpbmVzZXAsICd0ZXh0L2h0bWwnLCAyMDApLAotICAgICAgICAgICAgICAgIChyZXMucmVhZCgpLCByZXMuZ2V0aGVhZGVyKCdDb250ZW50LXR5cGUnKSwgcmVzLnN0YXR1cykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAoYidIZWxsbyBXb3JsZCcgKyBzZWxmLmxpbmVzZXAsICd0ZXh0L2h0bWwnLCBIVFRQU3RhdHVzLk9LKSwKKyAgICAgICAgICAgIChyZXMucmVhZCgpLCByZXMuZ2V0aGVhZGVyKCdDb250ZW50LXR5cGUnKSwgcmVzLnN0YXR1cykpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3MuZW52aXJvblsnU0VSVkVSX1NPRlRXQVJFJ10sIHNpZ25hdHVyZSkKIAogICAgIGRlZiB0ZXN0X3VybHF1b3RlX2RlY29kaW5nX2luX2NnaV9jaGVjayhzZWxmKToKICAgICAgICAgcmVzID0gc2VsZi5yZXF1ZXN0KCcvY2dpLWJpbiUyZmZpbGUxLnB5JykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYidIZWxsbyBXb3JsZCcgKyBzZWxmLmxpbmVzZXAsICd0ZXh0L2h0bWwnLCAyMDApLAotICAgICAgICAgICAgICAgIChyZXMucmVhZCgpLCByZXMuZ2V0aGVhZGVyKCdDb250ZW50LXR5cGUnKSwgcmVzLnN0YXR1cykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAoYidIZWxsbyBXb3JsZCcgKyBzZWxmLmxpbmVzZXAsICd0ZXh0L2h0bWwnLCBIVFRQU3RhdHVzLk9LKSwKKyAgICAgICAgICAgIChyZXMucmVhZCgpLCByZXMuZ2V0aGVhZGVyKCdDb250ZW50LXR5cGUnKSwgcmVzLnN0YXR1cykpCiAKICAgICBkZWYgdGVzdF9uZXN0ZWRfY2dpX3BhdGhfaXNzdWUyMTMyMyhzZWxmKToKICAgICAgICAgcmVzID0gc2VsZi5yZXF1ZXN0KCcvY2dpLWJpbi9jaGlsZC1kaXIvZmlsZTMucHknKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChiJ0hlbGxvIFdvcmxkJyArIHNlbGYubGluZXNlcCwgJ3RleHQvaHRtbCcsIDIwMCksCi0gICAgICAgICAgICAgICAgKHJlcy5yZWFkKCksIHJlcy5nZXRoZWFkZXIoJ0NvbnRlbnQtdHlwZScpLCByZXMuc3RhdHVzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIChiJ0hlbGxvIFdvcmxkJyArIHNlbGYubGluZXNlcCwgJ3RleHQvaHRtbCcsIEhUVFBTdGF0dXMuT0spLAorICAgICAgICAgICAgKHJlcy5yZWFkKCksIHJlcy5nZXRoZWFkZXIoJ0NvbnRlbnQtdHlwZScpLCByZXMuc3RhdHVzKSkKIAogCiBjbGFzcyBTb2NrZXRsZXNzUmVxdWVzdEhhbmRsZXIoU2ltcGxlSFRUUFJlcXVlc3RIYW5kbGVyKToKQEAgLTU0OSw3ICs1OTIsNyBAQAogCiAgICAgZGVmIGRvX0dFVChzZWxmKToKICAgICAgICAgc2VsZi5nZXRfY2FsbGVkID0gVHJ1ZQotICAgICAgICBzZWxmLnNlbmRfcmVzcG9uc2UoMjAwKQorICAgICAgICBzZWxmLnNlbmRfcmVzcG9uc2UoSFRUUFN0YXR1cy5PSykKICAgICAgICAgc2VsZi5zZW5kX2hlYWRlcignQ29udGVudC1UeXBlJywgJ3RleHQvaHRtbCcpCiAgICAgICAgIHNlbGYuZW5kX2hlYWRlcnMoKQogICAgICAgICBzZWxmLndmaWxlLndyaXRlKGInPGh0bWw+PGJvZHk+RGF0YTwvYm9keT48L2h0bWw+XHJcbicpCkBAIC01NTksNyArNjAyLDcgQEAKIAogY2xhc3MgUmVqZWN0aW5nU29ja2V0bGVzc1JlcXVlc3RIYW5kbGVyKFNvY2tldGxlc3NSZXF1ZXN0SGFuZGxlcik6CiAgICAgZGVmIGhhbmRsZV9leHBlY3RfMTAwKHNlbGYpOgotICAgICAgICBzZWxmLnNlbmRfZXJyb3IoNDE3KQorICAgICAgICBzZWxmLnNlbmRfZXJyb3IoSFRUUFN0YXR1cy5FWFBFQ1RBVElPTl9GQUlMRUQpCiAgICAgICAgIHJldHVybiBGYWxzZQogCiAKQEAgLTYxNiw2ICs2NTksMTEgQEAKICAgICAgICAgc2VsZi52ZXJpZnlfZXhwZWN0ZWRfaGVhZGVycyhyZXN1bHRbMTotMV0pCiAgICAgICAgIHNlbGYudmVyaWZ5X2dldF9jYWxsZWQoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdFstMV0sIGInPGh0bWw+PGJvZHk+RGF0YTwvYm9keT48L2h0bWw+XHJcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5oYW5kbGVyLnJlcXVlc3RsaW5lLCAnR0VUIC8gSFRUUC8xLjEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuaGFuZGxlci5jb21tYW5kLCAnR0VUJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmhhbmRsZXIucGF0aCwgJy8nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuaGFuZGxlci5yZXF1ZXN0X3ZlcnNpb24sICdIVFRQLzEuMScpCisgICAgICAgIHNlbGYuYXNzZXJ0U2VxdWVuY2VFcXVhbChzZWxmLmhhbmRsZXIuaGVhZGVycy5pdGVtcygpLCAoKSkKIAogICAgIGRlZiB0ZXN0X2h0dHBfMV8wKHNlbGYpOgogICAgICAgICByZXN1bHQgPSBzZWxmLnNlbmRfdHlwaWNhbF9yZXF1ZXN0KGInR0VUIC8gSFRUUC8xLjBcclxuXHJcbicpCkBAIC02MjMsNiArNjcxLDExIEBACiAgICAgICAgIHNlbGYudmVyaWZ5X2V4cGVjdGVkX2hlYWRlcnMocmVzdWx0WzE6LTFdKQogICAgICAgICBzZWxmLnZlcmlmeV9nZXRfY2FsbGVkKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHRbLTFdLCBiJzxodG1sPjxib2R5PkRhdGE8L2JvZHk+PC9odG1sPlxyXG4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuaGFuZGxlci5yZXF1ZXN0bGluZSwgJ0dFVCAvIEhUVFAvMS4wJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmhhbmRsZXIuY29tbWFuZCwgJ0dFVCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5oYW5kbGVyLnBhdGgsICcvJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmhhbmRsZXIucmVxdWVzdF92ZXJzaW9uLCAnSFRUUC8xLjAnKQorICAgICAgICBzZWxmLmFzc2VydFNlcXVlbmNlRXF1YWwoc2VsZi5oYW5kbGVyLmhlYWRlcnMuaXRlbXMoKSwgKCkpCiAKICAgICBkZWYgdGVzdF9odHRwXzBfOShzZWxmKToKICAgICAgICAgcmVzdWx0ID0gc2VsZi5zZW5kX3R5cGljYWxfcmVxdWVzdChiJ0dFVCAvIEhUVFAvMC45XHJcblxyXG4nKQpAQCAtNjM2LDYgKzY4OSwxMiBAQAogICAgICAgICBzZWxmLnZlcmlmeV9leHBlY3RlZF9oZWFkZXJzKHJlc3VsdFsxOi0xXSkKICAgICAgICAgc2VsZi52ZXJpZnlfZ2V0X2NhbGxlZCgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0Wy0xXSwgYic8aHRtbD48Ym9keT5EYXRhPC9ib2R5PjwvaHRtbD5cclxuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmhhbmRsZXIucmVxdWVzdGxpbmUsICdHRVQgLyBIVFRQLzEuMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5oYW5kbGVyLmNvbW1hbmQsICdHRVQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuaGFuZGxlci5wYXRoLCAnLycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5oYW5kbGVyLnJlcXVlc3RfdmVyc2lvbiwgJ0hUVFAvMS4wJykKKyAgICAgICAgaGVhZGVycyA9ICgoIkV4cGVjdCIsICIxMDAtY29udGludWUiKSwpCisgICAgICAgIHNlbGYuYXNzZXJ0U2VxdWVuY2VFcXVhbChzZWxmLmhhbmRsZXIuaGVhZGVycy5pdGVtcygpLCBoZWFkZXJzKQogCiAgICAgZGVmIHRlc3Rfd2l0aF9jb250aW51ZV8xXzEoc2VsZik6CiAgICAgICAgIHJlc3VsdCA9IHNlbGYuc2VuZF90eXBpY2FsX3JlcXVlc3QoYidHRVQgLyBIVFRQLzEuMVxyXG5FeHBlY3Q6IDEwMC1jb250aW51ZVxyXG5cclxuJykKQEAgLTY0NSw2ICs3MDQsMTIgQEAKICAgICAgICAgc2VsZi52ZXJpZnlfZXhwZWN0ZWRfaGVhZGVycyhyZXN1bHRbMjotMV0pCiAgICAgICAgIHNlbGYudmVyaWZ5X2dldF9jYWxsZWQoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdFstMV0sIGInPGh0bWw+PGJvZHk+RGF0YTwvYm9keT48L2h0bWw+XHJcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5oYW5kbGVyLnJlcXVlc3RsaW5lLCAnR0VUIC8gSFRUUC8xLjEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuaGFuZGxlci5jb21tYW5kLCAnR0VUJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmhhbmRsZXIucGF0aCwgJy8nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuaGFuZGxlci5yZXF1ZXN0X3ZlcnNpb24sICdIVFRQLzEuMScpCisgICAgICAgIGhlYWRlcnMgPSAoKCJFeHBlY3QiLCAiMTAwLWNvbnRpbnVlIiksKQorICAgICAgICBzZWxmLmFzc2VydFNlcXVlbmNlRXF1YWwoc2VsZi5oYW5kbGVyLmhlYWRlcnMuaXRlbXMoKSwgaGVhZGVycykKIAogICAgIGRlZiB0ZXN0X2hlYWRlcl9idWZmZXJpbmdfb2Zfc2VuZF9lcnJvcihzZWxmKToKIApAQCAtNzMwLDYgKzc5NSw3IEBACiAgICAgICAgIHJlc3VsdCA9IHNlbGYuc2VuZF90eXBpY2FsX3JlcXVlc3QoYidHRVQgJyArIGIneCcgKiA2NTUzNykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHRbMF0sIGInSFRUUC8xLjEgNDE0IFJlcXVlc3QtVVJJIFRvbyBMb25nXHJcbicpCiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5oYW5kbGVyLmdldF9jYWxsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzZWxmLmhhbmRsZXIucmVxdWVzdGxpbmUsIHN0cikKIAogICAgIGRlZiB0ZXN0X2hlYWRlcl9sZW5ndGgoc2VsZik6CiAgICAgICAgICMgSXNzdWUgIzY3OTE6IHNhbWUgZm9yIGhlYWRlcnMKQEAgLTczNyw2ICs4MDMsMjIgQEAKICAgICAgICAgICAgIGInR0VUIC8gSFRUUC8xLjFcclxuWC1Gb286IGJhcicgKyBiJ3InICogNjU1MzcgKyBiJ1xyXG5cclxuJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHRbMF0sIGInSFRUUC8xLjEgNDAwIExpbmUgdG9vIGxvbmdcclxuJykKICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmhhbmRsZXIuZ2V0X2NhbGxlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmhhbmRsZXIucmVxdWVzdGxpbmUsICdHRVQgLyBIVFRQLzEuMScpCisKKyAgICBkZWYgdGVzdF9jbG9zZV9jb25uZWN0aW9uKHNlbGYpOgorICAgICAgICAjIGhhbmRsZV9vbmVfcmVxdWVzdCgpIHNob3VsZCBiZSByZXBlYXRlZGx5IGNhbGxlZCB1bnRpbAorICAgICAgICAjIGl0IHNldHMgY2xvc2VfY29ubmVjdGlvbgorICAgICAgICBkZWYgaGFuZGxlX29uZV9yZXF1ZXN0KCk6CisgICAgICAgICAgICBzZWxmLmhhbmRsZXIuY2xvc2VfY29ubmVjdGlvbiA9IG5leHQoY2xvc2VfdmFsdWVzKQorICAgICAgICBzZWxmLmhhbmRsZXIuaGFuZGxlX29uZV9yZXF1ZXN0ID0gaGFuZGxlX29uZV9yZXF1ZXN0CisKKyAgICAgICAgY2xvc2VfdmFsdWVzID0gaXRlcigoVHJ1ZSwpKQorICAgICAgICBzZWxmLmhhbmRsZXIuaGFuZGxlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3RvcEl0ZXJhdGlvbiwgbmV4dCwgY2xvc2VfdmFsdWVzKQorCisgICAgICAgIGNsb3NlX3ZhbHVlcyA9IGl0ZXIoKEZhbHNlLCBGYWxzZSwgVHJ1ZSkpCisgICAgICAgIHNlbGYuaGFuZGxlci5oYW5kbGUoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTdG9wSXRlcmF0aW9uLCBuZXh0LCBjbG9zZV92YWx1ZXMpCiAKIGNsYXNzIFNpbXBsZUhUVFBSZXF1ZXN0SGFuZGxlclRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICAiIiIgVGVzdCB1cmwgcGFyc2luZyAiIiIKQEAgLTc2MCwxNSArODQyLDMwIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGF0aCwgc2VsZi50cmFuc2xhdGVkKQogCiAKK2NsYXNzIE1pc2NUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfYWxsKHNlbGYpOgorICAgICAgICBleHBlY3RlZCA9IFtdCisgICAgICAgIGJsYWNrbGlzdCA9IHsnZXhlY3V0YWJsZScsICdub2JvZHlfdWlkJywgJ3Rlc3QnfQorICAgICAgICBmb3IgbmFtZSBpbiBkaXIoc2VydmVyKToKKyAgICAgICAgICAgIGlmIG5hbWUuc3RhcnRzd2l0aCgnXycpIG9yIG5hbWUgaW4gYmxhY2tsaXN0OgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBtb2R1bGVfb2JqZWN0ID0gZ2V0YXR0cihzZXJ2ZXIsIG5hbWUpCisgICAgICAgICAgICBpZiBnZXRhdHRyKG1vZHVsZV9vYmplY3QsICdfX21vZHVsZV9fJywgTm9uZSkgPT0gJ2h0dHAuc2VydmVyJzoKKyAgICAgICAgICAgICAgICBleHBlY3RlZC5hcHBlbmQobmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRDb3VudEVxdWFsKHNlcnZlci5fX2FsbF9fLCBleHBlY3RlZCkKKworCiBkZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6CiAgICAgY3dkID0gb3MuZ2V0Y3dkKCkKICAgICB0cnk6CiAgICAgICAgIHN1cHBvcnQucnVuX3VuaXR0ZXN0KAorICAgICAgICAgICAgUmVxdWVzdEhhbmRsZXJMb2dnaW5nVGVzdENhc2UsCiAgICAgICAgICAgICBCYXNlSFRUUFJlcXVlc3RIYW5kbGVyVGVzdENhc2UsCiAgICAgICAgICAgICBCYXNlSFRUUFNlcnZlclRlc3RDYXNlLAogICAgICAgICAgICAgU2ltcGxlSFRUUFNlcnZlclRlc3RDYXNlLAogICAgICAgICAgICAgQ0dJSFRUUFNlcnZlclRlc3RDYXNlLAogICAgICAgICAgICAgU2ltcGxlSFRUUFJlcXVlc3RIYW5kbGVyVGVzdENhc2UsCisgICAgICAgICAgICBNaXNjVGVzdENhc2UsCiAgICAgICAgICkKICAgICBmaW5hbGx5OgogICAgICAgICBvcy5jaGRpcihjd2QpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9pbXBvcnRfL3Rlc3RfcGF0aC5weSBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2ltcG9ydF8vdGVzdF9wYXRoLnB5CmluZGV4IDlhM2M0ZmUuLmMyNDZkNjkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2ltcG9ydF8vdGVzdF9wYXRoLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2ltcG9ydF8vdGVzdF9wYXRoLnB5CkBAIC0zLDYgKzMsNyBAQAogaW1wb3J0bGliID0gdXRpbC5pbXBvcnRfaW1wb3J0bGliKCdpbXBvcnRsaWInKQogbWFjaGluZXJ5ID0gdXRpbC5pbXBvcnRfaW1wb3J0bGliKCdpbXBvcnRsaWIubWFjaGluZXJ5JykKIAoraW1wb3J0IGVycm5vCiBpbXBvcnQgb3MKIGltcG9ydCBzeXMKIGltcG9ydCB0ZW1wZmlsZQpAQCAtMTYzLDggKzE2NCwxMyBAQAogICAgIGRlZiB0ZXN0X2RlbGV0ZWRfY3dkKHNlbGYpOgogICAgICAgICAjIElzc3VlICMyMjgzNAogICAgICAgICBzZWxmLmFkZENsZWFudXAob3MuY2hkaXIsIG9zLmdldGN3ZCgpKQotICAgICAgICB3aXRoIHRlbXBmaWxlLlRlbXBvcmFyeURpcmVjdG9yeSgpIGFzIHBhdGg6Ci0gICAgICAgICAgICBvcy5jaGRpcihwYXRoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIHRlbXBmaWxlLlRlbXBvcmFyeURpcmVjdG9yeSgpIGFzIHBhdGg6CisgICAgICAgICAgICAgICAgb3MuY2hkaXIocGF0aCkKKyAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZXhjOgorICAgICAgICAgICAgaWYgZXhjLmVycm5vID09IGVycm5vLkVJTlZBTDoKKyAgICAgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJwbGF0Zm9ybSBkb2VzIG5vdCBhbGxvdyB0aGUgZGVsZXRpb24gb2YgdGhlIGN3ZCIpCisgICAgICAgICAgICByYWlzZQogICAgICAgICB3aXRoIHV0aWwuaW1wb3J0X3N0YXRlKHBhdGg9WycnXSk6CiAgICAgICAgICAgICAjIERvIG5vdCB3YW50IEZpbGVOb3RGb3VuZEVycm9yIHJhaXNlZC4KICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHNlbGYubWFjaGluZXJ5LlBhdGhGaW5kZXIuZmluZF9zcGVjKCd3aGF0ZXZlcicpKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pby5weSBiL0xpYi90ZXN0L3Rlc3RfaW8ucHkKaW5kZXggYzg2NzUwMi4uYTBhNDY3MCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pby5weQorKysgYi9MaWIvdGVzdC90ZXN0X2lvLnB5CkBAIC01ODksMTMgKzU4OSw0NCBAQAogICAgICAgICB3aXRoIHNlbGYub3Blbih6ZXJvLCAiciIpIGFzIGY6CiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBmLnJlYWQpCiAKLSAgICBkZWYgdGVzdF9mbHVzaF9lcnJvcl9vbl9jbG9zZShzZWxmKToKLSAgICAgICAgZiA9IHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgIndiIiwgYnVmZmVyaW5nPTApCisgICAgZGVmIGNoZWNrX2ZsdXNoX2Vycm9yX29uX2Nsb3NlKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICMgVGVzdCB0aGF0IHRoZSBmaWxlIGlzIGNsb3NlZCBkZXNwaXRlIGZhaWxlZCBmbHVzaAorICAgICAgICAjIGFuZCB0aGF0IGZsdXNoKCkgaXMgY2FsbGVkIGJlZm9yZSBmaWxlIGNsb3NlZC4KKyAgICAgICAgZiA9IHNlbGYub3BlbigqYXJncywgKiprd2FyZ3MpCisgICAgICAgIGNsb3NlZCA9IFtdCiAgICAgICAgIGRlZiBiYWRfZmx1c2goKToKKyAgICAgICAgICAgIGNsb3NlZFs6XSA9IFtmLmNsb3NlZF0KICAgICAgICAgICAgIHJhaXNlIE9TRXJyb3IoKQogICAgICAgICBmLmZsdXNoID0gYmFkX2ZsdXNoCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIGYuY2xvc2UpICMgZXhjZXB0aW9uIG5vdCBzd2FsbG93ZWQKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGYuY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY2xvc2VkKSAgICAgICMgZmx1c2goKSBjYWxsZWQKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjbG9zZWRbMF0pICAjIGZsdXNoKCkgY2FsbGVkIGJlZm9yZSBmaWxlIGNsb3NlZAorICAgICAgICBmLmZsdXNoID0gbGFtYmRhOiBOb25lICAjIGJyZWFrIHJlZmVyZW5jZSBsb29wCisKKyAgICBkZWYgdGVzdF9mbHVzaF9lcnJvcl9vbl9jbG9zZShzZWxmKToKKyAgICAgICAgIyByYXcgZmlsZQorICAgICAgICAjIElzc3VlICM1NzAwOiBpby5GaWxlSU8gY2FsbHMgZmx1c2goKSBhZnRlciBmaWxlIGNsb3NlZAorICAgICAgICBzZWxmLmNoZWNrX2ZsdXNoX2Vycm9yX29uX2Nsb3NlKHN1cHBvcnQuVEVTVEZOLCAnd2InLCBidWZmZXJpbmc9MCkKKyAgICAgICAgZmQgPSBvcy5vcGVuKHN1cHBvcnQuVEVTVEZOLCBvcy5PX1dST05MWXxvcy5PX0NSRUFUKQorICAgICAgICBzZWxmLmNoZWNrX2ZsdXNoX2Vycm9yX29uX2Nsb3NlKGZkLCAnd2InLCBidWZmZXJpbmc9MCkKKyAgICAgICAgZmQgPSBvcy5vcGVuKHN1cHBvcnQuVEVTVEZOLCBvcy5PX1dST05MWXxvcy5PX0NSRUFUKQorICAgICAgICBzZWxmLmNoZWNrX2ZsdXNoX2Vycm9yX29uX2Nsb3NlKGZkLCAnd2InLCBidWZmZXJpbmc9MCwgY2xvc2VmZD1GYWxzZSkKKyAgICAgICAgb3MuY2xvc2UoZmQpCisgICAgICAgICMgYnVmZmVyZWQgaW8KKyAgICAgICAgc2VsZi5jaGVja19mbHVzaF9lcnJvcl9vbl9jbG9zZShzdXBwb3J0LlRFU1RGTiwgJ3diJykKKyAgICAgICAgZmQgPSBvcy5vcGVuKHN1cHBvcnQuVEVTVEZOLCBvcy5PX1dST05MWXxvcy5PX0NSRUFUKQorICAgICAgICBzZWxmLmNoZWNrX2ZsdXNoX2Vycm9yX29uX2Nsb3NlKGZkLCAnd2InKQorICAgICAgICBmZCA9IG9zLm9wZW4oc3VwcG9ydC5URVNURk4sIG9zLk9fV1JPTkxZfG9zLk9fQ1JFQVQpCisgICAgICAgIHNlbGYuY2hlY2tfZmx1c2hfZXJyb3Jfb25fY2xvc2UoZmQsICd3YicsIGNsb3NlZmQ9RmFsc2UpCisgICAgICAgIG9zLmNsb3NlKGZkKQorICAgICAgICAjIHRleHQgaW8KKyAgICAgICAgc2VsZi5jaGVja19mbHVzaF9lcnJvcl9vbl9jbG9zZShzdXBwb3J0LlRFU1RGTiwgJ3cnKQorICAgICAgICBmZCA9IG9zLm9wZW4oc3VwcG9ydC5URVNURk4sIG9zLk9fV1JPTkxZfG9zLk9fQ1JFQVQpCisgICAgICAgIHNlbGYuY2hlY2tfZmx1c2hfZXJyb3Jfb25fY2xvc2UoZmQsICd3JykKKyAgICAgICAgZmQgPSBvcy5vcGVuKHN1cHBvcnQuVEVTVEZOLCBvcy5PX1dST05MWXxvcy5PX0NSRUFUKQorICAgICAgICBzZWxmLmNoZWNrX2ZsdXNoX2Vycm9yX29uX2Nsb3NlKGZkLCAndycsIGNsb3NlZmQ9RmFsc2UpCisgICAgICAgIG9zLmNsb3NlKGZkKQogCiAgICAgZGVmIHRlc3RfbXVsdGlfY2xvc2Uoc2VsZik6CiAgICAgICAgIGYgPSBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJ3YiIsIGJ1ZmZlcmluZz0wKQpAQCAtNzg0LDEzICs4MTUsMjIgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGIpLCAiPCVzIG5hbWU9YidkdW1teSc+IiAlIGNsc25hbWUpCiAKICAgICBkZWYgdGVzdF9mbHVzaF9lcnJvcl9vbl9jbG9zZShzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgYnVmZmVyZWQgZmlsZSBpcyBjbG9zZWQgZGVzcGl0ZSBmYWlsZWQgZmx1c2gKKyAgICAgICAgIyBhbmQgdGhhdCBmbHVzaCgpIGlzIGNhbGxlZCBiZWZvcmUgZmlsZSBjbG9zZWQuCiAgICAgICAgIHJhdyA9IHNlbGYuTW9ja1Jhd0lPKCkKKyAgICAgICAgY2xvc2VkID0gW10KICAgICAgICAgZGVmIGJhZF9mbHVzaCgpOgorICAgICAgICAgICAgY2xvc2VkWzpdID0gW2IuY2xvc2VkLCByYXcuY2xvc2VkXQogICAgICAgICAgICAgcmFpc2UgT1NFcnJvcigpCiAgICAgICAgIHJhdy5mbHVzaCA9IGJhZF9mbHVzaAogICAgICAgICBiID0gc2VsZi50cChyYXcpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIGIuY2xvc2UpICMgZXhjZXB0aW9uIG5vdCBzd2FsbG93ZWQKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGIuY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmF3LmNsb3NlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNsb3NlZCkgICAgICAjIGZsdXNoKCkgY2FsbGVkCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoY2xvc2VkWzBdKSAgIyBmbHVzaCgpIGNhbGxlZCBiZWZvcmUgZmlsZSBjbG9zZWQKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjbG9zZWRbMV0pCisgICAgICAgIHJhdy5mbHVzaCA9IGxhbWJkYTogTm9uZSAgIyBicmVhayByZWZlcmVuY2UgbG9vcAogCiAgICAgZGVmIHRlc3RfY2xvc2VfZXJyb3Jfb25fY2xvc2Uoc2VsZik6CiAgICAgICAgIHJhdyA9IHNlbGYuTW9ja1Jhd0lPKCkKQEAgLTI2NzksMTIgKzI3MTksMjEgQEAKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbnRlbnQuY291bnQoIlRocmVhZCUwM2RcbiIgJSBuKSwgMSkKIAogICAgIGRlZiB0ZXN0X2ZsdXNoX2Vycm9yX29uX2Nsb3NlKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCB0ZXh0IGZpbGUgaXMgY2xvc2VkIGRlc3BpdGUgZmFpbGVkIGZsdXNoCisgICAgICAgICMgYW5kIHRoYXQgZmx1c2goKSBpcyBjYWxsZWQgYmVmb3JlIGZpbGUgY2xvc2VkLgogICAgICAgICB0eHQgPSBzZWxmLlRleHRJT1dyYXBwZXIoc2VsZi5CeXRlc0lPKHNlbGYudGVzdGRhdGEpLCBlbmNvZGluZz0iYXNjaWkiKQorICAgICAgICBjbG9zZWQgPSBbXQogICAgICAgICBkZWYgYmFkX2ZsdXNoKCk6CisgICAgICAgICAgICBjbG9zZWRbOl0gPSBbdHh0LmNsb3NlZCwgdHh0LmJ1ZmZlci5jbG9zZWRdCiAgICAgICAgICAgICByYWlzZSBPU0Vycm9yKCkKICAgICAgICAgdHh0LmZsdXNoID0gYmFkX2ZsdXNoCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIHR4dC5jbG9zZSkgIyBleGNlcHRpb24gbm90IHN3YWxsb3dlZAogICAgICAgICBzZWxmLmFzc2VydFRydWUodHh0LmNsb3NlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR4dC5idWZmZXIuY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY2xvc2VkKSAgICAgICMgZmx1c2goKSBjYWxsZWQKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjbG9zZWRbMF0pICAjIGZsdXNoKCkgY2FsbGVkIGJlZm9yZSBmaWxlIGNsb3NlZAorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGNsb3NlZFsxXSkKKyAgICAgICAgdHh0LmZsdXNoID0gbGFtYmRhOiBOb25lICAjIGJyZWFrIHJlZmVyZW5jZSBsb29wCiAKICAgICBkZWYgdGVzdF9jbG9zZV9lcnJvcl9vbl9jbG9zZShzZWxmKToKICAgICAgICAgYnVmZmVyID0gc2VsZi5CeXRlc0lPKHNlbGYudGVzdGRhdGEpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2lwYWRkcmVzcy5weSBiL0xpYi90ZXN0L3Rlc3RfaXBhZGRyZXNzLnB5CmluZGV4IGU5ODUzMjkuLmMyMTdkMzYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaXBhZGRyZXNzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaXBhZGRyZXNzLnB5CkBAIC0xMSw2ICsxMSw3IEBACiBpbXBvcnQgb3BlcmF0b3IKIGltcG9ydCBwaWNrbGUKIGltcG9ydCBpcGFkZHJlc3MKK2ltcG9ydCB3ZWFrcmVmCiAKIAogY2xhc3MgQmFzZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTI1OSw2ICsyNjAsOSBAQAogICAgIGRlZiB0ZXN0X3BpY2tsZShzZWxmKToKICAgICAgICAgc2VsZi5waWNrbGVfdGVzdCgnMTkyLjAuMi4xJykKIAorICAgIGRlZiB0ZXN0X3dlYWtyZWYoc2VsZik6CisgICAgICAgIHdlYWtyZWYucmVmKHNlbGYuZmFjdG9yeSgnMTkyLjAuMi4xJykpCisKIAogY2xhc3MgQWRkcmVzc1Rlc3RDYXNlX3Y2KEJhc2VUZXN0Q2FzZSwgQ29tbW9uVGVzdE1peGluX3Y2KToKICAgICBmYWN0b3J5ID0gaXBhZGRyZXNzLklQdjZBZGRyZXNzCkBAIC0zOTQsNiArMzk4LDkgQEAKICAgICBkZWYgdGVzdF9waWNrbGUoc2VsZik6CiAgICAgICAgIHNlbGYucGlja2xlX3Rlc3QoJzIwMDE6ZGI4OjonKQogCisgICAgZGVmIHRlc3Rfd2Vha3JlZihzZWxmKToKKyAgICAgICAgd2Vha3JlZi5yZWYoc2VsZi5mYWN0b3J5KCcyMDAxOmRiODo6JykpCisKIAogY2xhc3MgTmV0bWFza1Rlc3RNaXhpbl92NChDb21tb25UZXN0TWl4aW5fdjQpOgogICAgICIiIklucHV0IHZhbGlkYXRpb24gb24gaW50ZXJmYWNlcyBhbmQgbmV0d29ya3MgaXMgdmVyeSBzaW1pbGFyIiIiCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2xpbmVjYWNoZS5weSBiL0xpYi90ZXN0L3Rlc3RfbGluZWNhY2hlLnB5CmluZGV4IDVmZTA1NTQuLjJmYjg2NjIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbGluZWNhY2hlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbGluZWNhY2hlLnB5CkBAIC03LDYgKzcsNyBAQAogCiAKIEZJTEVOQU1FID0gbGluZWNhY2hlLl9fZmlsZV9fCitOT05FWElTVEVOVF9GSUxFTkFNRSA9IEZJTEVOQU1FICsgJy5taXNzaW5nJwogSU5WQUxJRF9OQU1FID0gJyFAJCkoIUAjXzEnCiBFTVBUWSA9ICcnCiBURVNUUyA9ICdpbnNwZWN0X2ZvZGRlciBpbnNwZWN0X2ZvZGRlcjIgbWFwcGluZ190ZXN0cycKQEAgLTEyNiw2ICsxMjcsNDkgQEAKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmUsIGdldGxpbmUoc291cmNlX25hbWUsIGluZGV4ICsgMSkpCiAgICAgICAgICAgICAgICAgc291cmNlX2xpc3QuYXBwZW5kKGxpbmUpCiAKKyAgICBkZWYgdGVzdF9sYXp5Y2FjaGVfbm9fZ2xvYmFscyhzZWxmKToKKyAgICAgICAgbGluZXMgPSBsaW5lY2FjaGUuZ2V0bGluZXMoRklMRU5BTUUpCisgICAgICAgIGxpbmVjYWNoZS5jbGVhcmNhY2hlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZSwgbGluZWNhY2hlLmxhenljYWNoZShGSUxFTkFNRSwgTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZXMsIGxpbmVjYWNoZS5nZXRsaW5lcyhGSUxFTkFNRSkpCisKKyAgICBkZWYgdGVzdF9sYXp5Y2FjaGVfc21va2Uoc2VsZik6CisgICAgICAgIGxpbmVzID0gbGluZWNhY2hlLmdldGxpbmVzKE5PTkVYSVNURU5UX0ZJTEVOQU1FLCBnbG9iYWxzKCkpCisgICAgICAgIGxpbmVjYWNoZS5jbGVhcmNhY2hlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIFRydWUsIGxpbmVjYWNoZS5sYXp5Y2FjaGUoTk9ORVhJU1RFTlRfRklMRU5BTUUsIGdsb2JhbHMoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgbGVuKGxpbmVjYWNoZS5jYWNoZVtOT05FWElTVEVOVF9GSUxFTkFNRV0pKQorICAgICAgICAjIE5vdGUgaGVyZSB0aGF0IHdlJ3JlIGxvb2tpbmcgdXAgYSBub24gZXhpc3RhbnQgZmlsZW5hbWUgd2l0aCBubworICAgICAgICAjIGdsb2JhbHM6IHRoaXMgd291bGQgZXJyb3IgaWYgdGhlIGxhenkgdmFsdWUgd2Fzbid0IHJlc29sdmVkLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmVzLCBsaW5lY2FjaGUuZ2V0bGluZXMoTk9ORVhJU1RFTlRfRklMRU5BTUUpKQorCisgICAgZGVmIHRlc3RfbGF6eWNhY2hlX3Byb3ZpZGVfYWZ0ZXJfZmFpbGVkX2xvb2t1cChzZWxmKToKKyAgICAgICAgbGluZWNhY2hlLmNsZWFyY2FjaGUoKQorICAgICAgICBsaW5lcyA9IGxpbmVjYWNoZS5nZXRsaW5lcyhOT05FWElTVEVOVF9GSUxFTkFNRSwgZ2xvYmFscygpKQorICAgICAgICBsaW5lY2FjaGUuY2xlYXJjYWNoZSgpCisgICAgICAgIGxpbmVjYWNoZS5nZXRsaW5lcyhOT05FWElTVEVOVF9GSUxFTkFNRSkKKyAgICAgICAgbGluZWNhY2hlLmxhenljYWNoZShOT05FWElTVEVOVF9GSUxFTkFNRSwgZ2xvYmFscygpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmVzLCBsaW5lY2FjaGUudXBkYXRlY2FjaGUoTk9ORVhJU1RFTlRfRklMRU5BTUUpKQorCisgICAgZGVmIHRlc3RfbGF6eWNhY2hlX2NoZWNrKHNlbGYpOgorICAgICAgICBsaW5lY2FjaGUuY2xlYXJjYWNoZSgpCisgICAgICAgIGxpbmVjYWNoZS5sYXp5Y2FjaGUoTk9ORVhJU1RFTlRfRklMRU5BTUUsIGdsb2JhbHMoKSkKKyAgICAgICAgbGluZWNhY2hlLmNoZWNrY2FjaGUoKQorCisgICAgZGVmIHRlc3RfbGF6eWNhY2hlX2JhZF9maWxlbmFtZShzZWxmKToKKyAgICAgICAgbGluZWNhY2hlLmNsZWFyY2FjaGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEZhbHNlLCBsaW5lY2FjaGUubGF6eWNhY2hlKCcnLCBnbG9iYWxzKCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEZhbHNlLCBsaW5lY2FjaGUubGF6eWNhY2hlKCc8Zm9vPicsIGdsb2JhbHMoKSkpCisKKyAgICBkZWYgdGVzdF9sYXp5Y2FjaGVfYWxyZWFkeV9jYWNoZWQoc2VsZik6CisgICAgICAgIGxpbmVjYWNoZS5jbGVhcmNhY2hlKCkKKyAgICAgICAgbGluZXMgPSBsaW5lY2FjaGUuZ2V0bGluZXMoTk9ORVhJU1RFTlRfRklMRU5BTUUsIGdsb2JhbHMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIEZhbHNlLAorICAgICAgICAgICAgbGluZWNhY2hlLmxhenljYWNoZShOT05FWElTVEVOVF9GSUxFTkFNRSwgZ2xvYmFscygpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg0LCBsZW4obGluZWNhY2hlLmNhY2hlW05PTkVYSVNURU5UX0ZJTEVOQU1FXSkpCisKKwogZGVmIHRlc3RfbWFpbigpOgogICAgIHN1cHBvcnQucnVuX3VuaXR0ZXN0KExpbmVDYWNoZVRlc3RzKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2xvY2FsZS5weSBiL0xpYi90ZXN0L3Rlc3RfbG9jYWxlLnB5CmluZGV4IDgxZmU1N2QuLmZhZTJjM2QgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbG9jYWxlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbG9jYWxlLnB5CkBAIC01MTEsNyArNTExLDcgQEAKICAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJ3Rlc3QgbmVlZHMgVHVya2lzaCBsb2NhbGUnKQogICAgICAgICBsb2MgPSBsb2NhbGUuZ2V0bG9jYWxlKGxvY2FsZS5MQ19DVFlQRSkKICAgICAgICAgaWYgdmVyYm9zZToKLSAgICAgICAgICAgIHByaW50KCdnb3QgbG9jYWxlICVhJyAlIChsb2MsKSkKKyAgICAgICAgICAgIHByaW50KCd0ZXN0aW5nIHdpdGggJWEnICUgKGxvYywpLCBlbmQ9JyAnLCBmbHVzaD1UcnVlKQogICAgICAgICBsb2NhbGUuc2V0bG9jYWxlKGxvY2FsZS5MQ19DVFlQRSwgbG9jKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvYywgbG9jYWxlLmdldGxvY2FsZShsb2NhbGUuTENfQ1RZUEUpKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2xvZ2dpbmcucHkgYi9MaWIvdGVzdC90ZXN0X2xvZ2dpbmcucHkKaW5kZXggOTY3NDMyMi4uYzhiNmE5OCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9sb2dnaW5nLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbG9nZ2luZy5weQpAQCAtMzAwNiw2ICszMDA2LDI1IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYW5kbGVyLm1hdGNoZXMobGV2ZWxubz1sb2dnaW5nLldBUk5JTkcsIG1lc3NhZ2U9JzEnKSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhbmRsZXIubWF0Y2hlcyhsZXZlbG5vPWxvZ2dpbmcuRVJST1IsIG1lc3NhZ2U9JzInKSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhbmRsZXIubWF0Y2hlcyhsZXZlbG5vPWxvZ2dpbmcuQ1JJVElDQUwsIG1lc3NhZ2U9JzMnKSkKKyAgICAgICAgaGFuZGxlci5jbG9zZSgpCisKKyAgICAgICAgIyBOb3cgdGVzdCB3aXRoIHJlc3BlY3RfaGFuZGxlcl9sZXZlbCBzZXQKKworICAgICAgICBoYW5kbGVyID0gc3VwcG9ydC5UZXN0SGFuZGxlcihzdXBwb3J0Lk1hdGNoZXIoKSkKKyAgICAgICAgaGFuZGxlci5zZXRMZXZlbChsb2dnaW5nLkNSSVRJQ0FMKQorICAgICAgICBsaXN0ZW5lciA9IGxvZ2dpbmcuaGFuZGxlcnMuUXVldWVMaXN0ZW5lcihzZWxmLnF1ZXVlLCBoYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwZWN0X2hhbmRsZXJfbGV2ZWw9VHJ1ZSkKKyAgICAgICAgbGlzdGVuZXIuc3RhcnQoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnF1ZV9sb2dnZXIud2FybmluZyhzZWxmLm5leHRfbWVzc2FnZSgpKQorICAgICAgICAgICAgc2VsZi5xdWVfbG9nZ2VyLmVycm9yKHNlbGYubmV4dF9tZXNzYWdlKCkpCisgICAgICAgICAgICBzZWxmLnF1ZV9sb2dnZXIuY3JpdGljYWwoc2VsZi5uZXh0X21lc3NhZ2UoKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGxpc3RlbmVyLnN0b3AoKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhhbmRsZXIubWF0Y2hlcyhsZXZlbG5vPWxvZ2dpbmcuV0FSTklORywgbWVzc2FnZT0nNCcpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhhbmRsZXIubWF0Y2hlcyhsZXZlbG5vPWxvZ2dpbmcuRVJST1IsIG1lc3NhZ2U9JzUnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhbmRsZXIubWF0Y2hlcyhsZXZlbG5vPWxvZ2dpbmcuQ1JJVElDQUwsIG1lc3NhZ2U9JzYnKSkKKwogCiBaRVJPID0gZGF0ZXRpbWUudGltZWRlbHRhKDApCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbXVsdGlieXRlY29kZWMucHkgYi9MaWIvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjLnB5CmluZGV4IGNlMjY3ZGQuLjI5MjlmOTggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbXVsdGlieXRlY29kZWMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9tdWx0aWJ5dGVjb2RlYy5weQpAQCAtNDQsNiArNDQsMTMgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgZGVjLAogICAgICAgICAgICAgICAgICAgICAgICAgICBiJ2FwcGxlXHg5MmhhbVx4OTNzcGFtJywgJ3Rlc3QuY2prdGVzdCcpCiAKKyAgICBkZWYgdGVzdF9lcnJvcmNhbGxiYWNrX2N1c3RvbV9pZ25vcmUoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzIzMjE1OiBNZW1vcnlFcnJvciB3aXRoIGN1c3RvbSBlcnJvciBoYW5kbGVycyBhbmQgbXVsdGlieXRlIGNvZGVjcworICAgICAgICBkYXRhID0gMTAwICogIlx1ZGMwMCIKKyAgICAgICAgY29kZWNzLnJlZ2lzdGVyX2Vycm9yKCJ0ZXN0Lmlnbm9yZSIsIGNvZGVjcy5pZ25vcmVfZXJyb3JzKQorICAgICAgICBmb3IgZW5jIGluIEFMTF9DSktFTkNPRElOR1M6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEuZW5jb2RlKGVuYywgInRlc3QuaWdub3JlIiksIGInJykKKwogICAgIGRlZiB0ZXN0X2NvZGluZ3NwZWMoc2VsZik6CiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGZvciBlbmMgaW4gQUxMX0NKS0VOQ09ESU5HUzoKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfb3MucHkgYi9MaWIvdGVzdC90ZXN0X29zLnB5CmluZGV4IGUyOGEzZGIuLmYwYjk4ZTcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfb3MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9vcy5weQpAQCAtMTA3NSw3ICsxMDc1LDcgQEAKICAgICBkZWYgdGVzdF9jaG93bl93aXRob3V0X3Blcm1pc3Npb24oc2VsZik6CiAgICAgICAgIHVpZF8xLCB1aWRfMiA9IGFsbF91c2Vyc1s6Ml0KICAgICAgICAgZ2lkID0gb3Muc3RhdChzdXBwb3J0LlRFU1RGTikuc3RfZ2lkCi0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChQZXJtaXNzaW9uRXJyb3IsICJPcGVyYXRpb24gbm90IHBlcm1pdHRlZCIpOgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFBlcm1pc3Npb25FcnJvcik6CiAgICAgICAgICAgICBvcy5jaG93bihzdXBwb3J0LlRFU1RGTiwgdWlkXzEsIGdpZCkKICAgICAgICAgICAgIG9zLmNob3duKHN1cHBvcnQuVEVTVEZOLCB1aWRfMiwgZ2lkKQogCkBAIC0xMTk5LDggKzExOTksMTAgQEAKICAgICAgICAgY29kZSA9ICIiImlmIDE6CiAgICAgICAgICAgICBpbXBvcnQgb3MKICAgICAgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgICAgIGltcG9ydCB0ZXN0LnN1cHBvcnQKICAgICAgICAgICAgIG9zLnVyYW5kb20oNCkKLSAgICAgICAgICAgIG9zLmNsb3NlcmFuZ2UoMywgMjU2KQorICAgICAgICAgICAgd2l0aCB0ZXN0LnN1cHBvcnQuU3VwcHJlc3NDcmFzaFJlcG9ydCgpOgorICAgICAgICAgICAgICAgIG9zLmNsb3NlcmFuZ2UoMywgMjU2KQogICAgICAgICAgICAgc3lzLnN0ZG91dC5idWZmZXIud3JpdGUob3MudXJhbmRvbSg0KSkKICAgICAgICAgICAgICIiIgogICAgICAgICByYywgb3V0LCBlcnIgPSBhc3NlcnRfcHl0aG9uX29rKCctU2MnLCBjb2RlKQpAQCAtMTIxNCwxNiArMTIxNiwxOCBAQAogICAgICAgICBjb2RlID0gIiIiaWYgMToKICAgICAgICAgICAgIGltcG9ydCBvcwogICAgICAgICAgICAgaW1wb3J0IHN5cworICAgICAgICAgICAgaW1wb3J0IHRlc3Quc3VwcG9ydAogICAgICAgICAgICAgb3MudXJhbmRvbSg0KQotICAgICAgICAgICAgZm9yIGZkIGluIHJhbmdlKDMsIDI1Nik6Ci0gICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICBvcy5jbG9zZShmZCkKLSAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKLSAgICAgICAgICAgICAgICAgICAgcGFzcwotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgICMgRm91bmQgdGhlIHVyYW5kb20gZmQgKFhYWCBob3BlZnVsbHkpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBvcy5jbG9zZXJhbmdlKDMsIDI1NikKKyAgICAgICAgICAgIHdpdGggdGVzdC5zdXBwb3J0LlN1cHByZXNzQ3Jhc2hSZXBvcnQoKToKKyAgICAgICAgICAgICAgICBmb3IgZmQgaW4gcmFuZ2UoMywgMjU2KToKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgb3MuY2xvc2UoZmQpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBGb3VuZCB0aGUgdXJhbmRvbSBmZCAoWFhYIGhvcGVmdWxseSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgb3MuY2xvc2VyYW5nZSgzLCAyNTYpCiAgICAgICAgICAgICB3aXRoIG9wZW4oe1RFU1RGTiFyfSwgJ3JiJykgYXMgZjoKICAgICAgICAgICAgICAgICBvcy5kdXAyKGYuZmlsZW5vKCksIGZkKQogICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQuYnVmZmVyLndyaXRlKG9zLnVyYW5kb20oNCkpCkBAIC0yNjk4LDUgKzI3MDIsMjI5IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ3dhbGsnLCBvcy5fX2FsbF9fKQogCiAKK2NsYXNzIFRlc3RTY2FuZGlyKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYucGF0aCA9IG9zLnBhdGgucmVhbHBhdGgoc3VwcG9ydC5URVNURk4pCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnJtdHJlZSwgc2VsZi5wYXRoKQorICAgICAgICBvcy5ta2RpcihzZWxmLnBhdGgpCisKKyAgICBkZWYgY3JlYXRlX2ZpbGUoc2VsZiwgbmFtZT0iZmlsZS50eHQiKToKKyAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5wYXRoLCBuYW1lKQorICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICJ3YiIpIGFzIGZwOgorICAgICAgICAgICAgZnAud3JpdGUoYidweXRob24nKQorICAgICAgICByZXR1cm4gZmlsZW5hbWUKKworICAgIGRlZiBnZXRfZW50cmllcyhzZWxmLCBuYW1lcyk6CisgICAgICAgIGVudHJpZXMgPSBkaWN0KChlbnRyeS5uYW1lLCBlbnRyeSkKKyAgICAgICAgICAgICAgICAgICAgICAgZm9yIGVudHJ5IGluIG9zLnNjYW5kaXIoc2VsZi5wYXRoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3J0ZWQoZW50cmllcy5rZXlzKCkpLCBuYW1lcykKKyAgICAgICAgcmV0dXJuIGVudHJpZXMKKworICAgIGRlZiBhc3NlcnRfc3RhdF9lcXVhbChzZWxmLCBzdGF0MSwgc3RhdDIsIHNraXBfZmllbGRzKToKKyAgICAgICAgaWYgc2tpcF9maWVsZHM6CisgICAgICAgICAgICBmb3IgYXR0ciBpbiBkaXIoc3RhdDEpOgorICAgICAgICAgICAgICAgIGlmIG5vdCBhdHRyLnN0YXJ0c3dpdGgoInN0XyIpOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIGF0dHIgaW4gKCJzdF9kZXYiLCAic3RfaW5vIiwgInN0X25saW5rIik6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRhdHRyKHN0YXQxLCBhdHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldGF0dHIoc3RhdDIsIGF0dHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXQxLCBzdGF0MiwgYXR0cikpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXQxLCBzdGF0MikKKworICAgIGRlZiBjaGVja19lbnRyeShzZWxmLCBlbnRyeSwgbmFtZSwgaXNfZGlyLCBpc19maWxlLCBpc19zeW1saW5rKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbnRyeS5uYW1lLCBuYW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVudHJ5LnBhdGgsIG9zLnBhdGguam9pbihzZWxmLnBhdGgsIG5hbWUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVudHJ5Lmlub2RlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgb3Muc3RhdChlbnRyeS5wYXRoLCBmb2xsb3dfc3ltbGlua3M9RmFsc2UpLnN0X2lubykKKworICAgICAgICBlbnRyeV9zdGF0ID0gb3Muc3RhdChlbnRyeS5wYXRoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVudHJ5LmlzX2RpcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXQuU19JU0RJUihlbnRyeV9zdGF0LnN0X21vZGUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVudHJ5LmlzX2ZpbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0LlNfSVNSRUcoZW50cnlfc3RhdC5zdF9tb2RlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbnRyeS5pc19zeW1saW5rKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5pc2xpbmsoZW50cnkucGF0aCkpCisKKyAgICAgICAgZW50cnlfbHN0YXQgPSBvcy5zdGF0KGVudHJ5LnBhdGgsIGZvbGxvd19zeW1saW5rcz1GYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbnRyeS5pc19kaXIoZm9sbG93X3N5bWxpbmtzPUZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0LlNfSVNESVIoZW50cnlfbHN0YXQuc3RfbW9kZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW50cnkuaXNfZmlsZShmb2xsb3dfc3ltbGlua3M9RmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXQuU19JU1JFRyhlbnRyeV9sc3RhdC5zdF9tb2RlKSkKKworICAgICAgICBzZWxmLmFzc2VydF9zdGF0X2VxdWFsKGVudHJ5LnN0YXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeV9zdGF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLm5hbWUgPT0gJ250JyBhbmQgbm90IGlzX3N5bWxpbmspCisgICAgICAgIHNlbGYuYXNzZXJ0X3N0YXRfZXF1YWwoZW50cnkuc3RhdChmb2xsb3dfc3ltbGlua3M9RmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5X2xzdGF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLm5hbWUgPT0gJ250JykKKworICAgIGRlZiB0ZXN0X2F0dHJpYnV0ZXMoc2VsZik6CisgICAgICAgIGxpbmsgPSBoYXNhdHRyKG9zLCAnbGluaycpCisgICAgICAgIHN5bWxpbmsgPSBzdXBwb3J0LmNhbl9zeW1saW5rKCkKKworICAgICAgICBkaXJuYW1lID0gb3MucGF0aC5qb2luKHNlbGYucGF0aCwgImRpciIpCisgICAgICAgIG9zLm1rZGlyKGRpcm5hbWUpCisgICAgICAgIGZpbGVuYW1lID0gc2VsZi5jcmVhdGVfZmlsZSgiZmlsZS50eHQiKQorICAgICAgICBpZiBsaW5rOgorICAgICAgICAgICAgb3MubGluayhmaWxlbmFtZSwgb3MucGF0aC5qb2luKHNlbGYucGF0aCwgImxpbmtfZmlsZS50eHQiKSkKKyAgICAgICAgaWYgc3ltbGluazoKKyAgICAgICAgICAgIG9zLnN5bWxpbmsoZGlybmFtZSwgb3MucGF0aC5qb2luKHNlbGYucGF0aCwgInN5bWxpbmtfZGlyIiksCisgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9pc19kaXJlY3Rvcnk9VHJ1ZSkKKyAgICAgICAgICAgIG9zLnN5bWxpbmsoZmlsZW5hbWUsIG9zLnBhdGguam9pbihzZWxmLnBhdGgsICJzeW1saW5rX2ZpbGUudHh0IikpCisKKyAgICAgICAgbmFtZXMgPSBbJ2RpcicsICdmaWxlLnR4dCddCisgICAgICAgIGlmIGxpbms6CisgICAgICAgICAgICBuYW1lcy5hcHBlbmQoJ2xpbmtfZmlsZS50eHQnKQorICAgICAgICBpZiBzeW1saW5rOgorICAgICAgICAgICAgbmFtZXMuZXh0ZW5kKCgnc3ltbGlua19kaXInLCAnc3ltbGlua19maWxlLnR4dCcpKQorICAgICAgICBlbnRyaWVzID0gc2VsZi5nZXRfZW50cmllcyhuYW1lcykKKworICAgICAgICBlbnRyeSA9IGVudHJpZXNbJ2RpciddCisgICAgICAgIHNlbGYuY2hlY2tfZW50cnkoZW50cnksICdkaXInLCBUcnVlLCBGYWxzZSwgRmFsc2UpCisKKyAgICAgICAgZW50cnkgPSBlbnRyaWVzWydmaWxlLnR4dCddCisgICAgICAgIHNlbGYuY2hlY2tfZW50cnkoZW50cnksICdmaWxlLnR4dCcsIEZhbHNlLCBUcnVlLCBGYWxzZSkKKworICAgICAgICBpZiBsaW5rOgorICAgICAgICAgICAgZW50cnkgPSBlbnRyaWVzWydsaW5rX2ZpbGUudHh0J10KKyAgICAgICAgICAgIHNlbGYuY2hlY2tfZW50cnkoZW50cnksICdsaW5rX2ZpbGUudHh0JywgRmFsc2UsIFRydWUsIEZhbHNlKQorCisgICAgICAgIGlmIHN5bWxpbms6CisgICAgICAgICAgICBlbnRyeSA9IGVudHJpZXNbJ3N5bWxpbmtfZGlyJ10KKyAgICAgICAgICAgIHNlbGYuY2hlY2tfZW50cnkoZW50cnksICdzeW1saW5rX2RpcicsIFRydWUsIEZhbHNlLCBUcnVlKQorCisgICAgICAgICAgICBlbnRyeSA9IGVudHJpZXNbJ3N5bWxpbmtfZmlsZS50eHQnXQorICAgICAgICAgICAgc2VsZi5jaGVja19lbnRyeShlbnRyeSwgJ3N5bWxpbmtfZmlsZS50eHQnLCBGYWxzZSwgVHJ1ZSwgVHJ1ZSkKKworICAgIGRlZiBnZXRfZW50cnkoc2VsZiwgbmFtZSk6CisgICAgICAgIGVudHJpZXMgPSBsaXN0KG9zLnNjYW5kaXIoc2VsZi5wYXRoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZW50cmllcyksIDEpCisKKyAgICAgICAgZW50cnkgPSBlbnRyaWVzWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW50cnkubmFtZSwgbmFtZSkKKyAgICAgICAgcmV0dXJuIGVudHJ5CisKKyAgICBkZWYgY3JlYXRlX2ZpbGVfZW50cnkoc2VsZik6CisgICAgICAgIGZpbGVuYW1lID0gc2VsZi5jcmVhdGVfZmlsZSgpCisgICAgICAgIHJldHVybiBzZWxmLmdldF9lbnRyeShvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSkKKworICAgIGRlZiB0ZXN0X2N1cnJlbnRfZGlyZWN0b3J5KHNlbGYpOgorICAgICAgICBmaWxlbmFtZSA9IHNlbGYuY3JlYXRlX2ZpbGUoKQorICAgICAgICBvbGRfZGlyID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MuY2hkaXIoc2VsZi5wYXRoKQorCisgICAgICAgICAgICAjIGNhbGwgc2NhbmRpcigpIHdpdGhvdXQgcGFyYW1ldGVyOiBpdCBtdXN0IGxpc3QgdGhlIGNvbnRlbnQKKyAgICAgICAgICAgICMgb2YgdGhlIGN1cnJlbnQgZGlyZWN0b3J5CisgICAgICAgICAgICBlbnRyaWVzID0gZGljdCgoZW50cnkubmFtZSwgZW50cnkpIGZvciBlbnRyeSBpbiBvcy5zY2FuZGlyKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvcnRlZChlbnRyaWVzLmtleXMoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKV0pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy5jaGRpcihvbGRfZGlyKQorCisgICAgZGVmIHRlc3RfcmVwcihzZWxmKToKKyAgICAgICAgZW50cnkgPSBzZWxmLmNyZWF0ZV9maWxlX2VudHJ5KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGVudHJ5KSwgIjxEaXJFbnRyeSAnZmlsZS50eHQnPiIpCisKKyAgICBkZWYgdGVzdF9yZW1vdmVkX2RpcihzZWxmKToKKyAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLnBhdGgsICdkaXInKQorCisgICAgICAgIG9zLm1rZGlyKHBhdGgpCisgICAgICAgIGVudHJ5ID0gc2VsZi5nZXRfZW50cnkoJ2RpcicpCisgICAgICAgIG9zLnJtZGlyKHBhdGgpCisKKyAgICAgICAgIyBPbiBQT1NJWCwgaXNfZGlyKCkgcmVzdWx0IGRlcGVuZHMgaWYgc2NhbmRpcigpIGZpbGxlZCBkX3R5cGUgb3Igbm90CisgICAgICAgIGlmIG9zLm5hbWUgPT0gJ250JzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlbnRyeS5pc19kaXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShlbnRyeS5pc19maWxlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZW50cnkuaXNfc3ltbGluaygpKQorICAgICAgICBpZiBvcy5uYW1lID09ICdudCc6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhGaWxlTm90Rm91bmRFcnJvciwgZW50cnkuaW5vZGUpCisgICAgICAgICAgICAjIGRvbid0IGZhaWwKKyAgICAgICAgICAgIGVudHJ5LnN0YXQoKQorICAgICAgICAgICAgZW50cnkuc3RhdChmb2xsb3dfc3ltbGlua3M9RmFsc2UpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXIoZW50cnkuaW5vZGUoKSwgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEZpbGVOb3RGb3VuZEVycm9yLCBlbnRyeS5zdGF0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRmlsZU5vdEZvdW5kRXJyb3IsIGVudHJ5LnN0YXQsIGZvbGxvd19zeW1saW5rcz1GYWxzZSkKKworICAgIGRlZiB0ZXN0X3JlbW92ZWRfZmlsZShzZWxmKToKKyAgICAgICAgZW50cnkgPSBzZWxmLmNyZWF0ZV9maWxlX2VudHJ5KCkKKyAgICAgICAgb3MudW5saW5rKGVudHJ5LnBhdGgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShlbnRyeS5pc19kaXIoKSkKKyAgICAgICAgIyBPbiBQT1NJWCwgaXNfZGlyKCkgcmVzdWx0IGRlcGVuZHMgaWYgc2NhbmRpcigpIGZpbGxlZCBkX3R5cGUgb3Igbm90CisgICAgICAgIGlmIG9zLm5hbWUgPT0gJ250JzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlbnRyeS5pc19maWxlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZW50cnkuaXNfc3ltbGluaygpKQorICAgICAgICBpZiBvcy5uYW1lID09ICdudCc6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhGaWxlTm90Rm91bmRFcnJvciwgZW50cnkuaW5vZGUpCisgICAgICAgICAgICAjIGRvbid0IGZhaWwKKyAgICAgICAgICAgIGVudHJ5LnN0YXQoKQorICAgICAgICAgICAgZW50cnkuc3RhdChmb2xsb3dfc3ltbGlua3M9RmFsc2UpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXIoZW50cnkuaW5vZGUoKSwgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEZpbGVOb3RGb3VuZEVycm9yLCBlbnRyeS5zdGF0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRmlsZU5vdEZvdW5kRXJyb3IsIGVudHJ5LnN0YXQsIGZvbGxvd19zeW1saW5rcz1GYWxzZSkKKworICAgIGRlZiB0ZXN0X2Jyb2tlbl9zeW1saW5rKHNlbGYpOgorICAgICAgICBpZiBub3Qgc3VwcG9ydC5jYW5fc3ltbGluaygpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2tpcFRlc3QoJ2Nhbm5vdCBjcmVhdGUgc3ltYm9saWMgbGluaycpCisKKyAgICAgICAgZmlsZW5hbWUgPSBzZWxmLmNyZWF0ZV9maWxlKCJmaWxlLnR4dCIpCisgICAgICAgIG9zLnN5bWxpbmsoZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHNlbGYucGF0aCwgInN5bWxpbmsudHh0IikpCisgICAgICAgIGVudHJpZXMgPSBzZWxmLmdldF9lbnRyaWVzKFsnZmlsZS50eHQnLCAnc3ltbGluay50eHQnXSkKKyAgICAgICAgZW50cnkgPSBlbnRyaWVzWydzeW1saW5rLnR4dCddCisgICAgICAgIG9zLnVubGluayhmaWxlbmFtZSkKKworICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXIoZW50cnkuaW5vZGUoKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShlbnRyeS5pc19kaXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShlbnRyeS5pc19maWxlKCkpICAjIGJyb2tlbiBzeW1saW5rIHJldHVybnMgRmFsc2UKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShlbnRyeS5pc19kaXIoZm9sbG93X3N5bWxpbmtzPUZhbHNlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShlbnRyeS5pc19maWxlKGZvbGxvd19zeW1saW5rcz1GYWxzZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlbnRyeS5pc19zeW1saW5rKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEZpbGVOb3RGb3VuZEVycm9yLCBlbnRyeS5zdGF0KQorICAgICAgICAjIGRvbid0IGZhaWwKKyAgICAgICAgZW50cnkuc3RhdChmb2xsb3dfc3ltbGlua3M9RmFsc2UpCisKKyAgICBkZWYgdGVzdF9ieXRlcyhzZWxmKToKKyAgICAgICAgaWYgb3MubmFtZSA9PSAibnQiOgorICAgICAgICAgICAgIyBPbiBXaW5kb3dzLCBvcy5zY2FuZGlyKGJ5dGVzKSBtdXN0IHJhaXNlIGFuIGV4Y2VwdGlvbgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcy5zY2FuZGlyLCBiJy4nKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgc2VsZi5jcmVhdGVfZmlsZSgiZmlsZS50eHQiKQorCisgICAgICAgIHBhdGhfYnl0ZXMgPSBvcy5mc2VuY29kZShzZWxmLnBhdGgpCisgICAgICAgIGVudHJpZXMgPSBsaXN0KG9zLnNjYW5kaXIocGF0aF9ieXRlcykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGVudHJpZXMpLCAxLCBlbnRyaWVzKQorICAgICAgICBlbnRyeSA9IGVudHJpZXNbMF0KKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVudHJ5Lm5hbWUsIGInZmlsZS50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVudHJ5LnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3MuZnNlbmNvZGUob3MucGF0aC5qb2luKHNlbGYucGF0aCwgJ2ZpbGUudHh0JykpKQorCisgICAgZGVmIHRlc3RfZW1wdHlfcGF0aChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRmlsZU5vdEZvdW5kRXJyb3IsIG9zLnNjYW5kaXIsICcnKQorCisgICAgZGVmIHRlc3RfY29uc3VtZV9pdGVyYXRvcl90d2ljZShzZWxmKToKKyAgICAgICAgc2VsZi5jcmVhdGVfZmlsZSgiZmlsZS50eHQiKQorICAgICAgICBpdGVyYXRvciA9IG9zLnNjYW5kaXIoc2VsZi5wYXRoKQorCisgICAgICAgIGVudHJpZXMgPSBsaXN0KGl0ZXJhdG9yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihlbnRyaWVzKSwgMSwgZW50cmllcykKKworICAgICAgICAjIGNoZWNrIHRoYW4gY29uc3VtaW5nIHRoZSBpdGVyYXRvciB0d2ljZSBkb2Vzbid0IHJhaXNlIGV4Y2VwdGlvbgorICAgICAgICBlbnRyaWVzMiA9IGxpc3QoaXRlcmF0b3IpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGVudHJpZXMyKSwgMCwgZW50cmllczIpCisKKyAgICBkZWYgdGVzdF9iYWRfcGF0aF90eXBlKHNlbGYpOgorICAgICAgICBmb3Igb2JqIGluIFsxMjM0LCAxLjIzNCwge30sIFtdXToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3Muc2NhbmRpciwgb2JqKQorCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BhdGhsaWIucHkgYi9MaWIvdGVzdC90ZXN0X3BhdGhsaWIucHkKaW5kZXggZjRlZTUxOS4uMWM1M2FiNyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wYXRobGliLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcGF0aGxpYi5weQpAQCAtMTAyLDMxICsxMDIsMzUgQEAKICAgICAgICAgY2hlY2sgPSBzZWxmLl9jaGVja19wYXJzZV9wYXJ0cwogICAgICAgICAjIEZpcnN0IHBhcnQgaXMgYW5jaG9yZWQKICAgICAgICAgY2hlY2soWydjOiddLCAgICAgICAgICAgICAgICAgICAoJ2M6JywgJycsIFsnYzonXSkpCi0gICAgICAgIGNoZWNrKFsnYzpcXCddLCAgICAgICAgICAgICAgICAgKCdjOicsICdcXCcsIFsnYzpcXCddKSkKLSAgICAgICAgY2hlY2soWydcXCddLCAgICAgICAgICAgICAgICAgICAoJycsICdcXCcsIFsnXFwnXSkpCisgICAgICAgIGNoZWNrKFsnYzovJ10sICAgICAgICAgICAgICAgICAgKCdjOicsICdcXCcsIFsnYzpcXCddKSkKKyAgICAgICAgY2hlY2soWycvJ10sICAgICAgICAgICAgICAgICAgICAoJycsICdcXCcsIFsnXFwnXSkpCiAgICAgICAgIGNoZWNrKFsnYzphJ10sICAgICAgICAgICAgICAgICAgKCdjOicsICcnLCBbJ2M6JywgJ2EnXSkpCi0gICAgICAgIGNoZWNrKFsnYzpcXGEnXSwgICAgICAgICAgICAgICAgKCdjOicsICdcXCcsIFsnYzpcXCcsICdhJ10pKQotICAgICAgICBjaGVjayhbJ1xcYSddLCAgICAgICAgICAgICAgICAgICgnJywgJ1xcJywgWydcXCcsICdhJ10pKQorICAgICAgICBjaGVjayhbJ2M6L2EnXSwgICAgICAgICAgICAgICAgICgnYzonLCAnXFwnLCBbJ2M6XFwnLCAnYSddKSkKKyAgICAgICAgY2hlY2soWycvYSddLCAgICAgICAgICAgICAgICAgICAoJycsICdcXCcsIFsnXFwnLCAnYSddKSkKICAgICAgICAgIyBVTkMgcGF0aHMKLSAgICAgICAgY2hlY2soWydcXFxcYVxcYiddLCAgICAgICAgICAgICAoJ1xcXFxhXFxiJywgJ1xcJywgWydcXFxcYVxcYlxcJ10pKQotICAgICAgICBjaGVjayhbJ1xcXFxhXFxiXFwnXSwgICAgICAgICAgICgnXFxcXGFcXGInLCAnXFwnLCBbJ1xcXFxhXFxiXFwnXSkpCi0gICAgICAgIGNoZWNrKFsnXFxcXGFcXGJcXGMnXSwgICAgICAgICAgKCdcXFxcYVxcYicsICdcXCcsIFsnXFxcXGFcXGJcXCcsICdjJ10pKQorICAgICAgICBjaGVjayhbJy8vYS9iJ10sICAgICAgICAgICAgICAgICgnXFxcXGFcXGInLCAnXFwnLCBbJ1xcXFxhXFxiXFwnXSkpCisgICAgICAgIGNoZWNrKFsnLy9hL2IvJ10sICAgICAgICAgICAgICAgKCdcXFxcYVxcYicsICdcXCcsIFsnXFxcXGFcXGJcXCddKSkKKyAgICAgICAgY2hlY2soWycvL2EvYi9jJ10sICAgICAgICAgICAgICAoJ1xcXFxhXFxiJywgJ1xcJywgWydcXFxcYVxcYlxcJywgJ2MnXSkpCiAgICAgICAgICMgU2Vjb25kIHBhcnQgaXMgYW5jaG9yZWQsIHNvIHRoYXQgdGhlIGZpcnN0IHBhcnQgaXMgaWdub3JlZAogICAgICAgICBjaGVjayhbJ2EnLCAnWjpiJywgJ2MnXSwgICAgICAgICgnWjonLCAnJywgWydaOicsICdiJywgJ2MnXSkpCi0gICAgICAgIGNoZWNrKFsnYScsICdaOlxcYicsICdjJ10sICAgICAgKCdaOicsICdcXCcsIFsnWjpcXCcsICdiJywgJ2MnXSkpCi0gICAgICAgIGNoZWNrKFsnYScsICdcXGInLCAnYyddLCAgICAgICAgKCcnLCAnXFwnLCBbJ1xcJywgJ2InLCAnYyddKSkKKyAgICAgICAgY2hlY2soWydhJywgJ1o6L2InLCAnYyddLCAgICAgICAoJ1o6JywgJ1xcJywgWydaOlxcJywgJ2InLCAnYyddKSkKICAgICAgICAgIyBVTkMgcGF0aHMKLSAgICAgICAgY2hlY2soWydhJywgJ1xcXFxiXFxjJywgJ2QnXSwgICAoJ1xcXFxiXFxjJywgJ1xcJywgWydcXFxcYlxcY1xcJywgJ2QnXSkpCisgICAgICAgIGNoZWNrKFsnYScsICcvL2IvYycsICdkJ10sICAgICAgKCdcXFxcYlxcYycsICdcXCcsIFsnXFxcXGJcXGNcXCcsICdkJ10pKQogICAgICAgICAjIENvbGxhcHNpbmcgYW5kIHN0cmlwcGluZyBleGNlc3Mgc2xhc2hlcwotICAgICAgICBjaGVjayhbJ2EnLCAnWjpcXFxcYlxcXFxjXFwnLCAnZFxcJ10sICgnWjonLCAnXFwnLCBbJ1o6XFwnLCAnYicsICdjJywgJ2QnXSkpCisgICAgICAgIGNoZWNrKFsnYScsICdaOi8vYi8vYy8nLCAnZC8nXSwgKCdaOicsICdcXCcsIFsnWjpcXCcsICdiJywgJ2MnLCAnZCddKSkKICAgICAgICAgIyBVTkMgcGF0aHMKLSAgICAgICAgY2hlY2soWydhJywgJ1xcXFxiXFxjXFxcXCcsICdkJ10sICgnXFxcXGJcXGMnLCAnXFwnLCBbJ1xcXFxiXFxjXFwnLCAnZCddKSkKKyAgICAgICAgY2hlY2soWydhJywgJy8vYi9jLy8nLCAnZCddLCAgICAoJ1xcXFxiXFxjJywgJ1xcJywgWydcXFxcYlxcY1xcJywgJ2QnXSkpCiAgICAgICAgICMgRXh0ZW5kZWQgcGF0aHMKLSAgICAgICAgY2hlY2soWydcXFxcP1xcYzpcXCddLCAgICAgICAgICAoJ1xcXFw/XFxjOicsICdcXCcsIFsnXFxcXD9cXGM6XFwnXSkpCi0gICAgICAgIGNoZWNrKFsnXFxcXD9cXGM6XFxhJ10sICAgICAgICAgKCdcXFxcP1xcYzonLCAnXFwnLCBbJ1xcXFw/XFxjOlxcJywgJ2EnXSkpCisgICAgICAgIGNoZWNrKFsnLy8/L2M6LyddLCAgICAgICAgICAgICAgKCdcXFxcP1xcYzonLCAnXFwnLCBbJ1xcXFw/XFxjOlxcJ10pKQorICAgICAgICBjaGVjayhbJy8vPy9jOi9hJ10sICAgICAgICAgICAgICgnXFxcXD9cXGM6JywgJ1xcJywgWydcXFxcP1xcYzpcXCcsICdhJ10pKQorICAgICAgICBjaGVjayhbJy8vPy9jOi9hJywgJy9iJ10sICAgICAgICgnXFxcXD9cXGM6JywgJ1xcJywgWydcXFxcP1xcYzpcXCcsICdiJ10pKQogICAgICAgICAjIEV4dGVuZGVkIFVOQyBwYXRocyAoZm9ybWF0IGlzICJcXD9cVU5DXHNlcnZlclxzaGFyZSIpCi0gICAgICAgIGNoZWNrKFsnXFxcXD9cXFVOQ1xcYlxcYyddLCAgICAgKCdcXFxcP1xcVU5DXFxiXFxjJywgJ1xcJywgWydcXFxcP1xcVU5DXFxiXFxjXFwnXSkpCi0gICAgICAgIGNoZWNrKFsnXFxcXD9cXFVOQ1xcYlxcY1xcZCddLCAgKCdcXFxcP1xcVU5DXFxiXFxjJywgJ1xcJywgWydcXFxcP1xcVU5DXFxiXFxjXFwnLCAnZCddKSkKKyAgICAgICAgY2hlY2soWycvLz8vVU5DL2IvYyddLCAgICAgICAgICAoJ1xcXFw/XFxVTkNcXGJcXGMnLCAnXFwnLCBbJ1xcXFw/XFxVTkNcXGJcXGNcXCddKSkKKyAgICAgICAgY2hlY2soWycvLz8vVU5DL2IvYy9kJ10sICAgICAgICAoJ1xcXFw/XFxVTkNcXGJcXGMnLCAnXFwnLCBbJ1xcXFw/XFxVTkNcXGJcXGNcXCcsICdkJ10pKQorICAgICAgICAjIFNlY29uZCBwYXJ0IGhhcyBhIHJvb3QgYnV0IG5vdCBkcml2ZQorICAgICAgICBjaGVjayhbJ2EnLCAnL2InLCAnYyddLCAgICAgICAgICgnJywgJ1xcJywgWydcXCcsICdiJywgJ2MnXSkpCisgICAgICAgIGNoZWNrKFsnWjovYScsICcvYicsICdjJ10sICAgICAgKCdaOicsICdcXCcsIFsnWjpcXCcsICdiJywgJ2MnXSkpCisgICAgICAgIGNoZWNrKFsnLy8/L1o6L2EnLCAnL2InLCAnYyddLCAgKCdcXFxcP1xcWjonLCAnXFwnLCBbJ1xcXFw/XFxaOlxcJywgJ2InLCAnYyddKSkKIAogICAgIGRlZiB0ZXN0X3NwbGl0cm9vdChzZWxmKToKICAgICAgICAgZiA9IHNlbGYuZmxhdm91ci5zcGxpdHJvb3QKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcHByaW50LnB5IGIvTGliL3Rlc3QvdGVzdF9wcHJpbnQucHkKaW5kZXggYWQ2YTdhMS4uYzA1Njg4MCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wcHJpbnQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wcHJpbnQucHkKQEAgLTE5MiwxMCArMTkyLDUyIEBACiAgICAgICAgIG8gPSBbbzEsIG8yXQogICAgICAgICBleHBlY3RlZCA9ICIiIlwKIFsgICBbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOV0sCisgICAgeydmaXJzdCc6IDEsICdzZWNvbmQnOiAyLCAndGhpcmQnOiAzfV0iIiIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcHJpbnQucGZvcm1hdChvLCBpbmRlbnQ9NCwgd2lkdGg9NDIpLCBleHBlY3RlZCkKKyAgICAgICAgZXhwZWN0ZWQgPSAiIiJcCitbICAgWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldLAogICAgIHsgICAnZmlyc3QnOiAxLAogICAgICAgICAnc2Vjb25kJzogMiwKICAgICAgICAgJ3RoaXJkJzogM31dIiIiCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHByaW50LnBmb3JtYXQobywgaW5kZW50PTQsIHdpZHRoPTQyKSwgZXhwZWN0ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHByaW50LnBmb3JtYXQobywgaW5kZW50PTQsIHdpZHRoPTQxKSwgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF93aWR0aChzZWxmKToKKyAgICAgICAgZXhwZWN0ZWQgPSAiIiJcCitbW1tbW1sxLCAyLCAzXSwKKyAgICAgJzEgMiddXV1dLAorIHsxOiBbMSwgMiwgM10sCisgIDI6IFsxMiwgMzRdfSwKKyAnYWJjIGRlZiBnaGknLAorICgnYWIgY2QgZWYnLCksCisgc2V0Mih7MSwgMjN9KSwKKyBbW1tbWzEsIDIsIDNdLAorICAgICAnMSAyJ11dXV1dIiIiCisgICAgICAgIG8gPSBldmFsKGV4cGVjdGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBwcmludC5wZm9ybWF0KG8sIHdpZHRoPTE1KSwgZXhwZWN0ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHByaW50LnBmb3JtYXQobywgd2lkdGg9MTYpLCBleHBlY3RlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcHJpbnQucGZvcm1hdChvLCB3aWR0aD0yNSksIGV4cGVjdGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBwcmludC5wZm9ybWF0KG8sIHdpZHRoPTE0KSwgIiIiXAorW1tbW1tbMSwKKyAgICAgIDIsCisgICAgICAzXSwKKyAgICAgJzEgJworICAgICAnMiddXV1dLAorIHsxOiBbMSwKKyAgICAgIDIsCisgICAgICAzXSwKKyAgMjogWzEyLAorICAgICAgMzRdfSwKKyAnYWJjIGRlZiAnCisgJ2doaScsCisgKCdhYiBjZCAnCisgICdlZicsKSwKKyBzZXQyKHsxLAorICAgICAgIDIzfSksCisgW1tbW1sxLAorICAgICAgMiwKKyAgICAgIDNdLAorICAgICAnMSAnCisgICAgICcyJ11dXV1dIiIiKQogCiAgICAgZGVmIHRlc3Rfc29ydGVkX2RpY3Qoc2VsZik6CiAgICAgICAgICMgU3RhcnRpbmcgaW4gUHl0aG9uIDIuNSwgcHByaW50IHNvcnRzIGRpY3QgZGlzcGxheXMgYnkga2V5IHJlZ2FyZGxlc3MKQEAgLTUzNSwxMyArNTc3LDEyIEBACiAgICAgZGVmIHRlc3Rfc3RyX3dyYXAoc2VsZik6CiAgICAgICAgICMgcHByaW50IHRyaWVzIHRvIHdyYXAgc3RyaW5ncyBpbnRlbGxpZ2VudGx5CiAgICAgICAgIGZveCA9ICd0aGUgcXVpY2sgYnJvd24gZm94IGp1bXBlZCBvdmVyIGEgbGF6eSBkb2cnCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHByaW50LnBmb3JtYXQoZm94LCB3aWR0aD0yMCksICIiIlwKLSgndGhlIHF1aWNrICcKLSAnYnJvd24gZm94ICcKLSAnanVtcGVkIG92ZXIgYSAnCi0gJ2xhenkgZG9nJykiIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHByaW50LnBmb3JtYXQoZm94LCB3aWR0aD0xOSksICIiIlwKKygndGhlIHF1aWNrIGJyb3duICcKKyAnZm94IGp1bXBlZCBvdmVyICcKKyAnYSBsYXp5IGRvZycpIiIiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBwcmludC5wZm9ybWF0KHsnYSc6IDEsICdiJzogZm94LCAnYyc6IDJ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPTI2KSwgIiIiXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPTI1KSwgIiIiXAogeydhJzogMSwKICAnYic6ICd0aGUgcXVpY2sgYnJvd24gJwogICAgICAgJ2ZveCBqdW1wZWQgb3ZlciAnCkBAIC01NTMsMTIgKzU5NCwzNCBAQAogICAgICAgICAjIC0gbm9uLUFTQ0lJIGlzIGFsbG93ZWQKICAgICAgICAgIyAtIGFuIGFwb3N0cm9waGUgZG9lc24ndCBkaXNydXB0IHRoZSBwcHJpbnQKICAgICAgICAgc3BlY2lhbCA9ICJQb3J0b25zIGRpeCBib25zIFwid2hpc2t5c1wiXG7DoCBsJ2F2b2NhdCBnb3VqYXRcdCBxdWkgZnVtYWl0IGF1IHpvbyIKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcHJpbnQucGZvcm1hdChzcGVjaWFsLCB3aWR0aD0yMSksICIiIlwKLSgnUG9ydG9ucyBkaXggJwotICdib25zICJ3aGlza3lzIlxcbicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcHJpbnQucGZvcm1hdChzcGVjaWFsLCB3aWR0aD02OCksIHJlcHIoc3BlY2lhbCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHByaW50LnBmb3JtYXQoc3BlY2lhbCwgd2lkdGg9MzEpLCAiIiJcCisoJ1BvcnRvbnMgZGl4IGJvbnMgIndoaXNreXMiXFxuJworICLDoCBsJ2F2b2NhdCBnb3VqYXRcXHQgcXVpICIKKyAnZnVtYWl0IGF1IHpvbycpIiIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBwcmludC5wZm9ybWF0KHNwZWNpYWwsIHdpZHRoPTIwKSwgIiIiXAorKCdQb3J0b25zIGRpeCBib25zICcKKyAnIndoaXNreXMiXFxuJwogICLDoCBsJ2F2b2NhdCAiCiAgJ2dvdWphdFxcdCBxdWkgJwogICdmdW1haXQgYXUgem9vJykiIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHByaW50LnBmb3JtYXQoW1tbW1tzcGVjaWFsXV1dXV0sIHdpZHRoPTM1KSwgIiIiXAorW1tbW1snUG9ydG9ucyBkaXggYm9ucyAid2hpc2t5cyJcXG4nCisgICAgICLDoCBsJ2F2b2NhdCBnb3VqYXRcXHQgcXVpICIKKyAgICAgJ2Z1bWFpdCBhdSB6b28nXV1dXV0iIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHByaW50LnBmb3JtYXQoW1tbW1tzcGVjaWFsXV1dXV0sIHdpZHRoPTI1KSwgIiIiXAorW1tbW1snUG9ydG9ucyBkaXggYm9ucyAnCisgICAgICcid2hpc2t5cyJcXG4nCisgICAgICLDoCBsJ2F2b2NhdCAiCisgICAgICdnb3VqYXRcXHQgcXVpICcKKyAgICAgJ2Z1bWFpdCBhdSB6b28nXV1dXV0iIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHByaW50LnBmb3JtYXQoW1tbW1tzcGVjaWFsXV1dXV0sIHdpZHRoPTIzKSwgIiIiXAorW1tbW1snUG9ydG9ucyBkaXggJworICAgICAnYm9ucyAid2hpc2t5cyJcXG4nCisgICAgICLDoCBsJ2F2b2NhdCAiCisgICAgICdnb3VqYXRcXHQgcXVpICcKKyAgICAgJ2Z1bWFpdCBhdSAnCisgICAgICd6b28nXV1dXV0iIiIpCiAgICAgICAgICMgQW4gdW53cmFwcGFibGUgc3RyaW5nIGlzIGZvcm1hdHRlZCBhcyBpdHMgcmVwcgogICAgICAgICB1bndyYXBwYWJsZSA9ICJ4IiAqIDEwMAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBwcmludC5wZm9ybWF0KHVud3JhcHBhYmxlLCB3aWR0aD04MCksIHJlcHIodW53cmFwcGFibGUpKQpAQCAtNTgxLDcgKzY0NCwxOSBAQAogICAxNCwgMTVdLAogIFtdLCBbMF0sIFswLCAxXSwgWzAsIDEsIDJdLCBbMCwgMSwgMiwgM10sCiAgWzAsIDEsIDIsIDMsIDRdXSIiIgotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBwcmludC5wZm9ybWF0KG8sIHdpZHRoPTQ4LCBjb21wYWN0PVRydWUpLCBleHBlY3RlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcHJpbnQucGZvcm1hdChvLCB3aWR0aD00NywgY29tcGFjdD1UcnVlKSwgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9jb21wYWN0X3dpZHRoKHNlbGYpOgorICAgICAgICBsZXZlbHMgPSAyMAorICAgICAgICBudW1iZXIgPSAxMAorICAgICAgICBvID0gWzBdICogbnVtYmVyCisgICAgICAgIGZvciBpIGluIHJhbmdlKGxldmVscyAtIDEpOgorICAgICAgICAgICAgbyA9IFtvXQorICAgICAgICBmb3IgdyBpbiByYW5nZShsZXZlbHMgKiAyICsgMSwgbGV2ZWxzICsgMyAqIG51bWJlciAtIDEpOgorICAgICAgICAgICAgbGluZXMgPSBwcHJpbnQucGZvcm1hdChvLCB3aWR0aD13LCBjb21wYWN0PVRydWUpLnNwbGl0bGluZXMoKQorICAgICAgICAgICAgbWF4d2lkdGggPSBtYXgobWFwKGxlbiwgbGluZXMpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRMZXNzRXF1YWwobWF4d2lkdGgsIHcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXIobWF4d2lkdGgsIHcgLSAzKQogCiAKIGNsYXNzIERvdHRlZFByZXR0eVByaW50ZXIocHByaW50LlByZXR0eVByaW50ZXIpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9weWRvYy5weSBiL0xpYi90ZXN0L3Rlc3RfcHlkb2MucHkKaW5kZXggNjc0MjQ0NC4uNTBlZDRkNSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9weWRvYy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3B5ZG9jLnB5CkBAIC0yLDEyICsyLDE1IEBACiBpbXBvcnQgc3lzCiBpbXBvcnQgYnVpbHRpbnMKIGltcG9ydCBjb250ZXh0bGliCitpbXBvcnQgaW1wb3J0bGliLnV0aWwKIGltcG9ydCBpbnNwZWN0CiBpbXBvcnQgcHlkb2MKK2ltcG9ydCBweV9jb21waWxlCiBpbXBvcnQga2V5d29yZAogaW1wb3J0IF9waWNrbGUKIGltcG9ydCBwa2d1dGlsCiBpbXBvcnQgcmUKK2ltcG9ydCBzdGF0CiBpbXBvcnQgc3RyaW5nCiBpbXBvcnQgdGVzdC5zdXBwb3J0CiBpbXBvcnQgdGltZQpAQCAtMzEsNiArMzQsMTAgQEAKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICB0aHJlYWRpbmcgPSBOb25lCiAKK2NsYXNzIG5vbmFzY2lpOgorICAgICfQptC1INC90LUg0LvQsNGC0LjQvdC40YbRjycKKyAgICBwYXNzCisKIGlmIHRlc3Quc3VwcG9ydC5IQVZFX0RPQ1NUUklOR1M6CiAgICAgZXhwZWN0ZWRfZGF0YV9kb2NzdHJpbmdzID0gKAogICAgICAgICAnZGljdGlvbmFyeSBmb3IgaW5zdGFuY2UgdmFyaWFibGVzIChpZiBkZWZpbmVkKScsCkBAIC0yNDksNyArMjU2LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBzIGluIGV4cGVjdGVkX2RhdGFfZG9jc3RyaW5ncykKIAogIyBvdXRwdXQgcGF0dGVybiBmb3IgbWlzc2luZyBtb2R1bGUKLW1pc3NpbmdfcGF0dGVybiA9ICJubyBQeXRob24gZG9jdW1lbnRhdGlvbiBmb3VuZCBmb3IgJyVzJyIKK21pc3NpbmdfcGF0dGVybiA9ICcnJ1wKK05vIFB5dGhvbiBkb2N1bWVudGF0aW9uIGZvdW5kIGZvciAlci4KK1VzZSBoZWxwKCkgdG8gZ2V0IHRoZSBpbnRlcmFjdGl2ZSBoZWxwIHV0aWxpdHkuCitVc2UgaGVscChzdHIpIGZvciBoZWxwIG9uIHRoZSBzdHIgY2xhc3MuJycnLnJlcGxhY2UoJ1xuJywgb3MubGluZXNlcCkKIAogIyBvdXRwdXQgcGF0dGVybiBmb3IgbW9kdWxlIHdpdGggYmFkIGltcG9ydHMKIGJhZGltcG9ydF9wYXR0ZXJuID0gInByb2JsZW0gaW4gJXMgLSBJbXBvcnRFcnJvcjogTm8gbW9kdWxlIG5hbWVkICVyIgpAQCAtNDU3LDYgKzQ2NywxMyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLCByZXN1bHQsCiAgICAgICAgICAgICAiZG9jdW1lbnRhdGlvbiBmb3IgbWlzc2luZyBtb2R1bGUgZm91bmQiKQogCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMuZmxhZ3Mub3B0aW1pemUgPj0gMiwKKyAgICAgICAgICAgICAgICAgICAgICdEb2NzdHJpbmdzIGFyZSBvbWl0dGVkIHdpdGggLU9PIGFuZCBhYm92ZScpCisgICAgZGVmIHRlc3Rfbm90X2FzY2lpKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBydW5fcHlkb2MoJ3Rlc3QudGVzdF9weWRvYy5ub25hc2NpaScsIFBZVEhPTklPRU5DT0RJTkc9J2FzY2lpJykKKyAgICAgICAgZW5jb2RlZCA9IG5vbmFzY2lpLl9fZG9jX18uZW5jb2RlKCdhc2NpaScsICdiYWNrc2xhc2hyZXBsYWNlJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbihlbmNvZGVkLCByZXN1bHQpCisKICAgICBkZWYgdGVzdF9pbnB1dF9zdHJpcChzZWxmKToKICAgICAgICAgbWlzc2luZ19tb2R1bGUgPSAiIHRlc3QuaV9hbV9ub3RfaGVyZSAiCiAgICAgICAgIHJlc3VsdCA9IHN0cihydW5fcHlkb2MobWlzc2luZ19tb2R1bGUpLCAnYXNjaWknKQpAQCAtNTM2LDYgKzU1Myw4IEBACiAgICAgICAgICAgICBzeW5vcHNpcyA9IHB5ZG9jLnN5bm9wc2lzKFRFU1RGTiwge30pCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN5bm9wc2lzLCAnbGluZSAxOiBoXHhlOScpCiAKKyAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5mbGFncy5vcHRpbWl6ZSA+PSAyLAorICAgICAgICAgICAgICAgICAgICAgJ0RvY3N0cmluZ3MgYXJlIG9taXR0ZWQgd2l0aCAtT08gYW5kIGFib3ZlJykKICAgICBkZWYgdGVzdF9zeW5vcHNpc19zb3VyY2VsZXNzKHNlbGYpOgogICAgICAgICBleHBlY3RlZCA9IG9zLl9fZG9jX18uc3BsaXRsaW5lcygpWzBdCiAgICAgICAgIGZpbGVuYW1lID0gb3MuX19jYWNoZWRfXwpAQCAtNTQzLDYgKzU2MiwxOCBAQAogCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3lub3BzaXMsIGV4cGVjdGVkKQogCisgICAgZGVmIHRlc3Rfc3lub3BzaXNfc291cmNlbGVzc19lbXB0eV9kb2Moc2VsZik6CisgICAgICAgIHdpdGggdGVzdC5zdXBwb3J0LnRlbXBfY3dkKCkgYXMgdGVzdF9kaXI6CisgICAgICAgICAgICBpbml0X3BhdGggPSBvcy5wYXRoLmpvaW4odGVzdF9kaXIsICdmb29tb2Q0Mi5weScpCisgICAgICAgICAgICBjYWNoZWRfcGF0aCA9IGltcG9ydGxpYi51dGlsLmNhY2hlX2Zyb21fc291cmNlKGluaXRfcGF0aCkKKyAgICAgICAgICAgIHdpdGggb3Blbihpbml0X3BhdGgsICd3JykgYXMgZm9iajoKKyAgICAgICAgICAgICAgICBmb2JqLndyaXRlKCJmb28gPSAxIikKKyAgICAgICAgICAgIHB5X2NvbXBpbGUuY29tcGlsZShpbml0X3BhdGgpCisgICAgICAgICAgICBzeW5vcHNpcyA9IHB5ZG9jLnN5bm9wc2lzKGluaXRfcGF0aCwge30pCisgICAgICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzeW5vcHNpcykKKyAgICAgICAgICAgIHN5bm9wc2lzX2NhY2hlZCA9IHB5ZG9jLnN5bm9wc2lzKGNhY2hlZF9wYXRoLCB7fSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHN5bm9wc2lzX2NhY2hlZCkKKwogICAgIGRlZiB0ZXN0X3NwbGl0ZG9jX3dpdGhfZGVzY3JpcHRpb24oc2VsZik6CiAgICAgICAgIGV4YW1wbGVfc3RyaW5nID0gIkkgQW0gQSBEb2NcblxuXG5IZXJlIGlzIG15IGRlc2NyaXB0aW9uIgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHB5ZG9jLnNwbGl0ZG9jKGV4YW1wbGVfc3RyaW5nKSwKQEAgLTU5OCw2ICs2MjksNyBAQAogICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgc2VsZi50ZXN0X2RpciA9IG9zLm1rZGlyKFRFU1RGTikKICAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHJtdHJlZSwgVEVTVEZOKQorICAgICAgICBpbXBvcnRsaWIuaW52YWxpZGF0ZV9jYWNoZXMoKQogCiAgICAgZGVmIHRlc3RfYmFkaW1wb3J0KHNlbGYpOgogICAgICAgICAjIFRoaXMgdGVzdHMgdGhlIGZpeCBmb3IgaXNzdWUgNTIzMCwgd2hlcmUgaWYgcHlkb2MgZm91bmQgdGhlIG1vZHVsZQpAQCAtNjU2LDYgKzY4OCwyMiBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dC5nZXR2YWx1ZSgpLCAnJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnIuZ2V0dmFsdWUoKSwgJycpCiAKKyAgICBkZWYgdGVzdF9hcHJvcG9zX2VtcHR5X2RvYyhzZWxmKToKKyAgICAgICAgcGtnZGlyID0gb3MucGF0aC5qb2luKFRFU1RGTiwgJ3dhbGtwa2cnKQorICAgICAgICBvcy5ta2Rpcihwa2dkaXIpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChybXRyZWUsIHBrZ2RpcikKKyAgICAgICAgaW5pdF9wYXRoID0gb3MucGF0aC5qb2luKHBrZ2RpciwgJ19faW5pdF9fLnB5JykKKyAgICAgICAgd2l0aCBvcGVuKGluaXRfcGF0aCwgJ3cnKSBhcyBmb2JqOgorICAgICAgICAgICAgZm9iai53cml0ZSgiZm9vID0gMSIpCisgICAgICAgIGN1cnJlbnRfbW9kZSA9IHN0YXQuU19JTU9ERShvcy5zdGF0KHBrZ2Rpcikuc3RfbW9kZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MuY2htb2QocGtnZGlyLCBjdXJyZW50X21vZGUgJiB+c3RhdC5TX0lFWEVDKQorICAgICAgICAgICAgd2l0aCBzZWxmLnJlc3RyaWN0X3dhbGtfcGFja2FnZXMocGF0aD1bVEVTVEZOXSksIGNhcHR1cmVkX3N0ZG91dCgpIGFzIHN0ZG91dDoKKyAgICAgICAgICAgICAgICBweWRvYy5hcHJvcG9zKCcnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbignd2Fsa3BrZycsIHN0ZG91dC5nZXR2YWx1ZSgpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MuY2htb2QocGtnZGlyLCBjdXJyZW50X21vZGUpCisKICAgICBAdW5pdHRlc3Quc2tpcCgnY2F1c2VzIHVuZGVzaXJlYWJsZSBzaWRlLWVmZmVjdHMgKCMyMDEyOCknKQogICAgIGRlZiB0ZXN0X21vZHVsZXMoc2VsZik6CiAgICAgICAgICMgU2VlIEhlbHBlci5saXN0bW9kdWxlcygpLgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9yZS5weSBiL0xpYi90ZXN0L3Rlc3RfcmUucHkKaW5kZXggMmZiNDc2NC4uMGZiZjhjNSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9yZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3JlLnB5CkBAIC02MDQsNyArNjA0LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgiYS4qYiIsICJhXG5cbmIiLCByZS5ET1RBTEwpLmdyb3VwKDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICJhXG5cbmIiKQogCi0gICAgZGVmIHRlc3Rfbm9uX2NvbnN1bWluZyhzZWxmKToKKyAgICBkZWYgdGVzdF9sb29rYWhlYWQoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goIihhKD89XHNbXmFdKSkiLCAiYSBiIikuZ3JvdXAoMSksICJhIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgiKGEoPz1cc1teYV0qKSkiLCAiYSBiIikuZ3JvdXAoMSksICJhIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgiKGEoPz1cc1thYmNdKSkiLCAiYSBiIikuZ3JvdXAoMSksICJhIikKQEAgLTYxOCw2ICs2MTgsNDYgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaChyIihhKSg/IVxzXDEpIiwgImEgYiIpLmdyb3VwKDEpLCAiYSIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2gociIoYSkoPyFccyhhYmN8YSkpIiwgImEgYiIpLmdyb3VwKDEpLCAiYSIpCiAKKyAgICAgICAgIyBHcm91cCByZWZlcmVuY2UuCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaChyJyhhKWIoPz1cMSlhJywgJ2FiYScpKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShyZS5tYXRjaChyJyhhKWIoPz1cMSljJywgJ2FiYWMnKSkKKyAgICAgICAgIyBDb25kaXRpb25hbCBncm91cCByZWZlcmVuY2UuCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaChyJyg/OihhKXwoeCkpYig/PSg/KDIpeHxjKSljJywgJ2FiYycpKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShyZS5tYXRjaChyJyg/OihhKXwoeCkpYig/PSg/KDIpY3x4KSljJywgJ2FiYycpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2gocicoPzooYSl8KHgpKWIoPz0oPygyKXh8YykpYycsICdhYmMnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocmUubWF0Y2gocicoPzooYSl8KHgpKWIoPz0oPygxKWJ8eCkpYycsICdhYmMnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLm1hdGNoKHInKD86KGEpfCh4KSliKD89KD8oMSljfHgpKWMnLCAnYWJjJykpCisgICAgICAgICMgR3JvdXAgdXNlZCBiZWZvcmUgZGVmaW5lZC4KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLm1hdGNoKHInKGEpYig/PSg/KDIpeHxjKSkoYyknLCAnYWJjJykpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHJlLm1hdGNoKHInKGEpYig/PSg/KDIpYnx4KSkoYyknLCAnYWJjJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaChyJyhhKWIoPz0oPygxKWN8eCkpKGMpJywgJ2FiYycpKQorCisgICAgZGVmIHRlc3RfbG9va2JlaGluZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLm1hdGNoKHInYWIoPzw9YiljJywgJ2FiYycpKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShyZS5tYXRjaChyJ2FiKD88PWMpYycsICdhYmMnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocmUubWF0Y2gocidhYig/PCFiKWMnLCAnYWJjJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaChyJ2FiKD88IWMpYycsICdhYmMnKSkKKyAgICAgICAgIyBHcm91cCByZWZlcmVuY2UuCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaChyJyhhKWEoPzw9XDEpYycsICdhYWMnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocmUubWF0Y2gocicoYSliKD88PVwxKWEnLCAnYWJhYScpKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShyZS5tYXRjaChyJyhhKWEoPzwhXDEpYycsICdhYWMnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLm1hdGNoKHInKGEpYig/PCFcMSlhJywgJ2FiYWEnKSkKKyAgICAgICAgIyBDb25kaXRpb25hbCBncm91cCByZWZlcmVuY2UuCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHJlLm1hdGNoKHInKD86KGEpfCh4KSliKD88PSg/KDIpeHxjKSljJywgJ2FiYycpKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShyZS5tYXRjaChyJyg/OihhKXwoeCkpYig/PD0oPygyKWJ8eCkpYycsICdhYmMnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLm1hdGNoKHInKD86KGEpfCh4KSliKD88PSg/KDIpeHxiKSljJywgJ2FiYycpKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShyZS5tYXRjaChyJyg/OihhKXwoeCkpYig/PD0oPygxKWN8eCkpYycsICdhYmMnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLm1hdGNoKHInKD86KGEpfCh4KSliKD88PSg/KDEpYnx4KSljJywgJ2FiYycpKQorICAgICAgICAjIEdyb3VwIHVzZWQgYmVmb3JlIGRlZmluZWQuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5jb21waWxlLCByJyhhKWIoPzw9KD8oMilifHgpKShjKScpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHJlLm1hdGNoKHInKGEpYig/PD0oPygxKWN8eCkpKGMpJywgJ2FiYycpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2gocicoYSliKD88PSg/KDEpYnx4KSkoYyknLCAnYWJjJykpCisgICAgICAgICMgR3JvdXAgZGVmaW5lZCBpbiB0aGUgc2FtZSBsb29rYmVoaW5kIHBhdHRlcm4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmUuZXJyb3IsIHJlLmNvbXBpbGUsIHInKGEpYig/PD0oLilcMikoYyknKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhyZS5lcnJvciwgcmUuY29tcGlsZSwgcicoYSliKD88PSg/UDxhPi4pKD9QPWEpKShjKScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5jb21waWxlLCByJyhhKWIoPzw9KGEpKD8oMilifHgpKShjKScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5jb21waWxlLCByJyhhKWIoPzw9KC4pKD88PVwyKSkoYyknKQorCiAgICAgZGVmIHRlc3RfaWdub3JlX2Nhc2Uoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goImFiYyIsICJBQkMiLCByZS5JKS5ncm91cCgwKSwgIkFCQyIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goYiJhYmMiLCBiIkFCQyIsIHJlLkkpLmdyb3VwKDApLCBiIkFCQyIpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NtdHBuZXQucHkgYi9MaWIvdGVzdC90ZXN0X3NtdHBuZXQucHkKaW5kZXggMDNiZjkzYi4uMTU2NTRmMiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zbXRwbmV0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc210cG5ldC5weQpAQCAtMjEsNyArMjEsNyBAQAogCiBjbGFzcyBTbXRwVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgdGVzdFNlcnZlciA9ICdzbXRwLmdtYWlsLmNvbScKLSAgICByZW1vdGVQb3J0ID0gMjUKKyAgICByZW1vdGVQb3J0ID0gNTg3CiAKICAgICBkZWYgdGVzdF9jb25uZWN0X3N0YXJ0dGxzKHNlbGYpOgogICAgICAgICBzdXBwb3J0LmdldF9hdHRyaWJ1dGUoc210cGxpYiwgJ1NNVFBfU1NMJykKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3NsLnB5IGIvTGliL3Rlc3QvdGVzdF9zc2wucHkKaW5kZXggMmYyZTczOS4uZWE2MTlmZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zc2wucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zc2wucHkKQEAgLTM4Myw2ICszODMsOCBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc3NsLkNlcnRpZmljYXRlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2wubWF0Y2hfaG9zdG5hbWUsIGNlcnQsIGhvc3RuYW1lKQogCisgICAgICAgICMgLS0gSG9zdG5hbWUgbWF0Y2hpbmcgLS0KKwogICAgICAgICBjZXJ0ID0geydzdWJqZWN0JzogKCgoJ2NvbW1vbk5hbWUnLCAnZXhhbXBsZS5jb20nKSwpLCl9CiAgICAgICAgIG9rKGNlcnQsICdleGFtcGxlLmNvbScpCiAgICAgICAgIG9rKGNlcnQsICdFeEFtcGxlLmNPbScpCkBAIC00NjgsNiArNDcwLDI4IEBACiAgICAgICAgICMgT25seSBjb21tb25OYW1lIGlzIGNvbnNpZGVyZWQKICAgICAgICAgZmFpbChjZXJ0LCAnQ2FsaWZvcm5pYScpCiAKKyAgICAgICAgIyAtLSBJUHY0IG1hdGNoaW5nIC0tCisgICAgICAgIGNlcnQgPSB7J3N1YmplY3QnOiAoKCgnY29tbW9uTmFtZScsICdleGFtcGxlLmNvbScpLCksKSwKKyAgICAgICAgICAgICAgICAnc3ViamVjdEFsdE5hbWUnOiAoKCdETlMnLCAnZXhhbXBsZS5jb20nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdJUCBBZGRyZXNzJywgJzEwLjExLjEyLjEzJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnSVAgQWRkcmVzcycsICcxNC4xNS4xNi4xNycpKX0KKyAgICAgICAgb2soY2VydCwgJzEwLjExLjEyLjEzJykKKyAgICAgICAgb2soY2VydCwgJzE0LjE1LjE2LjE3JykKKyAgICAgICAgZmFpbChjZXJ0LCAnMTQuMTUuMTYuMTgnKQorICAgICAgICBmYWlsKGNlcnQsICdleGFtcGxlLm5ldCcpCisKKyAgICAgICAgIyAtLSBJUHY2IG1hdGNoaW5nIC0tCisgICAgICAgIGNlcnQgPSB7J3N1YmplY3QnOiAoKCgnY29tbW9uTmFtZScsICdleGFtcGxlLmNvbScpLCksKSwKKyAgICAgICAgICAgICAgICAnc3ViamVjdEFsdE5hbWUnOiAoKCdETlMnLCAnZXhhbXBsZS5jb20nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdJUCBBZGRyZXNzJywgJzIwMDE6MDowOjA6MDowOjA6Q0FGRVxuJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnSVAgQWRkcmVzcycsICcyMDAzOjA6MDowOjA6MDowOkJBQkFcbicpKX0KKyAgICAgICAgb2soY2VydCwgJzIwMDE6OmNhZmUnKQorICAgICAgICBvayhjZXJ0LCAnMjAwMzo6YmFiYScpCisgICAgICAgIGZhaWwoY2VydCwgJzIwMDM6OmJlYmUnKQorICAgICAgICBmYWlsKGNlcnQsICdleGFtcGxlLm5ldCcpCisKKyAgICAgICAgIyAtLSBNaXNjZWxsYW5lb3VzIC0tCisKICAgICAgICAgIyBOZWl0aGVyIGNvbW1vbk5hbWUgbm9yIHN1YmplY3RBbHROYW1lCiAgICAgICAgIGNlcnQgPSB7J25vdEFmdGVyJzogJ0RlYyAxOCAyMzo1OTo1OSAyMDExIEdNVCcsCiAgICAgICAgICAgICAgICAgJ3N1YmplY3QnOiAoKCgnY291bnRyeU5hbWUnLCAnVVMnKSwpLApAQCAtNzk0LDggKzgxOCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgInZlcmlmeV9mbGFncyBuZWVkIE9wZW5TU0wgPiAwLjkuOCIpCiAgICAgZGVmIHRlc3RfdmVyaWZ5X2ZsYWdzKHNlbGYpOgogICAgICAgICBjdHggPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfVExTdjEpCi0gICAgICAgICMgZGVmYXVsdCB2YWx1ZSBieSBPcGVuU1NMCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3R4LnZlcmlmeV9mbGFncywgc3NsLlZFUklGWV9ERUZBVUxUKQorICAgICAgICAjIGRlZmF1bHQgdmFsdWUKKyAgICAgICAgdGYgPSBnZXRhdHRyKHNzbCwgIlZFUklGWV9YNTA5X1RSVVNURURfRklSU1QiLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGN0eC52ZXJpZnlfZmxhZ3MsIHNzbC5WRVJJRllfREVGQVVMVCB8IHRmKQogICAgICAgICBjdHgudmVyaWZ5X2ZsYWdzID0gc3NsLlZFUklGWV9DUkxfQ0hFQ0tfTEVBRgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGN0eC52ZXJpZnlfZmxhZ3MsIHNzbC5WRVJJRllfQ1JMX0NIRUNLX0xFQUYpCiAgICAgICAgIGN0eC52ZXJpZnlfZmxhZ3MgPSBzc2wuVkVSSUZZX0NSTF9DSEVDS19DSEFJTgpAQCAtMjI1OSw3ICsyMjg0LDggQEAKICAgICAgICAgICAgIGNvbnRleHQgPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfVExTdjEpCiAgICAgICAgICAgICBjb250ZXh0LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfUkVRVUlSRUQKICAgICAgICAgICAgIGNvbnRleHQubG9hZF92ZXJpZnlfbG9jYXRpb25zKFNJR05JTkdfQ0EpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbnRleHQudmVyaWZ5X2ZsYWdzLCBzc2wuVkVSSUZZX0RFRkFVTFQpCisgICAgICAgICAgICB0ZiA9IGdldGF0dHIoc3NsLCAiVkVSSUZZX1g1MDlfVFJVU1RFRF9GSVJTVCIsIDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbnRleHQudmVyaWZ5X2ZsYWdzLCBzc2wuVkVSSUZZX0RFRkFVTFQgfCB0ZikKIAogICAgICAgICAgICAgIyBWRVJJRllfREVGQVVMVCBzaG91bGQgcGFzcwogICAgICAgICAgICAgc2VydmVyID0gVGhyZWFkZWRFY2hvU2VydmVyKGNvbnRleHQ9c2VydmVyX2NvbnRleHQsIGNoYXR0eT1UcnVlKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zdGF0aXN0aWNzLnB5IGIvTGliL3Rlc3QvdGVzdF9zdGF0aXN0aWNzLnB5CmluZGV4IGYxZGEyMWUuLjc1OGE0ODEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3RhdGlzdGljcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N0YXRpc3RpY3MucHkKQEAgLTksNyArOSw2IEBACiBpbXBvcnQgbWF0aAogaW1wb3J0IHJhbmRvbQogaW1wb3J0IHN5cwotaW1wb3J0IHR5cGVzCiBpbXBvcnQgdW5pdHRlc3QKIAogZnJvbSBkZWNpbWFsIGltcG9ydCBEZWNpbWFsCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N1YnByb2Nlc3MucHkgYi9MaWIvdGVzdC90ZXN0X3N1YnByb2Nlc3MucHkKaW5kZXggM2QzNDg1OS4uZTI1Y2NjZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zdWJwcm9jZXNzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3VicHJvY2Vzcy5weQpAQCAtMTkyMiw3ICsxOTIyLDcgQEAKICAgICAgICAgb3Blbl9mZHMgPSBzZXQoZmRzKQogICAgICAgICAjIGFkZCBhIGJ1bmNoIG1vcmUgZmRzCiAgICAgICAgIGZvciBfIGluIHJhbmdlKDkpOgotICAgICAgICAgICAgZmQgPSBvcy5vcGVuKCIvZGV2L251bGwiLCBvcy5PX1JET05MWSkKKyAgICAgICAgICAgIGZkID0gb3Mub3Blbihvcy5kZXZudWxsLCBvcy5PX1JET05MWSkKICAgICAgICAgICAgIHNlbGYuYWRkQ2xlYW51cChvcy5jbG9zZSwgZmQpCiAgICAgICAgICAgICBvcGVuX2Zkcy5hZGQoZmQpCiAKQEAgLTE5ODQsNyArMTk4NCw3IEBACiAgICAgICAgIG9wZW5fZmRzID0gc2V0KCkKICAgICAgICAgIyBBZGQgYSBidW5jaCBtb3JlIGZkcyB0byBwYXNzIGRvd24uCiAgICAgICAgIGZvciBfIGluIHJhbmdlKDQwKToKLSAgICAgICAgICAgIGZkID0gb3Mub3BlbigiL2Rldi9udWxsIiwgb3MuT19SRE9OTFkpCisgICAgICAgICAgICBmZCA9IG9zLm9wZW4ob3MuZGV2bnVsbCwgb3MuT19SRE9OTFkpCiAgICAgICAgICAgICBvcGVuX2Zkcy5hZGQoZmQpCiAKICAgICAgICAgIyBMZWF2ZSBhIHR3byBwYWlycyBvZiBsb3cgb25lcyBhdmFpbGFibGUgZm9yIHVzZSBieSB0aGUKQEAgLTI1MDIsNiArMjUwMiwyMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpIGFzIHByb2M6CiAgICAgICAgICAgICAgICAgcGFzcwogCisgICAgZGVmIHRlc3RfYnJva2VuX3BpcGVfY2xlYW51cChzZWxmKToKKyAgICAgICAgIiIiQnJva2VuIHBpcGUgZXJyb3Igc2hvdWxkIG5vdCBwcmV2ZW50IHdhaXQoKSAoSXNzdWUgMjE2MTkpIiIiCisgICAgICAgIHByb2MgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgJy1jJywgJ3Bhc3MnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkaW49c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZzaXplPXN1cHBvcnQuUElQRV9NQVhfU0laRSoyKQorICAgICAgICBwcm9jID0gcHJvYy5fX2VudGVyX18oKQorICAgICAgICAjIFByZXBhcmUgdG8gc2VuZCBlbm91Z2ggZGF0YSB0byBvdmVyZmxvdyBhbnkgT1MgcGlwZSBidWZmZXJpbmcgYW5kCisgICAgICAgICMgZ3VhcmFudGVlIGEgYnJva2VuIHBpcGUgZXJyb3IuIERhdGEgaXMgaGVsZCBpbiBCdWZmZXJlZFdyaXRlcgorICAgICAgICAjIGJ1ZmZlciB1bnRpbCBjbG9zZWQuCisgICAgICAgIHByb2Muc3RkaW4ud3JpdGUoYid4JyAqIHN1cHBvcnQuUElQRV9NQVhfU0laRSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocHJvYy5yZXR1cm5jb2RlKQorICAgICAgICAjIEVQSVBFIGV4cGVjdGVkIHVuZGVyIFBPU0lYOyBFSU5WQUwgdW5kZXIgV2luZG93cworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBwcm9jLl9fZXhpdF9fLCBOb25lLCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb2MucmV0dXJuY29kZSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHByb2Muc3RkaW4uY2xvc2VkKQorCiAKIGRlZiB0ZXN0X21haW4oKToKICAgICB1bml0X3Rlc3RzID0gKFByb2Nlc3NUZXN0Q2FzZSwKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdGFyZmlsZS5weSBiL0xpYi90ZXN0L3Rlc3RfdGFyZmlsZS5weQppbmRleCA4MTBiNzZiLi4wMWQxYTkyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3RhcmZpbGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90YXJmaWxlLnB5CkBAIC0xNDI4LDYgKzE0MjgsODggQEAKICAgICAgICAgICAgICAgICAgICAoImxvbmdsbmsvIiAqIDEyNykgKyAibG9uZ2xpbmtfIikKIAogCitjbGFzcyBDcmVhdGVUZXN0KFRhclRlc3QsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIHByZWZpeCA9ICJ4OiIKKworICAgIGZpbGVfcGF0aCA9IG9zLnBhdGguam9pbihURU1QRElSLCAic3BhbWVnZ3M0MiIpCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN1cHBvcnQudW5saW5rKHRtcG5hbWUpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgorICAgICAgICB3aXRoIG9wZW4oY2xzLmZpbGVfcGF0aCwgIndiIikgYXMgZm9iajoKKyAgICAgICAgICAgIGZvYmoud3JpdGUoYiJhYWEiKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHRlYXJEb3duQ2xhc3MoY2xzKToKKyAgICAgICAgc3VwcG9ydC51bmxpbmsoY2xzLmZpbGVfcGF0aCkKKworICAgIGRlZiB0ZXN0X2NyZWF0ZShzZWxmKToKKyAgICAgICAgd2l0aCB0YXJmaWxlLm9wZW4odG1wbmFtZSwgc2VsZi5tb2RlKSBhcyB0b2JqOgorICAgICAgICAgICAgdG9iai5hZGQoc2VsZi5maWxlX3BhdGgpCisKKyAgICAgICAgd2l0aCBzZWxmLnRhcm9wZW4odG1wbmFtZSkgYXMgdG9iajoKKyAgICAgICAgICAgIG5hbWVzID0gdG9iai5nZXRuYW1lcygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG5hbWVzKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignc3BhbWVnZ3M0MicsIG5hbWVzWzBdKQorCisgICAgZGVmIHRlc3RfY3JlYXRlX2V4aXN0aW5nKHNlbGYpOgorICAgICAgICB3aXRoIHRhcmZpbGUub3Blbih0bXBuYW1lLCBzZWxmLm1vZGUpIGFzIHRvYmo6CisgICAgICAgICAgICB0b2JqLmFkZChzZWxmLmZpbGVfcGF0aCkKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEZpbGVFeGlzdHNFcnJvcik6CisgICAgICAgICAgICB0b2JqID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIHNlbGYubW9kZSkKKworICAgICAgICB3aXRoIHNlbGYudGFyb3Blbih0bXBuYW1lKSBhcyB0b2JqOgorICAgICAgICAgICAgbmFtZXMgPSB0b2JqLmdldG5hbWVzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obmFtZXMpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEluKCdzcGFtZWdnczQyJywgbmFtZXNbMF0pCisKKyAgICBkZWYgdGVzdF9jcmVhdGVfdGFyb3BlbihzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLnRhcm9wZW4odG1wbmFtZSwgIngiKSBhcyB0b2JqOgorICAgICAgICAgICAgdG9iai5hZGQoc2VsZi5maWxlX3BhdGgpCisKKyAgICAgICAgd2l0aCBzZWxmLnRhcm9wZW4odG1wbmFtZSkgYXMgdG9iajoKKyAgICAgICAgICAgIG5hbWVzID0gdG9iai5nZXRuYW1lcygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG5hbWVzKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignc3BhbWVnZ3M0MicsIG5hbWVzWzBdKQorCisgICAgZGVmIHRlc3RfY3JlYXRlX2V4aXN0aW5nX3Rhcm9wZW4oc2VsZik6CisgICAgICAgIHdpdGggc2VsZi50YXJvcGVuKHRtcG5hbWUsICJ4IikgYXMgdG9iajoKKyAgICAgICAgICAgIHRvYmouYWRkKHNlbGYuZmlsZV9wYXRoKQorCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoRmlsZUV4aXN0c0Vycm9yKToKKyAgICAgICAgICAgIHdpdGggc2VsZi50YXJvcGVuKHRtcG5hbWUsICJ4Iik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIHdpdGggc2VsZi50YXJvcGVuKHRtcG5hbWUpIGFzIHRvYmo6CisgICAgICAgICAgICBuYW1lcyA9IHRvYmouZ2V0bmFtZXMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihuYW1lcyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oInNwYW1lZ2dzNDIiLCBuYW1lc1swXSkKKworCitjbGFzcyBHemlwQ3JlYXRlVGVzdChHemlwVGVzdCwgQ3JlYXRlVGVzdCk6CisgICAgcGFzcworCisKK2NsYXNzIEJ6MkNyZWF0ZVRlc3QoQnoyVGVzdCwgQ3JlYXRlVGVzdCk6CisgICAgcGFzcworCisKK2NsYXNzIEx6bWFDcmVhdGVUZXN0KEx6bWFUZXN0LCBDcmVhdGVUZXN0KToKKyAgICBwYXNzCisKKworY2xhc3MgQ3JlYXRlV2l0aFhNb2RlVGVzdChDcmVhdGVUZXN0KToKKworICAgIHByZWZpeCA9ICJ4IgorCisgICAgdGVzdF9jcmVhdGVfdGFyb3BlbiA9IE5vbmUKKyAgICB0ZXN0X2NyZWF0ZV9leGlzdGluZ190YXJvcGVuID0gTm9uZQorCisKIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIob3MsICJsaW5rIiksICJNaXNzaW5nIGhhcmRsaW5rIGltcGxlbWVudGF0aW9uIikKIGNsYXNzIEhhcmRsaW5rVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgIyBUZXN0IHRoZSBjcmVhdGlvbiBvZiBMTktUWVBFIChoYXJkbGluaykgbWVtYmVycyBpbiBhbiBhcmNoaXZlLgpAQCAtMjAwNiw2ICsyMDg4LDIxIEBACiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBzdXBwb3J0LnVubGluayh0YXJfbmFtZSkKIAorICAgIGRlZiB0ZXN0X2NyZWF0ZV9jb21tYW5kX2NvbXByZXNzZWQoc2VsZik6CisgICAgICAgIGZpbGVzID0gW3N1cHBvcnQuZmluZGZpbGUoJ3Rva2VuaXplX3Rlc3RzLnR4dCcpLAorICAgICAgICAgICAgICAgICBzdXBwb3J0LmZpbmRmaWxlKCd0b2tlbml6ZV90ZXN0cy1uby1jb2RpbmctY29va2llLScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW5kLXV0ZjgtYm9tLXNpZy1vbmx5LnR4dCcpXQorICAgICAgICBmb3IgZmlsZXR5cGUgaW4gKEd6aXBUZXN0LCBCejJUZXN0LCBMem1hVGVzdCk6CisgICAgICAgICAgICBpZiBub3QgZmlsZXR5cGUub3BlbjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRhcl9uYW1lID0gdG1wbmFtZSArICcuJyArIGZpbGV0eXBlLnN1ZmZpeAorICAgICAgICAgICAgICAgIG91dCA9IHNlbGYudGFyZmlsZWNtZCgnLWMnLCB0YXJfbmFtZSwgKmZpbGVzKQorICAgICAgICAgICAgICAgIHdpdGggZmlsZXR5cGUudGFyb3Blbih0YXJfbmFtZSkgYXMgdGFyOgorICAgICAgICAgICAgICAgICAgICB0YXIuZ2V0bWVtYmVycygpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHN1cHBvcnQudW5saW5rKHRhcl9uYW1lKQorCiAgICAgZGVmIHRlc3RfZXh0cmFjdF9jb21tYW5kKHNlbGYpOgogICAgICAgICBzZWxmLm1ha2Vfc2ltcGxlX3RhcmZpbGUodG1wbmFtZSkKICAgICAgICAgZm9yIG9wdCBpbiAnLWUnLCAnLS1leHRyYWN0JzoKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdHJhY2ViYWNrLnB5IGIvTGliL3Rlc3QvdGVzdF90cmFjZWJhY2sucHkKaW5kZXggNmJkNmZhNi4uZDliNzNjMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90cmFjZWJhY2sucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90cmFjZWJhY2sucHkKQEAgLTEsNiArMSw4IEBACiAiIiJUZXN0IGNhc2VzIGZvciB0cmFjZWJhY2sgbW9kdWxlIiIiCiAKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IG5hbWVkdHVwbGUKIGZyb20gaW8gaW1wb3J0IFN0cmluZ0lPCitpbXBvcnQgbGluZWNhY2hlCiBpbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCByZQpAQCAtMTIsNiArMTQsMTEgQEAKIGltcG9ydCB0cmFjZWJhY2sKIAogCit0ZXN0X2NvZGUgPSBuYW1lZHR1cGxlKCdjb2RlJywgWydjb19maWxlbmFtZScsICdjb19uYW1lJ10pCit0ZXN0X2ZyYW1lID0gbmFtZWR0dXBsZSgnZnJhbWUnLCBbJ2ZfY29kZScsICdmX2dsb2JhbHMnLCAnZl9sb2NhbHMnXSkKK3Rlc3RfdGIgPSBuYW1lZHR1cGxlKCd0YicsIFsndGJfZnJhbWUnLCAndGJfbGluZW5vJywgJ3RiX25leHQnXSkKKworCiBjbGFzcyBTeW50YXhUcmFjZWJhY2tDYXNlcyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgIyBGb3Igbm93LCBhIHZlcnkgbWluaW1hbCBzZXQgb2YgdGVzdHMuICBJIHdhbnQgdG8gYmUgc3VyZSB0aGF0CiAgICAgIyBmb3JtYXR0aW5nIG9mIFN5bnRheEVycm9ycyB3b3JrcyBiYXNlZCBvbiBjaGFuZ2VzIGZvciAyLjEuCkBAIC00NzcsNiArNDg0LDI0NiBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihpbm5lcl9mcmFtZS5mX2xvY2FscyksIDApCiAKIAorY2xhc3MgVGVzdEZyYW1lKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2Jhc2ljcyhzZWxmKToKKyAgICAgICAgbGluZWNhY2hlLmNsZWFyY2FjaGUoKQorICAgICAgICBsaW5lY2FjaGUubGF6eWNhY2hlKCJmIiwgZ2xvYmFscygpKQorICAgICAgICBmID0gdHJhY2ViYWNrLkZyYW1lU3VtbWFyeSgiZiIsIDEsICJkdW1teSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAoImYiLCAxLCAiZHVtbXkiLCAnIiIiVGVzdCBjYXNlcyBmb3IgdHJhY2ViYWNrIG1vZHVsZSIiIicpLAorICAgICAgICAgICAgdHVwbGUoZikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgZi5sb2NhbHMpCisKKyAgICBkZWYgdGVzdF9sYXp5X2xpbmVzKHNlbGYpOgorICAgICAgICBsaW5lY2FjaGUuY2xlYXJjYWNoZSgpCisgICAgICAgIGYgPSB0cmFjZWJhY2suRnJhbWVTdW1tYXJ5KCJmIiwgMSwgImR1bW15IiwgbG9va3VwX2xpbmU9RmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgZi5fbGluZSkKKyAgICAgICAgbGluZWNhY2hlLmxhenljYWNoZSgiZiIsIGdsb2JhbHMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICciIiJUZXN0IGNhc2VzIGZvciB0cmFjZWJhY2sgbW9kdWxlIiIiJywKKyAgICAgICAgICAgIGYubGluZSkKKworICAgIGRlZiB0ZXN0X2V4cGxpY2l0X2xpbmUoc2VsZik6CisgICAgICAgIGYgPSB0cmFjZWJhY2suRnJhbWVTdW1tYXJ5KCJmIiwgMSwgImR1bW15IiwgbGluZT0ibGluZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoImxpbmUiLCBmLmxpbmUpCisKKworY2xhc3MgVGVzdFN0YWNrKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3dhbGtfc3RhY2soc2VsZik6CisgICAgICAgIHMgPSBsaXN0KHRyYWNlYmFjay53YWxrX3N0YWNrKE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXIobGVuKHMpLCAxMCkKKworICAgIGRlZiB0ZXN0X3dhbGtfdGIoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIDEvMAorICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgXywgXywgdGIgPSBzeXMuZXhjX2luZm8oKQorICAgICAgICBzID0gbGlzdCh0cmFjZWJhY2sud2Fsa190Yih0YikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHMpLCAxKQorCisgICAgZGVmIHRlc3RfZXh0cmFjdF9zdGFjayhzZWxmKToKKyAgICAgICAgcyA9IHRyYWNlYmFjay5TdGFja1N1bW1hcnkuZXh0cmFjdCh0cmFjZWJhY2sud2Fsa19zdGFjayhOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHMsIHRyYWNlYmFjay5TdGFja1N1bW1hcnkpCisKKyAgICBkZWYgdGVzdF9leHRyYWN0X3N0YWNrX2xpbWl0KHNlbGYpOgorICAgICAgICBzID0gdHJhY2ViYWNrLlN0YWNrU3VtbWFyeS5leHRyYWN0KHRyYWNlYmFjay53YWxrX3N0YWNrKE5vbmUpLCBsaW1pdD01KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzKSwgNSkKKworICAgIGRlZiB0ZXN0X2V4dHJhY3Rfc3RhY2tfbG9va3VwX2xpbmVzKHNlbGYpOgorICAgICAgICBsaW5lY2FjaGUuY2xlYXJjYWNoZSgpCisgICAgICAgIGxpbmVjYWNoZS51cGRhdGVjYWNoZSgnL2Zvby5weScsIGdsb2JhbHMoKSkKKyAgICAgICAgYyA9IHRlc3RfY29kZSgnL2Zvby5weScsICdtZXRob2QnKQorICAgICAgICBmID0gdGVzdF9mcmFtZShjLCBOb25lLCBOb25lKQorICAgICAgICBzID0gdHJhY2ViYWNrLlN0YWNrU3VtbWFyeS5leHRyYWN0KGl0ZXIoWyhmLCA2KV0pLCBsb29rdXBfbGluZXM9VHJ1ZSkKKyAgICAgICAgbGluZWNhY2hlLmNsZWFyY2FjaGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNbMF0ubGluZSwgImltcG9ydCBzeXMiKQorCisgICAgZGVmIHRlc3RfZXh0cmFjdF9zdGFja3VwX2RlZmVycmVkX2xvb2t1cF9saW5lcyhzZWxmKToKKyAgICAgICAgbGluZWNhY2hlLmNsZWFyY2FjaGUoKQorICAgICAgICBjID0gdGVzdF9jb2RlKCcvZm9vLnB5JywgJ21ldGhvZCcpCisgICAgICAgIGYgPSB0ZXN0X2ZyYW1lKGMsIE5vbmUsIE5vbmUpCisgICAgICAgIHMgPSB0cmFjZWJhY2suU3RhY2tTdW1tYXJ5LmV4dHJhY3QoaXRlcihbKGYsIDYpXSksIGxvb2t1cF9saW5lcz1GYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh7fSwgbGluZWNhY2hlLmNhY2hlKQorICAgICAgICBsaW5lY2FjaGUudXBkYXRlY2FjaGUoJy9mb28ucHknLCBnbG9iYWxzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc1swXS5saW5lLCAiaW1wb3J0IHN5cyIpCisKKyAgICBkZWYgdGVzdF9mcm9tX2xpc3Qoc2VsZik6CisgICAgICAgIHMgPSB0cmFjZWJhY2suU3RhY2tTdW1tYXJ5LmZyb21fbGlzdChbKCdmb28ucHknLCAxLCAnZnJlZCcsICdsaW5lJyldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgWycgIEZpbGUgImZvby5weSIsIGxpbmUgMSwgaW4gZnJlZFxuICAgIGxpbmVcbiddLAorICAgICAgICAgICAgcy5mb3JtYXQoKSkKKworICAgIGRlZiB0ZXN0X2Zvcm1hdF9zbW9rZShzZWxmKToKKyAgICAgICAgIyBGb3IgZGV0YWlsZWQgdGVzdHMgc2VlIHRoZSBmb3JtYXRfbGlzdCB0ZXN0cywgd2hpY2ggY29uc3VtZSB0aGUgc2FtZQorICAgICAgICAjIGNvZGUuCisgICAgICAgIHMgPSB0cmFjZWJhY2suU3RhY2tTdW1tYXJ5LmZyb21fbGlzdChbKCdmb28ucHknLCAxLCAnZnJlZCcsICdsaW5lJyldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgWycgIEZpbGUgImZvby5weSIsIGxpbmUgMSwgaW4gZnJlZFxuICAgIGxpbmVcbiddLAorICAgICAgICAgICAgcy5mb3JtYXQoKSkKKworICAgIGRlZiB0ZXN0X2xvY2FscyhzZWxmKToKKyAgICAgICAgbGluZWNhY2hlLnVwZGF0ZWNhY2hlKCcvZm9vLnB5JywgZ2xvYmFscygpKQorICAgICAgICBjID0gdGVzdF9jb2RlKCcvZm9vLnB5JywgJ21ldGhvZCcpCisgICAgICAgIGYgPSB0ZXN0X2ZyYW1lKGMsIGdsb2JhbHMoKSwgeydzb21ldGhpbmcnOiAxfSkKKyAgICAgICAgcyA9IHRyYWNlYmFjay5TdGFja1N1bW1hcnkuZXh0cmFjdChpdGVyKFsoZiwgNildKSwgY2FwdHVyZV9sb2NhbHM9VHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzWzBdLmxvY2Fscywgeydzb21ldGhpbmcnOiAnMSd9KQorCisgICAgZGVmIHRlc3Rfbm9fbG9jYWxzKHNlbGYpOgorICAgICAgICBsaW5lY2FjaGUudXBkYXRlY2FjaGUoJy9mb28ucHknLCBnbG9iYWxzKCkpCisgICAgICAgIGMgPSB0ZXN0X2NvZGUoJy9mb28ucHknLCAnbWV0aG9kJykKKyAgICAgICAgZiA9IHRlc3RfZnJhbWUoYywgZ2xvYmFscygpLCB7J3NvbWV0aGluZyc6IDF9KQorICAgICAgICBzID0gdHJhY2ViYWNrLlN0YWNrU3VtbWFyeS5leHRyYWN0KGl0ZXIoWyhmLCA2KV0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNbMF0ubG9jYWxzLCBOb25lKQorCisgICAgZGVmIHRlc3RfZm9ybWF0X2xvY2FscyhzZWxmKToKKyAgICAgICAgZGVmIHNvbWVfaW5uZXIoaywgdik6CisgICAgICAgICAgICBhID0gMQorICAgICAgICAgICAgYiA9IDIKKyAgICAgICAgICAgIHJldHVybiB0cmFjZWJhY2suU3RhY2tTdW1tYXJ5LmV4dHJhY3QoCisgICAgICAgICAgICAgICAgdHJhY2ViYWNrLndhbGtfc3RhY2soTm9uZSksIGNhcHR1cmVfbG9jYWxzPVRydWUsIGxpbWl0PTEpCisgICAgICAgIHMgPSBzb21lX2lubmVyKDMsIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBbJyAgRmlsZSAiJyArIF9fZmlsZV9fICsgJyIsIGxpbmUgNTg1LCAnCisgICAgICAgICAgICAgJ2luIHNvbWVfaW5uZXJcbicKKyAgICAgICAgICAgICAnICAgIHRyYWNlYmFjay53YWxrX3N0YWNrKE5vbmUpLCBjYXB0dXJlX2xvY2Fscz1UcnVlLCBsaW1pdD0xKVxuJworICAgICAgICAgICAgICcgICAgYSA9IDFcbicKKyAgICAgICAgICAgICAnICAgIGIgPSAyXG4nCisgICAgICAgICAgICAgJyAgICBrID0gM1xuJworICAgICAgICAgICAgICcgICAgdiA9IDRcbicKKyAgICAgICAgICAgIF0sIHMuZm9ybWF0KCkpCisKKworCitjbGFzcyBUZXN0VHJhY2ViYWNrRXhjZXB0aW9uKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3Ntb2tlKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICAxLzAKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIGV4Y19pbmZvID0gc3lzLmV4Y19pbmZvKCkKKyAgICAgICAgICAgIGV4YyA9IHRyYWNlYmFjay5UcmFjZWJhY2tFeGNlcHRpb24oKmV4Y19pbmZvKQorICAgICAgICAgICAgZXhwZWN0ZWRfc3RhY2sgPSB0cmFjZWJhY2suU3RhY2tTdW1tYXJ5LmV4dHJhY3QoCisgICAgICAgICAgICAgICAgdHJhY2ViYWNrLndhbGtfdGIoZXhjX2luZm9bMl0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIGV4Yy5fX2NhdXNlX18pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgZXhjLl9fY29udGV4dF9fKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEZhbHNlLCBleGMuX19zdXBwcmVzc19jb250ZXh0X18pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfc3RhY2ssIGV4Yy5zdGFjaykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleGNfaW5mb1swXSwgZXhjLmV4Y190eXBlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihleGNfaW5mb1sxXSksIHN0cihleGMpKQorCisgICAgZGVmIHRlc3RfZnJvbV9leGNlcHRpb24oc2VsZik6CisgICAgICAgICMgQ2hlY2sgYWxsIHRoZSBwYXJhbWV0ZXJzIGFyZSBhY2NlcHRlZC4KKyAgICAgICAgZGVmIGZvbygpOgorICAgICAgICAgICAgMS8wCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvbygpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgIGV4Y19pbmZvID0gc3lzLmV4Y19pbmZvKCkKKyAgICAgICAgICAgIHNlbGYuZXhwZWN0ZWRfc3RhY2sgPSB0cmFjZWJhY2suU3RhY2tTdW1tYXJ5LmV4dHJhY3QoCisgICAgICAgICAgICAgICAgdHJhY2ViYWNrLndhbGtfdGIoZXhjX2luZm9bMl0pLCBsaW1pdD0xLCBsb29rdXBfbGluZXM9RmFsc2UsCisgICAgICAgICAgICAgICAgY2FwdHVyZV9sb2NhbHM9VHJ1ZSkKKyAgICAgICAgICAgIHNlbGYuZXhjID0gdHJhY2ViYWNrLlRyYWNlYmFja0V4Y2VwdGlvbi5mcm9tX2V4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBlLCBsaW1pdD0xLCBsb29rdXBfbGluZXM9RmFsc2UsIGNhcHR1cmVfbG9jYWxzPVRydWUpCisgICAgICAgIGV4cGVjdGVkX3N0YWNrID0gc2VsZi5leHBlY3RlZF9zdGFjaworICAgICAgICBleGMgPSBzZWxmLmV4YworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIGV4Yy5fX2NhdXNlX18pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgZXhjLl9fY29udGV4dF9fKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEZhbHNlLCBleGMuX19zdXBwcmVzc19jb250ZXh0X18pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfc3RhY2ssIGV4Yy5zdGFjaykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleGNfaW5mb1swXSwgZXhjLmV4Y190eXBlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihleGNfaW5mb1sxXSksIHN0cihleGMpKQorCisgICAgZGVmIHRlc3RfY2F1c2Uoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAxLzAKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgZXhjX2luZm9fY29udGV4dCA9IHN5cy5leGNfaW5mbygpCisgICAgICAgICAgICAgICAgZXhjX2NvbnRleHQgPSB0cmFjZWJhY2suVHJhY2ViYWNrRXhjZXB0aW9uKCpleGNfaW5mb19jb250ZXh0KQorICAgICAgICAgICAgICAgIGNhdXNlID0gRXhjZXB0aW9uKCJjYXVzZSIpCisgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJ1aCBvaCIpIGZyb20gY2F1c2UKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIGV4Y19pbmZvID0gc3lzLmV4Y19pbmZvKCkKKyAgICAgICAgICAgIGV4YyA9IHRyYWNlYmFjay5UcmFjZWJhY2tFeGNlcHRpb24oKmV4Y19pbmZvKQorICAgICAgICAgICAgZXhwZWN0ZWRfc3RhY2sgPSB0cmFjZWJhY2suU3RhY2tTdW1tYXJ5LmV4dHJhY3QoCisgICAgICAgICAgICAgICAgdHJhY2ViYWNrLndhbGtfdGIoZXhjX2luZm9bMl0pKQorICAgICAgICBleGNfY2F1c2UgPSB0cmFjZWJhY2suVHJhY2ViYWNrRXhjZXB0aW9uKEV4Y2VwdGlvbiwgY2F1c2UsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhjX2NhdXNlLCBleGMuX19jYXVzZV9fKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4Y19jb250ZXh0LCBleGMuX19jb250ZXh0X18pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZSwgZXhjLl9fc3VwcHJlc3NfY29udGV4dF9fKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkX3N0YWNrLCBleGMuc3RhY2spCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhjX2luZm9bMF0sIGV4Yy5leGNfdHlwZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZXhjX2luZm9bMV0pLCBzdHIoZXhjKSkKKworICAgIGRlZiB0ZXN0X2NvbnRleHQoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAxLzAKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgZXhjX2luZm9fY29udGV4dCA9IHN5cy5leGNfaW5mbygpCisgICAgICAgICAgICAgICAgZXhjX2NvbnRleHQgPSB0cmFjZWJhY2suVHJhY2ViYWNrRXhjZXB0aW9uKCpleGNfaW5mb19jb250ZXh0KQorICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigidWggb2giKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgZXhjX2luZm8gPSBzeXMuZXhjX2luZm8oKQorICAgICAgICAgICAgZXhjID0gdHJhY2ViYWNrLlRyYWNlYmFja0V4Y2VwdGlvbigqZXhjX2luZm8pCisgICAgICAgICAgICBleHBlY3RlZF9zdGFjayA9IHRyYWNlYmFjay5TdGFja1N1bW1hcnkuZXh0cmFjdCgKKyAgICAgICAgICAgICAgICB0cmFjZWJhY2sud2Fsa190YihleGNfaW5mb1syXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgZXhjLl9fY2F1c2VfXykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleGNfY29udGV4dCwgZXhjLl9fY29udGV4dF9fKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEZhbHNlLCBleGMuX19zdXBwcmVzc19jb250ZXh0X18pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfc3RhY2ssIGV4Yy5zdGFjaykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleGNfaW5mb1swXSwgZXhjLmV4Y190eXBlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihleGNfaW5mb1sxXSksIHN0cihleGMpKQorCisgICAgZGVmIHRlc3RfbGltaXQoc2VsZik6CisgICAgICAgIGRlZiByZWN1cnNlKG4pOgorICAgICAgICAgICAgaWYgbjoKKyAgICAgICAgICAgICAgICByZWN1cnNlKG4tMSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgMS8wCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlY3Vyc2UoMTApCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICBleGNfaW5mbyA9IHN5cy5leGNfaW5mbygpCisgICAgICAgICAgICBleGMgPSB0cmFjZWJhY2suVHJhY2ViYWNrRXhjZXB0aW9uKCpleGNfaW5mbywgbGltaXQ9NSkKKyAgICAgICAgICAgIGV4cGVjdGVkX3N0YWNrID0gdHJhY2ViYWNrLlN0YWNrU3VtbWFyeS5leHRyYWN0KAorICAgICAgICAgICAgICAgIHRyYWNlYmFjay53YWxrX3RiKGV4Y19pbmZvWzJdKSwgbGltaXQ9NSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZF9zdGFjaywgZXhjLnN0YWNrKQorCisgICAgZGVmIHRlc3RfbG9va3VwX2xpbmVzKHNlbGYpOgorICAgICAgICBsaW5lY2FjaGUuY2xlYXJjYWNoZSgpCisgICAgICAgIGUgPSBFeGNlcHRpb24oInVoIG9oIikKKyAgICAgICAgYyA9IHRlc3RfY29kZSgnL2Zvby5weScsICdtZXRob2QnKQorICAgICAgICBmID0gdGVzdF9mcmFtZShjLCBOb25lLCBOb25lKQorICAgICAgICB0YiA9IHRlc3RfdGIoZiwgNiwgTm9uZSkKKyAgICAgICAgZXhjID0gdHJhY2ViYWNrLlRyYWNlYmFja0V4Y2VwdGlvbihFeGNlcHRpb24sIGUsIHRiLCBsb29rdXBfbGluZXM9RmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoe30sIGxpbmVjYWNoZS5jYWNoZSkKKyAgICAgICAgbGluZWNhY2hlLnVwZGF0ZWNhY2hlKCcvZm9vLnB5JywgZ2xvYmFscygpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4Yy5zdGFja1swXS5saW5lLCAiaW1wb3J0IHN5cyIpCisKKyAgICBkZWYgdGVzdF9sb2NhbHMoc2VsZik6CisgICAgICAgIGxpbmVjYWNoZS51cGRhdGVjYWNoZSgnL2Zvby5weScsIGdsb2JhbHMoKSkKKyAgICAgICAgZSA9IEV4Y2VwdGlvbigidWggb2giKQorICAgICAgICBjID0gdGVzdF9jb2RlKCcvZm9vLnB5JywgJ21ldGhvZCcpCisgICAgICAgIGYgPSB0ZXN0X2ZyYW1lKGMsIGdsb2JhbHMoKSwgeydzb21ldGhpbmcnOiAxLCAnb3RoZXInOiAnc3RyaW5nJ30pCisgICAgICAgIHRiID0gdGVzdF90YihmLCA2LCBOb25lKQorICAgICAgICBleGMgPSB0cmFjZWJhY2suVHJhY2ViYWNrRXhjZXB0aW9uKAorICAgICAgICAgICAgRXhjZXB0aW9uLCBlLCB0YiwgY2FwdHVyZV9sb2NhbHM9VHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGV4Yy5zdGFja1swXS5sb2NhbHMsIHsnc29tZXRoaW5nJzogJzEnLCAnb3RoZXInOiAiJ3N0cmluZycifSkKKworICAgIGRlZiB0ZXN0X25vX2xvY2FscyhzZWxmKToKKyAgICAgICAgbGluZWNhY2hlLnVwZGF0ZWNhY2hlKCcvZm9vLnB5JywgZ2xvYmFscygpKQorICAgICAgICBlID0gRXhjZXB0aW9uKCJ1aCBvaCIpCisgICAgICAgIGMgPSB0ZXN0X2NvZGUoJy9mb28ucHknLCAnbWV0aG9kJykKKyAgICAgICAgZiA9IHRlc3RfZnJhbWUoYywgZ2xvYmFscygpLCB7J3NvbWV0aGluZyc6IDF9KQorICAgICAgICB0YiA9IHRlc3RfdGIoZiwgNiwgTm9uZSkKKyAgICAgICAgZXhjID0gdHJhY2ViYWNrLlRyYWNlYmFja0V4Y2VwdGlvbihFeGNlcHRpb24sIGUsIHRiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4Yy5zdGFja1swXS5sb2NhbHMsIE5vbmUpCisKKwogZGVmIHRlc3RfbWFpbigpOgogICAgIHJ1bl91bml0dGVzdChfX25hbWVfXykKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91cmxsaWIucHkgYi9MaWIvdGVzdC90ZXN0X3VybGxpYi5weQppbmRleCBmY2QyMDczLi41OGNhMmE1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3VybGxpYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VybGxpYi5weQpAQCAtMTI5OCwyMSArMTI5OCw2IEBACiBjbGFzcyBVdGlsaXR5X1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICAiIiJUZXN0Y2FzZSB0byB0ZXN0IHRoZSB2YXJpb3VzIHV0aWxpdHkgZnVuY3Rpb25zIGluIHRoZSB1cmxsaWIuIiIiCiAKLSAgICBkZWYgdGVzdF9zcGxpdHBhc3N3ZChzZWxmKToKLSAgICAgICAgIiIiU29tZSBvZiBwYXNzd29yZCBleGFtcGxlcyBhcmUgbm90IHNlbnNpYmxlLCBidXQgaXQgaXMgYWRkZWQgdG8KLSAgICAgICAgY29uZmlybWluZyB0byBSRkMyNjE3IGFuZCBhZGRyZXNzaW5nIGlzc3VlNDY3NS4KLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKCd1c2VyJywgJ2FiJyksdXJsbGliLnBhcnNlLnNwbGl0cGFzc3dkKCd1c2VyOmFiJykpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKCd1c2VyJywgJ2FcbmInKSx1cmxsaWIucGFyc2Uuc3BsaXRwYXNzd2QoJ3VzZXI6YVxuYicpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgndXNlcicsICdhXHRiJyksdXJsbGliLnBhcnNlLnNwbGl0cGFzc3dkKCd1c2VyOmFcdGInKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoJ3VzZXInLCAnYVxyYicpLHVybGxpYi5wYXJzZS5zcGxpdHBhc3N3ZCgndXNlcjphXHJiJykpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKCd1c2VyJywgJ2FcZmInKSx1cmxsaWIucGFyc2Uuc3BsaXRwYXNzd2QoJ3VzZXI6YVxmYicpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgndXNlcicsICdhXHZiJyksdXJsbGliLnBhcnNlLnNwbGl0cGFzc3dkKCd1c2VyOmFcdmInKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoJ3VzZXInLCAnYTpiJyksdXJsbGliLnBhcnNlLnNwbGl0cGFzc3dkKCd1c2VyOmE6YicpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgndXNlcicsICdhIGInKSx1cmxsaWIucGFyc2Uuc3BsaXRwYXNzd2QoJ3VzZXI6YSBiJykpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKCd1c2VyIDInLCAnYWInKSx1cmxsaWIucGFyc2Uuc3BsaXRwYXNzd2QoJ3VzZXIgMjphYicpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgndXNlcisxJywgJ2ErYicpLHVybGxpYi5wYXJzZS5zcGxpdHBhc3N3ZCgndXNlcisxOmErYicpKQotCiAgICAgZGVmIHRlc3RfdGhpc2hvc3Qoc2VsZik6CiAgICAgICAgICIiIlRlc3QgdGhlIHVybGxpYi5yZXF1ZXN0LnRoaXNob3N0IHV0aWxpdHkgZnVuY3Rpb24gcmV0dXJucyBhIHR1cGxlIiIiCiAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh1cmxsaWIucmVxdWVzdC50aGlzaG9zdCgpLCB0dXBsZSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdXJsbGliMi5weSBiL0xpYi90ZXN0L3Rlc3RfdXJsbGliMi5weQppbmRleCAzMTgyMzkwLi4zNmQ3ZTg3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3VybGxpYjIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF91cmxsaWIyLnB5CkBAIC0xNDg0LDE3ICsxNDg0LDE4IEBACiAgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3VwcG9ydC5pc19yZXNvdXJjZV9lbmFibGVkKCduZXR3b3JrJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QgcmVxdWlyZXMgbmV0d29yayBhY2Nlc3MnKQogICAgIGRlZiB0ZXN0X2lzc3VlMTY0NjQoc2VsZik6Ci0gICAgICAgIG9wZW5lciA9IHVybGxpYi5yZXF1ZXN0LmJ1aWxkX29wZW5lcigpCi0gICAgICAgIHJlcXVlc3QgPSB1cmxsaWIucmVxdWVzdC5SZXF1ZXN0KCJodHRwOi8vd3d3LmV4YW1wbGUuY29tLyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgcmVxdWVzdC5kYXRhKQorICAgICAgICB3aXRoIHN1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KCJodHRwOi8vd3d3LmV4YW1wbGUuY29tLyIpOgorICAgICAgICAgICAgb3BlbmVyID0gdXJsbGliLnJlcXVlc3QuYnVpbGRfb3BlbmVyKCkKKyAgICAgICAgICAgIHJlcXVlc3QgPSB1cmxsaWIucmVxdWVzdC5SZXF1ZXN0KCJodHRwOi8vd3d3LmV4YW1wbGUuY29tLyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIHJlcXVlc3QuZGF0YSkKIAotICAgICAgICBvcGVuZXIub3BlbihyZXF1ZXN0LCAiMSIuZW5jb2RlKCJ1cy1hc2NpaSIpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiMSIsIHJlcXVlc3QuZGF0YSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiMSIsIHJlcXVlc3QuZ2V0X2hlYWRlcigiQ29udGVudC1sZW5ndGgiKSkKKyAgICAgICAgICAgIG9wZW5lci5vcGVuKHJlcXVlc3QsICIxIi5lbmNvZGUoInVzLWFzY2lpIikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiMSIsIHJlcXVlc3QuZGF0YSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIjEiLCByZXF1ZXN0LmdldF9oZWFkZXIoIkNvbnRlbnQtbGVuZ3RoIikpCiAKLSAgICAgICAgb3BlbmVyLm9wZW4ocmVxdWVzdCwgIjEyMzQ1Njc4OTAiLmVuY29kZSgidXMtYXNjaWkiKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiIjEyMzQ1Njc4OTAiLCByZXF1ZXN0LmRhdGEpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIjEwIiwgcmVxdWVzdC5nZXRfaGVhZGVyKCJDb250ZW50LWxlbmd0aCIpKQorICAgICAgICAgICAgb3BlbmVyLm9wZW4ocmVxdWVzdCwgIjEyMzQ1Njc4OTAiLmVuY29kZSgidXMtYXNjaWkiKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiIxMjM0NTY3ODkwIiwgcmVxdWVzdC5kYXRhKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiMTAiLCByZXF1ZXN0LmdldF9oZWFkZXIoIkNvbnRlbnQtbGVuZ3RoIikpCiAKICAgICBkZWYgdGVzdF9IVFRQRXJyb3JfaW50ZXJmYWNlKHNlbGYpOgogICAgICAgICAiIiIKQEAgLTE2NDUsMTcgKzE2NDYsNiBAQAogICAgICAgICAgICAgcmVxID0gUmVxdWVzdCh1cmwpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS5nZXRfZnVsbF91cmwoKSwgcmVxLmZ1bGxfdXJsKQogCi1kZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6Ci0gICAgZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3VybGxpYjIKLSAgICBzdXBwb3J0LnJ1bl9kb2N0ZXN0KHRlc3RfdXJsbGliMiwgdmVyYm9zZSkKLSAgICBzdXBwb3J0LnJ1bl9kb2N0ZXN0KHVybGxpYi5yZXF1ZXN0LCB2ZXJib3NlKQotICAgIHRlc3RzID0gKFRyaXZpYWxUZXN0cywKLSAgICAgICAgICAgICBPcGVuZXJEaXJlY3RvclRlc3RzLAotICAgICAgICAgICAgIEhhbmRsZXJUZXN0cywKLSAgICAgICAgICAgICBNaXNjVGVzdHMsCi0gICAgICAgICAgICAgUmVxdWVzdFRlc3RzLAotICAgICAgICAgICAgIFJlcXVlc3RIZHJzVGVzdHMpCi0gICAgc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnRlc3RzKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICAgIHRlc3RfbWFpbih2ZXJib3NlPVRydWUpCisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3VybHBhcnNlLnB5IGIvTGliL3Rlc3QvdGVzdF91cmxwYXJzZS5weQppbmRleCBjYjMyM2QzLi4wNDgxZjBiIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3VybHBhcnNlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdXJscGFyc2UucHkKQEAgLTEsNCArMSwzIEBACi1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IHVybGxpYi5wYXJzZQogCkBAIC03NjksNTIgKzc2OCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzPSJpZ25vcmUiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgWygna2V5JywgJ1x1MDE0MS0nKV0pCiAKLSAgICBkZWYgdGVzdF9zcGxpdHBvcnQoc2VsZik6Ci0gICAgICAgIHNwbGl0cG9ydCA9IHVybGxpYi5wYXJzZS5zcGxpdHBvcnQKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdHBvcnQoJ3BhcnJvdDo4OCcpLCAoJ3BhcnJvdCcsICc4OCcpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwbGl0cG9ydCgncGFycm90JyksICgncGFycm90JywgTm9uZSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXRwb3J0KCdwYXJyb3Q6JyksICgncGFycm90JywgTm9uZSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXRwb3J0KCcxMjcuMC4wLjEnKSwgKCcxMjcuMC4wLjEnLCBOb25lKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdHBvcnQoJ3BhcnJvdDpjaGVlc2UnKSwgKCdwYXJyb3Q6Y2hlZXNlJywgTm9uZSkpCi0KLSAgICBkZWYgdGVzdF9zcGxpdG5wb3J0KHNlbGYpOgotICAgICAgICBzcGxpdG5wb3J0ID0gdXJsbGliLnBhcnNlLnNwbGl0bnBvcnQKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdG5wb3J0KCdwYXJyb3Q6ODgnKSwgKCdwYXJyb3QnLCA4OCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXRucG9ydCgncGFycm90JyksICgncGFycm90JywgLTEpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwbGl0bnBvcnQoJ3BhcnJvdCcsIDU1KSwgKCdwYXJyb3QnLCA1NSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXRucG9ydCgncGFycm90OicpLCAoJ3BhcnJvdCcsIC0xKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdG5wb3J0KCdwYXJyb3Q6JywgNTUpLCAoJ3BhcnJvdCcsIDU1KSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdG5wb3J0KCcxMjcuMC4wLjEnKSwgKCcxMjcuMC4wLjEnLCAtMSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXRucG9ydCgnMTI3LjAuMC4xJywgNTUpLCAoJzEyNy4wLjAuMScsIDU1KSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdG5wb3J0KCdwYXJyb3Q6Y2hlZXNlJyksICgncGFycm90JywgTm9uZSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXRucG9ydCgncGFycm90OmNoZWVzZScsIDU1KSwgKCdwYXJyb3QnLCBOb25lKSkKLQotICAgIGRlZiB0ZXN0X3NwbGl0cXVlcnkoc2VsZik6Ci0gICAgICAgICMgTm9ybWFsIGNhc2VzIGFyZSBleGVyY2lzZWQgYnkgb3RoZXIgdGVzdHM7IGVuc3VyZSB0aGF0IHdlIGFsc28KLSAgICAgICAgIyBjYXRjaCBjYXNlcyB3aXRoIG5vIHBvcnQgc3BlY2lmaWVkICh0ZXN0Y2FzZSBlbnN1cmluZyBjb3ZlcmFnZSkKLSAgICAgICAgcmVzdWx0ID0gdXJsbGliLnBhcnNlLnNwbGl0cXVlcnkoJ2h0dHA6Ly9weXRob24ub3JnL2Zha2U/Zm9vPWJhcicpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAoJ2h0dHA6Ly9weXRob24ub3JnL2Zha2UnLCAnZm9vPWJhcicpKQotICAgICAgICByZXN1bHQgPSB1cmxsaWIucGFyc2Uuc3BsaXRxdWVyeSgnaHR0cDovL3B5dGhvbi5vcmcvZmFrZT9mb289YmFyPycpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAoJ2h0dHA6Ly9weXRob24ub3JnL2Zha2U/Zm9vPWJhcicsICcnKSkKLSAgICAgICAgcmVzdWx0ID0gdXJsbGliLnBhcnNlLnNwbGl0cXVlcnkoJ2h0dHA6Ly9weXRob24ub3JnL2Zha2UnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgKCdodHRwOi8vcHl0aG9uLm9yZy9mYWtlJywgTm9uZSkpCi0KLSAgICBkZWYgdGVzdF9zcGxpdHZhbHVlKHNlbGYpOgotICAgICAgICAjIE5vcm1hbCBjYXNlcyBhcmUgZXhlcmNpc2VkIGJ5IG90aGVyIHRlc3RzOyB0ZXN0IHBhdGhvbG9naWNhbCBjYXNlcwotICAgICAgICAjIHdpdGggbm8ga2V5L3ZhbHVlIHBhaXJzLiAodGVzdGNhc2UgZW5zdXJpbmcgY292ZXJhZ2UpCi0gICAgICAgIHJlc3VsdCA9IHVybGxpYi5wYXJzZS5zcGxpdHZhbHVlKCdmb289YmFyJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsICgnZm9vJywgJ2JhcicpKQotICAgICAgICByZXN1bHQgPSB1cmxsaWIucGFyc2Uuc3BsaXR2YWx1ZSgnZm9vPScpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAoJ2ZvbycsICcnKSkKLSAgICAgICAgcmVzdWx0ID0gdXJsbGliLnBhcnNlLnNwbGl0dmFsdWUoJ2Zvb2JhcicpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAoJ2Zvb2JhcicsIE5vbmUpKQotCi0gICAgZGVmIHRlc3RfdG9fYnl0ZXMoc2VsZik6Ci0gICAgICAgIHJlc3VsdCA9IHVybGxpYi5wYXJzZS50b19ieXRlcygnaHR0cDovL3d3dy5weXRob24ub3JnJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsICdodHRwOi8vd3d3LnB5dGhvbi5vcmcnKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRXJyb3IsIHVybGxpYi5wYXJzZS50b19ieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJ2h0dHA6Ly93d3cucHl0aG9uLm9yZy9tZWRpXHUwMGU2dmFsJykKLQogICAgIGRlZiB0ZXN0X3VybGVuY29kZV9zZXF1ZW5jZXMoc2VsZik6CiAgICAgICAgICMgT3RoZXIgdGVzdHMgaW5jaWRlbnRhbGx5IHVybGVuY29kZSB0aGluZ3M7IHRlc3Qgbm9uLWNvdmVyZWQgY2FzZXM6CiAgICAgICAgICMgU2VxdWVuY2UgYW5kIG9iamVjdCB2YWx1ZXMuCkBAIC04ODMsMTcgKzgzNiwxMzkgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwMS5wYXRoLCAnODYzLTEyMzQnKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAxLnBhcmFtcywgJ3Bob25lLWNvbnRleHQ9KzEtOTE0LTU1NScpCiAKLSAgICBkZWYgdGVzdF91bndyYXAoc2VsZik6Ci0gICAgICAgIHVybCA9IHVybGxpYi5wYXJzZS51bndyYXAoJzxVUkw6dHlwZTovL2hvc3QvcGF0aD4nKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVybCwgJ3R5cGU6Ly9ob3N0L3BhdGgnKQotCiAgICAgZGVmIHRlc3RfUXVvdGVyX3JlcHIoc2VsZik6CiAgICAgICAgIHF1b3RlciA9IHVybGxpYi5wYXJzZS5RdW90ZXIodXJsbGliLnBhcnNlLl9BTFdBWVNfU0FGRSkKICAgICAgICAgc2VsZi5hc3NlcnRJbignUXVvdGVyJywgcmVwcihxdW90ZXIpKQogCiAKLWRlZiB0ZXN0X21haW4oKToKLSAgICBzdXBwb3J0LnJ1bl91bml0dGVzdChVcmxQYXJzZVRlc3RDYXNlKQorY2xhc3MgVXRpbGl0eV9UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdGNhc2UgdG8gdGVzdCB0aGUgdmFyaW91cyB1dGlsaXR5IGZ1bmN0aW9ucyBpbiB0aGUgdXJsbGliLiIiIgorICAgICMgSW4gUHl0aG9uIDIgdGhpcyB0ZXN0IGNsYXNzIHdhcyBpbiB0ZXN0X3VybGxpYi4KKworICAgIGRlZiB0ZXN0X3NwbGl0dHlwZShzZWxmKToKKyAgICAgICAgc3BsaXR0eXBlID0gdXJsbGliLnBhcnNlLnNwbGl0dHlwZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwbGl0dHlwZSgndHlwZTpvcGFxdWVzdHJpbmcnKSwgKCd0eXBlJywgJ29wYXF1ZXN0cmluZycpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwbGl0dHlwZSgnb3BhcXVlc3RyaW5nJyksIChOb25lLCAnb3BhcXVlc3RyaW5nJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXR0eXBlKCc6b3BhcXVlc3RyaW5nJyksIChOb25lLCAnOm9wYXF1ZXN0cmluZycpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwbGl0dHlwZSgndHlwZTonKSwgKCd0eXBlJywgJycpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwbGl0dHlwZSgndHlwZTpvcGFxdWU6c3RyaW5nJyksICgndHlwZScsICdvcGFxdWU6c3RyaW5nJykpCisKKyAgICBkZWYgdGVzdF9zcGxpdGhvc3Qoc2VsZik6CisgICAgICAgIHNwbGl0aG9zdCA9IHVybGxpYi5wYXJzZS5zcGxpdGhvc3QKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdGhvc3QoJy8vd3d3LmV4YW1wbGUub3JnOjgwL2Zvby9iYXIvYmF6Lmh0bWwnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoJ3d3dy5leGFtcGxlLm9yZzo4MCcsICcvZm9vL2Jhci9iYXouaHRtbCcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwbGl0aG9zdCgnLy93d3cuZXhhbXBsZS5vcmc6ODAnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoJ3d3dy5leGFtcGxlLm9yZzo4MCcsICcnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdGhvc3QoJy9mb28vYmFyL2Jhei5odG1sJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgKE5vbmUsICcvZm9vL2Jhci9iYXouaHRtbCcpKQorCisgICAgZGVmIHRlc3Rfc3BsaXR1c2VyKHNlbGYpOgorICAgICAgICBzcGxpdHVzZXIgPSB1cmxsaWIucGFyc2Uuc3BsaXR1c2VyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXR1c2VyKCdVc2VyOlBhc3NAd3d3LnB5dGhvbi5vcmc6MDgwJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCdVc2VyOlBhc3MnLCAnd3d3LnB5dGhvbi5vcmc6MDgwJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXR1c2VyKCdAd3d3LnB5dGhvbi5vcmc6MDgwJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCcnLCAnd3d3LnB5dGhvbi5vcmc6MDgwJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXR1c2VyKCd3d3cucHl0aG9uLm9yZzowODAnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoTm9uZSwgJ3d3dy5weXRob24ub3JnOjA4MCcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwbGl0dXNlcignVXNlcjpQYXNzQCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgnVXNlcjpQYXNzJywgJycpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwbGl0dXNlcignVXNlckBleGFtcGxlLmNvbTpQYXNzQHd3dy5weXRob24ub3JnOjA4MCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgnVXNlckBleGFtcGxlLmNvbTpQYXNzJywgJ3d3dy5weXRob24ub3JnOjA4MCcpKQorCisgICAgZGVmIHRlc3Rfc3BsaXRwYXNzd2Qoc2VsZik6CisgICAgICAgICMgU29tZSBvZiB0aGUgcGFzc3dvcmQgZXhhbXBsZXMgYXJlIG5vdCBzZW5zaWJsZSwgYnV0IGl0IGlzIGFkZGVkIHRvCisgICAgICAgICMgY29uZmlybWluZyB0byBSRkMyNjE3IGFuZCBhZGRyZXNzaW5nIGlzc3VlNDY3NS4KKyAgICAgICAgc3BsaXRwYXNzd2QgPSB1cmxsaWIucGFyc2Uuc3BsaXRwYXNzd2QKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdHBhc3N3ZCgndXNlcjphYicpLCAoJ3VzZXInLCAnYWInKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdHBhc3N3ZCgndXNlcjphXG5iJyksICgndXNlcicsICdhXG5iJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXRwYXNzd2QoJ3VzZXI6YVx0YicpLCAoJ3VzZXInLCAnYVx0YicpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwbGl0cGFzc3dkKCd1c2VyOmFccmInKSwgKCd1c2VyJywgJ2FccmInKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdHBhc3N3ZCgndXNlcjphXGZiJyksICgndXNlcicsICdhXGZiJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXRwYXNzd2QoJ3VzZXI6YVx2YicpLCAoJ3VzZXInLCAnYVx2YicpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwbGl0cGFzc3dkKCd1c2VyOmE6YicpLCAoJ3VzZXInLCAnYTpiJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXRwYXNzd2QoJ3VzZXI6YSBiJyksICgndXNlcicsICdhIGInKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdHBhc3N3ZCgndXNlciAyOmFiJyksICgndXNlciAyJywgJ2FiJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXRwYXNzd2QoJ3VzZXIrMTphK2InKSwgKCd1c2VyKzEnLCAnYStiJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXRwYXNzd2QoJ3VzZXI6JyksICgndXNlcicsICcnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdHBhc3N3ZCgndXNlcicpLCAoJ3VzZXInLCBOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdHBhc3N3ZCgnOmFiJyksICgnJywgJ2FiJykpCisKKyAgICBkZWYgdGVzdF9zcGxpdHBvcnQoc2VsZik6CisgICAgICAgIHNwbGl0cG9ydCA9IHVybGxpYi5wYXJzZS5zcGxpdHBvcnQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdHBvcnQoJ3BhcnJvdDo4OCcpLCAoJ3BhcnJvdCcsICc4OCcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwbGl0cG9ydCgncGFycm90JyksICgncGFycm90JywgTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXRwb3J0KCdwYXJyb3Q6JyksICgncGFycm90JywgTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXRwb3J0KCcxMjcuMC4wLjEnKSwgKCcxMjcuMC4wLjEnLCBOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdHBvcnQoJ3BhcnJvdDpjaGVlc2UnKSwgKCdwYXJyb3Q6Y2hlZXNlJywgTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXRwb3J0KCdbOjoxXTo4OCcpLCAoJ1s6OjFdJywgJzg4JykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXRwb3J0KCdbOjoxXScpLCAoJ1s6OjFdJywgTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXRwb3J0KCc6ODgnKSwgKCcnLCAnODgnKSkKKworICAgIGRlZiB0ZXN0X3NwbGl0bnBvcnQoc2VsZik6CisgICAgICAgIHNwbGl0bnBvcnQgPSB1cmxsaWIucGFyc2Uuc3BsaXRucG9ydAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwbGl0bnBvcnQoJ3BhcnJvdDo4OCcpLCAoJ3BhcnJvdCcsIDg4KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdG5wb3J0KCdwYXJyb3QnKSwgKCdwYXJyb3QnLCAtMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXRucG9ydCgncGFycm90JywgNTUpLCAoJ3BhcnJvdCcsIDU1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdG5wb3J0KCdwYXJyb3Q6JyksICgncGFycm90JywgLTEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwbGl0bnBvcnQoJ3BhcnJvdDonLCA1NSksICgncGFycm90JywgNTUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwbGl0bnBvcnQoJzEyNy4wLjAuMScpLCAoJzEyNy4wLjAuMScsIC0xKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdG5wb3J0KCcxMjcuMC4wLjEnLCA1NSksICgnMTI3LjAuMC4xJywgNTUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwbGl0bnBvcnQoJ3BhcnJvdDpjaGVlc2UnKSwgKCdwYXJyb3QnLCBOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdG5wb3J0KCdwYXJyb3Q6Y2hlZXNlJywgNTUpLCAoJ3BhcnJvdCcsIE5vbmUpKQorCisgICAgZGVmIHRlc3Rfc3BsaXRxdWVyeShzZWxmKToKKyAgICAgICAgIyBOb3JtYWwgY2FzZXMgYXJlIGV4ZXJjaXNlZCBieSBvdGhlciB0ZXN0czsgZW5zdXJlIHRoYXQgd2UgYWxzbworICAgICAgICAjIGNhdGNoIGNhc2VzIHdpdGggbm8gcG9ydCBzcGVjaWZpZWQgKHRlc3RjYXNlIGVuc3VyaW5nIGNvdmVyYWdlKQorICAgICAgICBzcGxpdHF1ZXJ5ID0gdXJsbGliLnBhcnNlLnNwbGl0cXVlcnkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdHF1ZXJ5KCdodHRwOi8vcHl0aG9uLm9yZy9mYWtlP2Zvbz1iYXInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoJ2h0dHA6Ly9weXRob24ub3JnL2Zha2UnLCAnZm9vPWJhcicpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwbGl0cXVlcnkoJ2h0dHA6Ly9weXRob24ub3JnL2Zha2U/Zm9vPWJhcj8nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoJ2h0dHA6Ly9weXRob24ub3JnL2Zha2U/Zm9vPWJhcicsICcnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdHF1ZXJ5KCdodHRwOi8vcHl0aG9uLm9yZy9mYWtlJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCdodHRwOi8vcHl0aG9uLm9yZy9mYWtlJywgTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXRxdWVyeSgnP2Zvbz1iYXInKSwgKCcnLCAnZm9vPWJhcicpKQorCisgICAgZGVmIHRlc3Rfc3BsaXR0YWcoc2VsZik6CisgICAgICAgIHNwbGl0dGFnID0gdXJsbGliLnBhcnNlLnNwbGl0dGFnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXR0YWcoJ2h0dHA6Ly9leGFtcGxlLmNvbT9mb289YmFyI2JheicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgnaHR0cDovL2V4YW1wbGUuY29tP2Zvbz1iYXInLCAnYmF6JykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXR0YWcoJ2h0dHA6Ly9leGFtcGxlLmNvbT9mb289YmFyIycpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgnaHR0cDovL2V4YW1wbGUuY29tP2Zvbz1iYXInLCAnJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXR0YWcoJyNiYXonKSwgKCcnLCAnYmF6JykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXR0YWcoJ2h0dHA6Ly9leGFtcGxlLmNvbT9mb289YmFyJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCdodHRwOi8vZXhhbXBsZS5jb20/Zm9vPWJhcicsIE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwbGl0dGFnKCdodHRwOi8vZXhhbXBsZS5jb20/Zm9vPWJhciNiYXojYm9vJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCdodHRwOi8vZXhhbXBsZS5jb20/Zm9vPWJhciNiYXonLCAnYm9vJykpCisKKyAgICBkZWYgdGVzdF9zcGxpdGF0dHIoc2VsZik6CisgICAgICAgIHNwbGl0YXR0ciA9IHVybGxpYi5wYXJzZS5zcGxpdGF0dHIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdGF0dHIoJy9wYXRoO2F0dHIxPXZhbHVlMTthdHRyMj12YWx1ZTInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoJy9wYXRoJywgWydhdHRyMT12YWx1ZTEnLCAnYXR0cjI9dmFsdWUyJ10pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwbGl0YXR0cignL3BhdGg7JyksICgnL3BhdGgnLCBbJyddKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdGF0dHIoJzthdHRyMT12YWx1ZTE7YXR0cjI9dmFsdWUyJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCcnLCBbJ2F0dHIxPXZhbHVlMScsICdhdHRyMj12YWx1ZTInXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXRhdHRyKCcvcGF0aCcpLCAoJy9wYXRoJywgW10pKQorCisgICAgZGVmIHRlc3Rfc3BsaXR2YWx1ZShzZWxmKToKKyAgICAgICAgIyBOb3JtYWwgY2FzZXMgYXJlIGV4ZXJjaXNlZCBieSBvdGhlciB0ZXN0czsgdGVzdCBwYXRob2xvZ2ljYWwgY2FzZXMKKyAgICAgICAgIyB3aXRoIG5vIGtleS92YWx1ZSBwYWlycy4gKHRlc3RjYXNlIGVuc3VyaW5nIGNvdmVyYWdlKQorICAgICAgICBzcGxpdHZhbHVlID0gdXJsbGliLnBhcnNlLnNwbGl0dmFsdWUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdHZhbHVlKCdmb289YmFyJyksICgnZm9vJywgJ2JhcicpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwbGl0dmFsdWUoJ2Zvbz0nKSwgKCdmb28nLCAnJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXR2YWx1ZSgnPWJhcicpLCAoJycsICdiYXInKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdHZhbHVlKCdmb29iYXInKSwgKCdmb29iYXInLCBOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdHZhbHVlKCdmb289YmFyPWJheicpLCAoJ2ZvbycsICdiYXI9YmF6JykpCisKKyAgICBkZWYgdGVzdF90b19ieXRlcyhzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gdXJsbGliLnBhcnNlLnRvX2J5dGVzKCdodHRwOi8vd3d3LnB5dGhvbi5vcmcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgJ2h0dHA6Ly93d3cucHl0aG9uLm9yZycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFcnJvciwgdXJsbGliLnBhcnNlLnRvX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnaHR0cDovL3d3dy5weXRob24ub3JnL21lZGlcdTAwZTZ2YWwnKQorCisgICAgZGVmIHRlc3RfdW53cmFwKHNlbGYpOgorICAgICAgICB1cmwgPSB1cmxsaWIucGFyc2UudW53cmFwKCc8VVJMOnR5cGU6Ly9ob3N0L3BhdGg+JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmwsICd0eXBlOi8vaG9zdC9wYXRoJykKKwogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICAgIHRlc3RfbWFpbigpCisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3dzZ2lyZWYucHkgYi9MaWIvdGVzdC90ZXN0X3dzZ2lyZWYucHkKaW5kZXggNDc5ZmNiYy4uMjlmNjRmMyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF93c2dpcmVmLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfd3NnaXJlZi5weQpAQCAtNDgsNiArNDgsMTggQEAKICAgICBdKQogICAgIHJldHVybiBbYiJIZWxsbywgd29ybGQhIl0KIAorCitkZWYgaGVhZGVyX2FwcChlbnZpcm9uLCBzdGFydF9yZXNwb25zZSk6CisgICAgc3RhcnRfcmVzcG9uc2UoIjIwMCBPSyIsIFsKKyAgICAgICAgKCdDb250ZW50LVR5cGUnLCAndGV4dC9wbGFpbicpLAorICAgICAgICAoJ0RhdGUnLCAnTW9uLCAwNSBKdW4gMjAwNiAxODo0OTo1NCBHTVQnKQorICAgIF0pCisgICAgcmV0dXJuIFsnOycuam9pbihbCisgICAgICAgIGVudmlyb25bJ0hUVFBfWF9URVNUX0hFQURFUiddLCBlbnZpcm9uWydRVUVSWV9TVFJJTkcnXSwKKyAgICAgICAgZW52aXJvblsnUEFUSF9JTkZPJ10KKyAgICBdKS5lbmNvZGUoJ2lzby04ODU5LTEnKV0KKworCiBkZWYgcnVuX2Ftb2NrKGFwcD1oZWxsb19hcHAsIGRhdGE9YiJHRVQgLyBIVFRQLzEuMFxuXG4iKToKICAgICBzZXJ2ZXIgPSBtYWtlX3NlcnZlcigiIiwgODAsIGFwcCwgTW9ja1NlcnZlciwgTW9ja0hhbmRsZXIpCiAgICAgaW5wID0gQnVmZmVyZWRSZWFkZXIoQnl0ZXNJTyhkYXRhKSkKQEAgLTExOCw2ICsxMzAsMTkgQEAKICAgICAgICAgb3V0LCBlcnIgPSBydW5fYW1vY2soKQogICAgICAgICBzZWxmLmNoZWNrX2hlbGxvKG91dCkKIAorICAgIGRlZiB0ZXN0X2Vudmlyb24oc2VsZik6CisgICAgICAgIHJlcXVlc3QgPSAoCisgICAgICAgICAgICBiIkdFVCAvcCU2MXRoLz9xdWVyeT10ZXN0IEhUVFAvMS4wXG4iCisgICAgICAgICAgICBiIlgtVGVzdC1IZWFkZXI6IFB5dGhvbiB0ZXN0IFxuIgorICAgICAgICAgICAgYiJYLVRlc3QtSGVhZGVyOiBQeXRob24gdGVzdCAyXG4iCisgICAgICAgICAgICBiIkNvbnRlbnQtTGVuZ3RoOiAwXG5cbiIKKyAgICAgICAgKQorICAgICAgICBvdXQsIGVyciA9IHJ1bl9hbW9jayhoZWFkZXJfYXBwLCByZXF1ZXN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgb3V0LnNwbGl0bGluZXMoKVstMV0sCisgICAgICAgICAgICBiIlB5dGhvbiB0ZXN0LFB5dGhvbiB0ZXN0IDI7cXVlcnk9dGVzdDsvcGF0aC8iCisgICAgICAgICkKKwogICAgIGRlZiB0ZXN0X3JlcXVlc3RfbGVuZ3RoKHNlbGYpOgogICAgICAgICBvdXQsIGVyciA9IHJ1bl9hbW9jayhkYXRhPWIiR0VUICIgKyAoYiJ4IiAqIDY1NTM3KSArIGIiIEhUVFAvMS4wXG5cbiIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0LnNwbGl0bGluZXMoKVswXSwKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfeG1sX2V0cmVlX2MucHkgYi9MaWIvdGVzdC90ZXN0X3htbF9ldHJlZV9jLnB5CmluZGV4IDgxNmFhODYuLmQwZGYzOGQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfeG1sX2V0cmVlX2MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF94bWxfZXRyZWVfYy5weQpAQCAtNTUsNyArNTUsNyBAQAogICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgc2VsZi5lbGVtZW50c2l6ZSA9IHN1cHBvcnQuY2FsY29ianNpemUoJzVQJykKICAgICAgICAgIyBleHRyYQotICAgICAgICBzZWxmLmV4dHJhID0gc3RydWN0LmNhbGNzaXplKCdQaWlQNFAnKQorICAgICAgICBzZWxmLmV4dHJhID0gc3RydWN0LmNhbGNzaXplKCdQbm5QNFAnKQogCiAgICAgY2hlY2tfc2l6ZW9mID0gc3VwcG9ydC5jaGVja19zaXplb2YKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF96aXBmaWxlLnB5IGIvTGliL3Rlc3QvdGVzdF96aXBmaWxlLnB5CmluZGV4IGFiZTgwZTQuLmY0NThmMzAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfemlwZmlsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3ppcGZpbGUucHkKQEAgLTY3OSw3ICs2NzksMTQgQEAKICAgICAgICAgaWYgbmFtZSArICdvJyBub3QgaW4gbmFtZWxpc3Q6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEluKG5hbWUgKyAnYycsIG5hbWVsaXN0KQogCisgICAgZGVmIHJlcXVpcmVzV3JpdGVBY2Nlc3Moc2VsZiwgcGF0aCk6CisgICAgICAgICMgZWZmZWN0aXZlX2lkcyB1bmF2YWlsYWJsZSBvbiB3aW5kb3dzCisgICAgICAgIGlmIG5vdCBvcy5hY2Nlc3MocGF0aCwgb3MuV19PSywKKyAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RpdmVfaWRzPW9zLmFjY2VzcyBpbiBvcy5zdXBwb3J0c19lZmZlY3RpdmVfaWRzKToKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJ3JlcXVpcmVzIHdyaXRlIGFjY2VzcyB0byB0aGUgaW5zdGFsbGVkIGxvY2F0aW9uJykKKwogICAgIGRlZiB0ZXN0X3dyaXRlX3B5ZmlsZShzZWxmKToKKyAgICAgICAgc2VsZi5yZXF1aXJlc1dyaXRlQWNjZXNzKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCiAgICAgICAgIHdpdGggVGVtcG9yYXJ5RmlsZSgpIGFzIHQsIHppcGZpbGUuUHlaaXBGaWxlKHQsICJ3IikgYXMgemlwZnA6CiAgICAgICAgICAgICBmbiA9IF9fZmlsZV9fCiAgICAgICAgICAgICBpZiBmbi5lbmRzd2l0aCgnLnB5YycpIG9yIGZuLmVuZHN3aXRoKCcucHlvJyk6CkBAIC03MTEsNiArNzE4LDcgQEAKICAgICBkZWYgdGVzdF93cml0ZV9weXRob25fcGFja2FnZShzZWxmKToKICAgICAgICAgaW1wb3J0IGVtYWlsCiAgICAgICAgIHBhY2thZ2VkaXIgPSBvcy5wYXRoLmRpcm5hbWUoZW1haWwuX19maWxlX18pCisgICAgICAgIHNlbGYucmVxdWlyZXNXcml0ZUFjY2VzcyhwYWNrYWdlZGlyKQogCiAgICAgICAgIHdpdGggVGVtcG9yYXJ5RmlsZSgpIGFzIHQsIHppcGZpbGUuUHlaaXBGaWxlKHQsICJ3IikgYXMgemlwZnA6CiAgICAgICAgICAgICB6aXBmcC53cml0ZXB5KHBhY2thZ2VkaXIpCkBAIC03MjQsNiArNzMyLDcgQEAKICAgICBkZWYgdGVzdF93cml0ZV9maWx0ZXJlZF9weXRob25fcGFja2FnZShzZWxmKToKICAgICAgICAgaW1wb3J0IHRlc3QKICAgICAgICAgcGFja2FnZWRpciA9IG9zLnBhdGguZGlybmFtZSh0ZXN0Ll9fZmlsZV9fKQorICAgICAgICBzZWxmLnJlcXVpcmVzV3JpdGVBY2Nlc3MocGFja2FnZWRpcikKIAogICAgICAgICB3aXRoIFRlbXBvcmFyeUZpbGUoKSBhcyB0LCB6aXBmaWxlLlB5WmlwRmlsZSh0LCAidyIpIGFzIHppcGZwOgogCkBAIC03NTIsNiArNzYxLDcgQEAKICAgICBkZWYgdGVzdF93cml0ZV93aXRoX29wdGltaXphdGlvbihzZWxmKToKICAgICAgICAgaW1wb3J0IGVtYWlsCiAgICAgICAgIHBhY2thZ2VkaXIgPSBvcy5wYXRoLmRpcm5hbWUoZW1haWwuX19maWxlX18pCisgICAgICAgIHNlbGYucmVxdWlyZXNXcml0ZUFjY2VzcyhwYWNrYWdlZGlyKQogICAgICAgICAjIHVzZSAucHljIGlmIHJ1bm5pbmcgdGVzdCBpbiBvcHRpbWl6YXRpb24gbW9kZSwKICAgICAgICAgIyB1c2UgLnB5byBpZiBydW5uaW5nIHRlc3QgaW4gZGVidWcgbW9kZQogICAgICAgICBvcHRsZXZlbCA9IDEgaWYgX19kZWJ1Z19fIGVsc2UgMApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGZfaW5oZXJpdF9jaGVjay5weSBiL0xpYi90ZXN0L3RmX2luaGVyaXRfY2hlY2sucHkKaW5kZXggYWZlNTBkMi4uMTM4ZjI1YSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGZfaW5oZXJpdF9jaGVjay5weQorKysgYi9MaWIvdGVzdC90Zl9pbmhlcml0X2NoZWNrLnB5CkBAIC00LDIyICs0LDI0IEBACiAKIGltcG9ydCBzeXMKIGltcG9ydCBvcworZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IFN1cHByZXNzQ3Jhc2hSZXBvcnQKIAotdmVyYm9zZSA9IChzeXMuYXJndlsxXSA9PSAndicpCi10cnk6Ci0gICAgZmQgPSBpbnQoc3lzLmFyZ3ZbMl0pCi0KK3dpdGggU3VwcHJlc3NDcmFzaFJlcG9ydCgpOgorICAgIHZlcmJvc2UgPSAoc3lzLmFyZ3ZbMV0gPT0gJ3YnKQogICAgIHRyeToKLSAgICAgICAgb3Mud3JpdGUoZmQsIGIiYmxhdCIpCi0gICAgZXhjZXB0IE9TRXJyb3I6Ci0gICAgICAgICMgU3VjY2VzcyAtLSBjb3VsZCBub3Qgd3JpdGUgdG8gZmQuCi0gICAgICAgIHN5cy5leGl0KDApCi0gICAgZWxzZToKLSAgICAgICAgaWYgdmVyYm9zZToKLSAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoImZkICVkIGlzIG9wZW4gaW4gY2hpbGQiICUgZmQpCi0gICAgICAgIHN5cy5leGl0KDEpCisgICAgICAgIGZkID0gaW50KHN5cy5hcmd2WzJdKQogCi1leGNlcHQgRXhjZXB0aW9uOgotICAgIGlmIHZlcmJvc2U6Ci0gICAgICAgIHJhaXNlCi0gICAgc3lzLmV4aXQoMSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3Mud3JpdGUoZmQsIGIiYmxhdCIpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgIyBTdWNjZXNzIC0tIGNvdWxkIG5vdCB3cml0ZSB0byBmZC4KKyAgICAgICAgICAgIHN5cy5leGl0KDApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoImZkICVkIGlzIG9wZW4gaW4gY2hpbGQiICUgZmQpCisgICAgICAgICAgICBzeXMuZXhpdCgxKQorCisgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIHN5cy5leGl0KDEpCmRpZmYgLS1naXQgYS9MaWIvdHJhY2ViYWNrLnB5IGIvTGliL3RyYWNlYmFjay5weQppbmRleCBjMWFiMzZlLi4wYWMxODE5IDEwMDY0NAotLS0gYS9MaWIvdHJhY2ViYWNrLnB5CisrKyBiL0xpYi90cmFjZWJhY2sucHkKQEAgLTE0LDE5ICsxNCwxMiBAQAogIyBGb3JtYXR0aW5nIGFuZCBwcmludGluZyBsaXN0cyBvZiB0cmFjZWJhY2sgbGluZXMuCiAjCiAKLWRlZiBfZm9ybWF0X2xpc3RfaXRlcihleHRyYWN0ZWRfbGlzdCk6Ci0gICAgZm9yIGZpbGVuYW1lLCBsaW5lbm8sIG5hbWUsIGxpbmUgaW4gZXh0cmFjdGVkX2xpc3Q6Ci0gICAgICAgIGl0ZW0gPSAnICBGaWxlICJ7fSIsIGxpbmUge30sIGluIHt9XG4nLmZvcm1hdChmaWxlbmFtZSwgbGluZW5vLCBuYW1lKQotICAgICAgICBpZiBsaW5lOgotICAgICAgICAgICAgaXRlbSA9IGl0ZW0gKyAnICAgIHt9XG4nLmZvcm1hdChsaW5lLnN0cmlwKCkpCi0gICAgICAgIHlpZWxkIGl0ZW0KLQogZGVmIHByaW50X2xpc3QoZXh0cmFjdGVkX2xpc3QsIGZpbGU9Tm9uZSk6CiAgICAgIiIiUHJpbnQgdGhlIGxpc3Qgb2YgdHVwbGVzIGFzIHJldHVybmVkIGJ5IGV4dHJhY3RfdGIoKSBvcgogICAgIGV4dHJhY3Rfc3RhY2soKSBhcyBhIGZvcm1hdHRlZCBzdGFjayB0cmFjZSB0byB0aGUgZ2l2ZW4gZmlsZS4iIiIKICAgICBpZiBmaWxlIGlzIE5vbmU6CiAgICAgICAgIGZpbGUgPSBzeXMuc3RkZXJyCi0gICAgZm9yIGl0ZW0gaW4gX2Zvcm1hdF9saXN0X2l0ZXIoZXh0cmFjdGVkX2xpc3QpOgorICAgIGZvciBpdGVtIGluIFN0YWNrU3VtbWFyeS5mcm9tX2xpc3QoZXh0cmFjdGVkX2xpc3QpLmZvcm1hdCgpOgogICAgICAgICBwcmludChpdGVtLCBmaWxlPWZpbGUsIGVuZD0iIikKIAogZGVmIGZvcm1hdF9saXN0KGV4dHJhY3RlZF9saXN0KToKQEAgLTM5LDQ1ICszMiwxMiBAQAogICAgIHRoZSBzdHJpbmdzIG1heSBjb250YWluIGludGVybmFsIG5ld2xpbmVzIGFzIHdlbGwsIGZvciB0aG9zZSBpdGVtcwogICAgIHdob3NlIHNvdXJjZSB0ZXh0IGxpbmUgaXMgbm90IE5vbmUuCiAgICAgIiIiCi0gICAgcmV0dXJuIGxpc3QoX2Zvcm1hdF9saXN0X2l0ZXIoZXh0cmFjdGVkX2xpc3QpKQorICAgIHJldHVybiBTdGFja1N1bW1hcnkuZnJvbV9saXN0KGV4dHJhY3RlZF9saXN0KS5mb3JtYXQoKQogCiAjCiAjIFByaW50aW5nIGFuZCBFeHRyYWN0aW5nIFRyYWNlYmFja3MuCiAjCiAKLSMgZXh0cmFjdG9yIHRha2VzIGN1cnIgYW5kIG5lZWRzIHRvIHJldHVybiBhIHR1cGxlIG9mOgotIyAtIEZyYW1lIG9iamVjdAotIyAtIExpbmUgbnVtYmVyCi0jIC0gTmV4dCBpdGVtIChzYW1lIHR5cGUgYXMgY3VycikKLSMgSW4gcHJhY3RpY2UsIGN1cnIgaXMgZWl0aGVyIGEgdHJhY2ViYWNrIG9yIGEgZnJhbWUuCi1kZWYgX2V4dHJhY3RfdGJfb3Jfc3RhY2tfaXRlcihjdXJyLCBsaW1pdCwgZXh0cmFjdG9yKToKLSAgICBpZiBsaW1pdCBpcyBOb25lOgotICAgICAgICBsaW1pdCA9IGdldGF0dHIoc3lzLCAndHJhY2ViYWNrbGltaXQnLCBOb25lKQotCi0gICAgbiA9IDAKLSAgICB3aGlsZSBjdXJyIGlzIG5vdCBOb25lIGFuZCAobGltaXQgaXMgTm9uZSBvciBuIDwgbGltaXQpOgotICAgICAgICBmLCBsaW5lbm8sIG5leHRfaXRlbSA9IGV4dHJhY3RvcihjdXJyKQotICAgICAgICBjbyA9IGYuZl9jb2RlCi0gICAgICAgIGZpbGVuYW1lID0gY28uY29fZmlsZW5hbWUKLSAgICAgICAgbmFtZSA9IGNvLmNvX25hbWUKLQotICAgICAgICBsaW5lY2FjaGUuY2hlY2tjYWNoZShmaWxlbmFtZSkKLSAgICAgICAgbGluZSA9IGxpbmVjYWNoZS5nZXRsaW5lKGZpbGVuYW1lLCBsaW5lbm8sIGYuZl9nbG9iYWxzKQotCi0gICAgICAgIGlmIGxpbmU6Ci0gICAgICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBsaW5lID0gTm9uZQotCi0gICAgICAgIHlpZWxkIChmaWxlbmFtZSwgbGluZW5vLCBuYW1lLCBsaW5lKQotICAgICAgICBjdXJyID0gbmV4dF9pdGVtCi0gICAgICAgIG4gKz0gMQotCi1kZWYgX2V4dHJhY3RfdGJfaXRlcih0YiwgbGltaXQpOgotICAgIHJldHVybiBfZXh0cmFjdF90Yl9vcl9zdGFja19pdGVyKAotICAgICAgICAgICAgICAgIHRiLCBsaW1pdCwKLSAgICAgICAgICAgICAgICBvcGVyYXRvci5hdHRyZ2V0dGVyKCJ0Yl9mcmFtZSIsICJ0Yl9saW5lbm8iLCAidGJfbmV4dCIpKQotCiBkZWYgcHJpbnRfdGIodGIsIGxpbWl0PU5vbmUsIGZpbGU9Tm9uZSk6CiAgICAgIiIiUHJpbnQgdXAgdG8gJ2xpbWl0JyBzdGFjayB0cmFjZSBlbnRyaWVzIGZyb20gdGhlIHRyYWNlYmFjayAndGInLgogCkBAIC05MCw3ICs1MCw3IEBACiAKIGRlZiBmb3JtYXRfdGIodGIsIGxpbWl0PU5vbmUpOgogICAgICIiIkEgc2hvcnRoYW5kIGZvciAnZm9ybWF0X2xpc3QoZXh0cmFjdF90Yih0YiwgbGltaXQpKScuIiIiCi0gICAgcmV0dXJuIGZvcm1hdF9saXN0KGV4dHJhY3RfdGIodGIsIGxpbWl0PWxpbWl0KSkKKyAgICByZXR1cm4gZXh0cmFjdF90Yih0YiwgbGltaXQ9bGltaXQpLmZvcm1hdCgpCiAKIGRlZiBleHRyYWN0X3RiKHRiLCBsaW1pdD1Ob25lKToKICAgICAiIiJSZXR1cm4gbGlzdCBvZiB1cCB0byBsaW1pdCBwcmUtcHJvY2Vzc2VkIGVudHJpZXMgZnJvbSB0cmFjZWJhY2suCkBAIC0xMDMsNyArNjMsNyBAQAogICAgIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2Ugc3RyaXBwZWQ7IGlmIHRoZSBzb3VyY2UgaXMgbm90CiAgICAgYXZhaWxhYmxlIGl0IGlzIE5vbmUuCiAgICAgIiIiCi0gICAgcmV0dXJuIGxpc3QoX2V4dHJhY3RfdGJfaXRlcih0YiwgbGltaXQ9bGltaXQpKQorICAgIHJldHVybiBTdGFja1N1bW1hcnkuZXh0cmFjdCh3YWxrX3RiKHRiKSwgbGltaXQ9bGltaXQpCiAKICMKICMgRXhjZXB0aW9uIGZvcm1hdHRpbmcgYW5kIG91dHB1dC4KQEAgLTExMSw0NyArNzEsMTIgQEAKIAogX2NhdXNlX21lc3NhZ2UgPSAoCiAgICAgIlxuVGhlIGFib3ZlIGV4Y2VwdGlvbiB3YXMgdGhlIGRpcmVjdCBjYXVzZSAiCi0gICAgIm9mIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uOlxuIikKKyAgICAib2YgdGhlIGZvbGxvd2luZyBleGNlcHRpb246XG5cbiIpCiAKIF9jb250ZXh0X21lc3NhZ2UgPSAoCiAgICAgIlxuRHVyaW5nIGhhbmRsaW5nIG9mIHRoZSBhYm92ZSBleGNlcHRpb24sICIKLSAgICAiYW5vdGhlciBleGNlcHRpb24gb2NjdXJyZWQ6XG4iKQorICAgICJhbm90aGVyIGV4Y2VwdGlvbiBvY2N1cnJlZDpcblxuIikKIAotZGVmIF9pdGVyX2NoYWluKGV4YywgY3VzdG9tX3RiPU5vbmUsIHNlZW49Tm9uZSk6Ci0gICAgaWYgc2VlbiBpcyBOb25lOgotICAgICAgICBzZWVuID0gc2V0KCkKLSAgICBzZWVuLmFkZChleGMpCi0gICAgaXRzID0gW10KLSAgICBjb250ZXh0ID0gZXhjLl9fY29udGV4dF9fCi0gICAgY2F1c2UgPSBleGMuX19jYXVzZV9fCi0gICAgaWYgY2F1c2UgaXMgbm90IE5vbmUgYW5kIGNhdXNlIG5vdCBpbiBzZWVuOgotICAgICAgICBpdHMuYXBwZW5kKF9pdGVyX2NoYWluKGNhdXNlLCBGYWxzZSwgc2VlbikpCi0gICAgICAgIGl0cy5hcHBlbmQoWyhfY2F1c2VfbWVzc2FnZSwgTm9uZSldKQotICAgIGVsaWYgKGNvbnRleHQgaXMgbm90IE5vbmUgYW5kCi0gICAgICAgICAgbm90IGV4Yy5fX3N1cHByZXNzX2NvbnRleHRfXyBhbmQKLSAgICAgICAgICBjb250ZXh0IG5vdCBpbiBzZWVuKToKLSAgICAgICAgaXRzLmFwcGVuZChfaXRlcl9jaGFpbihjb250ZXh0LCBOb25lLCBzZWVuKSkKLSAgICAgICAgaXRzLmFwcGVuZChbKF9jb250ZXh0X21lc3NhZ2UsIE5vbmUpXSkKLSAgICBpdHMuYXBwZW5kKFsoZXhjLCBjdXN0b21fdGIgb3IgZXhjLl9fdHJhY2ViYWNrX18pXSkKLSAgICAjIGl0ZXJ0b29scy5jaGFpbiBpcyBpbiBhbiBleHRlbnNpb24gbW9kdWxlIGFuZCBtYXkgYmUgdW5hdmFpbGFibGUKLSAgICBmb3IgaXQgaW4gaXRzOgotICAgICAgICB5aWVsZCBmcm9tIGl0Ci0KLWRlZiBfZm9ybWF0X2V4Y2VwdGlvbl9pdGVyKGV0eXBlLCB2YWx1ZSwgdGIsIGxpbWl0LCBjaGFpbik6Ci0gICAgaWYgY2hhaW46Ci0gICAgICAgIHZhbHVlcyA9IF9pdGVyX2NoYWluKHZhbHVlLCB0YikKLSAgICBlbHNlOgotICAgICAgICB2YWx1ZXMgPSBbKHZhbHVlLCB0YildCi0KLSAgICBmb3IgdmFsdWUsIHRiIGluIHZhbHVlczoKLSAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgc3RyKToKLSAgICAgICAgICAgICMgVGhpcyBpcyBhIGNhdXNlL2NvbnRleHQgbWVzc2FnZSBsaW5lCi0gICAgICAgICAgICB5aWVsZCB2YWx1ZSArICdcbicKLSAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIGlmIHRiOgotICAgICAgICAgICAgeWllbGQgJ1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbicKLSAgICAgICAgICAgIHlpZWxkIGZyb20gX2Zvcm1hdF9saXN0X2l0ZXIoX2V4dHJhY3RfdGJfaXRlcih0YiwgbGltaXQ9bGltaXQpKQotICAgICAgICB5aWVsZCBmcm9tIF9mb3JtYXRfZXhjZXB0aW9uX29ubHlfaXRlcih0eXBlKHZhbHVlKSwgdmFsdWUpCiAKIGRlZiBwcmludF9leGNlcHRpb24oZXR5cGUsIHZhbHVlLCB0YiwgbGltaXQ9Tm9uZSwgZmlsZT1Ob25lLCBjaGFpbj1UcnVlKToKICAgICAiIiJQcmludCBleGNlcHRpb24gdXAgdG8gJ2xpbWl0JyBzdGFjayB0cmFjZSBlbnRyaWVzIGZyb20gJ3RiJyB0byAnZmlsZScuCkBAIC0xNjQsMTEgKzg5LDE2IEBACiAgICAgb2NjdXJyZWQgd2l0aCBhIGNhcmV0IG9uIHRoZSBuZXh0IGxpbmUgaW5kaWNhdGluZyB0aGUgYXBwcm94aW1hdGUKICAgICBwb3NpdGlvbiBvZiB0aGUgZXJyb3IuCiAgICAgIiIiCisgICAgIyBmb3JtYXRfZXhjZXB0aW9uIGhhcyBpZ25vcmVkIGV0eXBlIGZvciBzb21lIHRpbWUsIGFuZCBjb2RlIHN1Y2ggYXMgY2dpdGIKKyAgICAjIHBhc3NlcyBpbiBib2d1cyB2YWx1ZXMgYXMgYSByZXN1bHQuIEZvciBjb21wYXRpYmlsaXR5IHdpdGggc3VjaCBjb2RlIHdlCisgICAgIyBpZ25vcmUgaXQgaGVyZSAocmF0aGVyIHRoYW4gaW4gdGhlIG5ldyBUcmFjZWJhY2tFeGNlcHRpb24gQVBJKS4KICAgICBpZiBmaWxlIGlzIE5vbmU6CiAgICAgICAgIGZpbGUgPSBzeXMuc3RkZXJyCi0gICAgZm9yIGxpbmUgaW4gX2Zvcm1hdF9leGNlcHRpb25faXRlcihldHlwZSwgdmFsdWUsIHRiLCBsaW1pdCwgY2hhaW4pOgorICAgIGZvciBsaW5lIGluIFRyYWNlYmFja0V4Y2VwdGlvbigKKyAgICAgICAgICAgIHR5cGUodmFsdWUpLCB2YWx1ZSwgdGIsIGxpbWl0PWxpbWl0KS5mb3JtYXQoY2hhaW49Y2hhaW4pOgogICAgICAgICBwcmludChsaW5lLCBmaWxlPWZpbGUsIGVuZD0iIikKIAorCiBkZWYgZm9ybWF0X2V4Y2VwdGlvbihldHlwZSwgdmFsdWUsIHRiLCBsaW1pdD1Ob25lLCBjaGFpbj1UcnVlKToKICAgICAiIiJGb3JtYXQgYSBzdGFjayB0cmFjZSBhbmQgdGhlIGV4Y2VwdGlvbiBpbmZvcm1hdGlvbi4KIApAQCAtMTc4LDcgKzEwOCwxMiBAQAogICAgIHRoZXNlIGxpbmVzIGFyZSBjb25jYXRlbmF0ZWQgYW5kIHByaW50ZWQsIGV4YWN0bHkgdGhlIHNhbWUgdGV4dCBpcwogICAgIHByaW50ZWQgYXMgZG9lcyBwcmludF9leGNlcHRpb24oKS4KICAgICAiIiIKLSAgICByZXR1cm4gbGlzdChfZm9ybWF0X2V4Y2VwdGlvbl9pdGVyKGV0eXBlLCB2YWx1ZSwgdGIsIGxpbWl0LCBjaGFpbikpCisgICAgIyBmb3JtYXRfZXhjZXB0aW9uIGhhcyBpZ25vcmVkIGV0eXBlIGZvciBzb21lIHRpbWUsIGFuZCBjb2RlIHN1Y2ggYXMgY2dpdGIKKyAgICAjIHBhc3NlcyBpbiBib2d1cyB2YWx1ZXMgYXMgYSByZXN1bHQuIEZvciBjb21wYXRpYmlsaXR5IHdpdGggc3VjaCBjb2RlIHdlCisgICAgIyBpZ25vcmUgaXQgaGVyZSAocmF0aGVyIHRoYW4gaW4gdGhlIG5ldyBUcmFjZWJhY2tFeGNlcHRpb24gQVBJKS4KKyAgICByZXR1cm4gbGlzdChUcmFjZWJhY2tFeGNlcHRpb24oCisgICAgICAgIHR5cGUodmFsdWUpLCB2YWx1ZSwgdGIsIGxpbWl0PWxpbWl0KS5mb3JtYXQoY2hhaW49Y2hhaW4pKQorCiAKIGRlZiBmb3JtYXRfZXhjZXB0aW9uX29ubHkoZXR5cGUsIHZhbHVlKToKICAgICAiIiJGb3JtYXQgdGhlIGV4Y2VwdGlvbiBwYXJ0IG9mIGEgdHJhY2ViYWNrLgpAQCAtMTk2LDQ2ICsxMzEsMTQgQEAKICAgICBzdHJpbmcgaW4gdGhlIGxpc3QuCiAKICAgICAiIiIKLSAgICByZXR1cm4gbGlzdChfZm9ybWF0X2V4Y2VwdGlvbl9vbmx5X2l0ZXIoZXR5cGUsIHZhbHVlKSkKKyAgICByZXR1cm4gbGlzdChUcmFjZWJhY2tFeGNlcHRpb24oZXR5cGUsIHZhbHVlLCBOb25lKS5mb3JtYXRfZXhjZXB0aW9uX29ubHkoKSkKIAotZGVmIF9mb3JtYXRfZXhjZXB0aW9uX29ubHlfaXRlcihldHlwZSwgdmFsdWUpOgotICAgICMgR3JhY2VmdWxseSBoYW5kbGUgKHRoZSB3YXkgUHl0aG9uIDIuNCBhbmQgZWFybGllciBkaWQpIHRoZSBjYXNlIG9mCi0gICAgIyBiZWluZyBjYWxsZWQgd2l0aCAoTm9uZSwgTm9uZSkuCi0gICAgaWYgZXR5cGUgaXMgTm9uZToKLSAgICAgICAgeWllbGQgX2Zvcm1hdF9maW5hbF9leGNfbGluZShldHlwZSwgdmFsdWUpCi0gICAgICAgIHJldHVybgogCi0gICAgc3R5cGUgPSBldHlwZS5fX3F1YWxuYW1lX18KLSAgICBzbW9kID0gZXR5cGUuX19tb2R1bGVfXwotICAgIGlmIHNtb2Qgbm90IGluICgiX19tYWluX18iLCAiYnVpbHRpbnMiKToKLSAgICAgICAgc3R5cGUgPSBzbW9kICsgJy4nICsgc3R5cGUKLQotICAgIGlmIG5vdCBpc3N1YmNsYXNzKGV0eXBlLCBTeW50YXhFcnJvcik6Ci0gICAgICAgIHlpZWxkIF9mb3JtYXRfZmluYWxfZXhjX2xpbmUoc3R5cGUsIHZhbHVlKQotICAgICAgICByZXR1cm4KLQotICAgICMgSXQgd2FzIGEgc3ludGF4IGVycm9yOyBzaG93IGV4YWN0bHkgd2hlcmUgdGhlIHByb2JsZW0gd2FzIGZvdW5kLgotICAgIGZpbGVuYW1lID0gdmFsdWUuZmlsZW5hbWUgb3IgIjxzdHJpbmc+IgotICAgIGxpbmVubyA9IHN0cih2YWx1ZS5saW5lbm8pIG9yICc/JwotICAgIHlpZWxkICcgIEZpbGUgInt9IiwgbGluZSB7fVxuJy5mb3JtYXQoZmlsZW5hbWUsIGxpbmVubykKLQotICAgIGJhZGxpbmUgPSB2YWx1ZS50ZXh0Ci0gICAgb2Zmc2V0ID0gdmFsdWUub2Zmc2V0Ci0gICAgaWYgYmFkbGluZSBpcyBub3QgTm9uZToKLSAgICAgICAgeWllbGQgJyAgICB7fVxuJy5mb3JtYXQoYmFkbGluZS5zdHJpcCgpKQotICAgICAgICBpZiBvZmZzZXQgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBjYXJldHNwYWNlID0gYmFkbGluZS5yc3RyaXAoJ1xuJykKLSAgICAgICAgICAgIG9mZnNldCA9IG1pbihsZW4oY2FyZXRzcGFjZSksIG9mZnNldCkgLSAxCi0gICAgICAgICAgICBjYXJldHNwYWNlID0gY2FyZXRzcGFjZVs6b2Zmc2V0XS5sc3RyaXAoKQotICAgICAgICAgICAgIyBub24tc3BhY2Ugd2hpdGVzcGFjZSAobGlrZXMgdGFicykgbXVzdCBiZSBrZXB0IGZvciBhbGlnbm1lbnQKLSAgICAgICAgICAgIGNhcmV0c3BhY2UgPSAoKGMuaXNzcGFjZSgpIGFuZCBjIG9yICcgJykgZm9yIGMgaW4gY2FyZXRzcGFjZSkKLSAgICAgICAgICAgIHlpZWxkICcgICAge31eXG4nLmZvcm1hdCgnJy5qb2luKGNhcmV0c3BhY2UpKQotICAgIG1zZyA9IHZhbHVlLm1zZyBvciAiPG5vIGRldGFpbCBhdmFpbGFibGU+IgotICAgIHlpZWxkICJ7fToge31cbiIuZm9ybWF0KHN0eXBlLCBtc2cpCisjIC0tIG5vdCBvZmZpY2FsIEFQSSBidXQgZm9sayBwcm9iYWJseSB1c2UgdGhlc2UgdHdvIGZ1bmN0aW9ucy4KIAogZGVmIF9mb3JtYXRfZmluYWxfZXhjX2xpbmUoZXR5cGUsIHZhbHVlKToKICAgICB2YWx1ZXN0ciA9IF9zb21lX3N0cih2YWx1ZSkKLSAgICBpZiB2YWx1ZSBpcyBOb25lIG9yIG5vdCB2YWx1ZXN0cjoKKyAgICBpZiB2YWx1ZSA9PSAnTm9uZScgb3IgdmFsdWUgaXMgTm9uZSBvciBub3QgdmFsdWVzdHI6CiAgICAgICAgIGxpbmUgPSAiJXNcbiIgJSBldHlwZQogICAgIGVsc2U6CiAgICAgICAgIGxpbmUgPSAiJXM6ICVzXG4iICUgKGV0eXBlLCB2YWx1ZXN0cikKQEAgLTI0Nyw2ICsxNTAsOCBAQAogICAgIGV4Y2VwdDoKICAgICAgICAgcmV0dXJuICc8dW5wcmludGFibGUgJXMgb2JqZWN0PicgJSB0eXBlKHZhbHVlKS5fX25hbWVfXwogCisjIC0tCisKIGRlZiBwcmludF9leGMobGltaXQ9Tm9uZSwgZmlsZT1Ob25lLCBjaGFpbj1UcnVlKToKICAgICAiIiJTaG9ydGhhbmQgZm9yICdwcmludF9leGNlcHRpb24oKnN5cy5leGNfaW5mbygpLCBsaW1pdCwgZmlsZSknLiIiIgogICAgIHByaW50X2V4Y2VwdGlvbigqc3lzLmV4Y19pbmZvKCksIGxpbWl0PWxpbWl0LCBmaWxlPWZpbGUsIGNoYWluPWNoYWluKQpAQCAtMjY3LDE1ICsxNzIsNiBAQAogIyBQcmludGluZyBhbmQgRXh0cmFjdGluZyBTdGFja3MuCiAjCiAKLWRlZiBfZXh0cmFjdF9zdGFja19pdGVyKGYsIGxpbWl0PU5vbmUpOgotICAgIHJldHVybiBfZXh0cmFjdF90Yl9vcl9zdGFja19pdGVyKAotICAgICAgICAgICAgICAgIGYsIGxpbWl0LCBsYW1iZGEgZjogKGYsIGYuZl9saW5lbm8sIGYuZl9iYWNrKSkKLQotZGVmIF9nZXRfc3RhY2soZik6Ci0gICAgaWYgZiBpcyBOb25lOgotICAgICAgICBmID0gc3lzLl9nZXRmcmFtZSgpLmZfYmFjay5mX2JhY2sKLSAgICByZXR1cm4gZgotCiBkZWYgcHJpbnRfc3RhY2soZj1Ob25lLCBsaW1pdD1Ob25lLCBmaWxlPU5vbmUpOgogICAgICIiIlByaW50IGEgc3RhY2sgdHJhY2UgZnJvbSBpdHMgaW52b2NhdGlvbiBwb2ludC4KIApAQCAtMjgzLDExICsxNzksMTMgQEAKICAgICBzdGFjayBmcmFtZSBhdCB3aGljaCB0byBzdGFydC4gVGhlIG9wdGlvbmFsICdsaW1pdCcgYW5kICdmaWxlJwogICAgIGFyZ3VtZW50cyBoYXZlIHRoZSBzYW1lIG1lYW5pbmcgYXMgZm9yIHByaW50X2V4Y2VwdGlvbigpLgogICAgICIiIgotICAgIHByaW50X2xpc3QoZXh0cmFjdF9zdGFjayhfZ2V0X3N0YWNrKGYpLCBsaW1pdD1saW1pdCksIGZpbGU9ZmlsZSkKKyAgICBwcmludF9saXN0KGV4dHJhY3Rfc3RhY2soZiwgbGltaXQ9bGltaXQpLCBmaWxlPWZpbGUpCisKIAogZGVmIGZvcm1hdF9zdGFjayhmPU5vbmUsIGxpbWl0PU5vbmUpOgogICAgICIiIlNob3J0aGFuZCBmb3IgJ2Zvcm1hdF9saXN0KGV4dHJhY3Rfc3RhY2soZiwgbGltaXQpKScuIiIiCi0gICAgcmV0dXJuIGZvcm1hdF9saXN0KGV4dHJhY3Rfc3RhY2soX2dldF9zdGFjayhmKSwgbGltaXQ9bGltaXQpKQorICAgIHJldHVybiBmb3JtYXRfbGlzdChleHRyYWN0X3N0YWNrKGYsIGxpbWl0PWxpbWl0KSkKKwogCiBkZWYgZXh0cmFjdF9zdGFjayhmPU5vbmUsIGxpbWl0PU5vbmUpOgogICAgICIiIkV4dHJhY3QgdGhlIHJhdyB0cmFjZWJhY2sgZnJvbSB0aGUgY3VycmVudCBzdGFjayBmcmFtZS4KQEAgLTI5OCwxMCArMTk2LDExIEBACiAgICAgbGluZSBudW1iZXIsIGZ1bmN0aW9uIG5hbWUsIHRleHQpLCBhbmQgdGhlIGVudHJpZXMgYXJlIGluIG9yZGVyCiAgICAgZnJvbSBvbGRlc3QgdG8gbmV3ZXN0IHN0YWNrIGZyYW1lLgogICAgICIiIgotICAgIHN0YWNrID0gbGlzdChfZXh0cmFjdF9zdGFja19pdGVyKF9nZXRfc3RhY2soZiksIGxpbWl0PWxpbWl0KSkKKyAgICBzdGFjayA9IFN0YWNrU3VtbWFyeS5leHRyYWN0KHdhbGtfc3RhY2soZiksIGxpbWl0PWxpbWl0KQogICAgIHN0YWNrLnJldmVyc2UoKQogICAgIHJldHVybiBzdGFjawogCisKIGRlZiBjbGVhcl9mcmFtZXModGIpOgogICAgICJDbGVhciBhbGwgcmVmZXJlbmNlcyB0byBsb2NhbCB2YXJpYWJsZXMgaW4gdGhlIGZyYW1lcyBvZiBhIHRyYWNlYmFjay4iCiAgICAgd2hpbGUgdGIgaXMgbm90IE5vbmU6CkBAIC0zMTEsMyArMjEwLDM0NCBAQAogICAgICAgICAgICAgIyBJZ25vcmUgdGhlIGV4Y2VwdGlvbiByYWlzZWQgaWYgdGhlIGZyYW1lIGlzIHN0aWxsIGV4ZWN1dGluZy4KICAgICAgICAgICAgIHBhc3MKICAgICAgICAgdGIgPSB0Yi50Yl9uZXh0CisKKworY2xhc3MgRnJhbWVTdW1tYXJ5OgorICAgICIiIkEgc2luZ2xlIGZyYW1lIGZyb20gYSB0cmFjZWJhY2suCisKKyAgICAtIDphdHRyOmBmaWxlbmFtZWAgVGhlIGZpbGVuYW1lIGZvciB0aGUgZnJhbWUuCisgICAgLSA6YXR0cjpgbGluZW5vYCBUaGUgbGluZSB3aXRoaW4gZmlsZW5hbWUgZm9yIHRoZSBmcmFtZSB0aGF0IHdhcworICAgICAgYWN0aXZlIHdoZW4gdGhlIGZyYW1lIHdhcyBjYXB0dXJlZC4KKyAgICAtIDphdHRyOmBuYW1lYCBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gb3IgbWV0aG9kIHRoYXQgd2FzIGV4ZWN1dGluZworICAgICAgd2hlbiB0aGUgZnJhbWUgd2FzIGNhcHR1cmVkLgorICAgIC0gOmF0dHI6YGxpbmVgIFRoZSB0ZXh0IGZyb20gdGhlIGxpbmVjYWNoZSBtb2R1bGUgZm9yIHRoZQorICAgICAgb2YgY29kZSB0aGF0IHdhcyBydW5uaW5nIHdoZW4gdGhlIGZyYW1lIHdhcyBjYXB0dXJlZC4KKyAgICAtIDphdHRyOmBsb2NhbHNgIEVpdGhlciBOb25lIGlmIGxvY2FscyB3ZXJlIG5vdCBzdXBwbGllZCwgb3IgYSBkaWN0CisgICAgICBtYXBwaW5nIHRoZSBuYW1lIHRvIHRoZSByZXByKCkgb2YgdGhlIHZhcmlhYmxlLgorICAgICIiIgorCisgICAgX19zbG90c19fID0gKCdmaWxlbmFtZScsICdsaW5lbm8nLCAnbmFtZScsICdfbGluZScsICdsb2NhbHMnKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVuYW1lLCBsaW5lbm8sIG5hbWUsICosIGxvb2t1cF9saW5lPVRydWUsCisgICAgICAgICAgICBsb2NhbHM9Tm9uZSwgbGluZT1Ob25lKToKKyAgICAgICAgIiIiQ29uc3RydWN0IGEgRnJhbWVTdW1tYXJ5LgorCisgICAgICAgIDpwYXJhbSBsb29rdXBfbGluZTogSWYgVHJ1ZSwgYGxpbmVjYWNoZWAgaXMgY29uc3VsdGVkIGZvciB0aGUgc291cmNlCisgICAgICAgICAgICBjb2RlIGxpbmUuIE90aGVyd2lzZSwgdGhlIGxpbmUgd2lsbCBiZSBsb29rZWQgdXAgd2hlbiBmaXJzdCBuZWVkZWQuCisgICAgICAgIDpwYXJhbSBsb2NhbHM6IElmIHN1cHBsaWVkIHRoZSBmcmFtZSBsb2NhbHMsIHdoaWNoIHdpbGwgYmUgY2FwdHVyZWQgYXMKKyAgICAgICAgICAgIG9iamVjdCByZXByZXNlbnRhdGlvbnMuCisgICAgICAgIDpwYXJhbSBsaW5lOiBJZiBwcm92aWRlZCwgdXNlIHRoaXMgaW5zdGVhZCBvZiBsb29raW5nIHVwIHRoZSBsaW5lIGluCisgICAgICAgICAgICB0aGUgbGluZWNhY2hlLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5maWxlbmFtZSA9IGZpbGVuYW1lCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgc2VsZi5fbGluZSA9IGxpbmUKKyAgICAgICAgaWYgbG9va3VwX2xpbmU6CisgICAgICAgICAgICBzZWxmLmxpbmUKKyAgICAgICAgc2VsZi5sb2NhbHMgPSBcCisgICAgICAgICAgICBkaWN0KChrLCByZXByKHYpKSBmb3IgaywgdiBpbiBsb2NhbHMuaXRlbXMoKSkgaWYgbG9jYWxzIGVsc2UgTm9uZQorCisgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiAoc2VsZi5maWxlbmFtZSA9PSBvdGhlci5maWxlbmFtZSBhbmQKKyAgICAgICAgICAgICAgICBzZWxmLmxpbmVubyA9PSBvdGhlci5saW5lbm8gYW5kCisgICAgICAgICAgICAgICAgc2VsZi5uYW1lID09IG90aGVyLm5hbWUgYW5kCisgICAgICAgICAgICAgICAgc2VsZi5sb2NhbHMgPT0gb3RoZXIubG9jYWxzKQorCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIHBvcyk6CisgICAgICAgIHJldHVybiAoc2VsZi5maWxlbmFtZSwgc2VsZi5saW5lbm8sIHNlbGYubmFtZSwgc2VsZi5saW5lKVtwb3NdCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBpdGVyKFtzZWxmLmZpbGVuYW1lLCBzZWxmLmxpbmVubywgc2VsZi5uYW1lLCBzZWxmLmxpbmVdKQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIjxGcmFtZVN1bW1hcnkgZmlsZSB7ZmlsZW5hbWV9LCBsaW5lIHtsaW5lbm99IGluIHtuYW1lfT4iLmZvcm1hdCgKKyAgICAgICAgICAgIGZpbGVuYW1lPXNlbGYuZmlsZW5hbWUsIGxpbmVubz1zZWxmLmxpbmVubywgbmFtZT1zZWxmLm5hbWUpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgbGluZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fbGluZSBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5fbGluZSA9IGxpbmVjYWNoZS5nZXRsaW5lKHNlbGYuZmlsZW5hbWUsIHNlbGYubGluZW5vKS5zdHJpcCgpCisgICAgICAgIHJldHVybiBzZWxmLl9saW5lCisKKworZGVmIHdhbGtfc3RhY2soZik6CisgICAgIiIiV2FsayBhIHN0YWNrIHlpZWxkaW5nIHRoZSBmcmFtZSBhbmQgbGluZSBudW1iZXIgZm9yIGVhY2ggZnJhbWUuCisKKyAgICBUaGlzIHdpbGwgZm9sbG93IGYuZl9iYWNrIGZyb20gdGhlIGdpdmVuIGZyYW1lLiBJZiBubyBmcmFtZSBpcyBnaXZlbiwgdGhlCisgICAgY3VycmVudCBzdGFjayBpcyB1c2VkLiBVc3VhbGx5IHVzZWQgd2l0aCBTdGFja1N1bW1hcnkuZXh0cmFjdC4KKyAgICAiIiIKKyAgICBpZiBmIGlzIE5vbmU6CisgICAgICAgIGYgPSBzeXMuX2dldGZyYW1lKCkuZl9iYWNrLmZfYmFjaworICAgIHdoaWxlIGYgaXMgbm90IE5vbmU6CisgICAgICAgIHlpZWxkIGYsIGYuZl9saW5lbm8KKyAgICAgICAgZiA9IGYuZl9iYWNrCisKKworZGVmIHdhbGtfdGIodGIpOgorICAgICIiIldhbGsgYSB0cmFjZWJhY2sgeWllbGRpbmcgdGhlIGZyYW1lIGFuZCBsaW5lIG51bWJlciBmb3IgZWFjaCBmcmFtZS4KKworICAgIFRoaXMgd2lsbCBmb2xsb3cgdGIudGJfbmV4dCAoYW5kIHRodXMgaXMgaW4gdGhlIG9wcG9zaXRlIG9yZGVyIHRvCisgICAgd2Fsa19zdGFjaykuIFVzdWFsbHkgdXNlZCB3aXRoIFN0YWNrU3VtbWFyeS5leHRyYWN0LgorICAgICIiIgorICAgIHdoaWxlIHRiIGlzIG5vdCBOb25lOgorICAgICAgICB5aWVsZCB0Yi50Yl9mcmFtZSwgdGIudGJfbGluZW5vCisgICAgICAgIHRiID0gdGIudGJfbmV4dAorCisKK2NsYXNzIFN0YWNrU3VtbWFyeShsaXN0KToKKyAgICAiIiJBIHN0YWNrIG9mIGZyYW1lcy4iIiIKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBleHRyYWN0KGtsYXNzLCBmcmFtZV9nZW4sICosIGxpbWl0PU5vbmUsIGxvb2t1cF9saW5lcz1UcnVlLAorICAgICAgICAgICAgY2FwdHVyZV9sb2NhbHM9RmFsc2UpOgorICAgICAgICAiIiJDcmVhdGUgYSBTdGFja1N1bW1hcnkgZnJvbSBhIHRyYWNlYmFjayBvciBzdGFjayBvYmplY3QuCisKKyAgICAgICAgOnBhcmFtIGZyYW1lX2dlbjogQSBnZW5lcmF0b3IgdGhhdCB5aWVsZHMgKGZyYW1lLCBsaW5lbm8pIHR1cGxlcyB0bworICAgICAgICAgICAgaW5jbHVkZSBpbiB0aGUgc3RhY2suCisgICAgICAgIDpwYXJhbSBsaW1pdDogTm9uZSB0byBpbmNsdWRlIGFsbCBmcmFtZXMgb3IgdGhlIG51bWJlciBvZiBmcmFtZXMgdG8KKyAgICAgICAgICAgIGluY2x1ZGUuCisgICAgICAgIDpwYXJhbSBsb29rdXBfbGluZXM6IElmIFRydWUsIGxvb2t1cCBsaW5lcyBmb3IgZWFjaCBmcmFtZSBpbW1lZGlhdGVseSwKKyAgICAgICAgICAgIG90aGVyd2lzZSBsb29rdXAgaXMgZGVmZXJyZWQgdW50aWwgdGhlIGZyYW1lIGlzIHJlbmRlcmVkLgorICAgICAgICA6cGFyYW0gY2FwdHVyZV9sb2NhbHM6IElmIFRydWUsIHRoZSBsb2NhbCB2YXJpYWJsZXMgZnJvbSBlYWNoIGZyYW1lIHdpbGwKKyAgICAgICAgICAgIGJlIGNhcHR1cmVkIGFzIG9iamVjdCByZXByZXNlbnRhdGlvbnMgaW50byB0aGUgRnJhbWVTdW1tYXJ5LgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbGltaXQgaXMgTm9uZToKKyAgICAgICAgICAgIGxpbWl0ID0gZ2V0YXR0cihzeXMsICd0cmFjZWJhY2tsaW1pdCcsIE5vbmUpCisKKyAgICAgICAgcmVzdWx0ID0ga2xhc3MoKQorICAgICAgICBmbmFtZXMgPSBzZXQoKQorICAgICAgICBmb3IgcG9zLCAoZiwgbGluZW5vKSBpbiBlbnVtZXJhdGUoZnJhbWVfZ2VuKToKKyAgICAgICAgICAgIGlmIGxpbWl0IGlzIG5vdCBOb25lIGFuZCBwb3MgPj0gbGltaXQ6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGNvID0gZi5mX2NvZGUKKyAgICAgICAgICAgIGZpbGVuYW1lID0gY28uY29fZmlsZW5hbWUKKyAgICAgICAgICAgIG5hbWUgPSBjby5jb19uYW1lCisKKyAgICAgICAgICAgIGZuYW1lcy5hZGQoZmlsZW5hbWUpCisgICAgICAgICAgICBsaW5lY2FjaGUubGF6eWNhY2hlKGZpbGVuYW1lLCBmLmZfZ2xvYmFscykKKyAgICAgICAgICAgICMgTXVzdCBkZWZlciBsaW5lIGxvb2t1cHMgdW50aWwgd2UgaGF2ZSBjYWxsZWQgY2hlY2tjYWNoZS4KKyAgICAgICAgICAgIGlmIGNhcHR1cmVfbG9jYWxzOgorICAgICAgICAgICAgICAgIGZfbG9jYWxzID0gZi5mX2xvY2FscworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmX2xvY2FscyA9IE5vbmUKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoRnJhbWVTdW1tYXJ5KAorICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBsaW5lbm8sIG5hbWUsIGxvb2t1cF9saW5lPUZhbHNlLCBsb2NhbHM9Zl9sb2NhbHMpKQorICAgICAgICBmb3IgZmlsZW5hbWUgaW4gZm5hbWVzOgorICAgICAgICAgICAgbGluZWNhY2hlLmNoZWNrY2FjaGUoZmlsZW5hbWUpCisgICAgICAgICMgSWYgaW1tZWRpYXRlIGxvb2t1cCB3YXMgZGVzaXJlZCwgdHJpZ2dlciBsb29rdXBzIG5vdy4KKyAgICAgICAgaWYgbG9va3VwX2xpbmVzOgorICAgICAgICAgICAgZm9yIGYgaW4gcmVzdWx0OgorICAgICAgICAgICAgICAgIGYubGluZQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZnJvbV9saXN0KGtsYXNzLCBhX2xpc3QpOgorICAgICAgICAiIiJDcmVhdGUgYSBTdGFja1N1bW1hcnkgZnJvbSBhIHNpbXBsZSBsaXN0IG9mIHR1cGxlcy4KKworICAgICAgICBUaGlzIG1ldGhvZCBzdXBwb3J0cyB0aGUgb2xkZXIgUHl0aG9uIEFQSS4gRWFjaCB0dXBsZSBzaG91bGQgYmUgYQorICAgICAgICA0LXR1cGxlIHdpdGggKGZpbGVuYW1lLCBsaW5lbm8sIG5hbWUsIGxpbmUpIGVsZW1lbnRzLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgaXNpbnN0YW5jZShhX2xpc3QsIFN0YWNrU3VtbWFyeSk6CisgICAgICAgICAgICByZXR1cm4gU3RhY2tTdW1tYXJ5KGFfbGlzdCkKKyAgICAgICAgcmVzdWx0ID0gU3RhY2tTdW1tYXJ5KCkKKyAgICAgICAgZm9yIGZpbGVuYW1lLCBsaW5lbm8sIG5hbWUsIGxpbmUgaW4gYV9saXN0OgorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChGcmFtZVN1bW1hcnkoZmlsZW5hbWUsIGxpbmVubywgbmFtZSwgbGluZT1saW5lKSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIGZvcm1hdChzZWxmKToKKyAgICAgICAgIiIiRm9ybWF0IHRoZSBzdGFjayByZWFkeSBmb3IgcHJpbnRpbmcuCisKKyAgICAgICAgUmV0dXJucyBhIGxpc3Qgb2Ygc3RyaW5ncyByZWFkeSBmb3IgcHJpbnRpbmcuICBFYWNoIHN0cmluZyBpbiB0aGUKKyAgICAgICAgcmVzdWx0aW5nIGxpc3QgY29ycmVzcG9uZHMgdG8gYSBzaW5nbGUgZnJhbWUgZnJvbSB0aGUgc3RhY2suCisgICAgICAgIEVhY2ggc3RyaW5nIGVuZHMgaW4gYSBuZXdsaW5lOyB0aGUgc3RyaW5ncyBtYXkgY29udGFpbiBpbnRlcm5hbAorICAgICAgICBuZXdsaW5lcyBhcyB3ZWxsLCBmb3IgdGhvc2UgaXRlbXMgd2l0aCBzb3VyY2UgdGV4dCBsaW5lcy4KKyAgICAgICAgIiIiCisgICAgICAgIHJlc3VsdCA9IFtdCisgICAgICAgIGZvciBmcmFtZSBpbiBzZWxmOgorICAgICAgICAgICAgcm93ID0gW10KKyAgICAgICAgICAgIHJvdy5hcHBlbmQoJyAgRmlsZSAie30iLCBsaW5lIHt9LCBpbiB7fVxuJy5mb3JtYXQoCisgICAgICAgICAgICAgICAgZnJhbWUuZmlsZW5hbWUsIGZyYW1lLmxpbmVubywgZnJhbWUubmFtZSkpCisgICAgICAgICAgICBpZiBmcmFtZS5saW5lOgorICAgICAgICAgICAgICAgIHJvdy5hcHBlbmQoJyAgICB7fVxuJy5mb3JtYXQoZnJhbWUubGluZS5zdHJpcCgpKSkKKyAgICAgICAgICAgIGlmIGZyYW1lLmxvY2FsczoKKyAgICAgICAgICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gc29ydGVkKGZyYW1lLmxvY2Fscy5pdGVtcygpKToKKyAgICAgICAgICAgICAgICAgICAgcm93LmFwcGVuZCgnICAgIHtuYW1lfSA9IHt2YWx1ZX1cbicuZm9ybWF0KG5hbWU9bmFtZSwgdmFsdWU9dmFsdWUpKQorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnJy5qb2luKHJvdykpCisgICAgICAgIHJldHVybiByZXN1bHQKKworCitjbGFzcyBUcmFjZWJhY2tFeGNlcHRpb246CisgICAgIiIiQW4gZXhjZXB0aW9uIHJlYWR5IGZvciByZW5kZXJpbmcuCisKKyAgICBUaGUgdHJhY2ViYWNrIG1vZHVsZSBjYXB0dXJlcyBlbm91Z2ggYXR0cmlidXRlcyBmcm9tIHRoZSBvcmlnaW5hbCBleGNlcHRpb24KKyAgICB0byB0aGlzIGludGVybWVkaWFyeSBmb3JtIHRvIGVuc3VyZSB0aGF0IG5vIHJlZmVyZW5jZXMgYXJlIGhlbGQsIHdoaWxlCisgICAgc3RpbGwgYmVpbmcgYWJsZSB0byBmdWxseSBwcmludCBvciBmb3JtYXQgaXQuCisKKyAgICBVc2UgYGZyb21fZXhjZXB0aW9uYCB0byBjcmVhdGUgVHJhY2ViYWNrRXhjZXB0aW9uIGluc3RhbmNlcyBmcm9tIGV4Y2VwdGlvbgorICAgIG9iamVjdHMsIG9yIHRoZSBjb25zdHJ1Y3RvciB0byBjcmVhdGUgVHJhY2ViYWNrRXhjZXB0aW9uIGluc3RhbmNlcyBmcm9tCisgICAgaW5kaXZpZHVhbCBjb21wb25lbnRzLgorCisgICAgLSA6YXR0cjpgX19jYXVzZV9fYCBBIFRyYWNlYmFja0V4Y2VwdGlvbiBvZiB0aGUgb3JpZ2luYWwgKl9fY2F1c2VfXyouCisgICAgLSA6YXR0cjpgX19jb250ZXh0X19gIEEgVHJhY2ViYWNrRXhjZXB0aW9uIG9mIHRoZSBvcmlnaW5hbCAqX19jb250ZXh0X18qLgorICAgIC0gOmF0dHI6YF9fc3VwcHJlc3NfY29udGV4dF9fYCBUaGUgKl9fc3VwcHJlc3NfY29udGV4dF9fKiB2YWx1ZSBmcm9tIHRoZQorICAgICAgb3JpZ2luYWwgZXhjZXB0aW9uLgorICAgIC0gOmF0dHI6YHN0YWNrYCBBIGBTdGFja1N1bW1hcnlgIHJlcHJlc2VudGluZyB0aGUgdHJhY2ViYWNrLgorICAgIC0gOmF0dHI6YGV4Y190eXBlYCBUaGUgY2xhc3Mgb2YgdGhlIG9yaWdpbmFsIHRyYWNlYmFjay4KKyAgICAtIDphdHRyOmBmaWxlbmFtZWAgRm9yIHN5bnRheCBlcnJvcnMgLSB0aGUgZmlsZW5hbWUgd2hlcmUgdGhlIGVycm9yCisgICAgICBvY2N1cmVkLgorICAgIC0gOmF0dHI6YGxpbmVub2AgRm9yIHN5bnRheCBlcnJvcnMgLSB0aGUgbGluZW51bWJlciB3aGVyZSB0aGUgZXJyb3IKKyAgICAgIG9jY3VyZWQuCisgICAgLSA6YXR0cjpgdGV4dGAgRm9yIHN5bnRheCBlcnJvcnMgLSB0aGUgdGV4dCB3aGVyZSB0aGUgZXJyb3IKKyAgICAgIG9jY3VyZWQuCisgICAgLSA6YXR0cjpgb2Zmc2V0YCBGb3Igc3ludGF4IGVycm9ycyAtIHRoZSBvZmZzZXQgaW50byB0aGUgdGV4dCB3aGVyZSB0aGUKKyAgICAgIGVycm9yIG9jY3VyZWQuCisgICAgLSA6YXR0cjpgbXNnYCBGb3Igc3ludGF4IGVycm9ycyAtIHRoZSBjb21waWxlciBlcnJvciBtZXNzYWdlLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsdWUsIGV4Y190cmFjZWJhY2ssICosIGxpbWl0PU5vbmUsCisgICAgICAgICAgICBsb29rdXBfbGluZXM9VHJ1ZSwgY2FwdHVyZV9sb2NhbHM9RmFsc2UsIF9zZWVuPU5vbmUpOgorICAgICAgICAjIE5COiB3ZSBuZWVkIHRvIGFjY2VwdCBleGNfdHJhY2ViYWNrLCBleGNfdmFsdWUsIGV4Y190cmFjZWJhY2sgdG8KKyAgICAgICAgIyBwZXJtaXQgYmFja3dhcmRzIGNvbXBhdCB3aXRoIHRoZSBleGlzdGluZyBBUEksIG90aGVyd2lzZSB3ZQorICAgICAgICAjIG5lZWQgc3R1YiB0aHVuayBvYmplY3RzIGp1c3QgdG8gZ2x1ZSBpdCB0b2dldGhlci4KKyAgICAgICAgIyBIYW5kbGUgbG9vcHMgaW4gX19jYXVzZV9fIG9yIF9fY29udGV4dF9fLgorICAgICAgICBpZiBfc2VlbiBpcyBOb25lOgorICAgICAgICAgICAgX3NlZW4gPSBzZXQoKQorICAgICAgICBfc2Vlbi5hZGQoZXhjX3ZhbHVlKQorICAgICAgICAjIEdyYWNlZnVsbHkgaGFuZGxlICh0aGUgd2F5IFB5dGhvbiAyLjQgYW5kIGVhcmxpZXIgZGlkKSB0aGUgY2FzZSBvZgorICAgICAgICAjIGJlaW5nIGNhbGxlZCB3aXRoIG5vIHR5cGUgb3IgdmFsdWUgKE5vbmUsIE5vbmUsIE5vbmUpLgorICAgICAgICBpZiAoZXhjX3ZhbHVlIGFuZCBleGNfdmFsdWUuX19jYXVzZV9fIGlzIG5vdCBOb25lCisgICAgICAgICAgICBhbmQgZXhjX3ZhbHVlLl9fY2F1c2VfXyBub3QgaW4gX3NlZW4pOgorICAgICAgICAgICAgY2F1c2UgPSBUcmFjZWJhY2tFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgdHlwZShleGNfdmFsdWUuX19jYXVzZV9fKSwKKyAgICAgICAgICAgICAgICBleGNfdmFsdWUuX19jYXVzZV9fLAorICAgICAgICAgICAgICAgIGV4Y192YWx1ZS5fX2NhdXNlX18uX190cmFjZWJhY2tfXywKKyAgICAgICAgICAgICAgICBsaW1pdD1saW1pdCwKKyAgICAgICAgICAgICAgICBsb29rdXBfbGluZXM9RmFsc2UsCisgICAgICAgICAgICAgICAgY2FwdHVyZV9sb2NhbHM9Y2FwdHVyZV9sb2NhbHMsCisgICAgICAgICAgICAgICAgX3NlZW49X3NlZW4pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjYXVzZSA9IE5vbmUKKyAgICAgICAgaWYgKGV4Y192YWx1ZSBhbmQgZXhjX3ZhbHVlLl9fY29udGV4dF9fIGlzIG5vdCBOb25lCisgICAgICAgICAgICBhbmQgZXhjX3ZhbHVlLl9fY29udGV4dF9fIG5vdCBpbiBfc2Vlbik6CisgICAgICAgICAgICBjb250ZXh0ID0gVHJhY2ViYWNrRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIHR5cGUoZXhjX3ZhbHVlLl9fY29udGV4dF9fKSwKKyAgICAgICAgICAgICAgICBleGNfdmFsdWUuX19jb250ZXh0X18sCisgICAgICAgICAgICAgICAgZXhjX3ZhbHVlLl9fY29udGV4dF9fLl9fdHJhY2ViYWNrX18sCisgICAgICAgICAgICAgICAgbGltaXQ9bGltaXQsCisgICAgICAgICAgICAgICAgbG9va3VwX2xpbmVzPUZhbHNlLAorICAgICAgICAgICAgICAgIGNhcHR1cmVfbG9jYWxzPWNhcHR1cmVfbG9jYWxzLAorICAgICAgICAgICAgICAgIF9zZWVuPV9zZWVuKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY29udGV4dCA9IE5vbmUKKyAgICAgICAgc2VsZi5fX2NhdXNlX18gPSBjYXVzZQorICAgICAgICBzZWxmLl9fY29udGV4dF9fID0gY29udGV4dAorICAgICAgICBzZWxmLl9fc3VwcHJlc3NfY29udGV4dF9fID0gXAorICAgICAgICAgICAgZXhjX3ZhbHVlLl9fc3VwcHJlc3NfY29udGV4dF9fIGlmIGV4Y192YWx1ZSBlbHNlIEZhbHNlCisgICAgICAgICMgVE9ETzogbG9jYWxzLgorICAgICAgICBzZWxmLnN0YWNrID0gU3RhY2tTdW1tYXJ5LmV4dHJhY3QoCisgICAgICAgICAgICB3YWxrX3RiKGV4Y190cmFjZWJhY2spLCBsaW1pdD1saW1pdCwgbG9va3VwX2xpbmVzPWxvb2t1cF9saW5lcywKKyAgICAgICAgICAgIGNhcHR1cmVfbG9jYWxzPWNhcHR1cmVfbG9jYWxzKQorICAgICAgICBzZWxmLmV4Y190eXBlID0gZXhjX3R5cGUKKyAgICAgICAgIyBDYXB0dXJlIG5vdyB0byBwZXJtaXQgZnJlZWluZyByZXNvdXJjZXM6IG9ubHkgY29tcGxpY2F0aW9uIGlzIGluIHRoZQorICAgICAgICAjIHVub2ZmaWNpYWwgQVBJIF9mb3JtYXRfZmluYWxfZXhjX2xpbmUKKyAgICAgICAgc2VsZi5fc3RyID0gX3NvbWVfc3RyKGV4Y192YWx1ZSkKKyAgICAgICAgaWYgZXhjX3R5cGUgYW5kIGlzc3ViY2xhc3MoZXhjX3R5cGUsIFN5bnRheEVycm9yKToKKyAgICAgICAgICAgICMgSGFuZGxlIFN5bnRheEVycm9yJ3Mgc3BlY2lhbGx5CisgICAgICAgICAgICBzZWxmLmZpbGVuYW1lID0gZXhjX3ZhbHVlLmZpbGVuYW1lCisgICAgICAgICAgICBzZWxmLmxpbmVubyA9IHN0cihleGNfdmFsdWUubGluZW5vKQorICAgICAgICAgICAgc2VsZi50ZXh0ID0gZXhjX3ZhbHVlLnRleHQKKyAgICAgICAgICAgIHNlbGYub2Zmc2V0ID0gZXhjX3ZhbHVlLm9mZnNldAorICAgICAgICAgICAgc2VsZi5tc2cgPSBleGNfdmFsdWUubXNnCisgICAgICAgIGlmIGxvb2t1cF9saW5lczoKKyAgICAgICAgICAgIHNlbGYuX2xvYWRfbGluZXMoKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGZyb21fZXhjZXB0aW9uKHNlbGYsIGV4YywgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgIiIiQ3JlYXRlIGEgVHJhY2ViYWNrRXhjZXB0aW9uIGZyb20gYW4gZXhjZXB0aW9uLiIiIgorICAgICAgICByZXR1cm4gVHJhY2ViYWNrRXhjZXB0aW9uKAorICAgICAgICAgICAgdHlwZShleGMpLCBleGMsIGV4Yy5fX3RyYWNlYmFja19fLCAqYXJncywgKiprd2FyZ3MpCisKKyAgICBkZWYgX2xvYWRfbGluZXMoc2VsZik6CisgICAgICAgICIiIlByaXZhdGUgQVBJLiBmb3JjZSBhbGwgbGluZXMgaW4gdGhlIHN0YWNrIHRvIGJlIGxvYWRlZC4iIiIKKyAgICAgICAgZm9yIGZyYW1lIGluIHNlbGYuc3RhY2s6CisgICAgICAgICAgICBmcmFtZS5saW5lCisgICAgICAgIGlmIHNlbGYuX19jb250ZXh0X186CisgICAgICAgICAgICBzZWxmLl9fY29udGV4dF9fLl9sb2FkX2xpbmVzKCkKKyAgICAgICAgaWYgc2VsZi5fX2NhdXNlX186CisgICAgICAgICAgICBzZWxmLl9fY2F1c2VfXy5fbG9hZF9saW5lcygpCisKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX19kaWN0X18gPT0gb3RoZXIuX19kaWN0X18KKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fc3RyCisKKyAgICBkZWYgZm9ybWF0X2V4Y2VwdGlvbl9vbmx5KHNlbGYpOgorICAgICAgICAiIiJGb3JtYXQgdGhlIGV4Y2VwdGlvbiBwYXJ0IG9mIHRoZSB0cmFjZWJhY2suCisKKyAgICAgICAgVGhlIHJldHVybiB2YWx1ZSBpcyBhIGdlbmVyYXRvciBvZiBzdHJpbmdzLCBlYWNoIGVuZGluZyBpbiBhIG5ld2xpbmUuCisKKyAgICAgICAgTm9ybWFsbHksIHRoZSBnZW5lcmF0b3IgZW1pdHMgYSBzaW5nbGUgc3RyaW5nOyBob3dldmVyLCBmb3IKKyAgICAgICAgU3ludGF4RXJyb3IgZXhjZXB0aW9ucywgaXQgZW1pdGVzIHNldmVyYWwgbGluZXMgdGhhdCAod2hlbgorICAgICAgICBwcmludGVkKSBkaXNwbGF5IGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHdoZXJlIHRoZSBzeW50YXgKKyAgICAgICAgZXJyb3Igb2NjdXJyZWQuCisKKyAgICAgICAgVGhlIG1lc3NhZ2UgaW5kaWNhdGluZyB3aGljaCBleGNlcHRpb24gb2NjdXJyZWQgaXMgYWx3YXlzIHRoZSBsYXN0CisgICAgICAgIHN0cmluZyBpbiB0aGUgb3V0cHV0LgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5leGNfdHlwZSBpcyBOb25lOgorICAgICAgICAgICAgeWllbGQgX2Zvcm1hdF9maW5hbF9leGNfbGluZShOb25lLCBzZWxmLl9zdHIpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzdHlwZSA9IHNlbGYuZXhjX3R5cGUuX19xdWFsbmFtZV9fCisgICAgICAgIHNtb2QgPSBzZWxmLmV4Y190eXBlLl9fbW9kdWxlX18KKyAgICAgICAgaWYgc21vZCBub3QgaW4gKCJfX21haW5fXyIsICJidWlsdGlucyIpOgorICAgICAgICAgICAgc3R5cGUgPSBzbW9kICsgJy4nICsgc3R5cGUKKworICAgICAgICBpZiBub3QgaXNzdWJjbGFzcyhzZWxmLmV4Y190eXBlLCBTeW50YXhFcnJvcik6CisgICAgICAgICAgICB5aWVsZCBfZm9ybWF0X2ZpbmFsX2V4Y19saW5lKHN0eXBlLCBzZWxmLl9zdHIpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIEl0IHdhcyBhIHN5bnRheCBlcnJvcjsgc2hvdyBleGFjdGx5IHdoZXJlIHRoZSBwcm9ibGVtIHdhcyBmb3VuZC4KKyAgICAgICAgZmlsZW5hbWUgPSBzZWxmLmZpbGVuYW1lIG9yICI8c3RyaW5nPiIKKyAgICAgICAgbGluZW5vID0gc3RyKHNlbGYubGluZW5vKSBvciAnPycKKyAgICAgICAgeWllbGQgJyAgRmlsZSAie30iLCBsaW5lIHt9XG4nLmZvcm1hdChmaWxlbmFtZSwgbGluZW5vKQorCisgICAgICAgIGJhZGxpbmUgPSBzZWxmLnRleHQKKyAgICAgICAgb2Zmc2V0ID0gc2VsZi5vZmZzZXQKKyAgICAgICAgaWYgYmFkbGluZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHlpZWxkICcgICAge31cbicuZm9ybWF0KGJhZGxpbmUuc3RyaXAoKSkKKyAgICAgICAgICAgIGlmIG9mZnNldCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBjYXJldHNwYWNlID0gYmFkbGluZS5yc3RyaXAoJ1xuJykKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSBtaW4obGVuKGNhcmV0c3BhY2UpLCBvZmZzZXQpIC0gMQorICAgICAgICAgICAgICAgIGNhcmV0c3BhY2UgPSBjYXJldHNwYWNlWzpvZmZzZXRdLmxzdHJpcCgpCisgICAgICAgICAgICAgICAgIyBub24tc3BhY2Ugd2hpdGVzcGFjZSAobGlrZXMgdGFicykgbXVzdCBiZSBrZXB0IGZvciBhbGlnbm1lbnQKKyAgICAgICAgICAgICAgICBjYXJldHNwYWNlID0gKChjLmlzc3BhY2UoKSBhbmQgYyBvciAnICcpIGZvciBjIGluIGNhcmV0c3BhY2UpCisgICAgICAgICAgICAgICAgeWllbGQgJyAgICB7fV5cbicuZm9ybWF0KCcnLmpvaW4oY2FyZXRzcGFjZSkpCisgICAgICAgIG1zZyA9IHNlbGYubXNnIG9yICI8bm8gZGV0YWlsIGF2YWlsYWJsZT4iCisgICAgICAgIHlpZWxkICJ7fToge31cbiIuZm9ybWF0KHN0eXBlLCBtc2cpCisKKyAgICBkZWYgZm9ybWF0KHNlbGYsICosIGNoYWluPVRydWUpOgorICAgICAgICAiIiJGb3JtYXQgdGhlIGV4Y2VwdGlvbi4KKworICAgICAgICBJZiBjaGFpbiBpcyBub3QgKlRydWUqLCAqX19jYXVzZV9fKiBhbmQgKl9fY29udGV4dF9fKiB3aWxsIG5vdCBiZSBmb3JtYXR0ZWQuCisKKyAgICAgICAgVGhlIHJldHVybiB2YWx1ZSBpcyBhIGdlbmVyYXRvciBvZiBzdHJpbmdzLCBlYWNoIGVuZGluZyBpbiBhIG5ld2xpbmUgYW5kCisgICAgICAgIHNvbWUgY29udGFpbmluZyBpbnRlcm5hbCBuZXdsaW5lcy4gYHByaW50X2V4Y2VwdGlvbmAgaXMgYSB3cmFwcGVyIGFyb3VuZAorICAgICAgICB0aGlzIG1ldGhvZCB3aGljaCBqdXN0IHByaW50cyB0aGUgbGluZXMgdG8gYSBmaWxlLgorCisgICAgICAgIFRoZSBtZXNzYWdlIGluZGljYXRpbmcgd2hpY2ggZXhjZXB0aW9uIG9jY3VycmVkIGlzIGFsd2F5cyB0aGUgbGFzdAorICAgICAgICBzdHJpbmcgaW4gdGhlIG91dHB1dC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGNoYWluOgorICAgICAgICAgICAgaWYgc2VsZi5fX2NhdXNlX18gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgeWllbGQgZnJvbSBzZWxmLl9fY2F1c2VfXy5mb3JtYXQoY2hhaW49Y2hhaW4pCisgICAgICAgICAgICAgICAgeWllbGQgX2NhdXNlX21lc3NhZ2UKKyAgICAgICAgICAgIGVsaWYgKHNlbGYuX19jb250ZXh0X18gaXMgbm90IE5vbmUgYW5kCisgICAgICAgICAgICAgICAgbm90IHNlbGYuX19zdXBwcmVzc19jb250ZXh0X18pOgorICAgICAgICAgICAgICAgIHlpZWxkIGZyb20gc2VsZi5fX2NvbnRleHRfXy5mb3JtYXQoY2hhaW49Y2hhaW4pCisgICAgICAgICAgICAgICAgeWllbGQgX2NvbnRleHRfbWVzc2FnZQorICAgICAgICB5aWVsZCAnVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOlxuJworICAgICAgICB5aWVsZCBmcm9tIHNlbGYuc3RhY2suZm9ybWF0KCkKKyAgICAgICAgeWllbGQgZnJvbSBzZWxmLmZvcm1hdF9leGNlcHRpb25fb25seSgpCmRpZmYgLS1naXQgYS9MaWIvdHVydGxlLnB5IGIvTGliL3R1cnRsZS5weQppbmRleCBmNDQwMGM5Li5jYmQ0ZjQ3IDEwMDY0NAotLS0gYS9MaWIvdHVydGxlLnB5CisrKyBiL0xpYi90dXJ0bGUucHkKQEAgLTEyODgsNyArMTI4OCw3IEBACiAgICAgZGVmIF9pbmNyZW1lbnR1ZGMoc2VsZik6CiAgICAgICAgICIiIkluY3JlbWVudCB1cGRhdGUgY291bnRlci4iIiIKICAgICAgICAgaWYgbm90IFR1cnRsZVNjcmVlbi5fUlVOTklORzoKLSAgICAgICAgICAgIFR1cnRsZVNjcmVlbi5fUlVOTk5JTkcgPSBUcnVlCisgICAgICAgICAgICBUdXJ0bGVTY3JlZW4uX1JVTk5JTkcgPSBUcnVlCiAgICAgICAgICAgICByYWlzZSBUZXJtaW5hdG9yCiAgICAgICAgIGlmIHNlbGYuX3RyYWNpbmcgPiAwOgogICAgICAgICAgICAgc2VsZi5fdXBkYXRlY291bnRlciArPSAxCkBAIC0zNzU0LDcgKzM3NTQsNyBAQAogICAgICAgICAgICAgVHVydGxlLl9zY3JlZW4gPSBOb25lCiAgICAgICAgICAgICBfU2NyZWVuLl9yb290ID0gTm9uZQogICAgICAgICAgICAgX1NjcmVlbi5fY2FudmFzID0gTm9uZQotICAgICAgICBUdXJ0bGVTY3JlZW4uX1JVTk5JTkcgPSBUcnVlCisgICAgICAgIFR1cnRsZVNjcmVlbi5fUlVOTklORyA9IEZhbHNlCiAgICAgICAgIHJvb3QuZGVzdHJveSgpCiAKICAgICBkZWYgYnllKHNlbGYpOgpAQCAtMzc5NSw3ICszNzk1LDYgQEAKICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAgZXhpdCgwKQogCi0KIGNsYXNzIFR1cnRsZShSYXdUdXJ0bGUpOgogICAgICIiIlJhd1R1cnRsZSBhdXRvLWNyZWF0aW5nIChzY3JvbGxlZCkgY2FudmFzLgogCkBAIC0zODE4LDE4ICszODE3LDYgQEAKIAogUGVuID0gVHVydGxlCiAKLWRlZiBfZ2V0cGVuKCk6Ci0gICAgIiIiQ3JlYXRlIHRoZSAnYW5vbnltb3VzJyB0dXJ0bGUgaWYgbm90IGFscmVhZHkgcHJlc2VudC4iIiIKLSAgICBpZiBUdXJ0bGUuX3BlbiBpcyBOb25lOgotICAgICAgICBUdXJ0bGUuX3BlbiA9IFR1cnRsZSgpCi0gICAgcmV0dXJuIFR1cnRsZS5fcGVuCi0KLWRlZiBfZ2V0c2NyZWVuKCk6Ci0gICAgIiIiQ3JlYXRlIGEgVHVydGxlU2NyZWVuIGlmIG5vdCBhbHJlYWR5IHByZXNlbnQuIiIiCi0gICAgaWYgVHVydGxlLl9zY3JlZW4gaXMgTm9uZToKLSAgICAgICAgVHVydGxlLl9zY3JlZW4gPSBTY3JlZW4oKQotICAgIHJldHVybiBUdXJ0bGUuX3NjcmVlbgotCiBkZWYgd3JpdGVfZG9jc3RyaW5nZGljdChmaWxlbmFtZT0idHVydGxlX2RvY3N0cmluZ2RpY3QiKToKICAgICAiIiJDcmVhdGUgYW5kIHdyaXRlIGRvY3N0cmluZy1kaWN0aW9uYXJ5IHRvIGZpbGUuCiAKQEAgLTM5NTIsMjYgKzM5MzksMzggQEAKICMjIGFzIGZ1bmN0aW9ucy4gU28gd2UgY2FuIGVuaGFuY2UsIGNoYW5nZSwgYWRkLCBkZWxldGUgbWV0aG9kcyB0byB0aGVzZQogIyMgY2xhc3NlcyBhbmQgZG8gbm90IG5lZWQgdG8gY2hhbmdlIGFueXRoaW5nIGhlcmUuCiAKK19fZnVuY19ib2R5ID0gIiIiXAorZGVmIHtuYW1lfXtwYXJhbXNsaXN0fToKKyAgICBpZiB7b2JqfSBpcyBOb25lOgorICAgICAgICBpZiBub3QgVHVydGxlU2NyZWVuLl9SVU5OSU5HOgorICAgICAgICAgICAgVHVydGxlU2NyZWVuLl9SVU5OSU5HID0gVHJ1ZQorICAgICAgICAgICAgcmFpc2UgVGVybWluYXRvcgorICAgICAgICB7b2JqfSA9IHtpbml0fQorICAgIHRyeToKKyAgICAgICAgcmV0dXJuIHtvYmp9LntuYW1lfXthcmdzbGlzdH0KKyAgICBleGNlcHQgVEsuVGNsRXJyb3I6CisgICAgICAgIGlmIG5vdCBUdXJ0bGVTY3JlZW4uX1JVTk5JTkc6CisgICAgICAgICAgICBUdXJ0bGVTY3JlZW4uX1JVTk5JTkcgPSBUcnVlCisgICAgICAgICAgICByYWlzZSBUZXJtaW5hdG9yCisgICAgICAgIHJhaXNlCisiIiIKIAotZm9yIG1ldGhvZG5hbWUgaW4gX3RnX3NjcmVlbl9mdW5jdGlvbnM6Ci0gICAgcGwxLCBwbDIgPSBnZXRtZXRocGFybGlzdChldmFsKCdfU2NyZWVuLicgKyBtZXRob2RuYW1lKSkKLSAgICBpZiBwbDEgPT0gIiI6Ci0gICAgICAgIHByaW50KCI+Pj4+Pj4iLCBwbDEsIHBsMikKLSAgICAgICAgY29udGludWUKLSAgICBkZWZzdHIgPSAoImRlZiAlKGtleSlzJShwbDEpczogcmV0dXJuIF9nZXRzY3JlZW4oKS4lKGtleSlzJShwbDIpcyIgJQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7J2tleSc6bWV0aG9kbmFtZSwgJ3BsMSc6cGwxLCAncGwyJzpwbDJ9KQotICAgIGV4ZWMoZGVmc3RyKQotICAgIGV2YWwobWV0aG9kbmFtZSkuX19kb2NfXyA9IF9zY3JlZW5fZG9jcmV2aXNlKGV2YWwoJ19TY3JlZW4uJyttZXRob2RuYW1lKS5fX2RvY19fKQorZGVmIF9tYWtlX2dsb2JhbF9mdW5jcyhmdW5jdGlvbnMsIGNscywgb2JqLCBpbml0LCBkb2NyZXZpc2UpOgorICAgIGZvciBtZXRob2RuYW1lIGluIGZ1bmN0aW9uczoKKyAgICAgICAgbWV0aG9kID0gZ2V0YXR0cihjbHMsIG1ldGhvZG5hbWUpCisgICAgICAgIHBsMSwgcGwyID0gZ2V0bWV0aHBhcmxpc3QobWV0aG9kKQorICAgICAgICBpZiBwbDEgPT0gIiI6CisgICAgICAgICAgICBwcmludCgiPj4+Pj4+IiwgcGwxLCBwbDIpCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBkZWZzdHIgPSBfX2Z1bmNfYm9keS5mb3JtYXQob2JqPW9iaiwgaW5pdD1pbml0LCBuYW1lPW1ldGhvZG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNsaXN0PXBsMSwgYXJnc2xpc3Q9cGwyKQorICAgICAgICBleGVjKGRlZnN0ciwgZ2xvYmFscygpKQorICAgICAgICBnbG9iYWxzKClbbWV0aG9kbmFtZV0uX19kb2NfXyA9IGRvY3JldmlzZShtZXRob2QuX19kb2NfXykKIAotZm9yIG1ldGhvZG5hbWUgaW4gX3RnX3R1cnRsZV9mdW5jdGlvbnM6Ci0gICAgcGwxLCBwbDIgPSBnZXRtZXRocGFybGlzdChldmFsKCdUdXJ0bGUuJyArIG1ldGhvZG5hbWUpKQotICAgIGlmIHBsMSA9PSAiIjoKLSAgICAgICAgcHJpbnQoIj4+Pj4+PiIsIHBsMSwgcGwyKQotICAgICAgICBjb250aW51ZQotICAgIGRlZnN0ciA9ICgiZGVmICUoa2V5KXMlKHBsMSlzOiByZXR1cm4gX2dldHBlbigpLiUoa2V5KXMlKHBsMilzIiAlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsna2V5JzptZXRob2RuYW1lLCAncGwxJzpwbDEsICdwbDInOnBsMn0pCi0gICAgZXhlYyhkZWZzdHIpCi0gICAgZXZhbChtZXRob2RuYW1lKS5fX2RvY19fID0gX3R1cnRsZV9kb2NyZXZpc2UoZXZhbCgnVHVydGxlLicrbWV0aG9kbmFtZSkuX19kb2NfXykKK19tYWtlX2dsb2JhbF9mdW5jcyhfdGdfc2NyZWVuX2Z1bmN0aW9ucywgX1NjcmVlbiwKKyAgICAgICAgICAgICAgICAgICAnVHVydGxlLl9zY3JlZW4nLCAnU2NyZWVuKCknLCBfc2NyZWVuX2RvY3JldmlzZSkKK19tYWtlX2dsb2JhbF9mdW5jcyhfdGdfdHVydGxlX2Z1bmN0aW9ucywgVHVydGxlLAorICAgICAgICAgICAgICAgICAgICdUdXJ0bGUuX3BlbicsICdUdXJ0bGUoKScsIF90dXJ0bGVfZG9jcmV2aXNlKQogCiAKIGRvbmUgPSBtYWlubG9vcApkaWZmIC0tZ2l0IGEvTGliL3R1cnRsZWRlbW8vX19tYWluX18ucHkgYi9MaWIvdHVydGxlZGVtby9fX21haW5fXy5weQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDYyODBjODQuLjEwNmQwNTgKLS0tIGEvTGliL3R1cnRsZWRlbW8vX19tYWluX18ucHkKKysrIGIvTGliL3R1cnRsZWRlbW8vX19tYWluX18ucHkKQEAgLTM0NCw2ICszNDQsOCBAQAogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gRE9ORQogICAgICAgICBleGNlcHQgdHVydGxlLlRlcm1pbmF0b3I6CisgICAgICAgICAgICBpZiBzZWxmLnJvb3QgaXMgTm9uZToKKyAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBET05FCiAgICAgICAgICAgICByZXN1bHQgPSAic3RvcHBlZCEiCiAgICAgICAgIGlmIHNlbGYuc3RhdGUgPT0gRE9ORToKQEAgLTM2OSw3ICszNzEsOSBAQAogICAgICAgICB0dXJ0bGUuVHVydGxlU2NyZWVuLl9SVU5OSU5HID0gRmFsc2UKIAogICAgIGRlZiBfZGVzdHJveShzZWxmKToKKyAgICAgICAgdHVydGxlLlR1cnRsZVNjcmVlbi5fUlVOTklORyA9IEZhbHNlCiAgICAgICAgIHNlbGYucm9vdC5kZXN0cm95KCkKKyAgICAgICAgc2VsZi5yb290ID0gTm9uZQogCiAKIGRlZiBtYWluKCk6CmRpZmYgLS1naXQgYS9MaWIvdHVydGxlZGVtby9zb3J0aW5nX2FuaW1hdGUucHkgYi9MaWIvdHVydGxlZGVtby9zb3J0aW5nX2FuaW1hdGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI1YTBhYgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90dXJ0bGVkZW1vL3NvcnRpbmdfYW5pbWF0ZS5weQpAQCAtMCwwICsxLDIwNCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMworIiIiCisKKyAgICAgICAgIHNvcnRpbmdfYW5pbWF0aW9uLnB5CisKK0EgbWluaW1hbCBzb3J0aW5nIGFsZ29yaXRobSBhbmltYXRpb246CitTb3J0cyBhIHNoZWxmIG9mIDEwIGJsb2NrcyB1c2luZyBpbnNlcnRpb24KK3NvcnQsIHNlbGVjdGlvbiBzb3J0IGFuZCBxdWlja3NvcnQuCisKK1NoZWxmcyBhcmUgaW1wbGVtZW50ZWQgdXNpbmcgYnVpbHRpbiBsaXN0cy4KKworQmxvY2tzIGFyZSB0dXJ0bGVzIHdpdGggc2hhcGUgInNxdWFyZSIsIGJ1dAorc3RyZXRjaGVkIHRvIHJlY3RhbmdsZXMgYnkgc2hhcGVzaXplKCkKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICBUbyBleGl0IHByZXNzIHNwYWNlIGJ1dHRvbgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIiIiCitmcm9tIHR1cnRsZSBpbXBvcnQgKgoraW1wb3J0IHJhbmRvbQorCisKK2NsYXNzIEJsb2NrKFR1cnRsZSk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2l6ZSk6CisgICAgICAgIHNlbGYuc2l6ZSA9IHNpemUKKyAgICAgICAgVHVydGxlLl9faW5pdF9fKHNlbGYsIHNoYXBlPSJzcXVhcmUiLCB2aXNpYmxlPUZhbHNlKQorICAgICAgICBzZWxmLnB1KCkKKyAgICAgICAgc2VsZi5zaGFwZXNpemUoc2l6ZSAqIDEuNSwgMS41LCAyKSAjIHNxdWFyZS0tPnJlY3RhbmdsZQorICAgICAgICBzZWxmLmZpbGxjb2xvcigiYmxhY2siKQorICAgICAgICBzZWxmLnN0KCkKKworICAgIGRlZiBnbG93KHNlbGYpOgorICAgICAgICBzZWxmLmZpbGxjb2xvcigicmVkIikKKworICAgIGRlZiB1bmdsb3coc2VsZik6CisgICAgICAgIHNlbGYuZmlsbGNvbG9yKCJibGFjayIpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiQmxvY2sgc2l6ZTogezB9Ii5mb3JtYXQoc2VsZi5zaXplKQorCisKK2NsYXNzIFNoZWxmKGxpc3QpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHkpOgorICAgICAgICAiY3JlYXRlIGEgc2hlbGYuIHkgaXMgeS1wb3NpdGlvbiBvZiBmaXJzdCBibG9jayIKKyAgICAgICAgc2VsZi55ID0geQorICAgICAgICBzZWxmLnggPSAtMTUwCisKKyAgICBkZWYgcHVzaChzZWxmLCBkKToKKyAgICAgICAgd2lkdGgsIF8sIF8gPSBkLnNoYXBlc2l6ZSgpCisgICAgICAgICMgYWxpZ24gYmxvY2tzIGJ5IHRoZSBib3R0b20gZWRnZQorICAgICAgICB5X29mZnNldCA9IHdpZHRoIC8gMiAqIDIwCisgICAgICAgIGQuc2V0eShzZWxmLnkgKyB5X29mZnNldCkKKyAgICAgICAgZC5zZXR4KHNlbGYueCArIDM0ICogbGVuKHNlbGYpKQorICAgICAgICBzZWxmLmFwcGVuZChkKQorCisgICAgZGVmIF9jbG9zZV9nYXBfZnJvbV9pKHNlbGYsIGkpOgorICAgICAgICBmb3IgYiBpbiBzZWxmW2k6XToKKyAgICAgICAgICAgIHhwb3MsIF8gPSBiLnBvcygpCisgICAgICAgICAgICBiLnNldHgoeHBvcyAtIDM0KQorCisgICAgZGVmIF9vcGVuX2dhcF9mcm9tX2koc2VsZiwgaSk6CisgICAgICAgIGZvciBiIGluIHNlbGZbaTpdOgorICAgICAgICAgICAgeHBvcywgXyA9IGIucG9zKCkKKyAgICAgICAgICAgIGIuc2V0eCh4cG9zICsgMzQpCisKKyAgICBkZWYgcG9wKHNlbGYsIGtleSk6CisgICAgICAgIGIgPSBsaXN0LnBvcChzZWxmLCBrZXkpCisgICAgICAgIGIuZ2xvdygpCisgICAgICAgIGIuc2V0eSgyMDApCisgICAgICAgIHNlbGYuX2Nsb3NlX2dhcF9mcm9tX2koa2V5KQorICAgICAgICByZXR1cm4gYgorCisgICAgZGVmIGluc2VydChzZWxmLCBrZXksIGIpOgorICAgICAgICBzZWxmLl9vcGVuX2dhcF9mcm9tX2koa2V5KQorICAgICAgICBsaXN0Lmluc2VydChzZWxmLCBrZXksIGIpCisgICAgICAgIGIuc2V0eChzZWxmLnggKyAzNCAqIGtleSkKKyAgICAgICAgd2lkdGgsIF8sIF8gPSBiLnNoYXBlc2l6ZSgpCisgICAgICAgICMgYWxpZ24gYmxvY2tzIGJ5IHRoZSBib3R0b20gZWRnZQorICAgICAgICB5X29mZnNldCA9IHdpZHRoIC8gMiAqIDIwCisgICAgICAgIGIuc2V0eShzZWxmLnkgKyB5X29mZnNldCkKKyAgICAgICAgYi51bmdsb3coKQorCitkZWYgaXNvcnQoc2hlbGYpOgorICAgIGxlbmd0aCA9IGxlbihzaGVsZikKKyAgICBmb3IgaSBpbiByYW5nZSgxLCBsZW5ndGgpOgorICAgICAgICBob2xlID0gaQorICAgICAgICB3aGlsZSBob2xlID4gMCBhbmQgc2hlbGZbaV0uc2l6ZSA8IHNoZWxmW2hvbGUgLSAxXS5zaXplOgorICAgICAgICAgICAgaG9sZSA9IGhvbGUgLSAxCisgICAgICAgIHNoZWxmLmluc2VydChob2xlLCBzaGVsZi5wb3AoaSkpCisgICAgcmV0dXJuCisKK2RlZiBzc29ydChzaGVsZik6CisgICAgbGVuZ3RoID0gbGVuKHNoZWxmKQorICAgIGZvciBqIGluIHJhbmdlKDAsIGxlbmd0aCAtIDEpOgorICAgICAgICBpbWluID0gagorICAgICAgICBmb3IgaSBpbiByYW5nZShqICsgMSwgbGVuZ3RoKToKKyAgICAgICAgICAgIGlmIHNoZWxmW2ldLnNpemUgPCBzaGVsZltpbWluXS5zaXplOgorICAgICAgICAgICAgICAgIGltaW4gPSBpCisgICAgICAgIGlmIGltaW4gIT0gajoKKyAgICAgICAgICAgIHNoZWxmLmluc2VydChqLCBzaGVsZi5wb3AoaW1pbikpCisKK2RlZiBwYXJ0aXRpb24oc2hlbGYsIGxlZnQsIHJpZ2h0LCBwaXZvdF9pbmRleCk6CisgICAgcGl2b3QgPSBzaGVsZltwaXZvdF9pbmRleF0KKyAgICBzaGVsZi5pbnNlcnQocmlnaHQsIHNoZWxmLnBvcChwaXZvdF9pbmRleCkpCisgICAgc3RvcmVfaW5kZXggPSBsZWZ0CisgICAgZm9yIGkgaW4gcmFuZ2UobGVmdCwgcmlnaHQpOiAjIHJhbmdlIGlzIG5vbi1pbmNsdXNpdmUgb2YgZW5kaW5nIHZhbHVlCisgICAgICAgIGlmIHNoZWxmW2ldLnNpemUgPCBwaXZvdC5zaXplOgorICAgICAgICAgICAgc2hlbGYuaW5zZXJ0KHN0b3JlX2luZGV4LCBzaGVsZi5wb3AoaSkpCisgICAgICAgICAgICBzdG9yZV9pbmRleCA9IHN0b3JlX2luZGV4ICsgMQorICAgIHNoZWxmLmluc2VydChzdG9yZV9pbmRleCwgc2hlbGYucG9wKHJpZ2h0KSkgIyBtb3ZlIHBpdm90IHRvIGNvcnJlY3QgcG9zaXRpb24KKyAgICByZXR1cm4gc3RvcmVfaW5kZXgKKworZGVmIHFzb3J0KHNoZWxmLCBsZWZ0LCByaWdodCk6CisgICAgaWYgbGVmdCA8IHJpZ2h0OgorICAgICAgICBwaXZvdF9pbmRleCA9IGxlZnQKKyAgICAgICAgcGl2b3RfbmV3X2luZGV4ID0gcGFydGl0aW9uKHNoZWxmLCBsZWZ0LCByaWdodCwgcGl2b3RfaW5kZXgpCisgICAgICAgIHFzb3J0KHNoZWxmLCBsZWZ0LCBwaXZvdF9uZXdfaW5kZXggLSAxKQorICAgICAgICBxc29ydChzaGVsZiwgcGl2b3RfbmV3X2luZGV4ICsgMSwgcmlnaHQpCisKK2RlZiByYW5kb21pemUoKToKKyAgICBkaXNhYmxlX2tleXMoKQorICAgIGNsZWFyKCkKKyAgICB0YXJnZXQgPSBsaXN0KHJhbmdlKDEwKSkKKyAgICByYW5kb20uc2h1ZmZsZSh0YXJnZXQpCisgICAgZm9yIGksIHQgaW4gZW51bWVyYXRlKHRhcmdldCk6CisgICAgICAgIGZvciBqIGluIHJhbmdlKGksIGxlbihzKSk6CisgICAgICAgICAgICBpZiBzW2pdLnNpemUgPT0gdCArIDE6CisgICAgICAgICAgICAgICAgcy5pbnNlcnQoaSwgcy5wb3AoaikpCisgICAgc2hvd190ZXh0KGluc3RydWN0aW9uczEpCisgICAgc2hvd190ZXh0KGluc3RydWN0aW9uczIsIGxpbmU9MSkKKyAgICBlbmFibGVfa2V5cygpCisKK2RlZiBzaG93X3RleHQodGV4dCwgbGluZT0wKToKKyAgICBsaW5lID0gMjAgKiBsaW5lCisgICAgZ290bygwLC0yNTAgLSBsaW5lKQorICAgIHdyaXRlKHRleHQsIGFsaWduPSJjZW50ZXIiLCBmb250PSgiQ291cmllciIsIDE2LCAiYm9sZCIpKQorCitkZWYgc3RhcnRfc3NvcnQoKToKKyAgICBkaXNhYmxlX2tleXMoKQorICAgIGNsZWFyKCkKKyAgICBzaG93X3RleHQoIlNlbGVjdGlvbiBTb3J0IikKKyAgICBzc29ydChzKQorICAgIGNsZWFyKCkKKyAgICBzaG93X3RleHQoaW5zdHJ1Y3Rpb25zMSkKKyAgICBzaG93X3RleHQoaW5zdHJ1Y3Rpb25zMiwgbGluZT0xKQorICAgIGVuYWJsZV9rZXlzKCkKKworZGVmIHN0YXJ0X2lzb3J0KCk6CisgICAgZGlzYWJsZV9rZXlzKCkKKyAgICBjbGVhcigpCisgICAgc2hvd190ZXh0KCJJbnNlcnRpb24gU29ydCIpCisgICAgaXNvcnQocykKKyAgICBjbGVhcigpCisgICAgc2hvd190ZXh0KGluc3RydWN0aW9uczEpCisgICAgc2hvd190ZXh0KGluc3RydWN0aW9uczIsIGxpbmU9MSkKKyAgICBlbmFibGVfa2V5cygpCisKK2RlZiBzdGFydF9xc29ydCgpOgorICAgIGRpc2FibGVfa2V5cygpCisgICAgY2xlYXIoKQorICAgIHNob3dfdGV4dCgiUXVpY2tzb3J0IikKKyAgICBxc29ydChzLCAwLCBsZW4ocykgLSAxKQorICAgIGNsZWFyKCkKKyAgICBzaG93X3RleHQoaW5zdHJ1Y3Rpb25zMSkKKyAgICBzaG93X3RleHQoaW5zdHJ1Y3Rpb25zMiwgbGluZT0xKQorICAgIGVuYWJsZV9rZXlzKCkKKworZGVmIGluaXRfc2hlbGYoKToKKyAgICBnbG9iYWwgcworICAgIHMgPSBTaGVsZigtMjAwKQorICAgIHZhbHMgPSAoNCwgMiwgOCwgOSwgMSwgNSwgMTAsIDMsIDcsIDYpCisgICAgZm9yIGkgaW4gdmFsczoKKyAgICAgICAgcy5wdXNoKEJsb2NrKGkpKQorCitkZWYgZGlzYWJsZV9rZXlzKCk6CisgICAgb25rZXkoTm9uZSwgInMiKQorICAgIG9ua2V5KE5vbmUsICJpIikKKyAgICBvbmtleShOb25lLCAicSIpCisgICAgb25rZXkoTm9uZSwgInIiKQorCitkZWYgZW5hYmxlX2tleXMoKToKKyAgICBvbmtleShzdGFydF9pc29ydCwgImkiKQorICAgIG9ua2V5KHN0YXJ0X3Nzb3J0LCAicyIpCisgICAgb25rZXkoc3RhcnRfcXNvcnQsICJxIikKKyAgICBvbmtleShyYW5kb21pemUsICJyIikKKyAgICBvbmtleShieWUsICJzcGFjZSIpCisKK2RlZiBtYWluKCk6CisgICAgZ2V0c2NyZWVuKCkuY2xlYXJzY3JlZW4oKQorICAgIGh0KCk7IHBlbnVwKCkKKyAgICBpbml0X3NoZWxmKCkKKyAgICBzaG93X3RleHQoaW5zdHJ1Y3Rpb25zMSkKKyAgICBzaG93X3RleHQoaW5zdHJ1Y3Rpb25zMiwgbGluZT0xKQorICAgIGVuYWJsZV9rZXlzKCkKKyAgICBsaXN0ZW4oKQorICAgIHJldHVybiAiRVZFTlRMT09QIgorCitpbnN0cnVjdGlvbnMxID0gInByZXNzIGkgZm9yIGluc2VydGlvbiBzb3J0LCBzIGZvciBzZWxlY3Rpb24gc29ydCwgcSBmb3IgcXVpY2tzb3J0IgoraW5zdHJ1Y3Rpb25zMiA9ICJzcGFjZWJhciB0byBxdWl0LCByIHRvIHJhbmRvbWl6ZSIKKworaWYgX19uYW1lX189PSJfX21haW5fXyI6CisgICAgbXNnID0gbWFpbigpCisgICAgbWFpbmxvb3AoKQpkaWZmIC0tZ2l0IGEvTGliL3R5cGVzLnB5IGIvTGliL3R5cGVzLnB5CmluZGV4IDdlNGZlYzIuLjRmYjJkZWYgMTAwNjQ0Ci0tLSBhL0xpYi90eXBlcy5weQorKysgYi9MaWIvdHlwZXMucHkKQEAgLTE1NiwzICsxNTYsNiBAQAogICAgICAgICByZXN1bHQgPSB0eXBlKHNlbGYpKHNlbGYuZmdldCwgc2VsZi5mc2V0LCBmZGVsLCBzZWxmLl9fZG9jX18pCiAgICAgICAgIHJlc3VsdC5vdmVyd3JpdGVfZG9jID0gc2VsZi5vdmVyd3JpdGVfZG9jCiAgICAgICAgIHJldHVybiByZXN1bHQKKworCitfX2FsbF9fID0gW24gZm9yIG4gaW4gZ2xvYmFscygpIGlmIG5bOjFdICE9ICdfJ10KZGlmZiAtLWdpdCBhL0xpYi91bml0dGVzdC9tYWluLnB5IGIvTGliL3VuaXR0ZXN0L21haW4ucHkKaW5kZXggMTgwZGY4Ni4uYjIwOWEzYSAxMDA2NDQKLS0tIGEvTGliL3VuaXR0ZXN0L21haW4ucHkKKysrIGIvTGliL3VuaXR0ZXN0L21haW4ucHkKQEAgLTU4LDcgKzU4LDcgQEAKICAgICBkZWYgX19pbml0X18oc2VsZiwgbW9kdWxlPSdfX21haW5fXycsIGRlZmF1bHRUZXN0PU5vbmUsIGFyZ3Y9Tm9uZSwKICAgICAgICAgICAgICAgICAgICAgdGVzdFJ1bm5lcj1Ob25lLCB0ZXN0TG9hZGVyPWxvYWRlci5kZWZhdWx0VGVzdExvYWRlciwKICAgICAgICAgICAgICAgICAgICAgZXhpdD1UcnVlLCB2ZXJib3NpdHk9MSwgZmFpbGZhc3Q9Tm9uZSwgY2F0Y2hicmVhaz1Ob25lLAotICAgICAgICAgICAgICAgICAgICBidWZmZXI9Tm9uZSwgd2FybmluZ3M9Tm9uZSk6CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcj1Ob25lLCB3YXJuaW5ncz1Ob25lLCAqLCB0Yl9sb2NhbHM9RmFsc2UpOgogICAgICAgICBpZiBpc2luc3RhbmNlKG1vZHVsZSwgc3RyKToKICAgICAgICAgICAgIHNlbGYubW9kdWxlID0gX19pbXBvcnRfXyhtb2R1bGUpCiAgICAgICAgICAgICBmb3IgcGFydCBpbiBtb2R1bGUuc3BsaXQoJy4nKVsxOl06CkBAIC03Myw4ICs3Myw5IEBACiAgICAgICAgIHNlbGYuY2F0Y2hicmVhayA9IGNhdGNoYnJlYWsKICAgICAgICAgc2VsZi52ZXJib3NpdHkgPSB2ZXJib3NpdHkKICAgICAgICAgc2VsZi5idWZmZXIgPSBidWZmZXIKKyAgICAgICAgc2VsZi50Yl9sb2NhbHMgPSB0Yl9sb2NhbHMKICAgICAgICAgaWYgd2FybmluZ3MgaXMgTm9uZSBhbmQgbm90IHN5cy53YXJub3B0aW9uczoKLSAgICAgICAgICAgICMgZXZlbiBpZiBEcmVwcmVjYXRpb25XYXJuaW5ncyBhcmUgaWdub3JlZCBieSBkZWZhdWx0CisgICAgICAgICAgICAjIGV2ZW4gaWYgRGVwcmVjYXRpb25XYXJuaW5ncyBhcmUgaWdub3JlZCBieSBkZWZhdWx0CiAgICAgICAgICAgICAjIHByaW50IHRoZW0gYW55d2F5IHVubGVzcyBvdGhlciB3YXJuaW5ncyBzZXR0aW5ncyBhcmUKICAgICAgICAgICAgICMgc3BlY2lmaWVkIGJ5IHRoZSB3YXJuaW5ncyBhcmcgb3IgdGhlIC1XIHB5dGhvbiBmbGFnCiAgICAgICAgICAgICBzZWxmLndhcm5pbmdzID0gJ2RlZmF1bHQnCkBAIC0xNTksNyArMTYwLDkgQEAKICAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXEnLCAnLS1xdWlldCcsIGRlc3Q9J3ZlcmJvc2l0eScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV9jb25zdCcsIGNvbnN0PTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nUXVpZXQgb3V0cHV0JykKLQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWxvY2FscycsIGRlc3Q9J3RiX2xvY2FscycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdTaG93IGxvY2FsIHZhcmlhYmxlcyBpbiB0cmFjZWJhY2tzJykKICAgICAgICAgaWYgc2VsZi5mYWlsZmFzdCBpcyBOb25lOgogICAgICAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLWYnLCAnLS1mYWlsZmFzdCcsIGRlc3Q9J2ZhaWxmYXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKQEAgLTIzMSwxMCArMjM0LDE4IEBACiAgICAgICAgICAgICBzZWxmLnRlc3RSdW5uZXIgPSBydW5uZXIuVGV4dFRlc3RSdW5uZXIKICAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLnRlc3RSdW5uZXIsIHR5cGUpOgogICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHRlc3RSdW5uZXIgPSBzZWxmLnRlc3RSdW5uZXIodmVyYm9zaXR5PXNlbGYudmVyYm9zaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGZhc3Q9c2VsZi5mYWlsZmFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcj1zZWxmLmJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzPXNlbGYud2FybmluZ3MpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICB0ZXN0UnVubmVyID0gc2VsZi50ZXN0UnVubmVyKHZlcmJvc2l0eT1zZWxmLnZlcmJvc2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsZmFzdD1zZWxmLmZhaWxmYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcj1zZWxmLmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncz1zZWxmLndhcm5pbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRiX2xvY2Fscz1zZWxmLnRiX2xvY2FscykKKyAgICAgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgICAgICAjIGRpZG4ndCBhY2NlcHQgdGhlIHRiX2xvY2FscyBhcmd1bWVudAorICAgICAgICAgICAgICAgICAgICB0ZXN0UnVubmVyID0gc2VsZi50ZXN0UnVubmVyKHZlcmJvc2l0eT1zZWxmLnZlcmJvc2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsZmFzdD1zZWxmLmZhaWxmYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcj1zZWxmLmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncz1zZWxmLndhcm5pbmdzKQogICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgICAgICAgICAjIGRpZG4ndCBhY2NlcHQgdGhlIHZlcmJvc2l0eSwgYnVmZmVyIG9yIGZhaWxmYXN0IGFyZ3VtZW50cwogICAgICAgICAgICAgICAgIHRlc3RSdW5uZXIgPSBzZWxmLnRlc3RSdW5uZXIoKQpkaWZmIC0tZ2l0IGEvTGliL3VuaXR0ZXN0L3Jlc3VsdC5weSBiL0xpYi91bml0dGVzdC9yZXN1bHQucHkKaW5kZXggOGUwYTY0My4uYTE4ZjExYiAxMDA2NDQKLS0tIGEvTGliL3VuaXR0ZXN0L3Jlc3VsdC5weQorKysgYi9MaWIvdW5pdHRlc3QvcmVzdWx0LnB5CkBAIC00NSw2ICs0NSw3IEBACiAgICAgICAgIHNlbGYudW5leHBlY3RlZFN1Y2Nlc3NlcyA9IFtdCiAgICAgICAgIHNlbGYuc2hvdWxkU3RvcCA9IEZhbHNlCiAgICAgICAgIHNlbGYuYnVmZmVyID0gRmFsc2UKKyAgICAgICAgc2VsZi50Yl9sb2NhbHMgPSBGYWxzZQogICAgICAgICBzZWxmLl9zdGRvdXRfYnVmZmVyID0gTm9uZQogICAgICAgICBzZWxmLl9zdGRlcnJfYnVmZmVyID0gTm9uZQogICAgICAgICBzZWxmLl9vcmlnaW5hbF9zdGRvdXQgPSBzeXMuc3Rkb3V0CkBAIC0xNzksOSArMTgwLDExIEBACiAgICAgICAgIGlmIGV4Y3R5cGUgaXMgdGVzdC5mYWlsdXJlRXhjZXB0aW9uOgogICAgICAgICAgICAgIyBTa2lwIGFzc2VydCooKSB0cmFjZWJhY2sgbGV2ZWxzCiAgICAgICAgICAgICBsZW5ndGggPSBzZWxmLl9jb3VudF9yZWxldmFudF90Yl9sZXZlbHModGIpCi0gICAgICAgICAgICBtc2dMaW5lcyA9IHRyYWNlYmFjay5mb3JtYXRfZXhjZXB0aW9uKGV4Y3R5cGUsIHZhbHVlLCB0YiwgbGVuZ3RoKQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgbXNnTGluZXMgPSB0cmFjZWJhY2suZm9ybWF0X2V4Y2VwdGlvbihleGN0eXBlLCB2YWx1ZSwgdGIpCisgICAgICAgICAgICBsZW5ndGggPSBOb25lCisgICAgICAgIHRiX2UgPSB0cmFjZWJhY2suVHJhY2ViYWNrRXhjZXB0aW9uKAorICAgICAgICAgICAgZXhjdHlwZSwgdmFsdWUsIHRiLCBsaW1pdD1sZW5ndGgsIGNhcHR1cmVfbG9jYWxzPXNlbGYudGJfbG9jYWxzKQorICAgICAgICBtc2dMaW5lcyA9IGxpc3QodGJfZS5mb3JtYXQoKSkKIAogICAgICAgICBpZiBzZWxmLmJ1ZmZlcjoKICAgICAgICAgICAgIG91dHB1dCA9IHN5cy5zdGRvdXQuZ2V0dmFsdWUoKQpkaWZmIC0tZ2l0IGEvTGliL3VuaXR0ZXN0L3J1bm5lci5weSBiL0xpYi91bml0dGVzdC9ydW5uZXIucHkKaW5kZXggMjhiODg2NS4uMjExMjI2MiAxMDA2NDQKLS0tIGEvTGliL3VuaXR0ZXN0L3J1bm5lci5weQorKysgYi9MaWIvdW5pdHRlc3QvcnVubmVyLnB5CkBAIC0xMjYsNyArMTI2LDEzIEBACiAgICAgcmVzdWx0Y2xhc3MgPSBUZXh0VGVzdFJlc3VsdAogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbT1Ob25lLCBkZXNjcmlwdGlvbnM9VHJ1ZSwgdmVyYm9zaXR5PTEsCi0gICAgICAgICAgICAgICAgIGZhaWxmYXN0PUZhbHNlLCBidWZmZXI9RmFsc2UsIHJlc3VsdGNsYXNzPU5vbmUsIHdhcm5pbmdzPU5vbmUpOgorICAgICAgICAgICAgICAgICBmYWlsZmFzdD1GYWxzZSwgYnVmZmVyPUZhbHNlLCByZXN1bHRjbGFzcz1Ob25lLCB3YXJuaW5ncz1Ob25lLAorICAgICAgICAgICAgICAgICAqLCB0Yl9sb2NhbHM9RmFsc2UpOgorICAgICAgICAiIiJDb25zdHJ1Y3QgYSBUZXh0VGVzdFJ1bm5lci4KKworICAgICAgICBTdWJjbGFzc2VzIHNob3VsZCBhY2NlcHQgKiprd2FyZ3MgdG8gZW5zdXJlIGNvbXBhdGliaWxpdHkgYXMgdGhlCisgICAgICAgIGludGVyZmFjZSBjaGFuZ2VzLgorICAgICAgICAiIiIKICAgICAgICAgaWYgc3RyZWFtIGlzIE5vbmU6CiAgICAgICAgICAgICBzdHJlYW0gPSBzeXMuc3RkZXJyCiAgICAgICAgIHNlbGYuc3RyZWFtID0gX1dyaXRlbG5EZWNvcmF0b3Ioc3RyZWFtKQpAQCAtMTM0LDYgKzE0MCw3IEBACiAgICAgICAgIHNlbGYudmVyYm9zaXR5ID0gdmVyYm9zaXR5CiAgICAgICAgIHNlbGYuZmFpbGZhc3QgPSBmYWlsZmFzdAogICAgICAgICBzZWxmLmJ1ZmZlciA9IGJ1ZmZlcgorICAgICAgICBzZWxmLnRiX2xvY2FscyA9IHRiX2xvY2FscwogICAgICAgICBzZWxmLndhcm5pbmdzID0gd2FybmluZ3MKICAgICAgICAgaWYgcmVzdWx0Y2xhc3MgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICBzZWxmLnJlc3VsdGNsYXNzID0gcmVzdWx0Y2xhc3MKQEAgLTE0Nyw2ICsxNTQsNyBAQAogICAgICAgICByZWdpc3RlclJlc3VsdChyZXN1bHQpCiAgICAgICAgIHJlc3VsdC5mYWlsZmFzdCA9IHNlbGYuZmFpbGZhc3QKICAgICAgICAgcmVzdWx0LmJ1ZmZlciA9IHNlbGYuYnVmZmVyCisgICAgICAgIHJlc3VsdC50Yl9sb2NhbHMgPSBzZWxmLnRiX2xvY2FscwogICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6CiAgICAgICAgICAgICBpZiBzZWxmLndhcm5pbmdzOgogICAgICAgICAgICAgICAgICMgaWYgc2VsZi53YXJuaW5ncyBpcyBzZXQsIHVzZSBpdCB0byBmaWx0ZXIgYWxsIHRoZSB3YXJuaW5ncwpkaWZmIC0tZ2l0IGEvTGliL3VuaXR0ZXN0L3Rlc3QvdGVzdF9icmVhay5weSBiL0xpYi91bml0dGVzdC90ZXN0L3Rlc3RfYnJlYWsucHkKaW5kZXggMGJmMWEyMi4uMmM3NTAxOSAxMDA2NDQKLS0tIGEvTGliL3VuaXR0ZXN0L3Rlc3QvdGVzdF9icmVhay5weQorKysgYi9MaWIvdW5pdHRlc3QvdGVzdC90ZXN0X2JyZWFrLnB5CkBAIC0yMTEsNiArMjExLDcgQEAKICAgICAgICAgICAgICAgICBzZWxmLnZlcmJvc2l0eSA9IHZlcmJvc2l0eQogICAgICAgICAgICAgICAgIHNlbGYuZmFpbGZhc3QgPSBmYWlsZmFzdAogICAgICAgICAgICAgICAgIHNlbGYuY2F0Y2hicmVhayA9IGNhdGNoYnJlYWsKKyAgICAgICAgICAgICAgICBzZWxmLnRiX2xvY2FscyA9IEZhbHNlCiAgICAgICAgICAgICAgICAgc2VsZi50ZXN0UnVubmVyID0gRmFrZVJ1bm5lcgogICAgICAgICAgICAgICAgIHNlbGYudGVzdCA9IHRlc3QKICAgICAgICAgICAgICAgICBzZWxmLnJlc3VsdCA9IE5vbmUKQEAgLTIyMSw2ICsyMjIsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEZha2VSdW5uZXIuaW5pdEFyZ3MsIFsoKCksIHsnYnVmZmVyJzogTm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZlcmJvc2l0eSc6IHZlcmJvc2l0eSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZhaWxmYXN0JzogZmFpbGZhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0Yl9sb2NhbHMnOiBGYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dhcm5pbmdzJzogTm9uZX0pXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWtlUnVubmVyLnJ1bkFyZ3MsIFt0ZXN0XSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnJlc3VsdCwgcmVzdWx0KQpAQCAtMjM1LDYgKzIzNyw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFrZVJ1bm5lci5pbml0QXJncywgWygoKSwgeydidWZmZXInOiBOb25lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmVyYm9zaXR5JzogdmVyYm9zaXR5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmFpbGZhc3QnOiBmYWlsZmFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RiX2xvY2Fscyc6IEZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2FybmluZ3MnOiBOb25lfSldKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEZha2VSdW5uZXIucnVuQXJncywgW3Rlc3RdKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucmVzdWx0LCByZXN1bHQpCmRpZmYgLS1naXQgYS9MaWIvdW5pdHRlc3QvdGVzdC90ZXN0X3Byb2dyYW0ucHkgYi9MaWIvdW5pdHRlc3QvdGVzdC90ZXN0X3Byb2dyYW0ucHkKaW5kZXggNzI1ZDY3Zi4uMWNmYzE3OSAxMDA2NDQKLS0tIGEvTGliL3VuaXR0ZXN0L3Rlc3QvdGVzdF9wcm9ncmFtLnB5CisrKyBiL0xpYi91bml0dGVzdC90ZXN0L3Rlc3RfcHJvZ3JhbS5weQpAQCAtMTM0LDYgKzEzNCw3IEBACiAgICAgcmVzdWx0ID0gTm9uZQogICAgIHZlcmJvc2l0eSA9IDEKICAgICBkZWZhdWx0VGVzdCA9IE5vbmUKKyAgICB0Yl9sb2NhbHMgPSBGYWxzZQogICAgIHRlc3RSdW5uZXIgPSBOb25lCiAgICAgdGVzdExvYWRlciA9IHVuaXR0ZXN0LmRlZmF1bHRUZXN0TG9hZGVyCiAgICAgbW9kdWxlID0gJ19fbWFpbl9fJwpAQCAtMTQ3LDE4ICsxNDgsMTkgQEAKIGNsYXNzIEZha2VSdW5uZXIob2JqZWN0KToKICAgICBpbml0QXJncyA9IE5vbmUKICAgICB0ZXN0ID0gTm9uZQotICAgIHJhaXNlRXJyb3IgPSBGYWxzZQorICAgIHJhaXNlRXJyb3IgPSAwCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgKiprd2FyZ3MpOgogICAgICAgICBGYWtlUnVubmVyLmluaXRBcmdzID0ga3dhcmdzCiAgICAgICAgIGlmIEZha2VSdW5uZXIucmFpc2VFcnJvcjoKLSAgICAgICAgICAgIEZha2VSdW5uZXIucmFpc2VFcnJvciA9IEZhbHNlCisgICAgICAgICAgICBGYWtlUnVubmVyLnJhaXNlRXJyb3IgLT0gMQogICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yCiAKICAgICBkZWYgcnVuKHNlbGYsIHRlc3QpOgogICAgICAgICBGYWtlUnVubmVyLnRlc3QgPSB0ZXN0CiAgICAgICAgIHJldHVybiBSRVNVTFQKIAorCiBjbGFzcyBUZXN0Q29tbWFuZExpbmVBcmdzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiBzZXRVcChzZWxmKToKQEAgLTE2Niw3ICsxNjgsNyBAQAogICAgICAgICBzZWxmLnByb2dyYW0uY3JlYXRlVGVzdHMgPSBsYW1iZGE6IE5vbmUKICAgICAgICAgRmFrZVJ1bm5lci5pbml0QXJncyA9IE5vbmUKICAgICAgICAgRmFrZVJ1bm5lci50ZXN0ID0gTm9uZQotICAgICAgICBGYWtlUnVubmVyLnJhaXNlRXJyb3IgPSBGYWxzZQorICAgICAgICBGYWtlUnVubmVyLnJhaXNlRXJyb3IgPSAwCiAKICAgICBkZWYgdGVzdFZlcmJvc2l0eShzZWxmKToKICAgICAgICAgcHJvZ3JhbSA9IHNlbGYucHJvZ3JhbQpAQCAtMjU2LDYgKzI1OCw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFrZVJ1bm5lci5pbml0QXJncywgeyd2ZXJib3NpdHknOiAndmVyYm9zaXR5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmYWlsZmFzdCc6ICdmYWlsZmFzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnVmZmVyJzogJ2J1ZmZlcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGJfbG9jYWxzJzogRmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2FybmluZ3MnOiAnd2FybmluZ3MnfSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWtlUnVubmVyLnRlc3QsICd0ZXN0JykKICAgICAgICAgc2VsZi5hc3NlcnRJcyhwcm9ncmFtLnJlc3VsdCwgUkVTVUxUKQpAQCAtMjc0LDEwICsyNzcsMjUgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWtlUnVubmVyLnRlc3QsICd0ZXN0JykKICAgICAgICAgc2VsZi5hc3NlcnRJcyhwcm9ncmFtLnJlc3VsdCwgUkVTVUxUKQogCisgICAgZGVmIHRlc3RfbG9jYWxzKHNlbGYpOgorICAgICAgICBwcm9ncmFtID0gc2VsZi5wcm9ncmFtCisKKyAgICAgICAgcHJvZ3JhbS50ZXN0UnVubmVyID0gRmFrZVJ1bm5lcgorICAgICAgICBwcm9ncmFtLnBhcnNlQXJncyhbTm9uZSwgJy0tbG9jYWxzJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZSwgcHJvZ3JhbS50Yl9sb2NhbHMpCisgICAgICAgIHByb2dyYW0ucnVuVGVzdHMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEZha2VSdW5uZXIuaW5pdEFyZ3MsIHsnYnVmZmVyJzogRmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmYWlsZmFzdCc6IEZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGJfbG9jYWxzJzogVHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZlcmJvc2l0eSc6IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3YXJuaW5ncyc6IE5vbmV9KQorCiAgICAgZGVmIHRlc3RSdW5UZXN0c09sZFJ1bm5lckNsYXNzKHNlbGYpOgogICAgICAgICBwcm9ncmFtID0gc2VsZi5wcm9ncmFtCiAKLSAgICAgICAgRmFrZVJ1bm5lci5yYWlzZUVycm9yID0gVHJ1ZQorICAgICAgICAjIFR3byBUeXBlRXJyb3JzIGFyZSBuZWVkZWQgdG8gZmFsbCBhbGwgdGhlIHdheSBiYWNrIHRvIG9sZC1zdHlsZQorICAgICAgICAjIHJ1bm5lcnMgLSBvbmUgdG8gZmFpbCB0Yl9sb2NhbHMsIG9uZSB0byBmYWlsIGJ1ZmZlciBldGMuCisgICAgICAgIEZha2VSdW5uZXIucmFpc2VFcnJvciA9IDIKICAgICAgICAgcHJvZ3JhbS50ZXN0UnVubmVyID0gRmFrZVJ1bm5lcgogICAgICAgICBwcm9ncmFtLnZlcmJvc2l0eSA9ICd2ZXJib3NpdHknCiAgICAgICAgIHByb2dyYW0uZmFpbGZhc3QgPSAnZmFpbGZhc3QnCmRpZmYgLS1naXQgYS9MaWIvdW5pdHRlc3QvdGVzdC90ZXN0X3Jlc3VsdC5weSBiL0xpYi91bml0dGVzdC90ZXN0L3Rlc3RfcmVzdWx0LnB5CmluZGV4IDQ4OWZlMTcuLmUzOWUyZWEgMTAwNjQ0Ci0tLSBhL0xpYi91bml0dGVzdC90ZXN0L3Rlc3RfcmVzdWx0LnB5CisrKyBiL0xpYi91bml0dGVzdC90ZXN0L3Rlc3RfcmVzdWx0LnB5CkBAIC04LDYgKzgsMjAgQEAKIGltcG9ydCB1bml0dGVzdAogCiAKK2NsYXNzIE1vY2tUcmFjZWJhY2sob2JqZWN0KToKKyAgICBjbGFzcyBUcmFjZWJhY2tFeGNlcHRpb246CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAgICAgc2VsZi5jYXB0dXJlX2xvY2FscyA9IGt3YXJncy5nZXQoJ2NhcHR1cmVfbG9jYWxzJywgRmFsc2UpCisgICAgICAgIGRlZiBmb3JtYXQoc2VsZik6CisgICAgICAgICAgICByZXN1bHQgPSBbJ0EgdHJhY2ViYWNrJ10KKyAgICAgICAgICAgIGlmIHNlbGYuY2FwdHVyZV9sb2NhbHM6CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnbG9jYWxzJykKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQKKworZGVmIHJlc3RvcmVfdHJhY2ViYWNrKCk6CisgICAgdW5pdHRlc3QucmVzdWx0LnRyYWNlYmFjayA9IHRyYWNlYmFjaworCisKIGNsYXNzIFRlc3RfVGVzdFJlc3VsdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgIyBOb3RlOiB0aGVyZSBhcmUgbm90IHNlcGFyYXRlIHRlc3RzIGZvciBUZXN0UmVzdWx0Lndhc1N1Y2Nlc3NmdWwoKSwKICAgICAjIFRlc3RSZXN1bHQuZXJyb3JzLCBUZXN0UmVzdWx0LmZhaWx1cmVzLCBUZXN0UmVzdWx0LnRlc3RzUnVuIG9yCkBAIC0yMjcsNiArMjQxLDI1IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0SXModGVzdF9jYXNlLCB0ZXN0KQogICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZm9ybWF0dGVkX2V4Yywgc3RyKQogCisgICAgZGVmIHRlc3RfYWRkRXJyb3JfbG9jYWxzKHNlbGYpOgorICAgICAgICBjbGFzcyBGb28odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3RfMShzZWxmKToKKyAgICAgICAgICAgICAgICAxLzAKKworICAgICAgICB0ZXN0ID0gRm9vKCd0ZXN0XzEnKQorICAgICAgICByZXN1bHQgPSB1bml0dGVzdC5UZXN0UmVzdWx0KCkKKyAgICAgICAgcmVzdWx0LnRiX2xvY2FscyA9IFRydWUKKworICAgICAgICB1bml0dGVzdC5yZXN1bHQudHJhY2ViYWNrID0gTW9ja1RyYWNlYmFjaworICAgICAgICBzZWxmLmFkZENsZWFudXAocmVzdG9yZV90cmFjZWJhY2spCisgICAgICAgIHJlc3VsdC5zdGFydFRlc3RSdW4oKQorICAgICAgICB0ZXN0LnJ1bihyZXN1bHQpCisgICAgICAgIHJlc3VsdC5zdG9wVGVzdFJ1bigpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0LmVycm9ycyksIDEpCisgICAgICAgIHRlc3RfY2FzZSwgZm9ybWF0dGVkX2V4YyA9IHJlc3VsdC5lcnJvcnNbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnQSB0cmFjZWJhY2tsb2NhbHMnLCBmb3JtYXR0ZWRfZXhjKQorCiAgICAgZGVmIHRlc3RfYWRkU3ViVGVzdChzZWxmKToKICAgICAgICAgY2xhc3MgRm9vKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICAgICAgICAgIGRlZiB0ZXN0XzEoc2VsZik6CkBAIC0zOTgsNiArNDMxLDcgQEAKICAgICBzZWxmLnRlc3RzUnVuID0gMAogICAgIHNlbGYuc2hvdWxkU3RvcCA9IEZhbHNlCiAgICAgc2VsZi5idWZmZXIgPSBGYWxzZQorICAgIHNlbGYudGJfbG9jYWxzID0gRmFsc2UKIAogY2xhc3NEaWN0WydfX2luaXRfXyddID0gX19pbml0X18KIE9sZFJlc3VsdCA9IHR5cGUoJ09sZFJlc3VsdCcsIChvYmplY3QsKSwgY2xhc3NEaWN0KQpAQCAtNDU0LDE1ICs0ODgsNiBAQAogICAgICAgICBydW5uZXIucnVuKFRlc3QoJ3Rlc3RGb28nKSkKIAogCi1jbGFzcyBNb2NrVHJhY2ViYWNrKG9iamVjdCk6Ci0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBmb3JtYXRfZXhjZXB0aW9uKCpfKToKLSAgICAgICAgcmV0dXJuIFsnQSB0cmFjZWJhY2snXQotCi1kZWYgcmVzdG9yZV90cmFjZWJhY2soKToKLSAgICB1bml0dGVzdC5yZXN1bHQudHJhY2ViYWNrID0gdHJhY2ViYWNrCi0KLQogY2xhc3MgVGVzdE91dHB1dEJ1ZmZlcmluZyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBkZWYgc2V0VXAoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvdW5pdHRlc3QvdGVzdC90ZXN0X3J1bm5lci5weSBiL0xpYi91bml0dGVzdC90ZXN0L3Rlc3RfcnVubmVyLnB5CmluZGV4IDdjMGJkNTEuLjljYmMyNjAgMTAwNjQ0Ci0tLSBhL0xpYi91bml0dGVzdC90ZXN0L3Rlc3RfcnVubmVyLnB5CisrKyBiL0xpYi91bml0dGVzdC90ZXN0L3Rlc3RfcnVubmVyLnB5CkBAIC0xNTgsNyArMTU4LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChydW5uZXIud2FybmluZ3MsIE5vbmUpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShydW5uZXIuZGVzY3JpcHRpb25zKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJ1bm5lci5yZXN1bHRjbGFzcywgdW5pdHRlc3QuVGV4dFRlc3RSZXN1bHQpCi0KKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShydW5uZXIudGJfbG9jYWxzKQogCiAgICAgZGVmIHRlc3RfbXVsdGlwbGVfaW5oZXJpdGFuY2Uoc2VsZik6CiAgICAgICAgIGNsYXNzIEFSZXN1bHQodW5pdHRlc3QuVGVzdFJlc3VsdCk6CkBAIC0xNzIsMTQgKzE3MiwxMyBAQAogICAgICAgICAjIG9uIGFyZ3VtZW50cyBpbiBpdHMgX19pbml0X18gc3VwZXIgY2FsbAogICAgICAgICBBVGV4dFJlc3VsdChOb25lLCBOb25lLCAxKQogCi0KICAgICBkZWYgdGVzdEJ1ZmZlckFuZEZhaWxmYXN0KHNlbGYpOgogICAgICAgICBjbGFzcyBUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICAgICAgICAgIGRlZiB0ZXN0Rm9vKHNlbGYpOgogICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgcmVzdWx0ID0gdW5pdHRlc3QuVGVzdFJlc3VsdCgpCiAgICAgICAgIHJ1bm5lciA9IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHN0cmVhbT1pby5TdHJpbmdJTygpLCBmYWlsZmFzdD1UcnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcj1UcnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXI9VHJ1ZSkKICAgICAgICAgIyBVc2Ugb3VyIHJlc3VsdCBvYmplY3QKICAgICAgICAgcnVubmVyLl9tYWtlUmVzdWx0ID0gbGFtYmRhOiByZXN1bHQKICAgICAgICAgcnVubmVyLnJ1bihUZXN0KCd0ZXN0Rm9vJykpCkBAIC0xODcsNiArMTg2LDExIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHQuZmFpbGZhc3QpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHQuYnVmZmVyKQogCisgICAgZGVmIHRlc3RfbG9jYWxzKHNlbGYpOgorICAgICAgICBydW5uZXIgPSB1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcihzdHJlYW09aW8uU3RyaW5nSU8oKSwgdGJfbG9jYWxzPVRydWUpCisgICAgICAgIHJlc3VsdCA9IHJ1bm5lci5ydW4odW5pdHRlc3QuVGVzdFN1aXRlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZSwgcmVzdWx0LnRiX2xvY2FscykKKwogICAgIGRlZiB0ZXN0UnVubmVyUmVnaXN0ZXJzUmVzdWx0KHNlbGYpOgogICAgICAgICBjbGFzcyBUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICAgICAgICAgIGRlZiB0ZXN0Rm9vKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3VybGxpYi9wYXJzZS5weSBiL0xpYi91cmxsaWIvcGFyc2UucHkKaW5kZXggODIxZGFlNi4uNjY0MjBkMiAxMDA2NDQKLS0tIGEvTGliL3VybGxpYi9wYXJzZS5weQorKysgYi9MaWIvdXJsbGliL3BhcnNlLnB5CkBAIC04NjksMTIgKzg2OSwxMiBAQAogICAgICIiInNwbGl0dHlwZSgndHlwZTpvcGFxdWVzdHJpbmcnKSAtLT4gJ3R5cGUnLCAnb3BhcXVlc3RyaW5nJy4iIiIKICAgICBnbG9iYWwgX3R5cGVwcm9nCiAgICAgaWYgX3R5cGVwcm9nIGlzIE5vbmU6Ci0gICAgICAgIF90eXBlcHJvZyA9IHJlLmNvbXBpbGUoJ14oW14vOl0rKTonKQorICAgICAgICBfdHlwZXByb2cgPSByZS5jb21waWxlKCcoW14vOl0rKTooLiopJywgcmUuRE9UQUxMKQogCiAgICAgbWF0Y2ggPSBfdHlwZXByb2cubWF0Y2godXJsKQogICAgIGlmIG1hdGNoOgotICAgICAgICBzY2hlbWUgPSBtYXRjaC5ncm91cCgxKQotICAgICAgICByZXR1cm4gc2NoZW1lLmxvd2VyKCksIHVybFtsZW4oc2NoZW1lKSArIDE6XQorICAgICAgICBzY2hlbWUsIGRhdGEgPSBtYXRjaC5ncm91cHMoKQorICAgICAgICByZXR1cm4gc2NoZW1lLmxvd2VyKCksIGRhdGEKICAgICByZXR1cm4gTm9uZSwgdXJsCiAKIF9ob3N0cHJvZyA9IE5vbmUKQEAgLTg4MiwzOCArODgyLDI1IEBACiAgICAgIiIic3BsaXRob3N0KCcvL2hvc3RbOnBvcnRdL3BhdGgnKSAtLT4gJ2hvc3RbOnBvcnRdJywgJy9wYXRoJy4iIiIKICAgICBnbG9iYWwgX2hvc3Rwcm9nCiAgICAgaWYgX2hvc3Rwcm9nIGlzIE5vbmU6Ci0gICAgICAgIF9ob3N0cHJvZyA9IHJlLmNvbXBpbGUoJ14vLyhbXi8/XSopKC4qKSQnKQorICAgICAgICBfaG9zdHByb2cgPSByZS5jb21waWxlKCcvLyhbXi8/XSopKC4qKScsIHJlLkRPVEFMTCkKIAogICAgIG1hdGNoID0gX2hvc3Rwcm9nLm1hdGNoKHVybCkKICAgICBpZiBtYXRjaDoKLSAgICAgICAgaG9zdF9wb3J0ID0gbWF0Y2guZ3JvdXAoMSkKLSAgICAgICAgcGF0aCA9IG1hdGNoLmdyb3VwKDIpCi0gICAgICAgIGlmIHBhdGggYW5kIG5vdCBwYXRoLnN0YXJ0c3dpdGgoJy8nKToKKyAgICAgICAgaG9zdF9wb3J0LCBwYXRoID0gbWF0Y2guZ3JvdXBzKCkKKyAgICAgICAgaWYgcGF0aCBhbmQgcGF0aFswXSAhPSAnLyc6CiAgICAgICAgICAgICBwYXRoID0gJy8nICsgcGF0aAogICAgICAgICByZXR1cm4gaG9zdF9wb3J0LCBwYXRoCiAgICAgcmV0dXJuIE5vbmUsIHVybAogCi1fdXNlcnByb2cgPSBOb25lCiBkZWYgc3BsaXR1c2VyKGhvc3QpOgogICAgICIiInNwbGl0dXNlcigndXNlcls6cGFzc3dkXUBob3N0Wzpwb3J0XScpIC0tPiAndXNlcls6cGFzc3dkXScsICdob3N0Wzpwb3J0XScuIiIiCi0gICAgZ2xvYmFsIF91c2VycHJvZwotICAgIGlmIF91c2VycHJvZyBpcyBOb25lOgotICAgICAgICBfdXNlcnByb2cgPSByZS5jb21waWxlKCdeKC4qKUAoLiopJCcpCisgICAgdXNlciwgZGVsaW0sIGhvc3QgPSBob3N0LnJwYXJ0aXRpb24oJ0AnKQorICAgIHJldHVybiAodXNlciBpZiBkZWxpbSBlbHNlIE5vbmUpLCBob3N0CiAKLSAgICBtYXRjaCA9IF91c2VycHJvZy5tYXRjaChob3N0KQotICAgIGlmIG1hdGNoOiByZXR1cm4gbWF0Y2guZ3JvdXAoMSwgMikKLSAgICByZXR1cm4gTm9uZSwgaG9zdAotCi1fcGFzc3dkcHJvZyA9IE5vbmUKIGRlZiBzcGxpdHBhc3N3ZCh1c2VyKToKICAgICAiIiJzcGxpdHBhc3N3ZCgndXNlcjpwYXNzd2QnKSAtPiAndXNlcicsICdwYXNzd2QnLiIiIgotICAgIGdsb2JhbCBfcGFzc3dkcHJvZwotICAgIGlmIF9wYXNzd2Rwcm9nIGlzIE5vbmU6Ci0gICAgICAgIF9wYXNzd2Rwcm9nID0gcmUuY29tcGlsZSgnXihbXjpdKik6KC4qKSQnLHJlLlMpCi0KLSAgICBtYXRjaCA9IF9wYXNzd2Rwcm9nLm1hdGNoKHVzZXIpCi0gICAgaWYgbWF0Y2g6IHJldHVybiBtYXRjaC5ncm91cCgxLCAyKQotICAgIHJldHVybiB1c2VyLCBOb25lCisgICAgdXNlciwgZGVsaW0sIHBhc3N3ZCA9IHVzZXIucGFydGl0aW9uKCc6JykKKyAgICByZXR1cm4gdXNlciwgKHBhc3N3ZCBpZiBkZWxpbSBlbHNlIE5vbmUpCiAKICMgc3BsaXR0YWcoJy9wYXRoI3RhZycpIC0tPiAnL3BhdGgnLCAndGFnJwogX3BvcnRwcm9nID0gTm9uZQpAQCAtOTIxLDcgKzkwOCw3IEBACiAgICAgIiIic3BsaXRwb3J0KCdob3N0OnBvcnQnKSAtLT4gJ2hvc3QnLCAncG9ydCcuIiIiCiAgICAgZ2xvYmFsIF9wb3J0cHJvZwogICAgIGlmIF9wb3J0cHJvZyBpcyBOb25lOgotICAgICAgICBfcG9ydHByb2cgPSByZS5jb21waWxlKCdeKC4qKTooWzAtOV0qKSQnKQorICAgICAgICBfcG9ydHByb2cgPSByZS5jb21waWxlKCcoLiopOihbMC05XSopJCcsIHJlLkRPVEFMTCkKIAogICAgIG1hdGNoID0gX3BvcnRwcm9nLm1hdGNoKGhvc3QpCiAgICAgaWYgbWF0Y2g6CkBAIC05MzAsNDcgKzkxNywzNCBAQAogICAgICAgICAgICAgcmV0dXJuIGhvc3QsIHBvcnQKICAgICByZXR1cm4gaG9zdCwgTm9uZQogCi1fbnBvcnRwcm9nID0gTm9uZQogZGVmIHNwbGl0bnBvcnQoaG9zdCwgZGVmcG9ydD0tMSk6CiAgICAgIiIiU3BsaXQgaG9zdCBhbmQgcG9ydCwgcmV0dXJuaW5nIG51bWVyaWMgcG9ydC4KICAgICBSZXR1cm4gZ2l2ZW4gZGVmYXVsdCBwb3J0IGlmIG5vICc6JyBmb3VuZDsgZGVmYXVsdHMgdG8gLTEuCiAgICAgUmV0dXJuIG51bWVyaWNhbCBwb3J0IGlmIGEgdmFsaWQgbnVtYmVyIGFyZSBmb3VuZCBhZnRlciAnOicuCiAgICAgUmV0dXJuIE5vbmUgaWYgJzonIGJ1dCBub3QgYSB2YWxpZCBudW1iZXIuIiIiCi0gICAgZ2xvYmFsIF9ucG9ydHByb2cKLSAgICBpZiBfbnBvcnRwcm9nIGlzIE5vbmU6Ci0gICAgICAgIF9ucG9ydHByb2cgPSByZS5jb21waWxlKCdeKC4qKTooLiopJCcpCi0KLSAgICBtYXRjaCA9IF9ucG9ydHByb2cubWF0Y2goaG9zdCkKLSAgICBpZiBtYXRjaDoKLSAgICAgICAgaG9zdCwgcG9ydCA9IG1hdGNoLmdyb3VwKDEsIDIpCi0gICAgICAgIGlmIHBvcnQ6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgbnBvcnQgPSBpbnQocG9ydCkKLSAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgotICAgICAgICAgICAgICAgIG5wb3J0ID0gTm9uZQotICAgICAgICAgICAgcmV0dXJuIGhvc3QsIG5wb3J0CisgICAgaG9zdCwgZGVsaW0sIHBvcnQgPSBob3N0LnJwYXJ0aXRpb24oJzonKQorICAgIGlmIG5vdCBkZWxpbToKKyAgICAgICAgaG9zdCA9IHBvcnQKKyAgICBlbGlmIHBvcnQ6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG5wb3J0ID0gaW50KHBvcnQpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgbnBvcnQgPSBOb25lCisgICAgICAgIHJldHVybiBob3N0LCBucG9ydAogICAgIHJldHVybiBob3N0LCBkZWZwb3J0CiAKLV9xdWVyeXByb2cgPSBOb25lCiBkZWYgc3BsaXRxdWVyeSh1cmwpOgogICAgICIiInNwbGl0cXVlcnkoJy9wYXRoP3F1ZXJ5JykgLS0+ICcvcGF0aCcsICdxdWVyeScuIiIiCi0gICAgZ2xvYmFsIF9xdWVyeXByb2cKLSAgICBpZiBfcXVlcnlwcm9nIGlzIE5vbmU6Ci0gICAgICAgIF9xdWVyeXByb2cgPSByZS5jb21waWxlKCdeKC4qKVw/KFteP10qKSQnKQotCi0gICAgbWF0Y2ggPSBfcXVlcnlwcm9nLm1hdGNoKHVybCkKLSAgICBpZiBtYXRjaDogcmV0dXJuIG1hdGNoLmdyb3VwKDEsIDIpCisgICAgcGF0aCwgZGVsaW0sIHF1ZXJ5ID0gdXJsLnJwYXJ0aXRpb24oJz8nKQorICAgIGlmIGRlbGltOgorICAgICAgICByZXR1cm4gcGF0aCwgcXVlcnkKICAgICByZXR1cm4gdXJsLCBOb25lCiAKLV90YWdwcm9nID0gTm9uZQogZGVmIHNwbGl0dGFnKHVybCk6CiAgICAgIiIic3BsaXR0YWcoJy9wYXRoI3RhZycpIC0tPiAnL3BhdGgnLCAndGFnJy4iIiIKLSAgICBnbG9iYWwgX3RhZ3Byb2cKLSAgICBpZiBfdGFncHJvZyBpcyBOb25lOgotICAgICAgICBfdGFncHJvZyA9IHJlLmNvbXBpbGUoJ14oLiopIyhbXiNdKikkJykKLQotICAgIG1hdGNoID0gX3RhZ3Byb2cubWF0Y2godXJsKQotICAgIGlmIG1hdGNoOiByZXR1cm4gbWF0Y2guZ3JvdXAoMSwgMikKKyAgICBwYXRoLCBkZWxpbSwgdGFnID0gdXJsLnJwYXJ0aXRpb24oJyMnKQorICAgIGlmIGRlbGltOgorICAgICAgICByZXR1cm4gcGF0aCwgdGFnCiAgICAgcmV0dXJuIHVybCwgTm9uZQogCiBkZWYgc3BsaXRhdHRyKHVybCk6CkBAIC05NzksMTMgKzk1Myw3IEBACiAgICAgd29yZHMgPSB1cmwuc3BsaXQoJzsnKQogICAgIHJldHVybiB3b3Jkc1swXSwgd29yZHNbMTpdCiAKLV92YWx1ZXByb2cgPSBOb25lCiBkZWYgc3BsaXR2YWx1ZShhdHRyKToKICAgICAiIiJzcGxpdHZhbHVlKCdhdHRyPXZhbHVlJykgLS0+ICdhdHRyJywgJ3ZhbHVlJy4iIiIKLSAgICBnbG9iYWwgX3ZhbHVlcHJvZwotICAgIGlmIF92YWx1ZXByb2cgaXMgTm9uZToKLSAgICAgICAgX3ZhbHVlcHJvZyA9IHJlLmNvbXBpbGUoJ14oW149XSopPSguKikkJykKLQotICAgIG1hdGNoID0gX3ZhbHVlcHJvZy5tYXRjaChhdHRyKQotICAgIGlmIG1hdGNoOiByZXR1cm4gbWF0Y2guZ3JvdXAoMSwgMikKLSAgICByZXR1cm4gYXR0ciwgTm9uZQorICAgIGF0dHIsIGRlbGltLCB2YWx1ZSA9IGF0dHIucGFydGl0aW9uKCc9JykKKyAgICByZXR1cm4gYXR0ciwgKHZhbHVlIGlmIGRlbGltIGVsc2UgTm9uZSkKZGlmZiAtLWdpdCBhL01hYy9CdWlsZFNjcmlwdC9idWlsZC1pbnN0YWxsZXIucHkgYi9NYWMvQnVpbGRTY3JpcHQvYnVpbGQtaW5zdGFsbGVyLnB5CmluZGV4IDE2NTc2ZDUuLjBhZTFjYjYgMTAwNzU1Ci0tLSBhL01hYy9CdWlsZFNjcmlwdC9idWlsZC1pbnN0YWxsZXIucHkKKysrIGIvTWFjL0J1aWxkU2NyaXB0L2J1aWxkLWluc3RhbGxlci5weQpAQCAtMjM3LDkgKzIzNyw5IEBACiAKICAgICAgICAgcmVzdWx0LmV4dGVuZChbCiAgICAgICAgICAgZGljdCgKLSAgICAgICAgICAgICAgbmFtZT0iT3BlblNTTCAxLjAuMWwiLAotICAgICAgICAgICAgICB1cmw9Imh0dHBzOi8vd3d3Lm9wZW5zc2wub3JnL3NvdXJjZS9vcGVuc3NsLTEuMC4xbC50YXIuZ3oiLAotICAgICAgICAgICAgICBjaGVja3N1bT0nY2RiMjI5MjVmYzliYzk3Y2NiZjFlMDA3NjYxZjJhYTYnLAorICAgICAgICAgICAgICBuYW1lPSJPcGVuU1NMIDEuMC4yIiwKKyAgICAgICAgICAgICAgdXJsPSJodHRwczovL3d3dy5vcGVuc3NsLm9yZy9zb3VyY2Uvb3BlbnNzbC0xLjAuMi50YXIuZ3oiLAorICAgICAgICAgICAgICBjaGVja3N1bT0nMzgzNzMwMTNmYzg1Yzc5MGFhYmY4ODM3OTY5YzVlYmEnLAogICAgICAgICAgICAgICBwYXRjaGVzPVsKICAgICAgICAgICAgICAgICAgICJvcGVuc3NsX3Nka19tYWtlZGVwZW5kLnBhdGNoIiwKICAgICAgICAgICAgICAgICAgICBdLApkaWZmIC0tZ2l0IGEvTWFjL0J1aWxkU2NyaXB0L29wZW5zc2xfc2RrX21ha2VkZXBlbmQucGF0Y2ggYi9NYWMvQnVpbGRTY3JpcHQvb3BlbnNzbF9zZGtfbWFrZWRlcGVuZC5wYXRjaAppbmRleCBhNzJmNWEzLi5jMmU2NmMyIDEwMDY0NAotLS0gYS9NYWMvQnVpbGRTY3JpcHQvb3BlbnNzbF9zZGtfbWFrZWRlcGVuZC5wYXRjaAorKysgYi9NYWMvQnVpbGRTY3JpcHQvb3BlbnNzbF9zZGtfbWFrZWRlcGVuZC5wYXRjaApAQCAtMSwxNiArMSwxOCBAQAorIyBIRyBjaGFuZ2VzZXQgcGF0Y2gKKyMgUGFyZW50ICA5NzM3NDFjZjVhMDQ1YjJiYTg5NTA5NGQ5OGIyYzM2NDlkYzAwYjYxCiAjIG9wZW5zc2xfc2RrX21ha2VkZXBlbmQucGF0Y2gKICMKLSMgCXVzaW5nIG9wZW5zc2wgMS4wLjFrCisjIAl1c2luZyBvcGVuc3NsIDEuMC4yCiAjCiAjIC0gc3VwcG9ydCBidWlsZGluZyB3aXRoIGFuIE9TIFggU0RLCiAjIC0gYWxsb3cgIm1ha2UgZGVwZW5kIiB0byB1c2UgY29tcGlsZXJzIHdpdGggbmFtZXMgb3RoZXIgdGhhbiAiZ2NjIgogCiBkaWZmIENvbmZpZ3VyZQogCi1kaWZmIC1yIDk5YWU0MzlhMDdmMSBDb25maWd1cmUKLS0tLSBhL0NvbmZpZ3VyZQlGcmkgSmFuIDA5IDEyOjUwOjQzIDIwMTUgLTA4MDAKLSsrKyBiL0NvbmZpZ3VyZQlGcmkgSmFuIDA5IDEyOjUzOjUyIDIwMTUgLTA4MDAKLUBAIC01NzcsMTEgKzU3NywxMSBAQAorZGlmZiAtciA5NzM3NDFjZjVhMDQgQ29uZmlndXJlCistLS0gYS9Db25maWd1cmUJVGh1IE1hciAwNSAxMzo0NTo1OSAyMDE1IC0wODAwCisrKysgYi9Db25maWd1cmUJVGh1IE1hciAwNSAxNDowMDoyMCAyMDE1IC0wODAwCitAQCAtNjE3LDEyICs2MTcsMTIgQEAKICAKICAjIyMjIyBNYWNPUyBYIChhLmsuYS4gUmhhcHNvZHkgb3IgRGFyd2luKSBzZXR1cAogICJyaGFwc29keS1wcGMtY2MiLCJjYzotTzMgLURCX0VORElBTjo6KHVua25vd24pOk1BQ09TWF9SSEFQU09EWTo6Qk5fTExPTkcgUkM0X0NIQVIgUkM0X0NIVU5LIERFU19VTlJPTEwgQkZfUFRSOiR7bm9fYXNtfTo6IiwKQEAgLTE4LDE2ICsyMCwxOCBAQAogLSJkYXJ3aW42NC1wcGMtY2MiLCJjYzotYXJjaCBwcGM2NCAtTzMgLURCX0VORElBTjo6LURfUkVFTlRSQU5UOk1BQ09TWDotV2wsLXNlYXJjaF9wYXRoc19maXJzdCU6U0lYVFlfRk9VUl9CSVRfTE9ORyBSQzRfQ0hBUiBSQzRfQ0hVTksgREVTX1VOUk9MTCBCRl9QVFI6JHtwcGM2NF9hc219Om9zeDY0OmRsZmNuOmRhcndpbi1zaGFyZWQ6LWZQSUMgLWZuby1jb21tb246LWFyY2ggcHBjNjQgLWR5bmFtaWNsaWI6LlwkKFNITElCX01BSk9SKS5cJChTSExJQl9NSU5PUikuZHlsaWIiLAogLSJkYXJ3aW4taTM4Ni1jYyIsImNjOi1hcmNoIGkzODYgLU8zIC1mb21pdC1mcmFtZS1wb2ludGVyIC1ETF9FTkRJQU46Oi1EX1JFRU5UUkFOVDpNQUNPU1g6LVdsLC1zZWFyY2hfcGF0aHNfZmlyc3QlOkJOX0xMT05HIFJDNF9JTlQgUkM0X0NIVU5LIERFU19VTlJPTEwgQkZfUFRSOiIuZXZhbHtteSAkYXNtPSR4ODZfYXNtOyRhc209fnMvY2FzdFwtNTg2XC5vLy87JGFzbX0uIjptYWNvc3g6ZGxmY246ZGFyd2luLXNoYXJlZDotZlBJQyAtZm5vLWNvbW1vbjotYXJjaCBpMzg2IC1keW5hbWljbGliOi5cJChTSExJQl9NQUpPUikuXCQoU0hMSUJfTUlOT1IpLmR5bGliIiwKIC0iZGVidWctZGFyd2luLWkzODYtY2MiLCJjYzotYXJjaCBpMzg2IC1nMyAtRExfRU5ESUFOOjotRF9SRUVOVFJBTlQ6TUFDT1NYOi1XbCwtc2VhcmNoX3BhdGhzX2ZpcnN0JTpCTl9MTE9ORyBSQzRfSU5UIFJDNF9DSFVOSyBERVNfVU5ST0xMIEJGX1BUUjoke3g4Nl9hc219Om1hY29zeDpkbGZjbjpkYXJ3aW4tc2hhcmVkOi1mUElDIC1mbm8tY29tbW9uOi1hcmNoIGkzODYgLWR5bmFtaWNsaWI6LlwkKFNITElCX01BSk9SKS5cJChTSExJQl9NSU5PUikuZHlsaWIiLAotLSJkYXJ3aW42NC14ODZfNjQtY2MiLCJjYzotYXJjaCB4ODZfNjQgLU8zIC1ETF9FTkRJQU4gLVdhbGw6Oi1EX1JFRU5UUkFOVDpNQUNPU1g6LVdsLC1zZWFyY2hfcGF0aHNfZmlyc3QlOlNJWFRZX0ZPVVJfQklUX0xPTkcgUkM0X0NIQVIgUkM0X0NIVU5LIERFU19JTlQgREVTX1VOUk9MTDoiLmV2YWx7bXkgJGFzbT0keDg2XzY0X2FzbTskYXNtPX5zL3JjNFwtW146XSsvLzskYXNtfS4iOm1hY29zeDpkbGZjbjpkYXJ3aW4tc2hhcmVkOi1mUElDIC1mbm8tY29tbW9uOi1hcmNoIHg4Nl82NCAtZHluYW1pY2xpYjouXCQoU0hMSUJfTUFKT1IpLlwkKFNITElCX01JTk9SKS5keWxpYiIsCistImRhcndpbjY0LXg4Nl82NC1jYyIsImNjOi1hcmNoIHg4Nl82NCAtTzMgLURMX0VORElBTiAtV2FsbDo6LURfUkVFTlRSQU5UOk1BQ09TWDotV2wsLXNlYXJjaF9wYXRoc19maXJzdCU6U0lYVFlfRk9VUl9CSVRfTE9ORyBSQzRfQ0hVTksgREVTX0lOVCBERVNfVU5ST0xMOiIuZXZhbHtteSAkYXNtPSR4ODZfNjRfYXNtOyRhc209fnMvcmM0XC1bXjpdKy8vOyRhc219LiI6bWFjb3N4OmRsZmNuOmRhcndpbi1zaGFyZWQ6LWZQSUMgLWZuby1jb21tb246LWFyY2ggeDg2XzY0IC1keW5hbWljbGliOi5cJChTSExJQl9NQUpPUikuXCQoU0hMSUJfTUlOT1IpLmR5bGliIiwKKy0iZGVidWctZGFyd2luNjQteDg2XzY0LWNjIiwiY2M6LWFyY2ggeDg2XzY0IC1nZ2RiIC1nMiAtTzAgLURMX0VORElBTiAtV2FsbDo6LURfUkVFTlRSQU5UOk1BQ09TWDotV2wsLXNlYXJjaF9wYXRoc19maXJzdCU6U0lYVFlfRk9VUl9CSVRfTE9ORyBSQzRfQ0hVTksgREVTX0lOVCBERVNfVU5ST0xMOiIuZXZhbHtteSAkYXNtPSR4ODZfNjRfYXNtOyRhc209fnMvcmM0XC1bXjpdKy8vOyRhc219LiI6bWFjb3N4OmRsZmNuOmRhcndpbi1zaGFyZWQ6LWZQSUMgLWZuby1jb21tb246LWFyY2ggeDg2XzY0IC1keW5hbWljbGliOi5cJChTSExJQl9NQUpPUikuXCQoU0hMSUJfTUlOT1IpLmR5bGliIiwKICsiZGFyd2luLXBwYy1jYyIsImNjOi1hcmNoIHBwYyAtaXN5c3Jvb3QgXCQoT1NYX1NESykgLU8zIC1EQl9FTkRJQU4gLVdhLC1mb3JjZV9jcHVzdWJ0eXBlX0FMTDo6LURfUkVFTlRSQU5UOk1BQ09TWDotV2wsLXNlYXJjaF9wYXRoc19maXJzdCU6Qk5fTExPTkcgUkM0X0NIQVIgUkM0X0NIVU5LIERFU19VTlJPTEwgQkZfUFRSOiR7cHBjMzJfYXNtfTpvc3gzMjpkbGZjbjpkYXJ3aW4tc2hhcmVkOi1mUElDIC1mbm8tY29tbW9uOi1hcmNoIHBwYyAtZHluYW1pY2xpYjouXCQoU0hMSUJfTUFKT1IpLlwkKFNITElCX01JTk9SKS5keWxpYiIsCiArImRhcndpbjY0LXBwYy1jYyIsImNjOi1hcmNoIHBwYzY0IC1pc3lzcm9vdCBcJChPU1hfU0RLKSAtTzMgLURCX0VORElBTjo6LURfUkVFTlRSQU5UOk1BQ09TWDotV2wsLXNlYXJjaF9wYXRoc19maXJzdCU6U0lYVFlfRk9VUl9CSVRfTE9ORyBSQzRfQ0hBUiBSQzRfQ0hVTksgREVTX1VOUk9MTCBCRl9QVFI6JHtwcGM2NF9hc219Om9zeDY0OmRsZmNuOmRhcndpbi1zaGFyZWQ6LWZQSUMgLWZuby1jb21tb246LWFyY2ggcHBjNjQgLWR5bmFtaWNsaWI6LlwkKFNITElCX01BSk9SKS5cJChTSExJQl9NSU5PUikuZHlsaWIiLAogKyJkYXJ3aW4taTM4Ni1jYyIsImNjOi1hcmNoIGkzODYgLWlzeXNyb290IFwkKE9TWF9TREspIC1PMyAtZm9taXQtZnJhbWUtcG9pbnRlciAtRExfRU5ESUFOOjotRF9SRUVOVFJBTlQ6TUFDT1NYOi1XbCwtc2VhcmNoX3BhdGhzX2ZpcnN0JTpCTl9MTE9ORyBSQzRfSU5UIFJDNF9DSFVOSyBERVNfVU5ST0xMIEJGX1BUUjoiLmV2YWx7bXkgJGFzbT0keDg2X2FzbTskYXNtPX5zL2Nhc3RcLTU4Nlwuby8vOyRhc219LiI6bWFjb3N4OmRsZmNuOmRhcndpbi1zaGFyZWQ6LWZQSUMgLWZuby1jb21tb246LWFyY2ggaTM4NiAtZHluYW1pY2xpYjouXCQoU0hMSUJfTUFKT1IpLlwkKFNITElCX01JTk9SKS5keWxpYiIsCiArImRlYnVnLWRhcndpbi1pMzg2LWNjIiwiY2M6LWFyY2ggaTM4NiAtaXN5c3Jvb3QgXCQoT1NYX1NESykgLWczIC1ETF9FTkRJQU46Oi1EX1JFRU5UUkFOVDpNQUNPU1g6LVdsLC1zZWFyY2hfcGF0aHNfZmlyc3QlOkJOX0xMT05HIFJDNF9JTlQgUkM0X0NIVU5LIERFU19VTlJPTEwgQkZfUFRSOiR7eDg2X2FzbX06bWFjb3N4OmRsZmNuOmRhcndpbi1zaGFyZWQ6LWZQSUMgLWZuby1jb21tb246LWFyY2ggaTM4NiAtZHluYW1pY2xpYjouXCQoU0hMSUJfTUFKT1IpLlwkKFNITElCX01JTk9SKS5keWxpYiIsCi0rImRhcndpbjY0LXg4Nl82NC1jYyIsImNjOi1hcmNoIHg4Nl82NCAtaXN5c3Jvb3QgXCQoT1NYX1NESykgLU8zIC1ETF9FTkRJQU4gLVdhbGw6Oi1EX1JFRU5UUkFOVDpNQUNPU1g6LVdsLC1zZWFyY2hfcGF0aHNfZmlyc3QlOlNJWFRZX0ZPVVJfQklUX0xPTkcgUkM0X0NIQVIgUkM0X0NIVU5LIERFU19JTlQgREVTX1VOUk9MTDoiLmV2YWx7bXkgJGFzbT0keDg2XzY0X2FzbTskYXNtPX5zL3JjNFwtW146XSsvLzskYXNtfS4iOm1hY29zeDpkbGZjbjpkYXJ3aW4tc2hhcmVkOi1mUElDIC1mbm8tY29tbW9uOi1hcmNoIHg4Nl82NCAtZHluYW1pY2xpYjouXCQoU0hMSUJfTUFKT1IpLlwkKFNITElCX01JTk9SKS5keWxpYiIsCisrImRhcndpbjY0LXg4Nl82NC1jYyIsImNjOi1hcmNoIHg4Nl82NCAtaXN5c3Jvb3QgXCQoT1NYX1NESykgLU8zIC1ETF9FTkRJQU4gLVdhbGw6Oi1EX1JFRU5UUkFOVDpNQUNPU1g6LVdsLC1zZWFyY2hfcGF0aHNfZmlyc3QlOlNJWFRZX0ZPVVJfQklUX0xPTkcgUkM0X0NIVU5LIERFU19JTlQgREVTX1VOUk9MTDoiLmV2YWx7bXkgJGFzbT0keDg2XzY0X2FzbTskYXNtPX5zL3JjNFwtW146XSsvLzskYXNtfS4iOm1hY29zeDpkbGZjbjpkYXJ3aW4tc2hhcmVkOi1mUElDIC1mbm8tY29tbW9uOi1hcmNoIHg4Nl82NCAtZHluYW1pY2xpYjouXCQoU0hMSUJfTUFKT1IpLlwkKFNITElCX01JTk9SKS5keWxpYiIsCisrImRlYnVnLWRhcndpbjY0LXg4Nl82NC1jYyIsImNjOi1hcmNoIHg4Nl82NCAtaXN5c3Jvb3QgXCQoT1NYX1NESykgLWdnZGIgLWcyIC1PMCAtRExfRU5ESUFOIC1XYWxsOjotRF9SRUVOVFJBTlQ6TUFDT1NYOi1XbCwtc2VhcmNoX3BhdGhzX2ZpcnN0JTpTSVhUWV9GT1VSX0JJVF9MT05HIFJDNF9DSFVOSyBERVNfSU5UIERFU19VTlJPTEw6Ii5ldmFse215ICRhc209JHg4Nl82NF9hc207JGFzbT1+cy9yYzRcLVteOl0rLy87JGFzbX0uIjptYWNvc3g6ZGxmY246ZGFyd2luLXNoYXJlZDotZlBJQyAtZm5vLWNvbW1vbjotYXJjaCB4ODZfNjQgLWR5bmFtaWNsaWI6LlwkKFNITElCX01BSk9SKS5cJChTSExJQl9NSU5PUikuZHlsaWIiLAogICJkZWJ1Zy1kYXJ3aW4tcHBjLWNjIiwiY2M6LURCTl9ERUJVRyAtRFJFRl9DSEVDSyAtRENPTkZfREVCVUcgLURDUllQVE9fTURFQlVHIC1EQl9FTkRJQU4gLWcgLVdhbGwgLU86Oi1EX1JFRU5UUkFOVDpNQUNPU1g6OkJOX0xMT05HIFJDNF9DSEFSIFJDNF9DSFVOSyBERVNfVU5ST0xMIEJGX1BUUjoke3BwYzMyX2FzbX06b3N4MzI6ZGxmY246ZGFyd2luLXNoYXJlZDotZlBJQzotZHluYW1pY2xpYjouXCQoU0hMSUJfTUFKT1IpLlwkKFNITElCX01JTk9SKS5keWxpYiIsCiAgIyBpUGhvbmVPUy9pT1MKICAiaXBob25lb3MtY3Jvc3MiLCJsbHZtLWdjYzotTzMgLWlzeXNyb290IFwkKENST1NTX1RPUCkvU0RLcy9cJChDUk9TU19TREspIC1mb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tY29tbW9uOjotRF9SRUVOVFJBTlQ6aU9TOi1XbCwtc2VhcmNoX3BhdGhzX2ZpcnN0JTpCTl9MTE9ORyBSQzRfQ0hBUiBSQzRfQ0hVTksgREVTX1VOUk9MTCBCRl9QVFI6JHtub19hc219OmRsZmNuOmRhcndpbi1zaGFyZWQ6LWZQSUMgLWZuby1jb21tb246LWR5bmFtaWNsaWI6LlwkKFNITElCX01BSk9SKS5cJChTSExJQl9NSU5PUikuZHlsaWIiLAotQEAgLTE2MjksNyArMTYyOSw3IEBACitAQCAtMTY4NSw3ICsxNjg1LDcgQEAKICAJCXMvXkNDPS4qJC9DQz0gJGNjLzsKICAJCXMvXkFSPVxzKmFyL0FSPSAkYXIvOwogIAkJcy9eUkFOTElCPS4qL1JBTkxJQj0gJHJhbmxpYi87CkBAIC0zNiw5ICs0MCw5IEBACiAgCQl9CiAgCXMvXkNGTEFHPS4qJC9DRkxBRz0gJGNmbGFncy87CiAgCXMvXkRFUEZMQUc9LiokL0RFUEZMQUc9JGRlcGZsYWdzLzsKLWRpZmYgLXIgOTlhZTQzOWEwN2YxIHV0aWwvZG9tZAotLS0tIGEvdXRpbC9kb21kCUZyaSBKYW4gMDkgMTI6NTA6NDMgMjAxNSAtMDgwMAotKysrIGIvdXRpbC9kb21kCUZyaSBKYW4gMDkgMTI6NTM6NTIgMjAxNSAtMDgwMAorZGlmZiAtciA5NzM3NDFjZjVhMDQgdXRpbC9kb21kCistLS0gYS91dGlsL2RvbWQJVGh1IE1hciAwNSAxMzo0NTo1OSAyMDE1IC0wODAwCisrKysgYi91dGlsL2RvbWQJVGh1IE1hciAwNSAxNDowMDoyMCAyMDE1IC0wODAwCiBAQCAtMTQsNyArMTQsNyBAQAogIGNwIE1ha2VmaWxlIE1ha2VmaWxlLnNhdmUKICAjIGZha2UgdGhlIHByZXNlbmNlIG9mIEtlcmJlcm9zCmRpZmYgLS1naXQgYS9NYWtlZmlsZS5wcmUuaW4gYi9NYWtlZmlsZS5wcmUuaW4KaW5kZXggNTUwMzJkMC4uZDllZTc3NyAxMDA2NDQKLS0tIGEvTWFrZWZpbGUucHJlLmluCisrKyBiL01ha2VmaWxlLnByZS5pbgpAQCAtMTE0Myw2ICsxMTQzLDcgQEAKIAkJdGVzdC9hdWRpb2RhdGEgXAogCQl0ZXN0L2NhcGF0aCB0ZXN0L2RhdGEgXAogCQl0ZXN0L2Nqa2VuY29kaW5ncyB0ZXN0L2RlY2ltYWx0ZXN0ZGF0YSB0ZXN0L3htbHRlc3RkYXRhIFwKKwkJdGVzdC9laW50cmRhdGEgXAogCQl0ZXN0L2ltZ2hkcmRhdGEgXAogCQl0ZXN0L3N1YnByb2Nlc3NkYXRhIHRlc3Qvc25kaGRyZGF0YSB0ZXN0L3N1cHBvcnQgXAogCQl0ZXN0L3RyYWNlZG1vZHVsZXMgdGVzdC9lbmNvZGVkX21vZHVsZXMgXApkaWZmIC0tZ2l0IGEvTWlzYy9BQ0tTIGIvTWlzYy9BQ0tTCmluZGV4IGMxZDBkYWIuLjc3MDdmNjcgMTAwNjQ0Ci0tLSBhL01pc2MvQUNLUworKysgYi9NaXNjL0FDS1MKQEAgLTUxMyw2ICs1MTMsNyBAQAogRGFnIEdydW5lYXUKIEZpbGlwIEdydXN6Y3p5xYRza2kKIFRob21hcyBHdWV0dGxlcgorWXV5YW5nIEd1bwogQW51aiBHdXB0YQogTWljaGFlbCBHdXJhdmFnZQogTGFycyBHdXN0w6RiZWwKQEAgLTc4OCw2ICs3ODksNyBAQAogU2ltb24gTGF3CiBKdWxpYSBMYXdhbGwKIENocmlzIExhd3JlbmNlCitNYXJrIExhd3JlbmNlCiBCcmlhbiBMZWFpcgogTWF0aGlldSBMZWR1Yy1IYW1lbAogQW1hbmRpbmUgTGVlCkBAIC0xMjY5LDYgKzEyNzEsNyBAQAogUGV0ZSBTaGlubmVycwogTWljaGFlbCBTaGlwbGV0dAogSm9obiBXLiBTaGlwbWFuCitBbGV4IFNoa29wCiBKb2VsIFNocHJlbnR6CiBZdWUgU2h1YWlqaWUKIFRlcnJlbCBTaHVtd2F5CmRpZmYgLS1naXQgYS9NaXNjL05FV1MgYi9NaXNjL05FV1MKaW5kZXggMWE5YzQ4MS4uMzQzY2Y4ZiAxMDA2NDQKLS0tIGEvTWlzYy9ORVdTCisrKyBiL01pc2MvTkVXUwpAQCAtMiw2ICsyLDE0MyBAQAogUHl0aG9uIE5ld3MKICsrKysrKysrKysrCiAKK1doYXQncyBOZXcgaW4gUHl0aG9uIDMuNSBhbHBoYSAyPworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlbGVhc2UgZGF0ZTogMjAxNS0wMy0wOAorCitDb3JlIGFuZCBCdWlsdGlucworLS0tLS0tLS0tLS0tLS0tLS0KKworLSBJc3N1ZSAjMjM1NzE6IFB5T2JqZWN0X0NhbGwoKSBhbmQgUHlDRnVuY3Rpb25fQ2FsbCgpIG5vdyByYWlzZSBhIFN5c3RlbUVycm9yCisgIGlmIGEgZnVuY3Rpb24gcmV0dXJucyBhIHJlc3VsdCBhbmQgcmFpc2VzIGFuIGV4Y2VwdGlvbi4gVGhlIFN5c3RlbUVycm9yIGlzCisgIGNoYWluZWQgdG8gdGhlIHByZXZpb3VzIGV4Y2VwdGlvbi4KKworTGlicmFyeQorLS0tLS0tLQorCistIElzc3VlICMyMjUyNDogTmV3IG9zLnNjYW5kaXIoKSBmdW5jdGlvbiwgcGFydCBvZiB0aGUgUEVQIDQ3MTogIm9zLnNjYW5kaXIoKQorICBmdW5jdGlvbiAtLSBhIGJldHRlciBhbmQgZmFzdGVyIGRpcmVjdG9yeSBpdGVyYXRvciIuIFBhdGNoIHdyaXR0ZW4gYnkgQmVuCisgIEhveXQuCisKKy0gSXNzdWUgIzIzMTAzOiBSZWR1Y2VkIHRoZSBtZW1vcnkgY29uc3VtcHRpb24gb2YgSVB2NEFkZHJlc3MgYW5kIElQdjZBZGRyZXNzLgorCistIElzc3VlICMyMTc5MzogQmFzZUhUVFBSZXF1ZXN0SGFuZGxlciBhZ2FpbiBsb2dzIHJlc3BvbnNlIGNvZGUgYXMgbnVtZXJpYywKKyAgbm90IGFzIHN0cmluZ2lmaWVkIGVudW0uICBQYXRjaCBieSBEZW1pYW4gQnJlY2h0LgorCistIElzc3VlICMyMzQ3NjogSW4gdGhlIHNzbCBtb2R1bGUsIGVuYWJsZSBPcGVuU1NMJ3MgWDUwOV9WX0ZMQUdfVFJVU1RFRF9GSVJTVAorICBmbGFnIG9uIGNlcnRpZmljYXRlIHN0b3JlcyB3aGVuIGl0IGlzIGF2YWlsYWJsZS4KKworLSBJc3N1ZSAjMjM1NzY6IEF2b2lkIHN0YWxsaW5nIGluIFNTTCByZWFkcyB3aGVuIEVPRiBoYXMgYmVlbiByZWFjaGVkIGluIHRoZQorICBTU0wgbGF5ZXIgYnV0IHRoZSB1bmRlcmx5aW5nIGNvbm5lY3Rpb24gaGFzbid0IGJlZW4gY2xvc2VkLgorCistIElzc3VlICMyMzUwNDogQWRkZWQgYW4gX19hbGxfXyB0byB0aGUgdHlwZXMgbW9kdWxlLgorCistIElzc3VlICMyMzU2MzogT3B0aW1pemVkIHV0aWxpdHkgZnVuY3Rpb25zIGluIHVybGxpYi5wYXJzZS4KKworLSBJc3N1ZSAjNzgzMDogRmxhdHRlbiBuZXN0ZWQgZnVuY3Rvb2xzLnBhcnRpYWwuCisKKy0gSXNzdWUgIzIwMjA0OiBBZGRlZCB0aGUgX19tb2R1bGVfXyBhdHRyaWJ1dGUgdG8gX3RraW50ZXIgY2xhc3Nlcy4KKworLSBJc3N1ZSAjMTk5ODA6IEltcHJvdmVkIGhlbHAoKSBmb3Igbm9uLXJlY29nbml6ZWQgc3RyaW5ncy4gIGhlbHAoJycpIG5vdworICBzaG93cyB0aGUgaGVscCBvbiBzdHIuICBoZWxwKCdoZWxwJykgbm93IHNob3dzIHRoZSBoZWxwIG9uIGhlbHAoKS4KKyAgT3JpZ2luYWwgcGF0Y2ggYnkgTWFyayBMYXdyZW5jZS4KKworLSBJc3N1ZSAjMjM1MjE6IENvcnJlY3RlZCBwdXJlIHB5dGhvbiBpbXBsZW1lbnRhdGlvbiBvZiB0aW1lZGVsdGEgZGl2aXNpb24uCisKKyAqIEVsaW1pbmF0ZWQgT3ZlcmZsb3dFcnJvciBmcm9tIHRpbWVkZWx0YSAqIGZsb2F0IGZvciBzb21lIGZsb2F0czsKKyAqIENvcnJlY3RlZCByb3VuZGluZyBpbiB0aW1lZGx0YSB0cnVlIGRpdmlzaW9uLgorCistIElzc3VlICMyMTYxOTogUG9wZW4gb2JqZWN0cyBubyBsb25nZXIgbGVhdmUgYSB6b21iaWUgYWZ0ZXIgZXhpdCBpbiB0aGUgd2l0aAorICBzdGF0ZW1lbnQgaWYgdGhlIHBpcGUgd2FzIGJyb2tlbi4gIFBhdGNoIGJ5IE1hcnRpbiBQYW50ZXIuCisKKy0gSXNzdWUgIzIyOTM2OiBNYWtlIGl0IHBvc3NpYmxlIHRvIHNob3cgbG9jYWwgdmFyaWFibGVzIGluIHRyYWNlYmFja3MgZm9yCisgIGJvdGggdGhlIHRyYWNlYmFjayBtb2R1bGUgYW5kIHVuaXR0ZXN0LgorCistIElzc3VlICMxNTk1NTogQWRkIGFuIG9wdGlvbiB0byBsaW1pdCB0aGUgb3V0cHV0IHNpemUgaW4gYnoyLmRlY29tcHJlc3MoKS4KKyAgUGF0Y2ggYnkgTmlrb2xhdXMgUmF0aC4KKworLSBJc3N1ZSAjNjYzOTogTW9kdWxlLWxldmVsIHR1cnRsZSBmdW5jdGlvbnMgbm8gbG9uZ2VyIHJhaXNlIFRjbEVycm9yIGFmdGVyCisgIGNsb3NpbmcgdGhlIHdpbmRvdy4KKworLSBJc3N1ZXMgIzgxNDI1MywgIzkxNzk6IEdyb3VwIHJlZmVyZW5jZXMgYW5kIGNvbmRpdGlvbmFsIGdyb3VwIHJlZmVyZW5jZXMgbm93CisgIHdvcmsgaW4gbG9va2JlaGluZCBhc3NlcnRpb25zIGluIHJlZ3VsYXIgZXhwcmVzc2lvbnMuCisKKy0gSXNzdWUgIzIzMjE1OiBNdWx0aWJ5dGUgY29kZWNzIHdpdGggY3VzdG9tIGVycm9yIGhhbmRsZXJzIHRoYXQgaWdub3JlcyBlcnJvcnMKKyAgY29uc3VtZWQgdG9vIG11Y2ggbWVtb3J5IGFuZCByYWlzZWQgU3lzdGVtRXJyb3Igb3IgTWVtb3J5RXJyb3IuCisgIE9yaWdpbmFsIHBhdGNoIGJ5IEFsZWtzaSBUb3JoYW1vLgorCistIElzc3VlICM1NzAwOiBpby5GaWxlSU8oKSBjYWxsZWQgZmx1c2goKSBhZnRlciBjbG9zaW5nIHRoZSBmaWxlLgorICBmbHVzaCgpIHdhcyBub3QgY2FsbGVkIGluIGNsb3NlKCkgaWYgY2xvc2VmZD1GYWxzZS4KKworLSBJc3N1ZSAjMjMzNzQ6IEZpeGVkIHB5ZG9jIGZhaWx1cmUgd2l0aCBub24tQVNDSUkgZmlsZXMgd2hlbiBzdGRvdXQgZW5jb2RpbmcKKyAgZGlmZmVycyBmcm9tIGZpbGUgc3lzdGVtIGVuY29kaW5nIChlLmcuIG9uIE1hYyBPUykuCisKKy0gSXNzdWUgIzIzNDgxOiBSZW1vdmUgUkM0IGZyb20gdGhlIFNTTCBtb2R1bGUncyBkZWZhdWx0IGNpcGhlciBsaXN0LgorCistIElzc3VlICMyMTU0ODogRml4IHB5ZG9jLnN5bm9wc2lzKCkgYW5kIHB5ZG9jLmFwcm9wb3MoKSBvbiBtb2R1bGVzIHdpdGggZW1wdHkKKyAgZG9jc3RyaW5ncy4KKworLSBJc3N1ZSAjMjI4ODU6IEZpeGVkIGFyYml0cmFyeSBjb2RlIGV4ZWN1dGlvbiB2dWxuZXJhYmlsaXR5IGluIHRoZSBkYm0uZHVtYgorICBtb2R1bGUuICBPcmlnaW5hbCBwYXRjaCBieSBDbGF1ZGl1IFBvcGEuCisKKy0gSXNzdWUgIzIzMjM5OiBzc2wubWF0Y2hfaG9zdG5hbWUoKSBub3cgc3VwcG9ydHMgbWF0Y2hpbmcgb2YgSVAgYWRkcmVzc2VzLgorCistIElzc3VlICMyMzE0NjogRml4IG1pc2hhbmRsaW5nIG9mIGFic29sdXRlIFdpbmRvd3MgcGF0aHMgd2l0aCBmb3J3YXJkCisgIHNsYXNoZXMgaW4gcGF0aGxpYi4KKworLSBJc3N1ZSAjMjMwOTY6IFBpY2tsZSByZXByZXNlbnRhdGlvbiBvZiBmbG9hdHMgd2l0aCBwcm90b2NvbCAwIG5vdyBpcyB0aGUgc2FtZQorICBmb3IgYm90aCBQeXRob24gYW5kIEMgaW1wbGVtZW50YXRpb25zLgorCistIElzc3VlICMxOTEwNTogcHByaW50IG5vdyBtb3JlIGVmZmljaWVudGx5IHVzZXMgZnJlZSBzcGFjZSBhdCB0aGUgcmlnaHQuCisKKy0gSXNzdWUgIzE0OTEwOiBBZGQgYWxsb3dfYWJicmV2IHBhcmFtZXRlciB0byBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlci4gUGF0Y2ggYnkKKyAgSm9uYXRoYW4gUGF1Z2gsIFN0ZXZlbiBCZXRoYXJkLCBwYXVsIGozIGFuZCBEYW5pZWwgRXJpa3Nzb24uCisKKy0gSXNzdWUgIzIxNzE3OiB0YXJmaWxlLm9wZW4oKSBub3cgc3VwcG9ydHMgJ3gnIChleGNsdXNpdmUgY3JlYXRpb24pIG1vZGUuCisKKy0gSXNzdWUgIzIzMzQ0OiBtYXJzaGFsLmR1bXBzKCkgaXMgbm93IDIwLTI1JSBmYXN0ZXIgb24gYXZlcmFnZS4KKworLSBJc3N1ZSAjMjA0MTY6IG1hcnNoYWwuZHVtcHMoKSB3aXRoIHByb3RvY29scyAzIGFuZCA0IGlzIG5vdyA0MC01MCUgZmFzdGVyIG9uCisgIGF2ZXJhZ2UuCisKKy0gSXNzdWUgIzIzNDIxOiBGaXhlZCBjb21wcmVzc2lvbiBpbiB0YXJmaWxlIENMSS4gIFBhdGNoIGJ5IHdkdjQ3NThoLgorCistIElzc3VlICMyMzM2NzogRml4IHBvc3NpYmxlIG92ZXJmbG93cyBpbiB0aGUgdW5pY29kZWRhdGEgbW9kdWxlLgorCistIElzc3VlICMyMzM2MTogRml4IHBvc3NpYmxlIG92ZXJmbG93IGluIFdpbmRvd3Mgc3VicHJvY2VzcyBjcmVhdGlvbiBjb2RlLgorCistIGxvZ2dpbmcuaGFuZGxlcnMuUXVldWVMaXN0ZW5lciBub3cgdGFrZXMgYSByZXNwZWN0X2hhbmRsZXJfbGV2ZWwga2V5d29yZAorICBhcmd1bWVudCB3aGljaCwgaWYgc2V0IHRvIFRydWUsIHdpbGwgcGFzcyBtZXNzYWdlcyB0byBoYW5kbGVycyB0YWtpbmcgaGFuZGxlcgorICBsZXZlbHMgaW50byBhY2NvdW50LgorCistIElzc3VlICMxOTcwNTogdHVydGxlZGVtbyBub3cgaGFzIGEgdmlzdWFsIHNvcnRpbmcgYWxnb3JpdGhtIGRlbW8uICBPcmlnaW5hbAorICBwYXRjaCBmcm9tIEphc29uIFllby4KKworQnVpbGQKKy0tLS0tCisKKy0gSXNzdWUgIzIzNDQ1OiBweWRlYnVnIGJ1aWxkcyBub3cgdXNlICJnY2MgLU9nIiB3aGVyZSBwb3NzaWJsZSwgdG8gbWFrZQorICB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgZmFzdGVyLgorCistIElzc3VlICMyMzU5MzogVXBkYXRlIE9TIFggMTAuNSBpbnN0YWxsZXIgYnVpbGQgdG8gdXNlIE9wZW5TU0wgMS4wLjIuCisKK0MgQVBJCistLS0tLQorCistIElzc3VlICMyMDIwNDogRGVwcmVjYXRpb24gd2FybmluZyBpcyBub3cgcmFpc2VkIGZvciBidWlsdGluIHR5cGUgd2l0aG91dCB0aGUKKyAgX19tb2R1bGVfXyBhdHRyaWJ1dGUuCisKK1dpbmRvd3MKKy0tLS0tLS0KKworLSBJc3N1ZSAjMjM0NjU6IEltcGxlbWVudCBQRVAgNDg2IC0gTWFrZSB0aGUgUHl0aG9uIExhdW5jaGVyIGF3YXJlIG9mIHZpcnR1YWwKKyAgZW52aXJvbm1lbnRzLiBQYXRjaCBieSBQYXVsIE1vb3JlLgorCistIElzc3VlICMyMzQzNzogTWFrZSB1c2VyIHNjcmlwdHMgZGlyZWN0b3J5IHZlcnNpb25lZCBvbiBXaW5kb3dzLiBQYXRjaCBieSBQYXVsCisgIE1vb3JlLgorCisKIFdoYXQncyBOZXcgaW4gUHl0aG9uIDMuNSBhbHBoYSAxPwogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTI2Myw4ICs0MDAsNiBAQAogCiAtIElzc3VlICMyMzM2NjogRml4ZWQgcG9zc2libGUgaW50ZWdlciBvdmVyZmxvdyBpbiBpdGVydG9vbHMuY29tYmluYXRpb25zLgogCi0tIElzc3VlICMyMzM2NjogRml4ZWQgcG9zc2libGUgaW50ZWdlciBvdmVyZmxvdyBpbiBpdGVydG9vbHMuY29tYmluYXRpb25zLgotCiAtIElzc3VlICMyMzM2OTogRml4ZWQgcG9zc2libGUgaW50ZWdlciBvdmVyZmxvdyBpbgogICBfanNvbi5lbmNvZGVfYmFzZXN0cmluZ19hc2NpaS4KIApAQCAtMjk0LDcgKzQyOSw3IEBACiAgIF9fbmVfXygpIG5vdyB3b3JrcyBjb3JyZWN0bHkuCiAKIC0gSXNzdWUgIzE5OTk2OiA6Y2xhc3M6YGVtYWlsLmZlZWRwYXJzZXIuRmVlZFBhcnNlcmAgbm93IGhhbmRsZXMgKG1hbGZvcm1lZCkKLSAgaGVhZGVycyB3aXRoIG5vIGtleSByYXRoZXIgdGhhbiBhbXVzaW5nIHRoZSBib2R5IGhhcyBzdGFydGVkLgorICBoZWFkZXJzIHdpdGggbm8ga2V5IHJhdGhlciB0aGFuIGFzc3VtaW5nIHRoZSBib2R5IGhhcyBzdGFydGVkLgogCiAtIElzc3VlICMyMDE4ODogU3VwcG9ydCBBcHBsaWNhdGlvbi1MYXllciBQcm90b2NvbCBOZWdvdGlhdGlvbiAoQUxQTikgaW4gdGhlIHNzbAogICBtb2R1bGUuCkBAIC0zMjcsNiArNDYyLDEzIEBACiAgIG5vdyBjbGVhcnMgaXRzIGludGVybmFsIHJlZmVyZW5jZSB0byB0aGUgc2VsZWN0b3IgbWFwcGluZyB0byBicmVhayBhCiAgIHJlZmVyZW5jZSBjeWNsZS4gSW5pdGlhbCBwYXRjaCB3cml0dGVuIGJ5IE1hcnRpbiBSaWNoYXJkLgogCistIElzc3VlICMxNzkxMTogUHJvdmlkZSBhIHdheSB0byBzZWVkIHRoZSBsaW5lY2FjaGUgZm9yIGEgUEVQLTMwMiBtb2R1bGUKKyAgd2l0aG91dCBhY3R1YWxseSBsb2FkaW5nIHRoZSBjb2RlLgorCistIElzc3VlICMxNzkxMTogUHJvdmlkZSBhIG5ldyBvYmplY3QgQVBJIGZvciB0cmFjZWJhY2ssIGluY2x1ZGluZyB0aGUgYWJpbGl0eQorICB0byBub3QgbG9va3VwIGxpbmVzIGF0IGFsbCB1bnRpbCB0aGUgdHJhY2ViYWNrIGlzIGFjdHVhbGx5IHJlbmRlcmVkLCB3aXRob3V0CisgIGFueSB0cmFjZSBvZiB0aGUgb3JpZ2luYWwgb2JqZWN0cyBiZWluZyBrZXB0IGFsaXZlLgorCiAtIElzc3VlICMxOTc3NzogUHJvdmlkZSBhIGhvbWUoKSBjbGFzc21ldGhvZCBvbiBQYXRoIG9iamVjdHMuICBDb250cmlidXRlZAogICBieSBWaWN0b3IgU2FsZ2FkbyBhbmQgTWF5YW5rIFRyaXBhdGhpLgogCmRpZmYgLS1naXQgYS9NaXNjL1JFQURNRSBiL01pc2MvUkVBRE1FCmluZGV4IGU3NzgwYTIuLmRkYjhmM2YgMTAwNjQ0Ci0tLSBhL01pc2MvUkVBRE1FCisrKyBiL01pc2MvUkVBRE1FCkBAIC0yMSw3ICsyMSw2IEBACiBSRUFETUUuQUlYICAgICAgICAgICAgICBJbmZvcm1hdGlvbiBhYm91dCB1c2luZyBQeXRob24gb24gQUlYCiBSRUFETUUuY292ZXJpdHkgICAgICAgICBJbmZvcm1hdGlvbiBhYm91dCBydW5uaW5nIENvdmVyaXR5J3MgUHJldmVudCBvbiBQeXRob24KIFJFQURNRS52YWxncmluZCAgICAgICAgIEluZm9ybWF0aW9uIGZvciBWYWxncmluZCB1c2Vycywgc2VlIHZhbGdyaW5kLXB5dGhvbi5zdXBwCi1SUE0gICAgICAgICAgICAgICAgICAgICAoT2xkKSB0b29scyB0byBidWlsZCBSUE1zCiBTcGVjaWFsQnVpbGRzLnR4dCAgICAgICBEZXNjcmliZXMgZXh0cmEgc3ltYm9scyB5b3UgY2FuIHNldCBmb3IgZGVidWcgYnVpbGRzCiBzdm5tYXAudHh0ICAgICAgICAgICAgICBNYXAgb2Ygb2xkIFNWTiByZXZzIGFuZCBicmFuY2hlcyB0byBoZyBjaGFuZ2VzZXQgaWRzCiB2YWxncmluZC1weXRob24uc3VwcCAgICBWYWxncmluZCBzdXBwcmVzc2lvbiBmaWxlLCBzZWUgUkVBRE1FLnZhbGdyaW5kCmRpZmYgLS1naXQgYS9NaXNjL1JQTS9SRUFETUUgYi9NaXNjL1JQTS9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ODNjOTUuLjAwMDAwMDAKLS0tIGEvTWlzYy9SUE0vUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgc3VwcG9ydCBmaWxlIHVzZWQgdG8gYnVpbGQgUlBNIHJlbGVhc2VzIG9mCi1QeXRob24uICBJdHMgY29udGVudHMgYXJlIG1haW50YWluZWQgYnkgU2VhbiBSZWlmc2NobmVpZGVyCi08amFmb0B0dW1teS5jb20+LgotCi1JZiB5b3Ugd2lzaCB0byBidWlsZCBSUE1zIGZyb20gdGhlIGJhc2UgUHl0aG9uIHJlbGVhc2UgdGFyLWZpbGUsIG5vdGUKLXRoYXQgeW91IHdpbGwgaGF2ZSB0byBkb3dubG9hZCB0aGUKLSJkb2MvPHZlcnNpb24+L2h0bWwtPHZlcnNpb24+LnRhci5iejIiCi1maWxlIGZyb20gcHl0aG9uLm9yZyBhbmQgcGxhY2UgaXQgaW50byB5b3VyICJTT1VSQ0VTIiBkaXJlY3RvcnkgZm9yCi10aGUgYnVpbGQgdG8gY29tcGxldGUuICBUaGlzIGlzIHRoZSBzYW1lIGRpcmVjdG9yeSB0aGF0IHlvdSBwbGFjZSB0aGUKLVB5dGhvbi0yLjMuMSByZWxlYXNlIHRhci1maWxlIGluLiAgWW91IGNhbiB0aGVuIHVzZSB0aGUgIi5zcGVjIiBmaWxlIGluCi10aGlzIGRpcmVjdG9yeSB0byBidWlsZCBSUE1zLgotCi1Zb3UgbWF5IGFsc28gd2lzaCB0byBwdXJzdWUgUlBNcyBwcm92aWRlZCBieSBkaXN0cmlidXRpb24gbWFrZXJzIHRvIHNlZSBpZgotdGhleSBoYXZlIG9uZSBzdWl0YWJsZSBmb3IgeW91ciB1c2VzLiAgSWYsIGZvciBleGFtcGxlLCB5b3UganVzdCB3YW50IGEKLXNsaWdodGx5IG5ld2VyIHZlcnNpb24gb2YgUHl0aG9uIHRoYW4gd2hhdCB0aGUgZGlzdHJvIHByb3ZpZGVzLCB5b3UgY291bGQKLXBpY2sgdXAgdGhlIGNsb3Nlc3QgU1JQTSB5b3VyIGRpc3RybyBwcm92aWRlcywgYW5kIHRoZW4gbW9kaWZ5IGl0IHRvCi10aGUgbmV3ZXIgdmVyc2lvbiwgYW5kIGJ1aWxkIHRoYXQuICBJdCBtYXkgYmUgYXMgc2ltcGxlIGFzIGp1c3QgY2hhbmdpbmcKLXRoZSAidmVyc2lvbiIgaW5mb3JtYXRpb24gaW4gdGhlIHNwZWMgZmlsZSAob3IgaXQgbWF5IHJlcXVpcmUgZml4aW5nCi1wYXRjaGVzKS4KLQotTk9URTogSSBhbSAqTk9UKiByZWNvbW1lbmRpbmcganVzdCB1c2luZyB0aGUgYmluYXJ5IFJQTSwgYW5kIG5ldmVyIGRvIGFuCi1pbnN0YWxsIHdpdGggIi0tZm9yY2UiIG9yICItLW5vZGVwcyIuCi0KLUFsc28gd29ydGggcHVyc3VpbmcgbWF5IGJlIG5ld2VyIHZlcnNpb25zIHByb3ZpZGVkIGJ5IHNpbWlsYXIgZGlzdHJvcy4gIEZvcgotZXhhbXBsZSwgYSBQeXRob24gMyBTUlBNIGZyb20gRmVkb3JhIG1heSBiZSBhIGdvb2QgYmFzZWxpbmUgdG8gdHJ5IGJ1aWxkaW5nCi1vbiBDZW50T1MuCi0KLU1hbnkgbmV3ZXIgU1JQTXMgd29uJ3QgaW5zdGFsbCBvbiBvbGRlciBkaXN0cm9zIGJlY2F1c2Ugb2YgZm9ybWF0IGNoYW5nZXMuCi1Zb3UgY2FuIG1hbnVhbGx5IGV4dHJhY3QgdGhlc2UgU1JQTVMgd2l0aDoKLQotICAgbWtkaXIgZm9vCi0gICBjZCBmb28KLSAgIHJwbTJjcGlvIDwuLi9weXRob24zLSouc3JjLnJwbSB8IGNwaW8gLWl2ZApkaWZmIC0tZ2l0IGEvTWlzYy9SUE0vcHl0aG9uLTMuNS5zcGVjIGIvTWlzYy9SUE0vcHl0aG9uLTMuNS5zcGVjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWZkYTBlLi4wMDAwMDAwCi0tLSBhL01pc2MvUlBNL3B5dGhvbi0zLjUuc3BlYworKysgL2Rldi9udWxsCkBAIC0xLDM4OSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAgVXNlci1tb2RpZmlhYmxlIGNvbmZpZ3MKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgIElzIHRoZSByZXN1bHRpbmcgcGFja2FnZSBhbmQgdGhlIGluc3RhbGxlZCBiaW5hcnkgbmFtZWQgInB5dGhvbiIgb3IKLSMgICJweXRob24yIj8KLSNXQVJOSU5HOiBDb21tZW50aW5nIG91dCBkb2Vzbid0IHdvcmsuICBMYXN0IGxpbmUgaXMgd2hhdCdzIHVzZWQuCi0lZGVmaW5lIGNvbmZpZ19iaW5zdWZmaXggbm9uZQotJWRlZmluZSBjb25maWdfYmluc3VmZml4IDIuNgotCi0jICBCdWlsZCB0a2ludGVyPyAgImF1dG8iIGVuYWJsZXMgaXQgaWYgL3Vzci9iaW4vd2lzaCBleGlzdHMuCi0jV0FSTklORzogQ29tbWVudGluZyBvdXQgZG9lc24ndCB3b3JrLiAgTGFzdCBsaW5lIGlzIHdoYXQncyB1c2VkLgotJWRlZmluZSBjb25maWdfdGtpbnRlciBubwotJWRlZmluZSBjb25maWdfdGtpbnRlciB5ZXMKLSVkZWZpbmUgY29uZmlnX3RraW50ZXIgYXV0bwotCi0jICBVc2UgcHltYWxsb2M/ICBUaGUgbGFzdCBsaW5lIChjb21tZW50ZWQgb3Igbm90KSBkZXRlcm1pbmVzIHdldGhlcgotIyAgcHltYWxsb2MgaXMgdXNlZC4KLSNXQVJOSU5HOiBDb21tZW50aW5nIG91dCBkb2Vzbid0IHdvcmsuICBMYXN0IGxpbmUgaXMgd2hhdCdzIHVzZWQuCi0lZGVmaW5lIGNvbmZpZ19weW1hbGxvYyBubwotJWRlZmluZSBjb25maWdfcHltYWxsb2MgeWVzCi0KLSMgIEVuYWJsZSBJUFY2PwotI1dBUk5JTkc6IENvbW1lbnRpbmcgb3V0IGRvZXNuJ3Qgd29yay4gIExhc3QgbGluZSBpcyB3aGF0J3MgdXNlZC4KLSVkZWZpbmUgY29uZmlnX2lwdjYgeWVzCi0lZGVmaW5lIGNvbmZpZ19pcHY2IG5vCi0KLSMgIEJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgb3IgLmEgbGlicmFyeT8KLSNXQVJOSU5HOiBDb21tZW50aW5nIG91dCBkb2Vzbid0IHdvcmsuICBMYXN0IGxpbmUgaXMgd2hhdCdzIHVzZWQuCi0lZGVmaW5lIGNvbmZpZ19zaGFyZWRsaWIgbm8KLSVkZWZpbmUgY29uZmlnX3NoYXJlZGxpYiB5ZXMKLQotIyAgTG9jYXRpb24gb2YgdGhlIEhUTUwgZGlyZWN0b3J5LgotJWRlZmluZSBjb25maWdfaHRtbGRpciAvdmFyL3d3dy9odG1sL3B5dGhvbgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgIEVuZCBvZiB1c2VyLW1vZGlmaWFibGUgY29uZmlncwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSVkZWZpbmUgbmFtZSBweXRob24KLSMtLXN0YXJ0IGNvbnN0YW50cy0tCi0lZGVmaW5lIHZlcnNpb24gMy41LjBhMQotJWRlZmluZSBsaWJ2ZXJzIDMuNQotIy0tZW5kIGNvbnN0YW50cy0tCi0lZGVmaW5lIHJlbGVhc2UgMXB5ZG90b3JnCi0lZGVmaW5lIF9fcHJlZml4IC91c3IKLQotIyAga2x1ZGdlIHRvIGdldCBhcm91bmQgcnBtIDxwZXJjZW50PmRlZmluZSB3ZWlyZG5lc3MKLSVkZWZpbmUgaXB2NiAlKGlmIFsgIiV7Y29uZmlnX2lwdjZ9IiA9IHllcyBdOyB0aGVuIGVjaG8gLS1lbmFibGUtaXB2NjsgZWxzZSBlY2hvIC0tZGlzYWJsZS1pcHY2OyBmaSkKLSVkZWZpbmUgcHltYWxsb2MgJShpZiBbICIle2NvbmZpZ19weW1hbGxvY30iID0geWVzIF07IHRoZW4gZWNobyAtLXdpdGgtcHltYWxsb2M7IGVsc2UgZWNobyAtLXdpdGhvdXQtcHltYWxsb2M7IGZpKQotJWRlZmluZSBiaW5zdWZmaXggJShpZiBbICIle2NvbmZpZ19iaW5zdWZmaXh9IiA9IG5vbmUgXTsgdGhlbiBlY2hvIDsgZWxzZSBlY2hvICIle2NvbmZpZ19iaW5zdWZmaXh9IjsgZmkpCi0lZGVmaW5lIGluY2x1ZGVfdGtpbnRlciAlKGlmIFsgXFwoICIle2NvbmZpZ190a2ludGVyfSIgPSBhdXRvIC1hIC1mIC91c3IvYmluL3dpc2ggXFwpIC1vICIle2NvbmZpZ190a2ludGVyfSIgPSB5ZXMgXTsgdGhlbiBlY2hvIDE7IGVsc2UgZWNobyAwOyBmaSkKLSVkZWZpbmUgbGliZGlybmFtZSAlKCggdW5hbWUgLW0gfCBlZ3JlcCAtcSAnXzY0JCcgJiYgWyAtZCAvdXNyL2xpYjY0IF0gJiYgZWNobyBsaWI2NCApIHx8IGVjaG8gbGliKQotJWRlZmluZSBzaGFyZWRsaWIgJShpZiBbICIle2NvbmZpZ19zaGFyZWRsaWJ9IiA9IHllcyBdOyB0aGVuIGVjaG8gLS1lbmFibGUtc2hhcmVkOyBlbHNlIGVjaG8gOyBmaSkKLSVkZWZpbmUgaW5jbHVkZV9zaGFyZWRsaWIgJShpZiBbICIle2NvbmZpZ19zaGFyZWRsaWJ9IiA9IHllcyBdOyB0aGVuIGVjaG8gMTsgZWxzZSBlY2hvIDA7IGZpKQotCi0jICBkZXRlY3QgaWYgZG9jdW1lbnRhdGlvbiBpcyBhdmFpbGFibGUKLSVkZWZpbmUgaW5jbHVkZV9kb2NzICUoaWYgWyAtZiAiJXtfc291cmNlZGlyfS9odG1sLSV7dmVyc2lvbn0udGFyLmJ6MiIgXTsgdGhlbiBlY2hvIDE7IGVsc2UgZWNobyAwOyBmaSkKLQotU3VtbWFyeTogQW4gaW50ZXJwcmV0ZWQsIGludGVyYWN0aXZlLCBvYmplY3Qtb3JpZW50ZWQgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuCi1OYW1lOiAle25hbWV9JXtiaW5zdWZmaXh9Ci1WZXJzaW9uOiAle3ZlcnNpb259Ci1SZWxlYXNlOiAle3JlbGVhc2V9Ci1MaWNlbnNlOiBQU0YKLUdyb3VwOiBEZXZlbG9wbWVudC9MYW5ndWFnZXMKLVNvdXJjZTogUHl0aG9uLSV7dmVyc2lvbn0udGFyLmJ6MgotJWlmICV7aW5jbHVkZV9kb2NzfQotU291cmNlMTogaHRtbC0le3ZlcnNpb259LnRhci5iejIKLSVlbmRpZgotQnVpbGRSb290OiAle190bXBwYXRofS8le25hbWV9LSV7dmVyc2lvbn0tcm9vdAotQnVpbGRQcmVyZXE6IGV4cGF0LWRldmVsCi1CdWlsZFByZXJlcTogZGI0LWRldmVsCi1CdWlsZFByZXJlcTogZ2RibS1kZXZlbAotQnVpbGRQcmVyZXE6IHNxbGl0ZS1kZXZlbAotUHJlZml4OiAle19fcHJlZml4fQotUGFja2FnZXI6IFNlYW4gUmVpZnNjaG5laWRlciA8amFmby1ycG1zQHR1bW15LmNvbT4KLQotJWRlc2NyaXB0aW9uCi1QeXRob24gaXMgYW4gaW50ZXJwcmV0ZWQsIGludGVyYWN0aXZlLCBvYmplY3Qtb3JpZW50ZWQgcHJvZ3JhbW1pbmcKLWxhbmd1YWdlLiAgSXQgaW5jb3Jwb3JhdGVzIG1vZHVsZXMsIGV4Y2VwdGlvbnMsIGR5bmFtaWMgdHlwaW5nLCB2ZXJ5IGhpZ2gKLWxldmVsIGR5bmFtaWMgZGF0YSB0eXBlcywgYW5kIGNsYXNzZXMuIFB5dGhvbiBjb21iaW5lcyByZW1hcmthYmxlIHBvd2VyCi13aXRoIHZlcnkgY2xlYXIgc3ludGF4LiBJdCBoYXMgaW50ZXJmYWNlcyB0byBtYW55IHN5c3RlbSBjYWxscyBhbmQKLWxpYnJhcmllcywgYXMgd2VsbCBhcyB0byB2YXJpb3VzIHdpbmRvdyBzeXN0ZW1zLCBhbmQgaXMgZXh0ZW5zaWJsZSBpbiBDIG9yCi1DKysuIEl0IGlzIGFsc28gdXNhYmxlIGFzIGFuIGV4dGVuc2lvbiBsYW5ndWFnZSBmb3IgYXBwbGljYXRpb25zIHRoYXQgbmVlZAotYSBwcm9ncmFtbWFibGUgaW50ZXJmYWNlLiAgRmluYWxseSwgUHl0aG9uIGlzIHBvcnRhYmxlOiBpdCBydW5zIG9uIG1hbnkKLWJyYW5kcyBvZiBVTklYLCBvbiBQQ3MgdW5kZXIgV2luZG93cywgTVMtRE9TLCBhbmQgb24gdGhlIE1hYy4KLQotJXBhY2thZ2UgZGV2ZWwKLVN1bW1hcnk6IFRoZSBsaWJyYXJpZXMgYW5kIGhlYWRlciBmaWxlcyBuZWVkZWQgZm9yIFB5dGhvbiBleHRlbnNpb24gZGV2ZWxvcG1lbnQuCi1QcmVyZXE6IHB5dGhvbiV7Ymluc3VmZml4fSA9ICV7UEFDS0FHRV9WRVJTSU9OfQotR3JvdXA6IERldmVsb3BtZW50L0xpYnJhcmllcwotCi0lZGVzY3JpcHRpb24gZGV2ZWwKLVRoZSBQeXRob24gcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UncyBpbnRlcnByZXRlciBjYW4gYmUgZXh0ZW5kZWQgd2l0aAotZHluYW1pY2FsbHkgbG9hZGVkIGV4dGVuc2lvbnMgYW5kIGNhbiBiZSBlbWJlZGRlZCBpbiBvdGhlciBwcm9ncmFtcy4KLVRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgaGVhZGVyIGZpbGVzIGFuZCBsaWJyYXJpZXMgbmVlZGVkIHRvIGRvCi10aGVzZSB0eXBlcyBvZiB0YXNrcy4KLQotSW5zdGFsbCBweXRob24tZGV2ZWwgaWYgeW91IHdhbnQgdG8gZGV2ZWxvcCBQeXRob24gZXh0ZW5zaW9ucy4gIFRoZQotcHl0aG9uIHBhY2thZ2Ugd2lsbCBhbHNvIG5lZWQgdG8gYmUgaW5zdGFsbGVkLiAgWW91J2xsIHByb2JhYmx5IGFsc28KLXdhbnQgdG8gaW5zdGFsbCB0aGUgcHl0aG9uLWRvY3MgcGFja2FnZSwgd2hpY2ggY29udGFpbnMgUHl0aG9uCi1kb2N1bWVudGF0aW9uLgotCi0laWYgJXtpbmNsdWRlX3RraW50ZXJ9Ci0lcGFja2FnZSB0a2ludGVyCi1TdW1tYXJ5OiBBIGdyYXBoaWNhbCB1c2VyIGludGVyZmFjZSBmb3IgdGhlIFB5dGhvbiBzY3JpcHRpbmcgbGFuZ3VhZ2UuCi1Hcm91cDogRGV2ZWxvcG1lbnQvTGFuZ3VhZ2VzCi1QcmVyZXE6IHB5dGhvbiV7Ymluc3VmZml4fSA9ICV7UEFDS0FHRV9WRVJTSU9OfS0le3JlbGVhc2V9Ci0KLSVkZXNjcmlwdGlvbiB0a2ludGVyCi1UaGUgVGtpbnRlciAoVGsgaW50ZXJmYWNlKSBwcm9ncmFtIGlzIGFuIGdyYXBoaWNhbCB1c2VyIGludGVyZmFjZSBmb3IKLXRoZSBQeXRob24gc2NyaXB0aW5nIGxhbmd1YWdlLgotCi1Zb3Ugc2hvdWxkIGluc3RhbGwgdGhlIHRraW50ZXIgcGFja2FnZSBpZiB5b3UnZCBsaWtlIHRvIHVzZSBhIGdyYXBoaWNhbAotdXNlciBpbnRlcmZhY2UgZm9yIFB5dGhvbiBwcm9ncmFtbWluZy4KLSVlbmRpZgotCi0lcGFja2FnZSB0b29scwotU3VtbWFyeTogQSBjb2xsZWN0aW9uIG9mIGRldmVsb3BtZW50IHRvb2xzIGluY2x1ZGVkIHdpdGggUHl0aG9uLgotR3JvdXA6IERldmVsb3BtZW50L1Rvb2xzCi1QcmVyZXE6IHB5dGhvbiV7Ymluc3VmZml4fSA9ICV7UEFDS0FHRV9WRVJTSU9OfS0le3JlbGVhc2V9Ci0KLSVkZXNjcmlwdGlvbiB0b29scwotVGhlIFB5dGhvbiBwYWNrYWdlIGluY2x1ZGVzIHNldmVyYWwgZGV2ZWxvcG1lbnQgdG9vbHMgdGhhdCBhcmUgdXNlZAotdG8gYnVpbGQgcHl0aG9uIHByb2dyYW1zLiAgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIGEgc2VsZWN0aW9uIG9mIHRob3NlCi10b29scywgaW5jbHVkaW5nIHRoZSBJRExFIFB5dGhvbiBJREUuCi0KLUluc3RhbGwgcHl0aG9uLXRvb2xzIGlmIHlvdSB3YW50IHRvIHVzZSB0aGVzZSB0b29scyB0byBkZXZlbG9wCi1QeXRob24gcHJvZ3JhbXMuICBZb3Ugd2lsbCBhbHNvIG5lZWQgdG8gaW5zdGFsbCB0aGUgcHl0aG9uIGFuZAotdGtpbnRlciBwYWNrYWdlcy4KLQotJWlmICV7aW5jbHVkZV9kb2NzfQotJXBhY2thZ2UgZG9jcwotU3VtbWFyeTogUHl0aG9uLXJlbGF0ZWQgZG9jdW1lbnRhdGlvbi4KLUdyb3VwOiBEZXZlbG9wbWVudC9Eb2N1bWVudGF0aW9uCi0KLSVkZXNjcmlwdGlvbiBkb2NzCi1Eb2N1bWVudGF0aW9uIHJlbGF0aW5nIHRvIHRoZSBQeXRob24gcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgaW4gSFRNTCBhbmQgaW5mbwotZm9ybWF0cy4KLSVlbmRpZgotCi0lY2hhbmdlbG9nCi0qIE1vbiBEZWMgMjAgMjAwNCBTZWFuIFJlaWZzY2huZWlkZXIgPGphZm8tcnBtc0B0dW1teS5jb20+IFsyLjQtMnB5ZG90b3JnXQotLSBDaGFuZ2luZyB0aGUgaWRsZSB3cmFwcGVyIHNvIHRoYXQgaXQgcGFzc2VzIGFyZ3VtZW50cyB0byBpZGxlLgotCi0qIFR1ZSBPY3QgMTkgMjAwNCBTZWFuIFJlaWZzY2huZWlkZXIgPGphZm8tcnBtc0B0dW1teS5jb20+IFsyLjRiMS0xcHlkb3RvcmddCi0tIFVwZGF0aW5nIHRvIDIuNC4KLQotKiBUaHUgSnVsIDIyIDIwMDQgU2VhbiBSZWlmc2NobmVpZGVyIDxqYWZvLXJwbXNAdHVtbXkuY29tPiBbMi4zLjQtM3B5ZG90b3JnXQotLSBQYXVsIFRpZW1hbm4gZml4ZXMgZm9yICV7cHJlZml4fS4KLS0gQWRkaW5nIHBlcm1pc3Npb24gY2hhbmdlcyBmb3IgZGlyZWN0b3J5IGFzIHN1Z2dlc3RlZCBieSByZWltZWlrYS5jYQotLSBBZGRpbmcgY29kZSB0byBkZXRlY3Qgd2hlbiBpdCBzaG91bGQgYmUgdXNpbmcgbGliNjQuCi0tIEFkZGluZyBhIGRlZmluZSBmb3IgdGhlIGxvY2F0aW9uIG9mIC92YXIvd3d3L2h0bWwgZm9yIGRvY3MuCi0KLSogVGh1IE1heSAyNyAyMDA0IFNlYW4gUmVpZnNjaG5laWRlciA8amFmby1ycG1zQHR1bW15LmNvbT4gWzIuMy40LTJweWRvdG9yZ10KLS0gSW5jbHVkaW5nIGNoYW5nZXMgZnJvbSBJYW4gSG9sc21hbiB0byBidWlsZCB1bmRlciBSZWQgSGF0IDcuMy4KLS0gRml4aW5nIHNvbWUgcHJvYmxlbXMgd2l0aCB0aGUgL3Vzci9sb2NhbCBwYXRoIGNoYW5nZS4KLQotKiBTYXQgTWFyIDI3IDIwMDQgU2VhbiBSZWlmc2NobmVpZGVyIDxqYWZvLXJwbXNAdHVtbXkuY29tPiBbMi4zLjItM3B5ZG90b3JnXQotLSBCZWluZyBtb3JlIGFncmVzc2l2ZSBhYm91dCBmaW5kaW5nIHRoZSBwYXRocyB0byBmaXggZm9yCi0gICMhL3Vzci9sb2NhbC9iaW4vcHl0aG9uLgotCi0qIFNhdCBGZWIgMDcgMjAwNCBTZWFuIFJlaWZzY2huZWlkZXIgPGphZm8tcnBtc0B0dW1teS5jb20+IFsyLjMuMy0ycHlkb3RvcmddCi0tIEFkZGluZyBjb2RlIHRvIHJlbW92ZSAiIyEvdXNyL2xvY2FsL2Jpbi9weXRob24iIGZyb20gcGFydGljdWxhciBmaWxlcyBhbmQKLSAgY2F1c2luZyB0aGUgUlBNIGJ1aWxkIHRvIHRlcm1pbmF0ZSBpZiB0aGVyZSBhcmUgYW55IHVuZXhwZWN0ZWQgZmlsZXMKLSAgd2hpY2ggaGF2ZSB0aGF0IGxpbmUgaW4gdGhlbS4KLQotKiBNb24gT2N0IDEzIDIwMDMgU2VhbiBSZWlmc2NobmVpZGVyIDxqYWZvLXJwbXNAdHVtbXkuY29tPiBbMi4zLjItMXB5ZG90b3JnXQotLSBBZGRpbmcgY29kZSB0byBkZXRlY3Qgd2V0aGVyIGRvY3VtZW50YXRpb24gaXMgYXZhaWxhYmxlIHRvIGJ1aWxkLgotCi0qIEZyaSBTZXAgMTkgMjAwMyBTZWFuIFJlaWZzY2huZWlkZXIgPGphZm8tcnBtc0B0dW1teS5jb20+IFsyLjMuMS0xcHlkb3RvcmddCi0tIFVwZGF0aW5nIHRvIHRoZSAyLjMuMSByZWxlYXNlLgotCi0qIE1vbiBGZWIgMjQgMjAwMyBTZWFuIFJlaWZzY2huZWlkZXIgPGphZm8tcnBtc0B0dW1teS5jb20+IFsyLjNiMS0xcHlkb3RvcmddCi0tIFVwZGF0aW5nIHRvIDIuM2IxIHJlbGVhc2UuCi0KLSogTW9uIEZlYiAxNyAyMDAzIFNlYW4gUmVpZnNjaG5laWRlciA8amFmby1ycG1zQHR1bW15LmNvbT4gWzIuM2ExLTFdCi0tIFVwZGF0aW5nIHRvIDIuMyByZWxlYXNlLgotCi0qIFN1biBEZWMgMjMgMjAwMSBTZWFuIFJlaWZzY2huZWlkZXIgPGphZm8tcnBtc0B0dW1teS5jb20+Ci1bUmVsZWFzZSAyLjItMl0KLS0gQWRkZWQgLWRvY3MgcGFja2FnZS4KLS0gQWRkZWQgImF1dG8iIGNvbmZpZ190a2ludGVyIHNldHRpbmcgd2hpY2ggb25seSBlbmFibGVzIHRrIGlmCi0gIC91c3IvYmluL3dpc2ggZXhpc3RzLgotCi0qIFNhdCBEZWMgMjIgMjAwMSBTZWFuIFJlaWZzY2huZWlkZXIgPGphZm8tcnBtc0B0dW1teS5jb20+Ci1bUmVsZWFzZSAyLjItMV0KLS0gVXBkYXRlZCB0byAyLjIuCi0tIENoYW5nZWQgdGhlIGV4dGVuc2lvbiB0byAiMiIgZnJvbSAiMi4yIi4KLQotKiBUdWUgTm92IDE4IDIwMDEgU2VhbiBSZWlmc2NobmVpZGVyIDxqYWZvLXJwbXNAdHVtbXkuY29tPgotW1JlbGVhc2UgMi4yYzEtMV0KLS0gVXBkYXRlZCB0byAyLjJjMS4KLQotKiBUaHUgTm92ICAxIDIwMDEgU2VhbiBSZWlmc2NobmVpZGVyIDxqYWZvLXJwbXNAdHVtbXkuY29tPgotW1JlbGVhc2UgMi4yYjEtM10KLS0gQ2hhbmdlZCB0aGUgd2F5IHRoZSBzZWQgZm9yIGZpeGluZyB0aGUgIyEgaW4gcHlkb2Mgd29ya3MuCi0KLSogV2VkIE9jdCAgMjQgMjAwMSBTZWFuIFJlaWZzY2huZWlkZXIgPGphZm8tcnBtc0B0dW1teS5jb20+Ci1bUmVsZWFzZSAyLjJiMS0yXQotLSBGaXhlZCBtaXNzaW5nICJlbWFpbCIgcGFja2FnZSwgdGhhbmtzIHRvIGFub255bW91cyByZXBvcnQgb24gc291cmNlZm9yZ2UuCi0tIEZpeGVkIG1pc3NpbmcgImNvbXBpbGVyIiBwYWNrYWdlLgotCi0qIE1vbiBPY3QgMjIgMjAwMSBTZWFuIFJlaWZzY2huZWlkZXIgPGphZm8tcnBtc0B0dW1teS5jb20+Ci1bUmVsZWFzZSAyLjJiMS0xXQotLSBVcGRhdGVkIHRvIDIuMmIxLgotCi0qIE1vbiBPY3QgIDkgMjAwMSBTZWFuIFJlaWZzY2huZWlkZXIgPGphZm8tcnBtc0B0dW1teS5jb20+Ci1bUmVsZWFzZSAyLjJhNC00XQotLSBvdHRvQGJhbGlub3IubWF0LnVuaW1pLml0IG1lbnRpb25lZCB0aGF0IHRoZSBsaWNlbnNlIGZpbGUgaXMgbWlzc2luZy4KLQotKiBTdW4gU2VwIDMwIDIwMDEgU2VhbiBSZWlmc2NobmVpZGVyIDxqYWZvLXJwbXNAdHVtbXkuY29tPgotW1JlbGVhc2UgMi4yYTQtM10KLS0gSWduYWNpbyBWYXpxdWV6LUFicmFtcyBwb2ludGVkIG91dCB0aGF0IEkgaGFkIGEgc3BydWlvdXMgZG91YmxlLXF1b3RlIGluCi0gIHRoZSBzcGVjIGZpbGVzLiAgVGhhbmtzLgotCi0qIFdlZCBKdWwgMjUgMjAwMSBTZWFuIFJlaWZzY2huZWlkZXIgPGphZm8tcnBtc0B0dW1teS5jb20+Ci1bUmVsZWFzZSAyLjJhMS0xXQotLSBVcGRhdGVkIHRvIDIuMmExIHJlbGVhc2UuCi0tIENoYW5nZWQgaWRsZSBhbmQgcHlkb2MgdG8gdXNlIGJpbnN1ZmZpeCBtYWNybwotCi0jIyMjIyMjCi0jICBQUkVQCi0jIyMjIyMjCi0lcHJlcAotJXNldHVwIC1uIFB5dGhvbi0le3ZlcnNpb259Ci0KLSMjIyMjIyMjCi0jICBCVUlMRAotIyMjIyMjIyMKLSVidWlsZAotZWNobyAiU2V0dGluZyBmb3IgaXB2NjogJXtpcHY2fSIKLWVjaG8gIlNldHRpbmcgZm9yIHB5bWFsbG9jOiAle3B5bWFsbG9jfSIKLWVjaG8gIlNldHRpbmcgZm9yIGJpbnN1ZmZpeDogJXtiaW5zdWZmaXh9IgotZWNobyAiU2V0dGluZyBmb3IgaW5jbHVkZV90a2ludGVyOiAle2luY2x1ZGVfdGtpbnRlcn0iCi1lY2hvICJTZXR0aW5nIGZvciBsaWJkaXJuYW1lOiAle2xpYmRpcm5hbWV9IgotZWNobyAiU2V0dGluZyBmb3Igc2hhcmVkbGliOiAle3NoYXJlZGxpYn0iCi1lY2hvICJTZXR0aW5nIGZvciBpbmNsdWRlX3NoYXJlZGxpYjogJXtpbmNsdWRlX3NoYXJlZGxpYn0iCi0uL2NvbmZpZ3VyZSAtLWVuYWJsZS11bmljb2RlPXVjczQgJXtzaGFyZWRsaWJ9ICV7aXB2Nn0gJXtweW1hbGxvY30gLS1wcmVmaXg9JXtfX3ByZWZpeH0KLW1ha2UKLQotIyMjIyMjIyMjIwotIyAgSU5TVEFMTAotIyMjIyMjIyMjIwotJWluc3RhbGwKLSMgIHNldCB0aGUgaW5zdGFsbCBwYXRoCi1lY2hvICdbaW5zdGFsbF9zY3JpcHRzXScgPnNldHVwLmNmZwotZWNobyAnaW5zdGFsbF9kaXI9JyIke1JQTV9CVUlMRF9ST09UfSV7X19wcmVmaXh9L2JpbiIgPj5zZXR1cC5jZmcKLQotWyAtZCAiJFJQTV9CVUlMRF9ST09UIiAtYSAiJFJQTV9CVUlMRF9ST09UIiAhPSAiLyIgXSAmJiBybSAtcmYgJFJQTV9CVUlMRF9ST09UCi1ta2RpciAtcCAkUlBNX0JVSUxEX1JPT1Qle19fcHJlZml4fS8le2xpYmRpcm5hbWV9L3B5dGhvbiV7bGlidmVyc30vbGliLWR5bmxvYWQKLW1ha2UgcHJlZml4PSRSUE1fQlVJTERfUk9PVCV7X19wcmVmaXh9IGluc3RhbGwKLQotIyAgUkVQTEFDRSBQQVRIIElOIFBZRE9DCi1pZiBbICEgLXogIiV7Ymluc3VmZml4fSIgXQotdGhlbgotICAgKAotICAgICAgY2QgJFJQTV9CVUlMRF9ST09UJXtfX3ByZWZpeH0vYmluCi0gICAgICBtdiBweWRvYyBweWRvYy5vbGQKLSAgICAgIHNlZCAnc3wjIS4qfCMhJXtfX3ByZWZpeH0vYmluL2VudiBweXRob24nJXtiaW5zdWZmaXh9J3wnIFwKLSAgICAgICAgICAgIHB5ZG9jLm9sZCA+cHlkb2MKLSAgICAgIGNobW9kIDc1NSBweWRvYwotICAgICAgcm0gLWYgcHlkb2Mub2xkCi0gICApCi1maQotCi0jICBhZGQgdGhlIGJpbnN1ZmZpeAotaWYgWyAhIC16ICIle2JpbnN1ZmZpeH0iIF0KLXRoZW4KLSAgIHJtIC1mICRSUE1fQlVJTERfUk9PVCV7X19wcmVmaXh9L2Jpbi9weXRob25bMC05YS16QS1aXSoKLSAgICggY2QgJFJQTV9CVUlMRF9ST09UJXtfX3ByZWZpeH0vYmluOyAKLSAgICAgIGZvciBmaWxlIGluICo7IGRvIG12ICIkZmlsZSIgIiRmaWxlIiV7Ymluc3VmZml4fTsgZG9uZSApCi0gICAoIGNkICRSUE1fQlVJTERfUk9PVCV7X21hbmRpcn0vbWFuMTsgbXYgcHl0aG9uLjEgcHl0aG9uJXtiaW5zdWZmaXh9LjEgKQotZmkKLQotIyMjIyMjIyMKLSMgIFRvb2xzCi1lY2hvICcjISV7X19wcmVmaXh9L2Jpbi9lbnYgcHl0aG9uJXtiaW5zdWZmaXh9JyA+JHtSUE1fQlVJTERfUk9PVH0le19fcHJlZml4fS9iaW4vaWRsZSV7Ymluc3VmZml4fQotZWNobyAnaW1wb3J0IG9zLCBzeXMnID4+JHtSUE1fQlVJTERfUk9PVH0le19fcHJlZml4fS9iaW4vaWRsZSV7Ymluc3VmZml4fQotZWNobyAnb3MuZXhlY3ZwKCIle19fcHJlZml4fS9iaW4vcHl0aG9uJXtiaW5zdWZmaXh9IiwgWyIle19fcHJlZml4fS9iaW4vcHl0aG9uJXtiaW5zdWZmaXh9IiwgIiV7X19wcmVmaXh9L2xpYi9weXRob24le2xpYnZlcnN9L2lkbGVsaWIvaWRsZS5weSJdICsgc3lzLmFyZ3ZbMTpdKScgPj4ke1JQTV9CVUlMRF9ST09UfSV7X19wcmVmaXh9L2Jpbi9pZGxlJXtiaW5zdWZmaXh9Ci1lY2hvICdwcmludCAiRmFpbGVkIHRvIGV4ZWMgSWRsZSInID4+JHtSUE1fQlVJTERfUk9PVH0le19fcHJlZml4fS9iaW4vaWRsZSV7Ymluc3VmZml4fQotZWNobyAnc3lzLmV4aXQoMSknID4+JHtSUE1fQlVJTERfUk9PVH0le19fcHJlZml4fS9iaW4vaWRsZSV7Ymluc3VmZml4fQotY2htb2QgNzU1ICRSUE1fQlVJTERfUk9PVCV7X19wcmVmaXh9L2Jpbi9pZGxlJXtiaW5zdWZmaXh9Ci1jcCAtYSBUb29scyAkUlBNX0JVSUxEX1JPT1Qle19fcHJlZml4fS8le2xpYmRpcm5hbWV9L3B5dGhvbiV7bGlidmVyc30KLQotIyAgTUFLRSBGSUxFIExJU1RTCi1ybSAtZiBtYWlucGtnLmZpbGVzCi1maW5kICIkUlBNX0JVSUxEX1JPT1QiIiV7X19wcmVmaXh9Ii8le2xpYmRpcm5hbWV9L3B5dGhvbiV7bGlidmVyc30gLXR5cGUgZiB8Ci0Jc2VkICJzfF4ke1JQTV9CVUlMRF9ST09UfXwvfCIgfAotCWdyZXAgLXYgLWUgJy9weXRob24le2xpYnZlcnN9L2NvbmZpZyQnIC1lICdfdGtpbnRlci5zbyQnID5tYWlucGtnLmZpbGVzCi1maW5kICIkUlBNX0JVSUxEX1JPT1QiIiV7X19wcmVmaXh9Ii9iaW4gLXR5cGUgZiAtbyAtdHlwZSBsIHwKLQlzZWQgInN8XiR7UlBNX0JVSUxEX1JPT1R9fC98IiB8Ci0JZ3JlcCAtdiAtZSAnL2Jpbi8ydG8zJXtiaW5zdWZmaXh9JCcgfAotCWdyZXAgLXYgLWUgJy9iaW4vcHlkb2Mle2JpbnN1ZmZpeH0kJyB8Ci0JZ3JlcCAtdiAtZSAnL2Jpbi9zbXRwZC5weSV7Ymluc3VmZml4fSQnIHwKLQlncmVwIC12IC1lICcvYmluL2lkbGUle2JpbnN1ZmZpeH0kJyA+Pm1haW5wa2cuZmlsZXMKLQotcm0gLWYgdG9vbHMuZmlsZXMKLWZpbmQgIiRSUE1fQlVJTERfUk9PVCIiJXtfX3ByZWZpeH0iLyV7bGliZGlybmFtZX0vcHl0aG9uJXtsaWJ2ZXJzfS9pZGxlbGliIFwKLSAgICAgICIkUlBNX0JVSUxEX1JPT1QiIiV7X19wcmVmaXh9Ii8le2xpYmRpcm5hbWV9L3B5dGhvbiV7bGlidmVyc30vVG9vbHMgLXR5cGUgZiB8Ci0gICAgICBzZWQgInN8XiR7UlBNX0JVSUxEX1JPT1R9fC98IiA+dG9vbHMuZmlsZXMKLWVjaG8gIiV7X19wcmVmaXh9Ii9iaW4vMnRvMyV7Ymluc3VmZml4fSA+PnRvb2xzLmZpbGVzCi1lY2hvICIle19fcHJlZml4fSIvYmluL3B5ZG9jJXtiaW5zdWZmaXh9ID4+dG9vbHMuZmlsZXMKLWVjaG8gIiV7X19wcmVmaXh9Ii9iaW4vc210cGQucHkle2JpbnN1ZmZpeH0gPj50b29scy5maWxlcwotZWNobyAiJXtfX3ByZWZpeH0iL2Jpbi9pZGxlJXtiaW5zdWZmaXh9ID4+dG9vbHMuZmlsZXMKLQotIyMjIyMjCi0jIERvY3MKLSVpZiAle2luY2x1ZGVfZG9jc30KLW1rZGlyIC1wICIkUlBNX0JVSUxEX1JPT1QiJXtjb25maWdfaHRtbGRpcn0KLSgKLSAgIGNkICIkUlBNX0JVSUxEX1JPT1QiJXtjb25maWdfaHRtbGRpcn0KLSAgIGJ1bnppcDIgPCAle1NPVVJDRTF9IHwgdGFyIHgKLSkKLSVlbmRpZgotCi0jICBmaXggdGhlICMhIGxpbmUgaW4gaW5zdGFsbGVkIGZpbGVzCi1maW5kICIkUlBNX0JVSUxEX1JPT1QiIC10eXBlIGYgLXByaW50MCB8Ci0gICAgICB4YXJncyAtMCBncmVwIC1sIC91c3IvbG9jYWwvYmluL3B5dGhvbiB8IHdoaWxlIHJlYWQgZmlsZQotZG8KLSAgIEZJWEZJTEU9IiRmaWxlIgotICAgc2VkICdzfF4jIS4qcHl0aG9ufCMhJXtfX3ByZWZpeH0vYmluL2VudiBweXRob24nIiV7Ymluc3VmZml4fSInfCcgXAotICAgICAgICAgIiRGSVhGSUxFIiA+L3RtcC9maXgtcHl0aG9uLXBhdGguJCQKLSAgIGNhdCAvdG1wL2ZpeC1weXRob24tcGF0aC4kJCA+IiRGSVhGSUxFIgotICAgcm0gLWYgL3RtcC9maXgtcHl0aG9uLXBhdGguJCQKLWRvbmUKLQotIyAgY2hlY2sgdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkgc3RyYWdnbGluZyAjISBsaW5lcwotZmluZCAiJFJQTV9CVUlMRF9ST09UIiAtdHlwZSBmIHwgeGFyZ3MgZWdyZXAgLW4gJ14jISAqL3Vzci9sb2NhbC9iaW4vcHl0aG9uJyBcCi0gICAgICB8IGdyZXAgJzoxOiMhJyA+L3RtcC9weXRob24tcnBtLWZpbGVzLiQkIHx8IHRydWUKLWlmIFsgLXMgL3RtcC9weXRob24tcnBtLWZpbGVzLiQkIF0KLXRoZW4KLSAgIGVjaG8gJyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJwotICAgY2F0IC90bXAvcHl0aG9uLXJwbS1maWxlcy4kJAotICAgY2F0IDw8QEVPRgotICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgVGhlcmUgYXJlIHN0aWxsIGZpbGVzIHJlZmVyZW5jaW5nIC91c3IvbG9jYWwvYmluL3B5dGhvbiBpbiB0aGUKLSAgICAgaW5zdGFsbCBkaXJlY3RvcnkuICBUaGV5IGFyZSBsaXN0ZWQgYWJvdmUuICBQbGVhc2UgZml4IHRoZSAuc3BlYwotICAgICBmaWxlIGFuZCB0cnkgYWdhaW4uICBJZiB5b3UgYXJlIGFuIGVuZC11c2VyLCB5b3UgcHJvYmFibHkgd2FudAotICAgICB0byByZXBvcnQgdGhpcyB0byBqYWZvLXJwbXNAdHVtbXkuY29tIGFzIHdlbGwuCi0gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotQEVPRgotICAgcm0gLWYgL3RtcC9weXRob24tcnBtLWZpbGVzLiQkCi0gICBleGl0IDEKLWZpCi1ybSAtZiAvdG1wL3B5dGhvbi1ycG0tZmlsZXMuJCQKLQotIyMjIyMjIyMKLSMgIENMRUFOCi0jIyMjIyMjIwotJWNsZWFuCi1bIC1uICIkUlBNX0JVSUxEX1JPT1QiIC1hICIkUlBNX0JVSUxEX1JPT1QiICE9IC8gXSAmJiBybSAtcmYgJFJQTV9CVUlMRF9ST09UCi1ybSAtZiBtYWlucGtnLmZpbGVzIHRvb2xzLmZpbGVzCi0KLSMjIyMjIyMjCi0jICBGSUxFUwotIyMjIyMjIyMKLSVmaWxlcyAtZiBtYWlucGtnLmZpbGVzCi0lZGVmYXR0cigtLHJvb3Qscm9vdCkKLSVkb2MgTWlzYy9SRUFETUUgTWlzYy9jaGVhdHNoZWV0IE1pc2MvUG9ydGluZwotJWRvYyBMSUNFTlNFIE1pc2MvQUNLUyBNaXNjL0hJU1RPUlkgTWlzYy9ORVdTCi0le19tYW5kaXJ9L21hbjEvcHl0aG9uJXtiaW5zdWZmaXh9LjEqCi0KLSVhdHRyKDc1NSxyb290LHJvb3QpICVkaXIgJXtfX3ByZWZpeH0vaW5jbHVkZS9weXRob24le2xpYnZlcnN9Ci0lYXR0cig3NTUscm9vdCxyb290KSAlZGlyICV7X19wcmVmaXh9LyV7bGliZGlybmFtZX0vcHl0aG9uJXtsaWJ2ZXJzfS8KLSVpZiAle2luY2x1ZGVfc2hhcmVkbGlifQotJXtfX3ByZWZpeH0vJXtsaWJkaXJuYW1lfS9saWJweXRob24qCi0lZW5kaWYKLQotJWZpbGVzIGRldmVsCi0lZGVmYXR0cigtLHJvb3Qscm9vdCkKLSV7X19wcmVmaXh9L2luY2x1ZGUvcHl0aG9uJXtsaWJ2ZXJzfS8qLmgKLSV7X19wcmVmaXh9LyV7bGliZGlybmFtZX0vcHl0aG9uJXtsaWJ2ZXJzfS9jb25maWcKLQotJWZpbGVzIC1mIHRvb2xzLmZpbGVzIHRvb2xzCi0lZGVmYXR0cigtLHJvb3Qscm9vdCkKLQotJWlmICV7aW5jbHVkZV90a2ludGVyfQotJWZpbGVzIHRraW50ZXIKLSVkZWZhdHRyKC0scm9vdCxyb290KQotJXtfX3ByZWZpeH0vJXtsaWJkaXJuYW1lfS9weXRob24le2xpYnZlcnN9L3RraW50ZXIKLSV7X19wcmVmaXh9LyV7bGliZGlybmFtZX0vcHl0aG9uJXtsaWJ2ZXJzfS9saWItZHlubG9hZC9fdGtpbnRlci5zbyoKLSVlbmRpZgotCi0laWYgJXtpbmNsdWRlX2RvY3N9Ci0lZmlsZXMgZG9jcwotJWRlZmF0dHIoLSxyb290LHJvb3QpCi0le2NvbmZpZ19odG1sZGlyfS8qCi0lZW5kaWYKZGlmZiAtLWdpdCBhL01pc2MvU3BlY2lhbEJ1aWxkcy50eHQgYi9NaXNjL1NwZWNpYWxCdWlsZHMudHh0CmluZGV4IDczMmNiMDAuLjMwMDQxNzQgMTAwNjQ0Ci0tLSBhL01pc2MvU3BlY2lhbEJ1aWxkcy50eHQKKysrIGIvTWlzYy9TcGVjaWFsQnVpbGRzLnR4dApAQCAtMjE2LDEyICsyMTYsMTEgQEAKIAogQ29tcGlsZSBpbiBzdXBwb3J0IGZvciBMb3cgTGV2ZWwgVFJBQ0UtaW5nIG9mIHRoZSBtYWluIGludGVycHJldGVyIGxvb3AuCiAKLVdoZW4gdGhpcyBwcmVwcm9jZXNzb3Igc3ltYm9sIGlzIGRlZmluZWQsIGJlZm9yZSBQeUV2YWxfRXZhbEZyYW1lIChldmFsX2ZyYW1lIGluCi0yLjMgYW5kIDIuMiwgZXZhbF9jb2RlMiBiZWZvcmUgdGhhdCkgZXhlY3V0ZXMgYSBmcmFtZSdzIGNvZGUgaXQgY2hlY2tzIHRoZQotZnJhbWUncyBnbG9iYWwgbmFtZXNwYWNlIGZvciBhIHZhcmlhYmxlICJfX2xsdHJhY2VfXyIuICBJZiBzdWNoIGEgdmFyaWFibGUgaXMKLWZvdW5kLCBtb3VuZHMgb2YgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCB0aGUgaW50ZXJwcmV0ZXIgaXMgZG9pbmcgYXJlIHNwcmF5ZWQgdG8KLXN0ZG91dCwgc3VjaCBhcyBldmVyeSBvcGNvZGUgYW5kIG9wY29kZSBhcmd1bWVudCBhbmQgdmFsdWVzIHB1c2hlZCBvbnRvIGFuZAotcG9wcGVkIG9mZiB0aGUgdmFsdWUgc3RhY2suCitXaGVuIHRoaXMgcHJlcHJvY2Vzc29yIHN5bWJvbCBpcyBkZWZpbmVkLCBiZWZvcmUgUHlFdmFsX0V2YWxGcmFtZSBleGVjdXRlcyBhCitmcmFtZSdzIGNvZGUgaXQgY2hlY2tzIHRoZSBmcmFtZSdzIGdsb2JhbCBuYW1lc3BhY2UgZm9yIGEgdmFyaWFibGUKKyJfX2xsdHJhY2VfXyIuICBJZiBzdWNoIGEgdmFyaWFibGUgaXMgZm91bmQsIG1vdW5kcyBvZiBpbmZvcm1hdGlvbiBhYm91dCB3aGF0Cit0aGUgaW50ZXJwcmV0ZXIgaXMgZG9pbmcgYXJlIHNwcmF5ZWQgdG8gc3Rkb3V0LCBzdWNoIGFzIGV2ZXJ5IG9wY29kZSBhbmQgb3Bjb2RlCithcmd1bWVudCBhbmQgdmFsdWVzIHB1c2hlZCBvbnRvIGFuZCBwb3BwZWQgb2ZmIHRoZSB2YWx1ZSBzdGFjay4KIAogTm90IHVzZWZ1bCB2ZXJ5IG9mdGVuLCBidXQgdmVyeSB1c2VmdWwgd2hlbiBuZWVkZWQuCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2J6Mm1vZHVsZS5jIGIvTW9kdWxlcy9fYnoybW9kdWxlLmMKaW5kZXggNGYyYWZkYS4uZjI4NGNkNiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fYnoybW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fYnoybW9kdWxlLmMKQEAgLTUxLDYgKzUxLDE0IEBACiAgICAgYnpfc3RyZWFtIGJ6czsKICAgICBjaGFyIGVvZjsgICAgICAgICAgIC8qIFRfQk9PTCBleHBlY3RzIGEgY2hhciAqLwogICAgIFB5T2JqZWN0ICp1bnVzZWRfZGF0YTsKKyAgICBjaGFyIG5lZWRzX2lucHV0OworICAgIGNoYXIgKmlucHV0X2J1ZmZlcjsKKyAgICBzaXplX3QgaW5wdXRfYnVmZmVyX3NpemU7CisKKyAgICAvKiBienMtPmF2YWlsX2luIGlzIG9ubHkgMzIgYml0LCBzbyB3ZSBzdG9yZSB0aGUgdHJ1ZSBsZW5ndGgKKyAgICAgICBzZXBhcmF0ZWx5LiBDb252ZXJzaW9uIGFuZCBsb29waW5nIGlzIGVuY2Fwc3VsYXRlZCBpbgorICAgICAgIGRlY29tcHJlc3NfYnVmKCkgKi8KKyAgICBzaXplX3QgYnpzX2F2YWlsX2luX3JlYWw7CiAjaWZkZWYgV0lUSF9USFJFQUQKICAgICBQeVRocmVhZF90eXBlX2xvY2sgbG9jazsKICNlbmRpZgpAQCAtMTExLDE5ICsxMTksMjMgQEAKIH0KIAogI2lmIEJVRlNJWiA8IDgxOTIKLSNkZWZpbmUgU01BTExDSFVOSyA4MTkyCisjZGVmaW5lIElOSVRJQUxfQlVGRkVSX1NJWkUgODE5MgogI2Vsc2UKLSNkZWZpbmUgU01BTExDSFVOSyBCVUZTSVoKKyNkZWZpbmUgSU5JVElBTF9CVUZGRVJfU0laRSBCVUZTSVoKICNlbmRpZgogCiBzdGF0aWMgaW50Ci1ncm93X2J1ZmZlcihQeU9iamVjdCAqKmJ1ZikKK2dyb3dfYnVmZmVyKFB5T2JqZWN0ICoqYnVmLCBQeV9zc2l6ZV90IG1heF9sZW5ndGgpCiB7CiAgICAgLyogRXhwYW5kIHRoZSBidWZmZXIgYnkgYW4gYW1vdW50IHByb3BvcnRpb25hbCB0byB0aGUgY3VycmVudCBzaXplLAogICAgICAgIGdpdmluZyB1cyBhbW9ydGl6ZWQgbGluZWFyLXRpbWUgYmVoYXZpb3IuIFVzZSBhIGxlc3MtdGhhbi1kb3VibGUKICAgICAgICBncm93dGggZmFjdG9yIHRvIGF2b2lkIGV4Y2Vzc2l2ZSBhbGxvY2F0aW9uLiAqLwogICAgIHNpemVfdCBzaXplID0gUHlCeXRlc19HRVRfU0laRSgqYnVmKTsKICAgICBzaXplX3QgbmV3X3NpemUgPSBzaXplICsgKHNpemUgPj4gMykgKyA2OworCisgICAgaWYgKG1heF9sZW5ndGggPiAwICYmIG5ld19zaXplID4gKHNpemVfdCkgbWF4X2xlbmd0aCkKKyAgICAgICAgbmV3X3NpemUgPSAoc2l6ZV90KSBtYXhfbGVuZ3RoOworCiAgICAgaWYgKG5ld19zaXplID4gc2l6ZSkgewogICAgICAgICByZXR1cm4gX1B5Qnl0ZXNfUmVzaXplKGJ1ZiwgbmV3X3NpemUpOwogICAgIH0gZWxzZSB7ICAvKiBvdmVyZmxvdyAqLwpAQCAtMTQyLDE0ICsxNTQsMTQgQEAKICAgICBzaXplX3QgZGF0YV9zaXplID0gMDsKICAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0gICAgcmVzdWx0ID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBTTUFMTENIVU5LKTsKKyAgICByZXN1bHQgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIElOSVRJQUxfQlVGRkVSX1NJWkUpOwogICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBjLT5ienMubmV4dF9pbiA9IGRhdGE7CiAgICAgYy0+YnpzLmF2YWlsX2luID0gMDsKICAgICBjLT5ienMubmV4dF9vdXQgPSBQeUJ5dGVzX0FTX1NUUklORyhyZXN1bHQpOwotICAgIGMtPmJ6cy5hdmFpbF9vdXQgPSBTTUFMTENIVU5LOworICAgIGMtPmJ6cy5hdmFpbF9vdXQgPSBJTklUSUFMX0JVRkZFUl9TSVpFOwogICAgIGZvciAoOzspIHsKICAgICAgICAgY2hhciAqdGhpc19vdXQ7CiAgICAgICAgIGludCBiemVycm9yOwpAQCAtMTY4LDcgKzE4MCw3IEBACiAgICAgICAgIGlmIChjLT5ienMuYXZhaWxfb3V0ID09IDApIHsKICAgICAgICAgICAgIHNpemVfdCBidWZmZXJfbGVmdCA9IFB5Qnl0ZXNfR0VUX1NJWkUocmVzdWx0KSAtIGRhdGFfc2l6ZTsKICAgICAgICAgICAgIGlmIChidWZmZXJfbGVmdCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGdyb3dfYnVmZmVyKCZyZXN1bHQpIDwgMCkKKyAgICAgICAgICAgICAgICBpZiAoZ3Jvd19idWZmZXIoJnJlc3VsdCwgLTEpIDwgMCkKICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgICAgICBjLT5ienMubmV4dF9vdXQgPSBQeUJ5dGVzX0FTX1NUUklORyhyZXN1bHQpICsgZGF0YV9zaXplOwogICAgICAgICAgICAgICAgIGJ1ZmZlcl9sZWZ0ID0gUHlCeXRlc19HRVRfU0laRShyZXN1bHQpIC0gZGF0YV9zaXplOwpAQCAtNDAyLDY0ICs0MTQsMTc2IEBACiAKIC8qIEJaMkRlY29tcHJlc3NvciBjbGFzcy4gKi8KIAotc3RhdGljIFB5T2JqZWN0ICoKLWRlY29tcHJlc3MoQloyRGVjb21wcmVzc29yICpkLCBjaGFyICpkYXRhLCBzaXplX3QgbGVuKQorLyogRGVjb21wcmVzcyBkYXRhIG9mIGxlbmd0aCBkLT5ienNfYXZhaWxfaW5fcmVhbCBpbiBkLT5ienMubmV4dF9pbi4gIFRoZSBvdXRwdXQKKyAgIGJ1ZmZlciBpcyBhbGxvY2F0ZWQgZHluYW1pY2FsbHkgYW5kIHJldHVybmVkLiAgQXQgbW9zdCBtYXhfbGVuZ3RoIGJ5dGVzIGFyZQorICAgcmV0dXJuZWQsIHNvIHNvbWUgb2YgdGhlIGlucHV0IG1heSBub3QgYmUgY29uc3VtZWQuIGQtPmJ6cy5uZXh0X2luIGFuZAorICAgZC0+YnpzX2F2YWlsX2luX3JlYWwgYXJlIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aGUgY29uc3VtZWQgaW5wdXQuICovCitzdGF0aWMgUHlPYmplY3QqCitkZWNvbXByZXNzX2J1ZihCWjJEZWNvbXByZXNzb3IgKmQsIFB5X3NzaXplX3QgbWF4X2xlbmd0aCkKIHsKLSAgICBzaXplX3QgZGF0YV9zaXplID0gMDsKKyAgICAvKiBkYXRhX3NpemUgaXMgc3RyaWN0bHkgcG9zaXRpdmUsIGJ1dCBiZWNhdXNlIHdlIHJlcGVhdGVkbHkgaGF2ZSB0bworICAgICAgIGNvbXBhcmUgYWdhaW5zdCBtYXhfbGVuZ3RoIGFuZCBQeUJ5dGVzX0dFVF9TSVpFIHdlIGRlY2xhcmUgaXQgYXMKKyAgICAgICBzaWduZWQgKi8KKyAgICBQeV9zc2l6ZV90IGRhdGFfc2l6ZSA9IDA7CiAgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBiel9zdHJlYW0gKmJ6cyA9ICZkLT5ienM7CiAKLSAgICByZXN1bHQgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIFNNQUxMQ0hVTkspOworICAgIGlmIChtYXhfbGVuZ3RoIDwgMCB8fCBtYXhfbGVuZ3RoID49IElOSVRJQUxfQlVGRkVSX1NJWkUpCisgICAgICAgIHJlc3VsdCA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgSU5JVElBTF9CVUZGRVJfU0laRSk7CisgICAgZWxzZQorICAgICAgICByZXN1bHQgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG1heF9sZW5ndGgpOwogICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICBkLT5ienMubmV4dF9pbiA9IGRhdGE7Ci0gICAgLyogT24gYSA2NC1iaXQgc3lzdGVtLCBsZW4gbWlnaHQgbm90IGZpdCBpbiBhdmFpbF9pbiAoYW4gdW5zaWduZWQgaW50KS4KLSAgICAgICBEbyBkZWNvbXByZXNzaW9uIGluIGNodW5rcyBvZiBubyBtb3JlIHRoYW4gVUlOVF9NQVggYnl0ZXMgZWFjaC4gKi8KLSAgICBkLT5ienMuYXZhaWxfaW4gPSAodW5zaWduZWQgaW50KVB5X01JTihsZW4sIFVJTlRfTUFYKTsKLSAgICBsZW4gLT0gZC0+YnpzLmF2YWlsX2luOwotICAgIGQtPmJ6cy5uZXh0X291dCA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHJlc3VsdCk7Ci0gICAgZC0+YnpzLmF2YWlsX291dCA9IFNNQUxMQ0hVTks7CisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgYnpzLT5uZXh0X291dCA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHJlc3VsdCk7CiAgICAgZm9yICg7OykgewotICAgICAgICBjaGFyICp0aGlzX291dDsKLSAgICAgICAgaW50IGJ6ZXJyb3I7CisgICAgICAgIGludCBienJldDsKKyAgICAgICAgc2l6ZV90IGF2YWlsOworCisgICAgICAgIC8qIE9uIGEgNjQtYml0IHN5c3RlbSwgYnVmZmVyIGxlbmd0aCBtaWdodCBub3QgZml0IGluIGF2YWlsX291dCwgc28gd2UKKyAgICAgICAgICAgZG8gZGVjb21wcmVzc2lvbiBpbiBjaHVua3Mgb2Ygbm8gbW9yZSB0aGFuIFVJTlRfTUFYIGJ5dGVzCisgICAgICAgICAgIGVhY2guIE5vdGUgdGhhdCB0aGUgZXhwcmVzc2lvbiBmb3IgYGF2YWlsYCBpcyBndWFyYW50ZWVkIHRvIGJlCisgICAgICAgICAgIHBvc2l0aXZlLCBzbyB0aGUgY2FzdCBpcyBzYWZlLiAqLworICAgICAgICBhdmFpbCA9IChzaXplX3QpIChQeUJ5dGVzX0dFVF9TSVpFKHJlc3VsdCkgLSBkYXRhX3NpemUpOworICAgICAgICBienMtPmF2YWlsX291dCA9ICh1bnNpZ25lZCBpbnQpUHlfTUlOKGF2YWlsLCBVSU5UX01BWCk7CisgICAgICAgIGJ6cy0+YXZhaWxfaW4gPSAodW5zaWduZWQgaW50KVB5X01JTihkLT5ienNfYXZhaWxfaW5fcmVhbCwgVUlOVF9NQVgpOworICAgICAgICBkLT5ienNfYXZhaWxfaW5fcmVhbCAtPSBienMtPmF2YWlsX2luOwogCiAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLSAgICAgICAgdGhpc19vdXQgPSBkLT5ienMubmV4dF9vdXQ7Ci0gICAgICAgIGJ6ZXJyb3IgPSBCWjJfYnpEZWNvbXByZXNzKCZkLT5ienMpOwotICAgICAgICBkYXRhX3NpemUgKz0gZC0+YnpzLm5leHRfb3V0IC0gdGhpc19vdXQ7CisgICAgICAgIGJ6cmV0ID0gQloyX2J6RGVjb21wcmVzcyhienMpOworICAgICAgICBkYXRhX3NpemUgPSBienMtPm5leHRfb3V0IC0gUHlCeXRlc19BU19TVFJJTkcocmVzdWx0KTsKKyAgICAgICAgZC0+YnpzX2F2YWlsX2luX3JlYWwgKz0gYnpzLT5hdmFpbF9pbjsKICAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKLSAgICAgICAgaWYgKGNhdGNoX2J6Ml9lcnJvcihiemVycm9yKSkKKyAgICAgICAgaWYgKGNhdGNoX2J6Ml9lcnJvcihienJldCkpCiAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICBpZiAoYnplcnJvciA9PSBCWl9TVFJFQU1fRU5EKSB7CisgICAgICAgIGlmIChienJldCA9PSBCWl9TVFJFQU1fRU5EKSB7CiAgICAgICAgICAgICBkLT5lb2YgPSAxOwotICAgICAgICAgICAgbGVuICs9IGQtPmJ6cy5hdmFpbF9pbjsKLSAgICAgICAgICAgIGlmIChsZW4gPiAwKSB7IC8qIFNhdmUgbGVmdG92ZXIgaW5wdXQgdG8gdW51c2VkX2RhdGEgKi8KLSAgICAgICAgICAgICAgICBQeV9DTEVBUihkLT51bnVzZWRfZGF0YSk7Ci0gICAgICAgICAgICAgICAgZC0+dW51c2VkX2RhdGEgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKGQtPmJ6cy5uZXh0X2luLCBsZW4pOwotICAgICAgICAgICAgICAgIGlmIChkLT51bnVzZWRfZGF0YSA9PSBOVUxMKQotICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGQtPmJ6cy5hdmFpbF9pbiA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAobGVuID09IDApCisgICAgICAgIH0gZWxzZSBpZiAoZC0+YnpzX2F2YWlsX2luX3JlYWwgPT0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoYnpzLT5hdmFpbF9vdXQgPT0gMCkgeworICAgICAgICAgICAgaWYgKGRhdGFfc2l6ZSA9PSBtYXhfbGVuZ3RoKQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZC0+YnpzLmF2YWlsX2luID0gKHVuc2lnbmVkIGludClQeV9NSU4obGVuLCBVSU5UX01BWCk7Ci0gICAgICAgICAgICBsZW4gLT0gZC0+YnpzLmF2YWlsX2luOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkLT5ienMuYXZhaWxfb3V0ID09IDApIHsKLSAgICAgICAgICAgIHNpemVfdCBidWZmZXJfbGVmdCA9IFB5Qnl0ZXNfR0VUX1NJWkUocmVzdWx0KSAtIGRhdGFfc2l6ZTsKLSAgICAgICAgICAgIGlmIChidWZmZXJfbGVmdCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGdyb3dfYnVmZmVyKCZyZXN1bHQpIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgICAgICBkLT5ienMubmV4dF9vdXQgPSBQeUJ5dGVzX0FTX1NUUklORyhyZXN1bHQpICsgZGF0YV9zaXplOwotICAgICAgICAgICAgICAgIGJ1ZmZlcl9sZWZ0ID0gUHlCeXRlc19HRVRfU0laRShyZXN1bHQpIC0gZGF0YV9zaXplOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZC0+YnpzLmF2YWlsX291dCA9ICh1bnNpZ25lZCBpbnQpUHlfTUlOKGJ1ZmZlcl9sZWZ0LCBVSU5UX01BWCk7CisgICAgICAgICAgICBpZiAoZGF0YV9zaXplID09IFB5Qnl0ZXNfR0VUX1NJWkUocmVzdWx0KSAmJgorICAgICAgICAgICAgICAgIGdyb3dfYnVmZmVyKCZyZXN1bHQsIG1heF9sZW5ndGgpID09IC0xKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICBienMtPm5leHRfb3V0ID0gUHlCeXRlc19BU19TVFJJTkcocmVzdWx0KSArIGRhdGFfc2l6ZTsKICAgICAgICAgfQogICAgIH0KLSAgICBpZiAoZGF0YV9zaXplICE9IChzaXplX3QpUHlCeXRlc19HRVRfU0laRShyZXN1bHQpKQotICAgICAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZyZXN1bHQsIGRhdGFfc2l6ZSkgPCAwKQorICAgIGlmIChkYXRhX3NpemUgIT0gUHlCeXRlc19HRVRfU0laRShyZXN1bHQpKQorICAgICAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZyZXN1bHQsIGRhdGFfc2l6ZSkgPT0gLTEpCiAgICAgICAgICAgICBnb3RvIGVycm9yOworCisgICAgcmV0dXJuIHJlc3VsdDsKKworZXJyb3I6CisgICAgUHlfWERFQ1JFRihyZXN1bHQpOworICAgIHJldHVybiBOVUxMOworfQorCisKK3N0YXRpYyBQeU9iamVjdCAqCitkZWNvbXByZXNzKEJaMkRlY29tcHJlc3NvciAqZCwgY2hhciAqZGF0YSwgc2l6ZV90IGxlbiwgUHlfc3NpemVfdCBtYXhfbGVuZ3RoKQoreworICAgIGNoYXIgaW5wdXRfYnVmZmVyX2luX3VzZTsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIGJ6X3N0cmVhbSAqYnpzID0gJmQtPmJ6czsKKworICAgIC8qIFByZXBlbmQgdW5jb25zdW1lZCBpbnB1dCBpZiBuZWNlc3NhcnkgKi8KKyAgICBpZiAoYnpzLT5uZXh0X2luICE9IE5VTEwpIHsKKyAgICAgICAgc2l6ZV90IGF2YWlsX25vdywgYXZhaWxfdG90YWw7CisKKyAgICAgICAgLyogTnVtYmVyIG9mIGJ5dGVzIHdlIGNhbiBhcHBlbmQgdG8gaW5wdXQgYnVmZmVyICovCisgICAgICAgIGF2YWlsX25vdyA9IChkLT5pbnB1dF9idWZmZXIgKyBkLT5pbnB1dF9idWZmZXJfc2l6ZSkKKyAgICAgICAgICAgIC0gKGJ6cy0+bmV4dF9pbiArIGQtPmJ6c19hdmFpbF9pbl9yZWFsKTsKKworICAgICAgICAvKiBOdW1iZXIgb2YgYnl0ZXMgd2UgY2FuIGFwcGVuZCBpZiB3ZSBtb3ZlIGV4aXN0aW5nCisgICAgICAgICAgIGNvbnRlbnRzIHRvIGJlZ2lubmluZyBvZiBidWZmZXIgKG92ZXJ3cml0aW5nCisgICAgICAgICAgIGNvbnN1bWVkIGlucHV0KSAqLworICAgICAgICBhdmFpbF90b3RhbCA9IGQtPmlucHV0X2J1ZmZlcl9zaXplIC0gZC0+YnpzX2F2YWlsX2luX3JlYWw7CisKKyAgICAgICAgaWYgKGF2YWlsX3RvdGFsIDwgbGVuKSB7CisgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gYnpzLT5uZXh0X2luIC0gZC0+aW5wdXRfYnVmZmVyOworICAgICAgICAgICAgY2hhciAqdG1wOworICAgICAgICAgICAgc2l6ZV90IG5ld19zaXplID0gZC0+aW5wdXRfYnVmZmVyX3NpemUgKyBsZW4gLSBhdmFpbF9ub3c7CisKKyAgICAgICAgICAgIC8qIEFzc2lnbiB0byB0ZW1wb3JhcnkgdmFyaWFibGUgZmlyc3QsIHNvIHdlIGRvbid0CisgICAgICAgICAgICAgICBsb3NlIGFkZHJlc3Mgb2YgYWxsb2NhdGVkIGJ1ZmZlciBpZiByZWFsbG9jIGZhaWxzICovCisgICAgICAgICAgICB0bXAgPSBQeU1lbV9SZWFsbG9jKGQtPmlucHV0X2J1ZmZlciwgbmV3X3NpemUpOworICAgICAgICAgICAgaWYgKHRtcCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0Tm9uZShQeUV4Y19NZW1vcnlFcnJvcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkLT5pbnB1dF9idWZmZXIgPSB0bXA7CisgICAgICAgICAgICBkLT5pbnB1dF9idWZmZXJfc2l6ZSA9IG5ld19zaXplOworCisgICAgICAgICAgICBienMtPm5leHRfaW4gPSBkLT5pbnB1dF9idWZmZXIgKyBvZmZzZXQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYXZhaWxfbm93IDwgbGVuKSB7CisgICAgICAgICAgICBtZW1tb3ZlKGQtPmlucHV0X2J1ZmZlciwgYnpzLT5uZXh0X2luLAorICAgICAgICAgICAgICAgICAgICBkLT5ienNfYXZhaWxfaW5fcmVhbCk7CisgICAgICAgICAgICBienMtPm5leHRfaW4gPSBkLT5pbnB1dF9idWZmZXI7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KCh2b2lkKikoYnpzLT5uZXh0X2luICsgZC0+YnpzX2F2YWlsX2luX3JlYWwpLCBkYXRhLCBsZW4pOworICAgICAgICBkLT5ienNfYXZhaWxfaW5fcmVhbCArPSBsZW47CisgICAgICAgIGlucHV0X2J1ZmZlcl9pbl91c2UgPSAxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYnpzLT5uZXh0X2luID0gZGF0YTsKKyAgICAgICAgZC0+YnpzX2F2YWlsX2luX3JlYWwgPSBsZW47CisgICAgICAgIGlucHV0X2J1ZmZlcl9pbl91c2UgPSAwOworICAgIH0KKworICAgIHJlc3VsdCA9IGRlY29tcHJlc3NfYnVmKGQsIG1heF9sZW5ndGgpOworICAgIGlmKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmIChkLT5lb2YpIHsKKyAgICAgICAgZC0+bmVlZHNfaW5wdXQgPSAwOworICAgICAgICBpZiAoZC0+YnpzX2F2YWlsX2luX3JlYWwgPiAwKSB7CisgICAgICAgICAgICBQeV9DTEVBUihkLT51bnVzZWRfZGF0YSk7CisgICAgICAgICAgICBkLT51bnVzZWRfZGF0YSA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoCisgICAgICAgICAgICAgICAgYnpzLT5uZXh0X2luLCBkLT5ienNfYXZhaWxfaW5fcmVhbCk7CisgICAgICAgICAgICBpZiAoZC0+dW51c2VkX2RhdGEgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKGQtPmJ6c19hdmFpbF9pbl9yZWFsID09IDApIHsKKyAgICAgICAgYnpzLT5uZXh0X2luID0gTlVMTDsKKyAgICAgICAgZC0+bmVlZHNfaW5wdXQgPSAxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZC0+bmVlZHNfaW5wdXQgPSAwOworCisgICAgICAgIC8qIElmIHdlIGRpZCBub3QgdXNlIHRoZSBpbnB1dCBidWZmZXIsIHdlIG5vdyBoYXZlCisgICAgICAgICAgIHRvIGNvcHkgdGhlIHRhaWwgZnJvbSB0aGUgY2FsbGVyJ3MgYnVmZmVyIGludG8gdGhlCisgICAgICAgICAgIGlucHV0IGJ1ZmZlciAqLworICAgICAgICBpZiAoIWlucHV0X2J1ZmZlcl9pbl91c2UpIHsKKworICAgICAgICAgICAgLyogRGlzY2FyZCBidWZmZXIgaWYgaXQncyB0b28gc21hbGwKKyAgICAgICAgICAgICAgIChyZXNpemluZyBpdCBtYXkgbmVlZGxlc3NseSBjb3B5IHRoZSBjdXJyZW50IGNvbnRlbnRzKSAqLworICAgICAgICAgICAgaWYgKGQtPmlucHV0X2J1ZmZlciAhPSBOVUxMICYmCisgICAgICAgICAgICAgICAgZC0+aW5wdXRfYnVmZmVyX3NpemUgPCBkLT5ienNfYXZhaWxfaW5fcmVhbCkgeworICAgICAgICAgICAgICAgIFB5TWVtX0ZyZWUoZC0+aW5wdXRfYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBkLT5pbnB1dF9idWZmZXIgPSBOVUxMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBBbGxvY2F0ZSBpZiBuZWNlc3NhcnkgKi8KKyAgICAgICAgICAgIGlmIChkLT5pbnB1dF9idWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGQtPmlucHV0X2J1ZmZlciA9IFB5TWVtX01hbGxvYyhkLT5ienNfYXZhaWxfaW5fcmVhbCk7CisgICAgICAgICAgICAgICAgaWYgKGQtPmlucHV0X2J1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldE5vbmUoUHlFeGNfTWVtb3J5RXJyb3IpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkLT5pbnB1dF9idWZmZXJfc2l6ZSA9IGQtPmJ6c19hdmFpbF9pbl9yZWFsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBDb3B5IHRhaWwgKi8KKyAgICAgICAgICAgIG1lbWNweShkLT5pbnB1dF9idWZmZXIsIGJ6cy0+bmV4dF9pbiwgZC0+YnpzX2F2YWlsX2luX3JlYWwpOworICAgICAgICAgICAgYnpzLT5uZXh0X2luID0gZC0+aW5wdXRfYnVmZmVyOworICAgICAgICB9CisgICAgfQorCiAgICAgcmV0dXJuIHJlc3VsdDsKIAogZXJyb3I6CkBAIC00NzAsMjEgKzU5NCwyOSBAQAogLypbY2xpbmljIGlucHV0XQogX2J6Mi5CWjJEZWNvbXByZXNzb3IuZGVjb21wcmVzcwogCisgICAgc2VsZjogc2VsZih0eXBlPSJCWjJEZWNvbXByZXNzb3IgKiIpCiAgICAgZGF0YTogUHlfYnVmZmVyCi0gICAgLworICAgIG1heF9sZW5ndGg6IFB5X3NzaXplX3Q9LTEKIAotUHJvdmlkZSBkYXRhIHRvIHRoZSBkZWNvbXByZXNzb3Igb2JqZWN0LgorRGVjb21wcmVzcyAqZGF0YSosIHJldHVybmluZyB1bmNvbXByZXNzZWQgZGF0YSBhcyBieXRlcy4KIAotUmV0dXJucyBhIGNodW5rIG9mIGRlY29tcHJlc3NlZCBkYXRhIGlmIHBvc3NpYmxlLCBvciBiJycgb3RoZXJ3aXNlLgorSWYgKm1heF9sZW5ndGgqIGlzIG5vbm5lZ2F0aXZlLCByZXR1cm5zIGF0IG1vc3QgKm1heF9sZW5ndGgqIGJ5dGVzIG9mCitkZWNvbXByZXNzZWQgZGF0YS4gSWYgdGhpcyBsaW1pdCBpcyByZWFjaGVkIGFuZCBmdXJ0aGVyIG91dHB1dCBjYW4gYmUKK3Byb2R1Y2VkLCAqc2VsZi5uZWVkc19pbnB1dCogd2lsbCBiZSBzZXQgdG8gYGBGYWxzZWBgLiBJbiB0aGlzIGNhc2UsIHRoZSBuZXh0CitjYWxsIHRvICpkZWNvbXByZXNzKCkqIG1heSBwcm92aWRlICpkYXRhKiBhcyBiJycgdG8gb2J0YWluIG1vcmUgb2YgdGhlIG91dHB1dC4KIAotQXR0ZW1wdGluZyB0byBkZWNvbXByZXNzIGRhdGEgYWZ0ZXIgdGhlIGVuZCBvZiBzdHJlYW0gaXMgcmVhY2hlZAotcmFpc2VzIGFuIEVPRkVycm9yLiAgQW55IGRhdGEgZm91bmQgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgc3RyZWFtCi1pcyBpZ25vcmVkIGFuZCBzYXZlZCBpbiB0aGUgdW51c2VkX2RhdGEgYXR0cmlidXRlLgorSWYgYWxsIG9mIHRoZSBpbnB1dCBkYXRhIHdhcyBkZWNvbXByZXNzZWQgYW5kIHJldHVybmVkIChlaXRoZXIgYmVjYXVzZSB0aGlzCit3YXMgbGVzcyB0aGFuICptYXhfbGVuZ3RoKiBieXRlcywgb3IgYmVjYXVzZSAqbWF4X2xlbmd0aCogd2FzIG5lZ2F0aXZlKSwKKypzZWxmLm5lZWRzX2lucHV0KiB3aWxsIGJlIHNldCB0byBUcnVlLgorCitBdHRlbXB0aW5nIHRvIGRlY29tcHJlc3MgZGF0YSBhZnRlciB0aGUgZW5kIG9mIHN0cmVhbSBpcyByZWFjaGVkIHJhaXNlcyBhbgorRU9GRXJyb3IuICBBbnkgZGF0YSBmb3VuZCBhZnRlciB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gaXMgaWdub3JlZCBhbmQgc2F2ZWQgaW4KK3RoZSB1bnVzZWRfZGF0YSBhdHRyaWJ1dGUuCiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1fYnoyX0JaMkRlY29tcHJlc3Nvcl9kZWNvbXByZXNzX2ltcGwoQloyRGVjb21wcmVzc29yICpzZWxmLCBQeV9idWZmZXIgKmRhdGEpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MDg2ZTRiOTllNjBjYjNmNiBpbnB1dD02MTZjMmE2ZGI1MjY5OTYxXSovCitfYnoyX0JaMkRlY29tcHJlc3Nvcl9kZWNvbXByZXNzX2ltcGwoQloyRGVjb21wcmVzc29yICpzZWxmLCBQeV9idWZmZXIgKmRhdGEsIFB5X3NzaXplX3QgbWF4X2xlbmd0aCkKKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD03ZWViNTc5NDAzNWEyY2EzIGlucHV0PTk1NThiNDI0YzhiMDA1MTZdKi8KIHsKICAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKIApAQCAtNDkyLDcgKzYyNCw3IEBACiAgICAgaWYgKHNlbGYtPmVvZikKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0VPRkVycm9yLCAiRW5kIG9mIHN0cmVhbSBhbHJlYWR5IHJlYWNoZWQiKTsKICAgICBlbHNlCi0gICAgICAgIHJlc3VsdCA9IGRlY29tcHJlc3Moc2VsZiwgZGF0YS0+YnVmLCBkYXRhLT5sZW4pOworICAgICAgICByZXN1bHQgPSBkZWNvbXByZXNzKHNlbGYsIGRhdGEtPmJ1ZiwgZGF0YS0+bGVuLCBtYXhfbGVuZ3RoKTsKICAgICBSRUxFQVNFX0xPQ0soc2VsZik7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTUyNywxMCArNjU5LDE0IEBACiAgICAgfQogI2VuZGlmCiAKLSAgICBzZWxmLT51bnVzZWRfZGF0YSA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoIiIsIDApOworICAgIHNlbGYtPm5lZWRzX2lucHV0ID0gMTsKKyAgICBzZWxmLT5ienNfYXZhaWxfaW5fcmVhbCA9IDA7CisgICAgc2VsZi0+aW5wdXRfYnVmZmVyID0gTlVMTDsKKyAgICBzZWxmLT5pbnB1dF9idWZmZXJfc2l6ZSA9IDA7CisgICAgc2VsZi0+dW51c2VkX2RhdGEgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIDApOwogICAgIGlmIChzZWxmLT51bnVzZWRfZGF0YSA9PSBOVUxMKQogICAgICAgICBnb3RvIGVycm9yOwotCisgICAgCiAgICAgYnplcnJvciA9IEJaMl9iekRlY29tcHJlc3NJbml0KCZzZWxmLT5ienMsIDAsIDApOwogICAgIGlmIChjYXRjaF9iejJfZXJyb3IoYnplcnJvcikpCiAgICAgICAgIGdvdG8gZXJyb3I7CkBAIC01NDksNiArNjg1LDggQEAKIHN0YXRpYyB2b2lkCiBCWjJEZWNvbXByZXNzb3JfZGVhbGxvYyhCWjJEZWNvbXByZXNzb3IgKnNlbGYpCiB7CisgICAgaWYoc2VsZi0+aW5wdXRfYnVmZmVyICE9IE5VTEwpCisgICAgICAgIFB5TWVtX0ZyZWUoc2VsZi0+aW5wdXRfYnVmZmVyKTsKICAgICBCWjJfYnpEZWNvbXByZXNzRW5kKCZzZWxmLT5ienMpOwogICAgIFB5X0NMRUFSKHNlbGYtPnVudXNlZF9kYXRhKTsKICNpZmRlZiBXSVRIX1RIUkVBRApAQCAtNTcwLDExICs3MDgsMTYgQEAKIFB5RG9jX1NUUlZBUihCWjJEZWNvbXByZXNzb3JfdW51c2VkX2RhdGFfX2RvY19fLAogIkRhdGEgZm91bmQgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgY29tcHJlc3NlZCBzdHJlYW0uIik7CiAKK1B5RG9jX1NUUlZBUihCWjJEZWNvbXByZXNzb3JfbmVlZHNfaW5wdXRfZG9jLAorIlRydWUgaWYgbW9yZSBpbnB1dCBpcyBuZWVkZWQgYmVmb3JlIG1vcmUgZGVjb21wcmVzc2VkIGRhdGEgY2FuIGJlIHByb2R1Y2VkLiIpOworCiBzdGF0aWMgUHlNZW1iZXJEZWYgQloyRGVjb21wcmVzc29yX21lbWJlcnNbXSA9IHsKICAgICB7ImVvZiIsIFRfQk9PTCwgb2Zmc2V0b2YoQloyRGVjb21wcmVzc29yLCBlb2YpLAogICAgICBSRUFET05MWSwgQloyRGVjb21wcmVzc29yX2VvZl9fZG9jX199LAogICAgIHsidW51c2VkX2RhdGEiLCBUX09CSkVDVF9FWCwgb2Zmc2V0b2YoQloyRGVjb21wcmVzc29yLCB1bnVzZWRfZGF0YSksCiAgICAgIFJFQURPTkxZLCBCWjJEZWNvbXByZXNzb3JfdW51c2VkX2RhdGFfX2RvY19ffSwKKyAgICB7Im5lZWRzX2lucHV0IiwgVF9CT09MLCBvZmZzZXRvZihCWjJEZWNvbXByZXNzb3IsIG5lZWRzX2lucHV0KSwgUkVBRE9OTFksCisgICAgIEJaMkRlY29tcHJlc3Nvcl9uZWVkc19pbnB1dF9kb2N9LAogICAgIHtOVUxMfQogfTsKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY29sbGVjdGlvbnNtb2R1bGUuYyBiL01vZHVsZXMvX2NvbGxlY3Rpb25zbW9kdWxlLmMKaW5kZXggNjlkOTNhZS4uZDQ3OTRiZSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY29sbGVjdGlvbnNtb2R1bGUuYworKysgYi9Nb2R1bGVzL19jb2xsZWN0aW9uc21vZHVsZS5jCkBAIC0xLDIzICsxLDI2IEBACiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAjaW5jbHVkZSAic3RydWN0bWVtYmVyLmgiCiAKKyNpZmRlZiBTVERDX0hFQURFUlMKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbHNlCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+ICAgICAgICAgIC8qIEZvciBzaXplX3QgKi8KKyNlbmRpZgorCiAvKiBjb2xsZWN0aW9ucyBtb2R1bGUgaW1wbGVtZW50YXRpb24gb2YgYSBkZXF1ZSgpIGRhdGF0eXBlCiAgICBXcml0dGVuIGFuZCBtYWludGFpbmVkIGJ5IFJheW1vbmQgRC4gSGV0dGluZ2VyIDxweXRob25AcmNuLmNvbT4KLSAgIENvcHlyaWdodCAoYykgMjAwNC0yMDE0IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICAgQ29weXJpZ2h0IChjKSAyMDA0LTIwMTUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgogKi8KIAogLyogVGhlIGJsb2NrIGxlbmd0aCBtYXkgYmUgc2V0IHRvIGFueSBudW1iZXIgb3ZlciAxLiAgTGFyZ2VyIG51bWJlcnMKICAqIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGNhbGxzIHRvIHRoZSBtZW1vcnkgYWxsb2NhdG9yLCBnaXZlIGZhc3RlcgotICogaW5kZXhpbmcgYW5kIHJvdGF0aW9uLCBhbmQgcmVkdWNlIHRoZSBsaW5rOjpkYXRhIG92ZXJoZWFkIHJhdGlvLgotICoKLSAqIElkZWFsbHksIHRoZSBibG9jayBsZW5ndGggd2lsbCBiZSBzZXQgdG8gdHdvIGxlc3MgdGhhbiBzb21lCi0gKiBtdWx0aXBsZSBvZiB0aGUgY2FjaGUtbGluZSBsZW5ndGggKHNvIHRoYXQgdGhlIGZ1bGwgYmxvY2sKLSAqIGluY2x1ZGluZyB0aGUgbGVmdGxpbmsgYW5kIHJpZ2h0bGluayB3aWxsIGZpdCBuZWF0bHkgaW50bwotICogY2FjaGUgbGluZXMpLgorICogaW5kZXhpbmcgYW5kIHJvdGF0aW9uLCBhbmQgcmVkdWNlIHRoZSBsaW5rIHRvIGRhdGEgb3ZlcmhlYWQgcmF0aW8uCisgKiBNYWtpbmcgdGhlIGJsb2NrIGxlbmd0aCBhIHBvd2VyIG9mIHR3byBzcGVlZHMtdXAgdGhlIG1vZHVsbworICogYW5kIGRpdmlzaW9uIGNhbGN1bGF0aW9ucyBpbiBkZXF1ZV9pdGVtKCkgYW5kIGRlcXVlX2Fzc19pdGVtKCkuCiAgKi8KIAotI2RlZmluZSBCTE9DS0xFTiA2MgorI2RlZmluZSBCTE9DS0xFTiA2NAogI2RlZmluZSBDRU5URVIgKChCTE9DS0xFTiAtIDEpIC8gMikKIAogLyogQSBgZGVxdWVvYmplY3RgIGlzIGNvbXBvc2VkIG9mIGEgZG91Ymx5LWxpbmtlZCBsaXN0IG9mIGBibG9ja2Agbm9kZXMuCkBAIC01Myw2ICs1NiwxOSBAQAogICAgIHN0cnVjdCBCTE9DSyAqcmlnaHRsaW5rOwogfSBibG9jazsKIAordHlwZWRlZiBzdHJ1Y3QgeworICAgIFB5T2JqZWN0X1ZBUl9IRUFECisgICAgYmxvY2sgKmxlZnRibG9jazsKKyAgICBibG9jayAqcmlnaHRibG9jazsKKyAgICBQeV9zc2l6ZV90IGxlZnRpbmRleDsgICAgICAgLyogaW4gcmFuZ2UoQkxPQ0tMRU4pICovCisgICAgUHlfc3NpemVfdCByaWdodGluZGV4OyAgICAgIC8qIGluIHJhbmdlKEJMT0NLTEVOKSAqLworICAgIHNpemVfdCBzdGF0ZTsgICAgICAgICAgICAgICAvKiBpbmNyZW1lbnRlZCB3aGVuZXZlciB0aGUgaW5kaWNlcyBtb3ZlICovCisgICAgUHlfc3NpemVfdCBtYXhsZW47CisgICAgUHlPYmplY3QgKndlYWtyZWZsaXN0OyAvKiBMaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyAqLworfSBkZXF1ZW9iamVjdDsKKworc3RhdGljIFB5VHlwZU9iamVjdCBkZXF1ZV90eXBlOworCiAvKiBGb3IgZGVidWcgYnVpbGRzLCBhZGQgZXJyb3IgY2hlY2tpbmcgdG8gdHJhY2sgdGhlIGVuZHBvaW50cwogICogaW4gdGhlIGNoYWluIG9mIGxpbmtzLiAgVGhlIGdvYWwgaXMgdG8gbWFrZSBzdXJlIHRoYXQgbGluawogICogYXNzaWdubWVudHMgb25seSB0YWtlIHBsYWNlIGF0IGVuZHBvaW50cyBzbyB0aGF0IGxpbmtzIGFscmVhZHkKQEAgLTExNiwzNiArMTMyLDcgQEAKICAgICB9CiB9CiAKLXR5cGVkZWYgc3RydWN0IHsKLSAgICBQeU9iamVjdF9WQVJfSEVBRAotICAgIGJsb2NrICpsZWZ0YmxvY2s7Ci0gICAgYmxvY2sgKnJpZ2h0YmxvY2s7Ci0gICAgUHlfc3NpemVfdCBsZWZ0aW5kZXg7ICAgICAgIC8qIGluIHJhbmdlKEJMT0NLTEVOKSAqLwotICAgIFB5X3NzaXplX3QgcmlnaHRpbmRleDsgICAgICAvKiBpbiByYW5nZShCTE9DS0xFTikgKi8KLSAgICBsb25nIHN0YXRlOyAgICAgICAgICAgICAgICAgLyogaW5jcmVtZW50ZWQgd2hlbmV2ZXIgdGhlIGluZGljZXMgbW92ZSAqLwotICAgIFB5X3NzaXplX3QgbWF4bGVuOwotICAgIFB5T2JqZWN0ICp3ZWFrcmVmbGlzdDsgLyogTGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgKi8KLX0gZGVxdWVvYmplY3Q7Ci0KLS8qIFRoZSBkZXF1ZSdzIHNpemUgbGltaXQgaXMgZC5tYXhsZW4uICBUaGUgbGltaXQgY2FuIGJlIHplcm8gb3IgcG9zaXRpdmUuCi0gKiBJZiB0aGVyZSBpcyBubyBsaW1pdCwgdGhlbiBkLm1heGxlbiA9PSAtMS4KLSAqCi0gKiBBZnRlciBhbiBpdGVtIGlzIGFkZGVkIHRvIGEgZGVxdWUsIHdlIGNoZWNrIHRvIHNlZSBpZiB0aGUgc2l6ZSBoYXMgZ3Jvd24gcGFzdAotICogdGhlIGxpbWl0LiBJZiBpdCBoYXMsIHdlIGdldCB0aGUgc2l6ZSBiYWNrIGRvd24gdG8gdGhlIGxpbWl0IGJ5IHBvcHBpbmcgYW4KLSAqIGl0ZW0gb2ZmIG9mIHRoZSBvcHBvc2l0ZSBlbmQuICBUaGUgbWV0aG9kcyB0aGF0IGNhbiB0cmlnZ2VyIHRoaXMgYXJlIGFwcGVuZCgpLAotICogYXBwZW5kbGVmdCgpLCBleHRlbmQoKSwgYW5kIGV4dGVuZGxlZnQoKS4KLSAqLwotCi0jZGVmaW5lIFRSSU0oZCwgcG9wZnVuY3Rpb24pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChkLT5tYXhsZW4gIT0gLTEgJiYgUHlfU0laRShkKSA+IGQtPm1heGxlbikgeyAgICAgICBcCi0gICAgICAgIFB5T2JqZWN0ICpydiA9IHBvcGZ1bmN0aW9uKGQsIE5VTEwpOyAgICAgICAgICAgICAgICBcCi0gICAgICAgIGFzc2VydChydiAhPSBOVUxMICAmJiAgUHlfU0laRShkKSA8PSBkLT5tYXhsZW4pOyAgICBcCi0gICAgICAgIFB5X0RFQ1JFRihydik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfQotCi1zdGF0aWMgUHlUeXBlT2JqZWN0IGRlcXVlX3R5cGU7Ci0KLS8qIFhYWCBUb2RvOiAKKy8qIFhYWCBUb2RvOgogICAgSWYgYWxpZ25lZCBtZW1vcnkgYWxsb2NhdGlvbnMgYmVjb21lIGF2YWlsYWJsZSwgbWFrZSB0aGUKICAgIGRlcXVlIG9iamVjdCA2NCBieXRlIGFsaWduZWQgc28gdGhhdCBhbGwgb2YgdGhlIGZpZWxkcwogICAgY2FuIGJlIHJldHJpZXZlZCBvciB1cGRhdGVkIGluIGEgc2luZ2xlIGNhY2hlIGxpbmUuCkBAIC0xNzEsMTQgKzE1OCwxNCBAQAogICAgIE1BUktfRU5EKGItPnJpZ2h0bGluayk7CiAKICAgICBhc3NlcnQoQkxPQ0tMRU4gPj0gMik7CisgICAgUHlfU0laRShkZXF1ZSkgPSAwOwogICAgIGRlcXVlLT5sZWZ0YmxvY2sgPSBiOwogICAgIGRlcXVlLT5yaWdodGJsb2NrID0gYjsKICAgICBkZXF1ZS0+bGVmdGluZGV4ID0gQ0VOVEVSICsgMTsKICAgICBkZXF1ZS0+cmlnaHRpbmRleCA9IENFTlRFUjsKLSAgICBQeV9TSVpFKGRlcXVlKSA9IDA7CiAgICAgZGVxdWUtPnN0YXRlID0gMDsKLSAgICBkZXF1ZS0+d2Vha3JlZmxpc3QgPSBOVUxMOwogICAgIGRlcXVlLT5tYXhsZW4gPSAtMTsKKyAgICBkZXF1ZS0+d2Vha3JlZmxpc3QgPSBOVUxMOwogCiAgICAgcmV0dXJuIChQeU9iamVjdCAqKWRlcXVlOwogfQpAQCAtMjU4LDYgKzI0NSwzNyBAQAogCiBQeURvY19TVFJWQVIocG9wbGVmdF9kb2MsICJSZW1vdmUgYW5kIHJldHVybiB0aGUgbGVmdG1vc3QgZWxlbWVudC4iKTsKIAorLyogVGhlIGRlcXVlJ3Mgc2l6ZSBsaW1pdCBpcyBkLm1heGxlbi4gIFRoZSBsaW1pdCBjYW4gYmUgemVybyBvciBwb3NpdGl2ZS4KKyAqIElmIHRoZXJlIGlzIG5vIGxpbWl0LCB0aGVuIGQubWF4bGVuID09IC0xLgorICoKKyAqIEFmdGVyIGFuIGl0ZW0gaXMgYWRkZWQgdG8gYSBkZXF1ZSwgd2UgY2hlY2sgdG8gc2VlIGlmIHRoZSBzaXplIGhhcyBncm93biBwYXN0CisgKiB0aGUgbGltaXQuIElmIGl0IGhhcywgd2UgZ2V0IHRoZSBzaXplIGJhY2sgZG93biB0byB0aGUgbGltaXQgYnkgcG9wcGluZyBhbgorICogaXRlbSBvZmYgb2YgdGhlIG9wcG9zaXRlIGVuZC4gIFRoZSBtZXRob2RzIHRoYXQgY2FuIHRyaWdnZXIgdGhpcyBhcmUgYXBwZW5kKCksCisgKiBhcHBlbmRsZWZ0KCksIGV4dGVuZCgpLCBhbmQgZXh0ZW5kbGVmdCgpLgorICovCisKK3N0YXRpYyB2b2lkCitkZXF1ZV90cmltX3JpZ2h0KGRlcXVlb2JqZWN0ICpkZXF1ZSkKK3sKKyAgICBpZiAoZGVxdWUtPm1heGxlbiAhPSAtMSAmJiBQeV9TSVpFKGRlcXVlKSA+IGRlcXVlLT5tYXhsZW4pIHsKKyAgICAgICAgUHlPYmplY3QgKnJ2ID0gZGVxdWVfcG9wKGRlcXVlLCBOVUxMKTsKKyAgICAgICAgYXNzZXJ0KHJ2ICE9IE5VTEwpOworICAgICAgICBhc3NlcnQoUHlfU0laRShkZXF1ZSkgPD0gZGVxdWUtPm1heGxlbik7CisgICAgICAgIFB5X0RFQ1JFRihydik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorZGVxdWVfdHJpbV9sZWZ0KGRlcXVlb2JqZWN0ICpkZXF1ZSkKK3sKKyAgICBpZiAoZGVxdWUtPm1heGxlbiAhPSAtMSAmJiBQeV9TSVpFKGRlcXVlKSA+IGRlcXVlLT5tYXhsZW4pIHsKKyAgICAgICAgUHlPYmplY3QgKnJ2ID0gZGVxdWVfcG9wbGVmdChkZXF1ZSwgTlVMTCk7CisgICAgICAgIGFzc2VydChydiAhPSBOVUxMKTsKKyAgICAgICAgYXNzZXJ0KFB5X1NJWkUoZGVxdWUpIDw9IGRlcXVlLT5tYXhsZW4pOworICAgICAgICBQeV9ERUNSRUYocnYpOworICAgIH0KK30KKwogc3RhdGljIFB5T2JqZWN0ICoKIGRlcXVlX2FwcGVuZChkZXF1ZW9iamVjdCAqZGVxdWUsIFB5T2JqZWN0ICppdGVtKQogewpAQCAtMjc3LDcgKzI5NSw3IEBACiAgICAgUHlfU0laRShkZXF1ZSkrKzsKICAgICBkZXF1ZS0+cmlnaHRpbmRleCsrOwogICAgIGRlcXVlLT5yaWdodGJsb2NrLT5kYXRhW2RlcXVlLT5yaWdodGluZGV4XSA9IGl0ZW07Ci0gICAgVFJJTShkZXF1ZSwgZGVxdWVfcG9wbGVmdCk7CisgICAgZGVxdWVfdHJpbV9sZWZ0KGRlcXVlKTsKICAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIApAQCAtMzAyLDcgKzMyMCw3IEBACiAgICAgUHlfU0laRShkZXF1ZSkrKzsKICAgICBkZXF1ZS0+bGVmdGluZGV4LS07CiAgICAgZGVxdWUtPmxlZnRibG9jay0+ZGF0YVtkZXF1ZS0+bGVmdGluZGV4XSA9IGl0ZW07Ci0gICAgVFJJTShkZXF1ZSwgZGVxdWVfcG9wKTsKKyAgICBkZXF1ZV90cmltX3JpZ2h0KGRlcXVlKTsKICAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIApAQCAtMzc1LDcgKzM5Myw3IEBACiAgICAgICAgIFB5X1NJWkUoZGVxdWUpKys7CiAgICAgICAgIGRlcXVlLT5yaWdodGluZGV4Kys7CiAgICAgICAgIGRlcXVlLT5yaWdodGJsb2NrLT5kYXRhW2RlcXVlLT5yaWdodGluZGV4XSA9IGl0ZW07Ci0gICAgICAgIFRSSU0oZGVxdWUsIGRlcXVlX3BvcGxlZnQpOworICAgICAgICBkZXF1ZV90cmltX2xlZnQoZGVxdWUpOwogICAgIH0KICAgICBQeV9ERUNSRUYoaXQpOwogICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQpAQCAtNDM2LDcgKzQ1NCw3IEBACiAgICAgICAgIFB5X1NJWkUoZGVxdWUpKys7CiAgICAgICAgIGRlcXVlLT5sZWZ0aW5kZXgtLTsKICAgICAgICAgZGVxdWUtPmxlZnRibG9jay0+ZGF0YVtkZXF1ZS0+bGVmdGluZGV4XSA9IGl0ZW07Ci0gICAgICAgIFRSSU0oZGVxdWUsIGRlcXVlX3BvcCk7CisgICAgICAgIGRlcXVlX3RyaW1fcmlnaHQoZGVxdWUpOwogICAgIH0KICAgICBQeV9ERUNSRUYoaXQpOwogICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQpAQCAtNjc0LDggKzY5Miw4IEBACiAgICAgUHlfc3NpemVfdCBuID0gUHlfU0laRShkZXF1ZSk7CiAgICAgUHlfc3NpemVfdCBpOwogICAgIFB5X3NzaXplX3QgY291bnQgPSAwOworICAgIHNpemVfdCBzdGFydF9zdGF0ZSA9IGRlcXVlLT5zdGF0ZTsKICAgICBQeU9iamVjdCAqaXRlbTsKLSAgICBsb25nIHN0YXJ0X3N0YXRlID0gZGVxdWUtPnN0YXRlOwogICAgIGludCBjbXA7CiAKICAgICBmb3IgKGk9MCA7IGk8biA7IGkrKykgewpAQCAtNzU3LDkgKzc3NSwxNyBAQAogICAgICAgICBhc3NlcnQgKGl0ZW0gIT0gTlVMTCk7CiAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKICAgICB9Ci0gICAgYXNzZXJ0KGRlcXVlLT5sZWZ0YmxvY2sgPT0gZGVxdWUtPnJpZ2h0YmxvY2sgJiYKLSAgICAgICAgICAgZGVxdWUtPmxlZnRpbmRleCAtIDEgPT0gZGVxdWUtPnJpZ2h0aW5kZXggJiYKLSAgICAgICAgICAgUHlfU0laRShkZXF1ZSkgPT0gMCk7CisgICAgYXNzZXJ0KGRlcXVlLT5sZWZ0YmxvY2sgPT0gZGVxdWUtPnJpZ2h0YmxvY2spOworICAgIGFzc2VydChkZXF1ZS0+bGVmdGluZGV4IC0gMSA9PSBkZXF1ZS0+cmlnaHRpbmRleCk7CisgICAgYXNzZXJ0KFB5X1NJWkUoZGVxdWUpID09IDApOworfQorCitzdGF0aWMgaW50Cit2YWxpZF9pbmRleChQeV9zc2l6ZV90IGksIFB5X3NzaXplX3QgbGltaXQpCit7CisgICAgLyogVGhlIGNhc3QgdG8gc2l6ZV90IGxldCB1cyB1c2UganVzdCBhIHNpbmdsZSBjb21wYXJpc29uCisgICAgICAgdG8gY2hlY2sgd2hldGhlciBpIGlzIGluIHRoZSByYW5nZTogMCA8PSBpIDwgbGltaXQgKi8KKyAgICByZXR1cm4gKHNpemVfdCkgaSA8IChzaXplX3QpIGxpbWl0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtNzY5LDkgKzc5NSw4IEBACiAgICAgUHlPYmplY3QgKml0ZW07CiAgICAgUHlfc3NpemVfdCBuLCBpbmRleD1pOwogCi0gICAgaWYgKGkgPCAwIHx8IGkgPj0gUHlfU0laRShkZXF1ZSkpIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAiZGVxdWUgaW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgaWYgKCF2YWxpZF9pbmRleChpLCBQeV9TSVpFKGRlcXVlKSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJkZXF1ZSBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCkBAIC03ODMsMTQgKzgwOCwxNiBAQAogICAgICAgICBiID0gZGVxdWUtPnJpZ2h0YmxvY2s7CiAgICAgfSBlbHNlIHsKICAgICAgICAgaSArPSBkZXF1ZS0+bGVmdGluZGV4OwotICAgICAgICBuID0gaSAvIEJMT0NLTEVOOwotICAgICAgICBpICU9IEJMT0NLTEVOOworICAgICAgICBuID0gKFB5X3NzaXplX3QpKChzaXplX3QpIGkgLyBCTE9DS0xFTik7CisgICAgICAgIGkgPSAoUHlfc3NpemVfdCkoKHNpemVfdCkgaSAlIEJMT0NLTEVOKTsKICAgICAgICAgaWYgKGluZGV4IDwgKFB5X1NJWkUoZGVxdWUpID4+IDEpKSB7CiAgICAgICAgICAgICBiID0gZGVxdWUtPmxlZnRibG9jazsKICAgICAgICAgICAgIHdoaWxlIChuLS0pCiAgICAgICAgICAgICAgICAgYiA9IGItPnJpZ2h0bGluazsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG4gPSAoZGVxdWUtPmxlZnRpbmRleCArIFB5X1NJWkUoZGVxdWUpIC0gMSkgLyBCTE9DS0xFTiAtIG47CisgICAgICAgICAgICBuID0gKFB5X3NzaXplX3QpKAorICAgICAgICAgICAgICAgICAgICAoKHNpemVfdCkoZGVxdWUtPmxlZnRpbmRleCArIFB5X1NJWkUoZGVxdWUpIC0gMSkpCisgICAgICAgICAgICAgICAgICAgIC8gQkxPQ0tMRU4gLSBuKTsKICAgICAgICAgICAgIGIgPSBkZXF1ZS0+cmlnaHRibG9jazsKICAgICAgICAgICAgIHdoaWxlIChuLS0pCiAgICAgICAgICAgICAgICAgYiA9IGItPmxlZnRsaW5rOwpAQCAtODMxLDIzICs4NTgsMjQgQEAKICAgICBibG9jayAqYjsKICAgICBQeV9zc2l6ZV90IG4sIGxlbj1QeV9TSVpFKGRlcXVlKSwgaGFsZmxlbj0obGVuKzEpPj4xLCBpbmRleD1pOwogCi0gICAgaWYgKGkgPCAwIHx8IGkgPj0gbGVuKSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgImRlcXVlIGluZGV4IG91dCBvZiByYW5nZSIpOworICAgIGlmICghdmFsaWRfaW5kZXgoaSwgbGVuKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgImRlcXVlIGluZGV4IG91dCBvZiByYW5nZSIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIGlmICh2ID09IE5VTEwpCiAgICAgICAgIHJldHVybiBkZXF1ZV9kZWxfaXRlbShkZXF1ZSwgaSk7CiAKICAgICBpICs9IGRlcXVlLT5sZWZ0aW5kZXg7Ci0gICAgbiA9IGkgLyBCTE9DS0xFTjsKLSAgICBpICU9IEJMT0NLTEVOOworICAgIG4gPSAoUHlfc3NpemVfdCkoKHNpemVfdCkgaSAvIEJMT0NLTEVOKTsKKyAgICBpID0gKFB5X3NzaXplX3QpKChzaXplX3QpIGkgJSBCTE9DS0xFTik7CiAgICAgaWYgKGluZGV4IDw9IGhhbGZsZW4pIHsKICAgICAgICAgYiA9IGRlcXVlLT5sZWZ0YmxvY2s7CiAgICAgICAgIHdoaWxlIChuLS0pCiAgICAgICAgICAgICBiID0gYi0+cmlnaHRsaW5rOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIG4gPSAoZGVxdWUtPmxlZnRpbmRleCArIGxlbiAtIDEpIC8gQkxPQ0tMRU4gLSBuOworICAgICAgICBuID0gKFB5X3NzaXplX3QpKAorICAgICAgICAgICAgICAgICgoc2l6ZV90KShkZXF1ZS0+bGVmdGluZGV4ICsgUHlfU0laRShkZXF1ZSkgLSAxKSkKKyAgICAgICAgICAgICAgICAvIEJMT0NLTEVOIC0gbik7CiAgICAgICAgIGIgPSBkZXF1ZS0+cmlnaHRibG9jazsKICAgICAgICAgd2hpbGUgKG4tLSkKICAgICAgICAgICAgIGIgPSBiLT5sZWZ0bGluazsKQEAgLTExMjQsMTAgKzExNTIsMTAgQEAKICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9yZXBlYXQgKi8KICAgICAoc3NpemVhcmdmdW5jKWRlcXVlX2l0ZW0sICAgICAgICAgICAvKiBzcV9pdGVtICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3Ffc2xpY2UgKi8KLSAgICAoc3NpemVvYmphcmdwcm9jKWRlcXVlX2Fzc19pdGVtLCAgICAgICAgICAgIC8qIHNxX2Fzc19pdGVtICovCisgICAgKHNzaXplb2JqYXJncHJvYylkZXF1ZV9hc3NfaXRlbSwgICAgLyogc3FfYXNzX2l0ZW0gKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9hc3Nfc2xpY2UgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9jb250YWlucyAqLwotICAgIChiaW5hcnlmdW5jKWRlcXVlX2lucGxhY2VfY29uY2F0LCAgICAgICAgICAgLyogc3FfaW5wbGFjZV9jb25jYXQgKi8KKyAgICAoYmluYXJ5ZnVuYylkZXF1ZV9pbnBsYWNlX2NvbmNhdCwgICAvKiBzcV9pbnBsYWNlX2NvbmNhdCAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2lucGxhY2VfcmVwZWF0ICovCiAKIH07CkBAIC0xMjI2LDEwICsxMjU0LDEwIEBACiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBQeU9iamVjdF9IRUFECi0gICAgUHlfc3NpemVfdCBpbmRleDsKICAgICBibG9jayAqYjsKKyAgICBQeV9zc2l6ZV90IGluZGV4OwogICAgIGRlcXVlb2JqZWN0ICpkZXF1ZTsKLSAgICBsb25nIHN0YXRlOyAgICAgICAgIC8qIHN0YXRlIHdoZW4gdGhlIGl0ZXJhdG9yIGlzIGNyZWF0ZWQgKi8KKyAgICBzaXplX3Qgc3RhdGU7ICAgICAgICAgIC8qIHN0YXRlIHdoZW4gdGhlIGl0ZXJhdG9yIGlzIGNyZWF0ZWQgKi8KICAgICBQeV9zc2l6ZV90IGNvdW50ZXI7ICAgIC8qIG51bWJlciBvZiBpdGVtcyByZW1haW5pbmcgZm9yIGl0ZXJhdGlvbiAqLwogfSBkZXF1ZWl0ZXJvYmplY3Q7CiAKQEAgLTEzNDYsNyArMTM3NCw3IEBACiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgZGVxdWVpdGVyX3R5cGUgPSB7CiAgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0gICAgIl9jb2xsZWN0aW9ucy5fZGVxdWVfaXRlcmF0b3IiLCAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgICJfY29sbGVjdGlvbnMuX2RlcXVlX2l0ZXJhdG9yIiwgICAgICAgICAgICAgLyogdHBfbmFtZSAqLwogICAgIHNpemVvZihkZXF1ZWl0ZXJvYmplY3QpLCAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLwogICAgIC8qIG1ldGhvZHMgKi8KQEAgLTEzNjUsNyArMTM5Myw3IEBACiAgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLwotICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywvKiB0cF9mbGFncyAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywgICAgLyogdHBfZmxhZ3MgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLwogICAgICh0cmF2ZXJzZXByb2MpZGVxdWVpdGVyX3RyYXZlcnNlLCAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCkBAIC0xNDY4LDcgKzE0OTYsNyBAQAogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGRlcXVlcmV2aXRlcl90eXBlID0gewogICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotICAgICJfY29sbGVjdGlvbnMuX2RlcXVlX3JldmVyc2VfaXRlcmF0b3IiLCAgICAgIC8qIHRwX25hbWUgKi8KKyAgICAiX2NvbGxlY3Rpb25zLl9kZXF1ZV9yZXZlcnNlX2l0ZXJhdG9yIiwgICAgIC8qIHRwX25hbWUgKi8KICAgICBzaXplb2YoZGVxdWVpdGVyb2JqZWN0KSwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KICAgICAvKiBtZXRob2RzICovCkBAIC0xNDg3LDcgKzE1MTUsNyBAQAogICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KLSAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsICAgIC8qIHRwX2ZsYWdzICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KICAgICAodHJhdmVyc2Vwcm9jKWRlcXVlaXRlcl90cmF2ZXJzZSwgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLwpAQCAtMTg1MSw3ICsxODc5LDcgQEAKICAgICAgICAgICAgICAgICAoaGFzaCA9ICgoUHlBU0NJSU9iamVjdCAqKSBrZXkpLT5oYXNoKSA9PSAtMSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBoYXNoID0gUHlPYmplY3RfSGFzaChrZXkpOwotICAgICAgICAgICAgICAgIGlmIChoYXNoID09IC0xKSAKKyAgICAgICAgICAgICAgICBpZiAoaGFzaCA9PSAtMSkKICAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOwogICAgICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvX2N0eXBlcy5jIGIvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXMuYwppbmRleCBjMjg4OWQyLi42NTMxYWVjIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvX2N0eXBlcy5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9fY3R5cGVzLmMKQEAgLTMwMSw3ICszMDEsNyBAQAogICAgIGNoYXIgKm5ld19wcmVmaXg7CiAgICAgY2hhciAqcmVzdWx0OwogICAgIGNoYXIgYnVmWzMyXTsKLSAgICBpbnQgcHJlZml4X2xlbjsKKyAgICBQeV9zc2l6ZV90IHByZWZpeF9sZW47CiAgICAgaW50IGs7CiAKICAgICBwcmVmaXhfbGVuID0gMzIgKiBuZGltICsgMzsKQEAgLTI4MTksOCArMjgxOSw5IEBACiAgICAgICAgICAgICAgICBzcmMtPmJfcHRyLAogICAgICAgICAgICAgICAgc2l6ZSk7CiAKLSAgICAgICAgaWYgKFB5Q1BvaW50ZXJUeXBlT2JqZWN0X0NoZWNrKHR5cGUpKQotICAgICAgICAgICAgLyogWFhYICovOworICAgICAgICBpZiAoUHlDUG9pbnRlclR5cGVPYmplY3RfQ2hlY2sodHlwZSkpIHsKKyAgICAgICAgICAgIC8qIFhYWCAqLworICAgICAgICB9CiAKICAgICAgICAgdmFsdWUgPSBHZXRLZWVwZWRPYmplY3RzKHNyYyk7CiAgICAgICAgIGlmICh2YWx1ZSA9PSBOVUxMKQpAQCAtNDMwNSw4ICs0MzA2LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2VsZW4pOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBkZXN0ID0gKHdjaGFyX3QgKilQeU1lbV9NYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGljZWxlbiAqIHNpemVvZih3Y2hhcl90KSk7CisgICAgICAgICAgICBkZXN0ID0gUHlNZW1fTmV3KHdjaGFyX3QsIHNsaWNlbGVuKTsKKyAgICAgICAgICAgIGlmIChkZXN0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IHNsaWNlbGVuOwogICAgICAgICAgICAgICAgICBjdXIgKz0gc3RlcCwgaSsrKSB7CkBAIC00OTg2LDcgKzQ5OTAsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVdpZGVDaGFyKHB0ciArIHN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0ID0gKHdjaGFyX3QgKilQeU1lbV9NYWxsb2MobGVuICogc2l6ZW9mKHdjaGFyX3QpKTsKKyAgICAgICAgICAgIGRlc3QgPSBQeU1lbV9OZXcod2NoYXJfdCwgbGVuKTsKICAgICAgICAgICAgIGlmIChkZXN0ID09IE5VTEwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAgICAgICAgICAgICBmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IGxlbjsgY3VyICs9IHN0ZXAsIGkrKykgewpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL3N0Z2RpY3QuYyBiL01vZHVsZXMvX2N0eXBlcy9zdGdkaWN0LmMKaW5kZXggNzI4Zjc1MS4uODc5YWZiOCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL3N0Z2RpY3QuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvc3RnZGljdC5jCkBAIC03NiwxNCArNzYsMTggQEAKIAogICAgIGlmIChzcmMtPmZvcm1hdCkgewogICAgICAgICBkc3QtPmZvcm1hdCA9IFB5TWVtX01hbGxvYyhzdHJsZW4oc3JjLT5mb3JtYXQpICsgMSk7Ci0gICAgICAgIGlmIChkc3QtPmZvcm1hdCA9PSBOVUxMKQorICAgICAgICBpZiAoZHN0LT5mb3JtYXQgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQogICAgICAgICBzdHJjcHkoZHN0LT5mb3JtYXQsIHNyYy0+Zm9ybWF0KTsKICAgICB9CiAgICAgaWYgKHNyYy0+c2hhcGUpIHsKICAgICAgICAgZHN0LT5zaGFwZSA9IFB5TWVtX01hbGxvYyhzaXplb2YoUHlfc3NpemVfdCkgKiBzcmMtPm5kaW0pOwotICAgICAgICBpZiAoZHN0LT5zaGFwZSA9PSBOVUxMKQorICAgICAgICBpZiAoZHN0LT5zaGFwZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOwogICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CiAgICAgICAgIG1lbWNweShkc3QtPnNoYXBlLCBzcmMtPnNoYXBlLAogICAgICAgICAgICAgICAgc2l6ZW9mKFB5X3NzaXplX3QpICogc3JjLT5uZGltKTsKICAgICB9CkBAIC0zODAsNyArMzg0LDcgQEAKICAgICAgICAgdW5pb25fc2l6ZSA9IDA7CiAgICAgICAgIHRvdGFsX2FsaWduID0gYWxpZ24gPyBhbGlnbiA6IDE7CiAgICAgICAgIHN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIudHlwZSA9IEZGSV9UWVBFX1NUUlVDVDsKLSAgICAgICAgc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cyA9IFB5TWVtX01hbGxvYyhzaXplb2YoZmZpX3R5cGUgKikgKiAoYmFzZWRpY3QtPmxlbmd0aCArIGxlbiArIDEpKTsKKyAgICAgICAgc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cyA9IFB5TWVtX05ldyhmZmlfdHlwZSAqLCBiYXNlZGljdC0+bGVuZ3RoICsgbGVuICsgMSk7CiAgICAgICAgIGlmIChzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzID09IE5VTEwpIHsKICAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CiAgICAgICAgICAgICByZXR1cm4gLTE7CkBAIC0zOTgsNyArNDAyLDcgQEAKICAgICAgICAgdW5pb25fc2l6ZSA9IDA7CiAgICAgICAgIHRvdGFsX2FsaWduID0gMTsKICAgICAgICAgc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci50eXBlID0gRkZJX1RZUEVfU1RSVUNUOwotICAgICAgICBzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzID0gUHlNZW1fTWFsbG9jKHNpemVvZihmZmlfdHlwZSAqKSAqIChsZW4gKyAxKSk7CisgICAgICAgIHN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMgPSBQeU1lbV9OZXcoZmZpX3R5cGUgKiwgbGVuICsgMSk7CiAgICAgICAgIGlmIChzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzID09IE5VTEwpIHsKICAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CiAgICAgICAgICAgICByZXR1cm4gLTE7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19kYXRldGltZW1vZHVsZS5jIGIvTW9kdWxlcy9fZGF0ZXRpbWVtb2R1bGUuYwppbmRleCA3MDFjNTg3Li4wOTI4NWQ5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19kYXRldGltZW1vZHVsZS5jCisrKyBiL01vZHVsZXMvX2RhdGV0aW1lbW9kdWxlLmMKQEAgLTUwMjAsOCArNTAyMCw3IEBACiAKICAgICB7InV0Y2Zyb210aW1lc3RhbXAiLCAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfdXRjZnJvbXRpbWVzdGFtcCwKICAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9DTEFTUywKLSAgICAgUHlEb2NfU1RSKCJ0aW1lc3RhbXAgLT4gVVRDIGRhdGV0aW1lIGZyb20gYSBQT1NJWCB0aW1lc3RhbXAgIgotICAgICAgICAgICAgICAgIihsaWtlIHRpbWUudGltZSgpKS4iKX0sCisgICAgIFB5RG9jX1NUUigiQ29uc3RydWN0IGEgbmFpdmUgVVRDIGRhdGV0aW1lIGZyb20gYSBQT1NJWCB0aW1lc3RhbXAuIil9LAogCiAgICAgeyJzdHJwdGltZSIsIChQeUNGdW5jdGlvbilkYXRldGltZV9zdHJwdGltZSwKICAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9DTEFTUywKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2VsZW1lbnR0cmVlLmMgYi9Nb2R1bGVzL19lbGVtZW50dHJlZS5jCmluZGV4IDliM2U5ZWQuLmJmNGJjNGEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2VsZW1lbnR0cmVlLmMKKysrIGIvTW9kdWxlcy9fZWxlbWVudHRyZWUuYwpAQCAtMTEsNiArMTEsOCBAQAogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCiAKKyNkZWZpbmUgUFlfU1NJWkVfVF9DTEVBTgorCiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAjaW5jbHVkZSAic3RydWN0bWVtYmVyLmgiCiAKQEAgLTE4NSw4ICsxODcsOCBAQAogICAgIFB5T2JqZWN0KiBhdHRyaWI7CiAKICAgICAvKiBjaGlsZCBlbGVtZW50cyAqLwotICAgIGludCBsZW5ndGg7IC8qIGFjdHVhbCBudW1iZXIgb2YgaXRlbXMgKi8KLSAgICBpbnQgYWxsb2NhdGVkOyAvKiBhbGxvY2F0ZWQgaXRlbXMgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aDsgLyogYWN0dWFsIG51bWJlciBvZiBpdGVtcyAqLworICAgIFB5X3NzaXplX3QgYWxsb2NhdGVkOyAvKiBhbGxvY2F0ZWQgaXRlbXMgKi8KIAogICAgIC8qIHRoaXMgZWl0aGVyIHBvaW50cyB0byBfY2hpbGRyZW4gb3IgdG8gYSBtYWxsb2NlZCBidWZmZXIgKi8KICAgICBQeU9iamVjdCogKmNoaWxkcmVuOwpAQCAtMjUxLDcgKzI1Myw3IEBACiBkZWFsbG9jX2V4dHJhKEVsZW1lbnRPYmplY3QqIHNlbGYpCiB7CiAgICAgRWxlbWVudE9iamVjdEV4dHJhICpteWV4dHJhOwotICAgIGludCBpOworICAgIFB5X3NzaXplX3QgaTsKIAogICAgIGlmICghc2VsZi0+ZXh0cmEpCiAgICAgICAgIHJldHVybjsKQEAgLTQyOSw5ICs0MzEsOSBAQAogfQogCiBMT0NBTChpbnQpCi1lbGVtZW50X3Jlc2l6ZShFbGVtZW50T2JqZWN0KiBzZWxmLCBpbnQgZXh0cmEpCitlbGVtZW50X3Jlc2l6ZShFbGVtZW50T2JqZWN0KiBzZWxmLCBQeV9zc2l6ZV90IGV4dHJhKQogewotICAgIGludCBzaXplOworICAgIFB5X3NzaXplX3Qgc2l6ZTsKICAgICBQeU9iamVjdCogKmNoaWxkcmVuOwogCiAgICAgLyogbWFrZSBzdXJlIHNlbGYtPmNoaWxkcmVuIGNhbiBob2xkIHRoZSBnaXZlbiBudW1iZXIgb2YgZXh0cmEKQEAgLTQ0Miw3ICs0NDQsNyBAQAogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIHNpemUgPSBzZWxmLT5leHRyYS0+bGVuZ3RoICsgZXh0cmE7CisgICAgc2l6ZSA9IHNlbGYtPmV4dHJhLT5sZW5ndGggKyBleHRyYTsgIC8qIG5ldmVyIG92ZXJmbG93cyAqLwogCiAgICAgaWYgKHNpemUgPiBzZWxmLT5leHRyYS0+YWxsb2NhdGVkKSB7CiAgICAgICAgIC8qIHVzZSBQeXRob24gMi40J3MgbGlzdCBncm93dGggc3RyYXRlZ3kgKi8KQEAgLTQ1Myw2ICs0NTUsOCBAQAogICAgICAgICAgKiBiZSBzYWZlLgogICAgICAgICAgKi8KICAgICAgICAgc2l6ZSA9IHNpemUgPyBzaXplIDogMTsKKyAgICAgICAgaWYgKChzaXplX3Qpc2l6ZSA+IFBZX1NTSVpFX1RfTUFYL3NpemVvZihQeU9iamVjdCopKQorICAgICAgICAgICAgZ290byBub21lbW9yeTsKICAgICAgICAgaWYgKHNlbGYtPmV4dHJhLT5jaGlsZHJlbiAhPSBzZWxmLT5leHRyYS0+X2NoaWxkcmVuKSB7CiAgICAgICAgICAgICAvKiBDb3Zlcml0eSBDSUQgIzE4MiBzaXplX2Vycm9yOiBBbGxvY2F0aW5nIDEgYnl0ZXMgdG8gcG9pbnRlcgogICAgICAgICAgICAgICogImNoaWxkcmVuIiwgd2hpY2ggbmVlZHMgYXQgbGVhc3QgNCBieXRlcy4gQWx0aG91Z2ggaXQncyBhCkBAIC02MTMsNyArNjE3LDcgQEAKICAgICBQeV9WSVNJVChKT0lOX09CSihzZWxmLT50YWlsKSk7CiAKICAgICBpZiAoc2VsZi0+ZXh0cmEpIHsKLSAgICAgICAgaW50IGk7CisgICAgICAgIFB5X3NzaXplX3QgaTsKICAgICAgICAgUHlfVklTSVQoc2VsZi0+ZXh0cmEtPmF0dHJpYik7CiAKICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNlbGYtPmV4dHJhLT5sZW5ndGg7ICsraSkKQEAgLTY4OSw3ICs2OTMsNyBAQAogc3RhdGljIFB5T2JqZWN0KgogZWxlbWVudF9jb3B5KEVsZW1lbnRPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQogewotICAgIGludCBpOworICAgIFB5X3NzaXplX3QgaTsKICAgICBFbGVtZW50T2JqZWN0KiBlbGVtZW50OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6X19jb3B5X18iKSkKQEAgLTcyOCw3ICs3MzIsNyBAQAogc3RhdGljIFB5T2JqZWN0KgogZWxlbWVudF9kZWVwY29weShFbGVtZW50T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncykKIHsKLSAgICBpbnQgaTsKKyAgICBQeV9zc2l6ZV90IGk7CiAgICAgRWxlbWVudE9iamVjdCogZWxlbWVudDsKICAgICBQeU9iamVjdCogdGFnOwogICAgIFB5T2JqZWN0KiBhdHRyaWI7CkBAIC04MzksNyArODQzLDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBlbGVtZW50X2dldHN0YXRlKEVsZW1lbnRPYmplY3QgKnNlbGYpCiB7Ci0gICAgaW50IGksIG5vYXR0cmliOworICAgIFB5X3NzaXplX3QgaSwgbm9hdHRyaWI7CiAgICAgUHlPYmplY3QgKmluc3RhbmNlZGljdCA9IE5VTEwsICpjaGlsZHJlbjsKIAogICAgIC8qIEJ1aWxkIGEgbGlzdCBvZiBjaGlsZHJlbi4gKi8KQEAgLTEwNzcsNyArMTA4MSw3IEBACiBzdGF0aWMgUHlPYmplY3QqCiBlbGVtZW50X2ZpbmQoRWxlbWVudE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotICAgIGludCBpOworICAgIFB5X3NzaXplX3QgaTsKICAgICBQeU9iamVjdCogdGFnOwogICAgIFB5T2JqZWN0KiBuYW1lc3BhY2VzID0gUHlfTm9uZTsKICAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7InBhdGgiLCAibmFtZXNwYWNlcyIsIDB9OwpAQCAtMTExMiw3ICsxMTE2LDcgQEAKIHN0YXRpYyBQeU9iamVjdCoKIGVsZW1lbnRfZmluZHRleHQoRWxlbWVudE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotICAgIGludCBpOworICAgIFB5X3NzaXplX3QgaTsKICAgICBQeU9iamVjdCogdGFnOwogICAgIFB5T2JqZWN0KiBkZWZhdWx0X3ZhbHVlID0gUHlfTm9uZTsKICAgICBQeU9iamVjdCogbmFtZXNwYWNlcyA9IFB5X05vbmU7CkBAIC0xMTUzLDcgKzExNTcsNyBAQAogc3RhdGljIFB5T2JqZWN0KgogZWxlbWVudF9maW5kYWxsKEVsZW1lbnRPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLSAgICBpbnQgaTsKKyAgICBQeV9zc2l6ZV90IGk7CiAgICAgUHlPYmplY3QqIG91dDsKICAgICBQeU9iamVjdCogdGFnOwogICAgIFB5T2JqZWN0KiBuYW1lc3BhY2VzID0gUHlfTm9uZTsKQEAgLTEyMzgsNyArMTI0Miw3IEBACiBzdGF0aWMgUHlPYmplY3QqCiBlbGVtZW50X2dldGNoaWxkcmVuKEVsZW1lbnRPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQogewotICAgIGludCBpOworICAgIFB5X3NzaXplX3QgaTsKICAgICBQeU9iamVjdCogbGlzdDsKIAogICAgIC8qIEZJWE1FOiByZXBvcnQgYXMgZGVwcmVjYXRlZD8gKi8KQEAgLTEzMTAsMTEgKzEzMTQsOSBAQAogc3RhdGljIFB5T2JqZWN0KgogZWxlbWVudF9pbnNlcnQoRWxlbWVudE9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCiB7Ci0gICAgaW50IGk7Ci0KLSAgICBpbnQgaW5kZXg7CisgICAgUHlfc3NpemVfdCBpbmRleCwgaTsKICAgICBQeU9iamVjdCogZWxlbWVudDsKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlPITppbnNlcnQiLCAmaW5kZXgsCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJuTyE6aW5zZXJ0IiwgJmluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAmRWxlbWVudF9UeXBlLCAmZWxlbWVudCkpCiAgICAgICAgIHJldHVybiBOVUxMOwogCkBAIC0xNDAyLDcgKzE0MDQsNyBAQAogc3RhdGljIFB5T2JqZWN0KgogZWxlbWVudF9yZW1vdmUoRWxlbWVudE9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCiB7Ci0gICAgaW50IGk7CisgICAgUHlfc3NpemVfdCBpOwogCiAgICAgUHlPYmplY3QqIGVsZW1lbnQ7CiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPITpyZW1vdmUiLCAmRWxlbWVudF9UeXBlLCAmZWxlbWVudCkpCkBAIC0xNDgxLDcgKzE0ODMsNyBAQAogZWxlbWVudF9zZXRpdGVtKFB5T2JqZWN0KiBzZWxmXywgUHlfc3NpemVfdCBpbmRleCwgUHlPYmplY3QqIGl0ZW0pCiB7CiAgICAgRWxlbWVudE9iamVjdCogc2VsZiA9IChFbGVtZW50T2JqZWN0Kikgc2VsZl87Ci0gICAgaW50IGk7CisgICAgUHlfc3NpemVfdCBpOwogICAgIFB5T2JqZWN0KiBvbGQ7CiAKICAgICBpZiAoIXNlbGYtPmV4dHJhIHx8IGluZGV4IDwgMCB8fCBpbmRleCA+PSBzZWxmLT5leHRyYS0+bGVuZ3RoKSB7CkBAIC0yODE5LDEyICsyODIxLDEzIEBACiAgKiBtZXNzYWdlIHN0cmluZyBpcyB0aGUgZGVmYXVsdCBmb3IgdGhlIGdpdmVuIGVycm9yX2NvZGUuCiAqLwogc3RhdGljIHZvaWQKLWV4cGF0X3NldF9lcnJvcihlbnVtIFhNTF9FcnJvciBlcnJvcl9jb2RlLCBpbnQgbGluZSwgaW50IGNvbHVtbiwgY2hhciAqbWVzc2FnZSkKK2V4cGF0X3NldF9lcnJvcihlbnVtIFhNTF9FcnJvciBlcnJvcl9jb2RlLCBQeV9zc2l6ZV90IGxpbmUsIFB5X3NzaXplX3QgY29sdW1uLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2UpCiB7CiAgICAgUHlPYmplY3QgKmVycm1zZywgKmVycm9yLCAqcG9zaXRpb24sICpjb2RlOwogICAgIGVsZW1lbnR0cmVlc3RhdGUgKnN0ID0gRVRfU1RBVEVfR0xPQkFMOwogCi0gICAgZXJybXNnID0gUHlVbmljb2RlX0Zyb21Gb3JtYXQoIiVzOiBsaW5lICVkLCBjb2x1bW4gJWQiLAorICAgIGVycm1zZyA9IFB5VW5pY29kZV9Gcm9tRm9ybWF0KCIlczogbGluZSAlemQsIGNvbHVtbiAlemQiLAogICAgICAgICAgICAgICAgIG1lc3NhZ2UgPyBtZXNzYWdlIDogRVhQQVQoRXJyb3JTdHJpbmcpKGVycm9yX2NvZGUpLAogICAgICAgICAgICAgICAgIGxpbmUsIGNvbHVtbik7CiAgICAgaWYgKGVycm1zZyA9PSBOVUxMKQpAQCAtMjg0OCw3ICsyODUxLDcgQEAKICAgICB9CiAgICAgUHlfREVDUkVGKGNvZGUpOwogCi0gICAgcG9zaXRpb24gPSBQeV9CdWlsZFZhbHVlKCIoaWkpIiwgbGluZSwgY29sdW1uKTsKKyAgICBwb3NpdGlvbiA9IFB5X0J1aWxkVmFsdWUoIihubikiLCBsaW5lLCBjb2x1bW4pOwogICAgIGlmICghcG9zaXRpb24pIHsKICAgICAgICAgUHlfREVDUkVGKGVycm9yKTsKICAgICAgICAgcmV0dXJuOwpAQCAtMzQ3Nyw4ICszNDgwLDE0IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGlmIChQeUJ5dGVzX0dFVF9TSVpFKGJ1ZmZlcikgPiBJTlRfTUFYKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoYnVmZmVyKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZWFkZXIpOworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJzaXplIGRvZXMgbm90IGZpdCBpbiBhbiBpbnQiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAgICAgICAgIHJlcyA9IGV4cGF0X3BhcnNlKAotICAgICAgICAgICAgc2VsZiwgUHlCeXRlc19BU19TVFJJTkcoYnVmZmVyKSwgUHlCeXRlc19HRVRfU0laRShidWZmZXIpLCAwCisgICAgICAgICAgICBzZWxmLCBQeUJ5dGVzX0FTX1NUUklORyhidWZmZXIpLCAoaW50KVB5Qnl0ZXNfR0VUX1NJWkUoYnVmZmVyKSwgMAogICAgICAgICAgICAgKTsKIAogICAgICAgICBQeV9ERUNSRUYoYnVmZmVyKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2Z1bmN0b29sc21vZHVsZS5jIGIvTW9kdWxlcy9fZnVuY3Rvb2xzbW9kdWxlLmMKaW5kZXggNTdkZmJhMC4uMzQxM2IxMiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fZnVuY3Rvb2xzbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fZnVuY3Rvb2xzbW9kdWxlLmMKQEAgLTI1LDcgKzI1LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBwYXJ0aWFsX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0gICAgUHlPYmplY3QgKmZ1bmM7CisgICAgUHlPYmplY3QgKmZ1bmMsICpwYXJncywgKm5hcmdzLCAqcGt3OwogICAgIHBhcnRpYWxvYmplY3QgKnB0bzsKIAogICAgIGlmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpIDwgMSkgewpAQCAtMzQsNyArMzQsMTYgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCisgICAgcGFyZ3MgPSBwa3cgPSBQeV9Ob25lOwogICAgIGZ1bmMgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOworICAgIGlmIChQeV9UWVBFKGZ1bmMpID09ICZwYXJ0aWFsX3R5cGUgJiYgdHlwZSA9PSAmcGFydGlhbF90eXBlKSB7CisgICAgICAgIHBhcnRpYWxvYmplY3QgKnBhcnQgPSAocGFydGlhbG9iamVjdCAqKWZ1bmM7CisgICAgICAgIGlmIChwYXJ0LT5kaWN0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIHBhcmdzID0gcGFydC0+YXJnczsKKyAgICAgICAgICAgIHBrdyA9IHBhcnQtPmt3OworICAgICAgICAgICAgZnVuYyA9IHBhcnQtPmZuOworICAgICAgICB9CisgICAgfQogICAgIGlmICghUHlDYWxsYWJsZV9DaGVjayhmdW5jKSkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGNhbGxhYmxlIik7CkBAIC00OCwyMSArNTcsNTMgQEAKIAogICAgIHB0by0+Zm4gPSBmdW5jOwogICAgIFB5X0lOQ1JFRihmdW5jKTsKLSAgICBwdG8tPmFyZ3MgPSBQeVR1cGxlX0dldFNsaWNlKGFyZ3MsIDEsIFBZX1NTSVpFX1RfTUFYKTsKLSAgICBpZiAocHRvLT5hcmdzID09IE5VTEwpIHsKKworICAgIG5hcmdzID0gUHlUdXBsZV9HZXRTbGljZShhcmdzLCAxLCBQWV9TU0laRV9UX01BWCk7CisgICAgaWYgKG5hcmdzID09IE5VTEwpIHsKKyAgICAgICAgcHRvLT5hcmdzID0gTlVMTDsKICAgICAgICAgcHRvLT5rdyA9IE5VTEw7CiAgICAgICAgIFB5X0RFQ1JFRihwdG8pOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CisgICAgaWYgKHBhcmdzID09IFB5X05vbmUgfHwgUHlUdXBsZV9HRVRfU0laRShwYXJncykgPT0gMCkgeworICAgICAgICBwdG8tPmFyZ3MgPSBuYXJnczsKKyAgICAgICAgUHlfSU5DUkVGKG5hcmdzKTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlUdXBsZV9HRVRfU0laRShuYXJncykgPT0gMCkgeworICAgICAgICBwdG8tPmFyZ3MgPSBwYXJnczsKKyAgICAgICAgUHlfSU5DUkVGKHBhcmdzKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHB0by0+YXJncyA9IFB5U2VxdWVuY2VfQ29uY2F0KHBhcmdzLCBuYXJncyk7CisgICAgICAgIGlmIChwdG8tPmFyZ3MgPT0gTlVMTCkgeworICAgICAgICAgICAgcHRvLT5rdyA9IE5VTEw7CisgICAgICAgICAgICBQeV9ERUNSRUYocHRvKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIFB5X0RFQ1JFRihuYXJncyk7CisKICAgICBpZiAoa3cgIT0gTlVMTCkgewotICAgICAgICBwdG8tPmt3ID0gUHlEaWN0X0NvcHkoa3cpOworICAgICAgICBpZiAocGt3ID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgIHB0by0+a3cgPSBQeURpY3RfQ29weShrdyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBwdG8tPmt3ID0gUHlEaWN0X0NvcHkocGt3KTsKKyAgICAgICAgICAgIGlmIChwdG8tPmt3ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAoUHlEaWN0X01lcmdlKHB0by0+a3csIGt3LCAxKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihwdG8pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgaWYgKHB0by0+a3cgPT0gTlVMTCkgewogICAgICAgICAgICAgUHlfREVDUkVGKHB0byk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHB0by0+a3cgPSBQeV9Ob25lOwotICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBwdG8tPmt3ID0gcGt3OworICAgICAgICBQeV9JTkNSRUYocGt3KTsKICAgICB9CiAKICAgICBwdG8tPndlYWtyZWZsaXN0ID0gTlVMTDsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2lvL19pb21vZHVsZS5oIGIvTW9kdWxlcy9faW8vX2lvbW9kdWxlLmgKaW5kZXggODkyNzg2NC4uOWQ1MjA1ZSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9faW8vX2lvbW9kdWxlLmgKKysrIGIvTW9kdWxlcy9faW8vX2lvbW9kdWxlLmgKQEAgLTY5LDcgKzY5LDcgQEAKICAqIE9mZnNldCB0eXBlIGZvciBwb3NpdGlvbmluZy4KICAqLwogCi0vKiBQcmludGluZyBhIHZhcmlhYmxlIG9mIHR5cGUgb2ZmX3QgKHdpdGggZS5nLiwgUHlTdHJpbmdfRnJvbUZvcm1hdCkKKy8qIFByaW50aW5nIGEgdmFyaWFibGUgb2YgdHlwZSBvZmZfdCAod2l0aCBlLmcuLCBQeVVuaWNvZGVfRnJvbUZvcm1hdCkKICAgIGNvcnJlY3RseSBhbmQgd2l0aG91dCBwcm9kdWNpbmcgY29tcGlsZXIgd2FybmluZ3MgaXMgc3VycHJpc2luZ2x5IHBhaW5mdWwuCiAgICBXZSBpZGVudGlmeSBhbiBpbnRlZ2VyIHR5cGUgd2hvc2Ugc2l6ZSBtYXRjaGVzIG9mZl90IGFuZCB0aGVuOiAoMSkgY2FzdCB0aGUKICAgIG9mZl90IHRvIHRoYXQgaW50ZWdlciB0eXBlIGFuZCAoMikgdXNlIHRoZSBhcHByb3ByaWF0ZSBjb252ZXJzaW9uCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19pby9idWZmZXJlZGlvLmMgYi9Nb2R1bGVzL19pby9idWZmZXJlZGlvLmMKaW5kZXggNjkyY2U0MS4uMzcwYmI1ZSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9faW8vYnVmZmVyZWRpby5jCisrKyBiL01vZHVsZXMvX2lvL2J1ZmZlcmVkaW8uYwpAQCAtNjgwLDExICs2ODAsNyBAQAogX3NldF9CbG9ja2luZ0lPRXJyb3IoY2hhciAqbXNnLCBQeV9zc2l6ZV90IHdyaXR0ZW4pCiB7CiAgICAgUHlPYmplY3QgKmVycjsKLSNpZmRlZiBQeV9ERUJVRwotICAgIC8qIGluIGRlYnVnIG1vZGUsIFB5RXZhbF9FdmFsRnJhbWVFeCgpIGZhaWxzIHdpdGggYW4gYXNzZXJ0aW9uIGVycm9yCi0gICAgICAgaWYgYW4gZXhjZXB0aW9uIGlzIHNldCB3aGVuIGl0IGlzIGNhbGxlZCAqLwogICAgIFB5RXJyX0NsZWFyKCk7Ci0jZW5kaWYKICAgICBlcnIgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oUHlFeGNfQmxvY2tpbmdJT0Vycm9yLCAiaXNuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm8sIG1zZywgd3JpdHRlbik7CiAgICAgaWYgKGVycikKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2lvL2ZpbGVpby5jIGIvTW9kdWxlcy9faW8vZmlsZWlvLmMKaW5kZXggMjQzNTUxMy4uMGYyMjZlYSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9faW8vZmlsZWlvLmMKKysrIGIvTW9kdWxlcy9faW8vZmlsZWlvLmMKQEAgLTEyNywxMSArMTI3LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZmlsZWlvX2Nsb3NlKGZpbGVpbyAqc2VsZikKIHsKKyAgICBQeU9iamVjdCAqcmVzOworICAgIFB5T2JqZWN0ICpleGMsICp2YWwsICp0YjsKKyAgICBpbnQgcmM7CiAgICAgX1B5X0lERU5USUZJRVIoY2xvc2UpOworICAgIHJlcyA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoKFB5T2JqZWN0KikmUHlSYXdJT0Jhc2VfVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQeUlkX2Nsb3NlLCAiTyIsIHNlbGYpOwogICAgIGlmICghc2VsZi0+Y2xvc2VmZCkgewogICAgICAgICBzZWxmLT5mZCA9IC0xOwotICAgICAgICBQeV9SRVRVUk5fTk9ORTsKKyAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CisgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICBQeUVycl9GZXRjaCgmZXhjLCAmdmFsLCAmdGIpOwogICAgIGlmIChzZWxmLT5maW5hbGl6aW5nKSB7CiAgICAgICAgIFB5T2JqZWN0ICpyID0gZmlsZWlvX2RlYWxsb2Nfd2FybihzZWxmLCAoUHlPYmplY3QgKikgc2VsZik7CiAgICAgICAgIGlmIChyKQpAQCAtMTM5LDEyICsxNDYsMTIgQEAKICAgICAgICAgZWxzZQogICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKICAgICB9Ci0gICAgZXJybm8gPSBpbnRlcm5hbF9jbG9zZShzZWxmKTsKLSAgICBpZiAoZXJybm8gPCAwKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIHJldHVybiBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKChQeU9iamVjdCopJlB5UmF3SU9CYXNlX1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5SWRfY2xvc2UsICJPIiwgc2VsZik7CisgICAgcmMgPSBpbnRlcm5hbF9jbG9zZShzZWxmKTsKKyAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgIF9QeUVycl9DaGFpbkV4Y2VwdGlvbnMoZXhjLCB2YWwsIHRiKTsKKyAgICBpZiAocmMgPCAwKQorICAgICAgICBQeV9DTEVBUihyZXMpOworICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0xNzMsOSArMTgwLDE1IEBACiBzdGF0aWMgaW50CiBjaGVja19mZChpbnQgZmQpCiB7Ci0jaWYgZGVmaW5lZChIQVZFX0ZTVEFUKQotICAgIHN0cnVjdCBzdGF0IGJ1ZjsKLSAgICBpZiAoIV9QeVZlcmlmeV9mZChmZCkgfHwgKGZzdGF0KGZkLCAmYnVmKSA8IDAgJiYgZXJybm8gPT0gRUJBREYpKSB7CisjaWYgZGVmaW5lZChIQVZFX0ZTVEFUKSB8fCBkZWZpbmVkKE1TX1dJTkRPV1MpCisgICAgc3RydWN0IF9QeV9zdGF0X3N0cnVjdCBidWY7CisgICAgaWYgKF9QeV9mc3RhdChmZCwgJmJ1ZikgPCAwICYmCisjaWZkZWYgTVNfV0lORE9XUworICAgICAgICBHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9JTlZBTElEX0hBTkRMRQorI2Vsc2UKKyAgICAgICAgZXJybm8gPT0gRUJBREYKKyNlbmRpZgorICAgICAgICApIHsKICAgICAgICAgUHlPYmplY3QgKmV4YzsKICAgICAgICAgY2hhciAqbXNnID0gc3RyZXJyb3IoRUJBREYpOwogICAgICAgICBleGMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oUHlFeGNfT1NFcnJvciwgIihpcykiLApAQCAtMjE1LDggKzIyOCw4IEBACiAjZWxpZiAhZGVmaW5lZChNU19XSU5ET1dTKQogICAgIGludCAqYXRvbWljX2ZsYWdfd29ya3MgPSBOVUxMOwogI2VuZGlmCi0jaWZkZWYgSEFWRV9GU1RBVAotICAgIHN0cnVjdCBzdGF0IGZkZnN0YXQ7CisjaWYgZGVmaW5lZChIQVZFX0ZTVEFUKSB8fCBkZWZpbmVkKE1TX1dJTkRPV1MpCisgICAgc3RydWN0IF9QeV9zdGF0X3N0cnVjdCBmZGZzdGF0OwogI2VuZGlmCiAgICAgaW50IGFzeW5jX2VyciA9IDA7CiAKQEAgLTM2OSwxMCArMzgyLDEyIEBACiAgICAgICAgICAgICAgICAgZWxzZQogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmZkID0gb3BlbihuYW1lLCBmbGFncywgMDY2Nik7Ci0KICAgICAgICAgICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogICAgICAgICAgICAgfSB3aGlsZSAoc2VsZi0+ZmQgPCAwICYmIGVycm5vID09IEVJTlRSICYmCiAgICAgICAgICAgICAgICAgICAgICAhKGFzeW5jX2VyciA9IFB5RXJyX0NoZWNrU2lnbmFscygpKSk7CisKKyAgICAgICAgICAgIGlmIChhc3luY19lcnIpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQogICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIFB5T2JqZWN0ICpmZG9iajsKQEAgLTQwMSw4ICs0MTYsNyBAQAogCiAgICAgICAgIGZkX2lzX293biA9IDE7CiAgICAgICAgIGlmIChzZWxmLT5mZCA8IDApIHsKLSAgICAgICAgICAgIGlmICghYXN5bmNfZXJyKQotICAgICAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZU9iamVjdChQeUV4Y19PU0Vycm9yLCBuYW1lb2JqKTsKKyAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZU9iamVjdChQeUV4Y19PU0Vycm9yLCBuYW1lb2JqKTsKICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIH0KIApAQCAtNDEzLDkgKzQyNywxMSBAQAogICAgIH0KIAogICAgIHNlbGYtPmJsa3NpemUgPSBERUZBVUxUX0JVRkZFUl9TSVpFOwotI2lmZGVmIEhBVkVfRlNUQVQKLSAgICBpZiAoZnN0YXQoc2VsZi0+ZmQsICZmZGZzdGF0KSA8IDApCisjaWYgZGVmaW5lZChIQVZFX0ZTVEFUKSB8fCBkZWZpbmVkKE1TX1dJTkRPV1MpCisgICAgaWYgKF9QeV9mc3RhdChzZWxmLT5mZCwgJmZkZnN0YXQpIDwgMCkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfT1NFcnJvcik7CiAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogI2lmIGRlZmluZWQoU19JU0RJUikgJiYgZGVmaW5lZChFSVNESVIpCiAgICAgLyogT24gVW5peCwgb3BlbiB3aWxsIHN1Y2NlZWQgZm9yIGRpcmVjdG9yaWVzLgogICAgICAgIEluIFB5dGhvbiwgdGhlcmUgc2hvdWxkIGJlIG5vIGZpbGUgb2JqZWN0cyByZWZlcnJpbmcgdG8KQEAgLTQzMCw3ICs0NDYsNyBAQAogICAgIGlmIChmZGZzdGF0LnN0X2Jsa3NpemUgPiAxKQogICAgICAgICBzZWxmLT5ibGtzaXplID0gZmRmc3RhdC5zdF9ibGtzaXplOwogI2VuZGlmIC8qIEhBVkVfU1RSVUNUX1NUQVRfU1RfQkxLU0laRSAqLwotI2VuZGlmIC8qIEhBVkVfRlNUQVQgKi8KKyNlbmRpZiAvKiBIQVZFX0ZTVEFUIHx8IE1TX1dJTkRPV1MgKi8KIAogI2lmIGRlZmluZWQoTVNfV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQogICAgIC8qIGRvbid0IHRyYW5zbGF0ZSBuZXdsaW5lcyAoXHJcbiA8PT4gXG4pICovCkBAIC01NjcsMTIgKzU4MywxNSBAQAogCiAgICAgaWYgKF9QeVZlcmlmeV9mZChzZWxmLT5mZCkpIHsKICAgICAgICAgbGVuID0gcGJ1Zi5sZW47CisjaWZkZWYgTVNfV0lORE9XUworICAgICAgICBpZiAobGVuID4gSU5UX01BWCkKKyAgICAgICAgICAgIGxlbiA9IElOVF9NQVg7CisjZW5kaWYKKwogICAgICAgICBkbyB7CiAgICAgICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAgICAgICAgICAgICBlcnJubyA9IDA7CiAjaWZkZWYgTVNfV0lORE9XUwotICAgICAgICAgICAgaWYgKGxlbiA+IElOVF9NQVgpCi0gICAgICAgICAgICAgICAgbGVuID0gSU5UX01BWDsKICAgICAgICAgICAgIG4gPSByZWFkKHNlbGYtPmZkLCBwYnVmLmJ1ZiwgKGludClsZW4pOwogI2Vsc2UKICAgICAgICAgICAgIG4gPSByZWFkKHNlbGYtPmZkLCBwYnVmLmJ1ZiwgbGVuKTsKQEAgLTU4MCw2ICs1OTksOSBAQAogICAgICAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKICAgICAgICAgfSB3aGlsZSAobiA8IDAgJiYgZXJybm8gPT0gRUlOVFIgJiYKICAgICAgICAgICAgICAgICAgIShhc3luY19lcnIgPSBQeUVycl9DaGVja1NpZ25hbHMoKSkpOworCisgICAgICAgIGlmIChhc3luY19lcnIpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9IGVsc2UKICAgICAgICAgbiA9IC0xOwogICAgIGVyciA9IGVycm5vOwpAQCAtNTg4LDI1ICs2MTAsMTQgQEAKICAgICAgICAgaWYgKGVyciA9PSBFQUdBSU4pCiAgICAgICAgICAgICBQeV9SRVRVUk5fTk9ORTsKICAgICAgICAgZXJybm8gPSBlcnI7Ci0gICAgICAgIGlmICghYXN5bmNfZXJyKQotICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIHJldHVybiBQeUxvbmdfRnJvbVNzaXplX3Qobik7CiB9CiAKLSNpZm5kZWYgSEFWRV9GU1RBVAotCi1zdGF0aWMgUHlPYmplY3QgKgotZmlsZWlvX3JlYWRhbGwoZmlsZWlvICpzZWxmKQotewotICAgIF9QeV9JREVOVElGSUVSKHJlYWRhbGwpOwotICAgIHJldHVybiBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKChQeU9iamVjdCopJlB5UmF3SU9CYXNlX1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5SWRfcmVhZGFsbCwgIk8iLCBzZWxmKTsKLX0KLQotI2Vsc2UKKyNpZiBkZWZpbmVkKEhBVkVfRlNUQVQpIHx8IGRlZmluZWQoTVNfV0lORE9XUykKIAogc3RhdGljIHNpemVfdAogbmV3X2J1ZmZlcnNpemUoZmlsZWlvICpzZWxmLCBzaXplX3QgY3VycmVudHNpemUpCkBAIC02MzAsMTEgKzY0MSwxMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGZpbGVpb19yZWFkYWxsKGZpbGVpbyAqc2VsZikKIHsKLSAgICBzdHJ1Y3Qgc3RhdCBzdDsKKyAgICBzdHJ1Y3QgX1B5X3N0YXRfc3RydWN0IHN0OwogICAgIFB5X29mZl90IHBvcywgZW5kOwogICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAgICAgUHlfc3NpemVfdCBieXRlc19yZWFkID0gMDsKLSAgICBQeV9zc2l6ZV90IG47CisgICAgUHlfc3NpemVfdCBsZW4sIG47CiAgICAgc2l6ZV90IGJ1ZnNpemU7CiAgICAgaW50IGFzeW5jX2VyciA9IDA7CiAKQEAgLTY0OCw3ICs2NTksNyBAQAogI2Vsc2UKICAgICBwb3MgPSBsc2VlayhzZWxmLT5mZCwgMEwsIFNFRUtfQ1VSKTsKICNlbmRpZgotICAgIGlmIChmc3RhdChzZWxmLT5mZCwgJnN0KSA9PSAwKQorICAgIGlmIChfUHlfZnN0YXQoc2VsZi0+ZmQsICZzdCkgPT0gMCkKICAgICAgICAgZW5kID0gc3Quc3Rfc2l6ZTsKICAgICBlbHNlCiAgICAgICAgIGVuZCA9IChQeV9vZmZfdCktMTsKQEAgLTY4MywyMCArNjk0LDI2IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgbGVuID0gYnVmc2l6ZSAtIGJ5dGVzX3JlYWQ7CisjaWZkZWYgTVNfV0lORE9XUworICAgICAgICBpZiAobGVuID4gSU5UX01BWCkKKyAgICAgICAgICAgIGxlbiA9IElOVF9NQVg7CisjZW5kaWYKICAgICAgICAgZG8gewogICAgICAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogICAgICAgICAgICAgZXJybm8gPSAwOwotICAgICAgICAgICAgbiA9IGJ1ZnNpemUgLSBieXRlc19yZWFkOwogI2lmZGVmIE1TX1dJTkRPV1MKLSAgICAgICAgICAgIGlmIChuID4gSU5UX01BWCkKLSAgICAgICAgICAgICAgICBuID0gSU5UX01BWDsKLSAgICAgICAgICAgIG4gPSByZWFkKHNlbGYtPmZkLCBQeUJ5dGVzX0FTX1NUUklORyhyZXN1bHQpICsgYnl0ZXNfcmVhZCwgKGludCluKTsKKyAgICAgICAgICAgIG4gPSByZWFkKHNlbGYtPmZkLCBQeUJ5dGVzX0FTX1NUUklORyhyZXN1bHQpICsgYnl0ZXNfcmVhZCwgKGludClsZW4pOwogI2Vsc2UKLSAgICAgICAgICAgIG4gPSByZWFkKHNlbGYtPmZkLCBQeUJ5dGVzX0FTX1NUUklORyhyZXN1bHQpICsgYnl0ZXNfcmVhZCwgbik7CisgICAgICAgICAgICBuID0gcmVhZChzZWxmLT5mZCwgUHlCeXRlc19BU19TVFJJTkcocmVzdWx0KSArIGJ5dGVzX3JlYWQsIGxlbik7CiAjZW5kaWYKICAgICAgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCiAgICAgICAgIH0gd2hpbGUgKG4gPCAwICYmIGVycm5vID09IEVJTlRSICYmCiAgICAgICAgICAgICAgICAgICEoYXN5bmNfZXJyID0gUHlFcnJfQ2hlY2tTaWduYWxzKCkpKTsKKworICAgICAgICBpZiAoYXN5bmNfZXJyKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIGlmIChuID09IDApCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgaWYgKG4gPCAwKSB7CkBAIC03MDcsOCArNzI0LDcgQEAKICAgICAgICAgICAgICAgICBQeV9SRVRVUk5fTk9ORTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOwotICAgICAgICAgICAgaWYgKCFhc3luY19lcnIpCi0gICAgICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KICAgICAgICAgYnl0ZXNfcmVhZCArPSBuOwpAQCAtNzIyLDcgKzczOCwxNyBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLSNlbmRpZiAvKiBIQVZFX0ZTVEFUICovCisjZWxzZQorCitzdGF0aWMgUHlPYmplY3QgKgorZmlsZWlvX3JlYWRhbGwoZmlsZWlvICpzZWxmKQoreworICAgIF9QeV9JREVOVElGSUVSKHJlYWRhbGwpOworICAgIHJldHVybiBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKChQeU9iamVjdCopJlB5UmF3SU9CYXNlX1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5SWRfcmVhZGFsbCwgIk8iLCBzZWxmKTsKK30KKworI2VuZGlmIC8qIEhBVkVfRlNUQVQgfHwgTVNfV0lORE9XUyAqLwogCiBzdGF0aWMgUHlPYmplY3QgKgogZmlsZWlvX3JlYWQoZmlsZWlvICpzZWxmLCBQeU9iamVjdCAqYXJncykKQEAgLTc2Niw2ICs3OTIsOSBAQAogICAgICAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKICAgICAgICAgfSB3aGlsZSAobiA8IDAgJiYgZXJybm8gPT0gRUlOVFIgJiYKICAgICAgICAgICAgICAgICAgIShhc3luY19lcnIgPSBQeUVycl9DaGVja1NpZ25hbHMoKSkpOworCisgICAgICAgIGlmIChhc3luY19lcnIpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9IGVsc2UKICAgICAgICAgbiA9IC0xOwogCkBAIC03NzUsOCArODA0LDcgQEAKICAgICAgICAgaWYgKGVyciA9PSBFQUdBSU4pCiAgICAgICAgICAgICBQeV9SRVRVUk5fTk9ORTsKICAgICAgICAgZXJybm8gPSBlcnI7Ci0gICAgICAgIGlmICghYXN5bmNfZXJyKQotICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIApAQCAtODA2LDE5ICs4MzQsMjIgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBpZiAoX1B5VmVyaWZ5X2ZkKHNlbGYtPmZkKSkgeworICAgICAgICBsZW4gPSBwYnVmLmxlbjsKKyNpZmRlZiBNU19XSU5ET1dTCisgICAgICAgIGlmIChsZW4gPiAzMjc2NyAmJiBpc2F0dHkoc2VsZi0+ZmQpKSB7CisgICAgICAgICAgICAvKiBJc3N1ZSAjMTEzOTU6IHRoZSBXaW5kb3dzIGNvbnNvbGUgcmV0dXJucyBhbiBlcnJvciAoMTI6IG5vdAorICAgICAgICAgICAgICAgZW5vdWdoIHNwYWNlIGVycm9yKSBvbiB3cml0aW5nIGludG8gc3Rkb3V0IGlmIHN0ZG91dCBtb2RlIGlzCisgICAgICAgICAgICAgICBiaW5hcnkgYW5kIHRoZSBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIDY2LDAwMCBieXRlcyAob3IgbGVzcywKKyAgICAgICAgICAgICAgIGRlcGVuZGluZyBvbiBoZWFwIHVzYWdlKS4gKi8KKyAgICAgICAgICAgIGxlbiA9IDMyNzY3OworICAgICAgICB9IGVsc2UgaWYgKGxlbiA+IElOVF9NQVgpCisgICAgICAgICAgICBsZW4gPSBJTlRfTUFYOworI2VuZGlmCisKICAgICAgICAgZG8gewogICAgICAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogICAgICAgICAgICAgZXJybm8gPSAwOwotICAgICAgICAgICAgbGVuID0gcGJ1Zi5sZW47CiAjaWZkZWYgTVNfV0lORE9XUwotICAgICAgICAgICAgaWYgKGxlbiA+IDMyNzY3ICYmIGlzYXR0eShzZWxmLT5mZCkpIHsKLSAgICAgICAgICAgICAgICAvKiBJc3N1ZSAjMTEzOTU6IHRoZSBXaW5kb3dzIGNvbnNvbGUgcmV0dXJucyBhbiBlcnJvciAoMTI6IG5vdAotICAgICAgICAgICAgICAgICAgIGVub3VnaCBzcGFjZSBlcnJvcikgb24gd3JpdGluZyBpbnRvIHN0ZG91dCBpZiBzdGRvdXQgbW9kZSBpcwotICAgICAgICAgICAgICAgICAgIGJpbmFyeSBhbmQgdGhlIGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gNjYsMDAwIGJ5dGVzIChvciBsZXNzLAotICAgICAgICAgICAgICAgICAgIGRlcGVuZGluZyBvbiBoZWFwIHVzYWdlKS4gKi8KLSAgICAgICAgICAgICAgICBsZW4gPSAzMjc2NzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobGVuID4gSU5UX01BWCkKLSAgICAgICAgICAgICAgICBsZW4gPSBJTlRfTUFYOwogICAgICAgICAgICAgbiA9IHdyaXRlKHNlbGYtPmZkLCBwYnVmLmJ1ZiwgKGludClsZW4pOwogI2Vsc2UKICAgICAgICAgICAgIG4gPSB3cml0ZShzZWxmLT5mZCwgcGJ1Zi5idWYsIGxlbik7CkBAIC04MjYsNiArODU3LDkgQEAKICAgICAgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCiAgICAgICAgIH0gd2hpbGUgKG4gPCAwICYmIGVycm5vID09IEVJTlRSICYmCiAgICAgICAgICAgICAgICAgICEoYXN5bmNfZXJyID0gUHlFcnJfQ2hlY2tTaWduYWxzKCkpKTsKKworICAgICAgICBpZiAoYXN5bmNfZXJyKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfSBlbHNlCiAgICAgICAgIG4gPSAtMTsKICAgICBlcnIgPSBlcnJubzsKQEAgLTgzNiw4ICs4NzAsNyBAQAogICAgICAgICBpZiAoZXJyID09IEVBR0FJTikKICAgICAgICAgICAgIFB5X1JFVFVSTl9OT05FOwogICAgICAgICBlcnJubyA9IGVycjsKLSAgICAgICAgaWYgKCFhc3luY19lcnIpCi0gICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19qc29uLmMgYi9Nb2R1bGVzL19qc29uLmMKaW5kZXggMDMxNDcxZS4uMDc2ODU5ZiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fanNvbi5jCisrKyBiL01vZHVsZXMvX2pzb24uYwpAQCAtODI3LDcgKzgyNyw3IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBfcGFyc2VfYXJyYXlfdW5pY29kZShQeVNjYW5uZXJPYmplY3QgKnMsIFB5T2JqZWN0ICpweXN0ciwgUHlfc3NpemVfdCBpZHgsIFB5X3NzaXplX3QgKm5leHRfaWR4X3B0cikgewotICAgIC8qIFJlYWQgYSBKU09OIGFycmF5IGZyb20gUHlTdHJpbmcgcHlzdHIuCisgICAgLyogUmVhZCBhIEpTT04gYXJyYXkgZnJvbSBQeVVuaWNvZGUgcHlzdHIuCiAgICAgaWR4IGlzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGFmdGVyIHRoZSBvcGVuaW5nIGJyYWNlLgogICAgICpuZXh0X2lkeF9wdHIgaXMgYSByZXR1cm4tYnktcmVmZXJlbmNlIGluZGV4IHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgYWZ0ZXIKICAgICAgICAgdGhlIGNsb3NpbmcgYnJhY2UuCkBAIC04OTksOCArODk5LDggQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLV9wYXJzZV9jb25zdGFudChQeVNjYW5uZXJPYmplY3QgKnMsIGNoYXIgKmNvbnN0YW50LCBQeV9zc2l6ZV90IGlkeCwgUHlfc3NpemVfdCAqbmV4dF9pZHhfcHRyKSB7Ci0gICAgLyogUmVhZCBhIEpTT04gY29uc3RhbnQgZnJvbSBQeVN0cmluZyBweXN0ci4KK19wYXJzZV9jb25zdGFudChQeVNjYW5uZXJPYmplY3QgKnMsIGNvbnN0IGNoYXIgKmNvbnN0YW50LCBQeV9zc2l6ZV90IGlkeCwgUHlfc3NpemVfdCAqbmV4dF9pZHhfcHRyKSB7CisgICAgLyogUmVhZCBhIEpTT04gY29uc3RhbnQuCiAgICAgY29uc3RhbnQgaXMgdGhlIGNvbnN0YW50IHN0cmluZyB0aGF0IHdhcyBmb3VuZAogICAgICAgICAoIk5hTiIsICJJbmZpbml0eSIsICItSW5maW5pdHkiKS4KICAgICBpZHggaXMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIGNvbnN0YW50CkBAIC05MzIsNyArOTMyLDcgQEAKICAgICAgICAgdGhlIG51bWJlci4KIAogICAgIFJldHVybnMgYSBuZXcgUHlPYmplY3QgcmVwcmVzZW50YXRpb24gb2YgdGhhdCBudW1iZXI6Ci0gICAgICAgIFB5SW50LCBQeUxvbmcsIG9yIFB5RmxvYXQuCisgICAgICAgIFB5TG9uZywgb3IgUHlGbG9hdC4KICAgICAgICAgTWF5IHJldHVybiBvdGhlciB0eXBlcyBpZiBwYXJzZV9pbnQgb3IgcGFyc2VfZmxvYXQgYXJlIHNldAogICAgICovCiAgICAgdm9pZCAqc3RyOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fbG9jYWxlbW9kdWxlLmMgYi9Nb2R1bGVzL19sb2NhbGVtb2R1bGUuYwppbmRleCA0MDBjMzQ0Li5iMWQ2YWRkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19sb2NhbGVtb2R1bGUuYworKysgYi9Nb2R1bGVzL19sb2NhbGVtb2R1bGUuYwpAQCAtMjU0LDcgKzI1NCw3IEBACiAKICAgICAvKiBhc3N1bWUgbm8gY2hhbmdlIGluIHNpemUsIGZpcnN0ICovCiAgICAgbjEgPSBuMSArIDE7Ci0gICAgYnVmID0gUHlNZW1fTWFsbG9jKG4xICogc2l6ZW9mKHdjaGFyX3QpKTsKKyAgICBidWYgPSBQeU1lbV9OZXcod2NoYXJfdCwgbjEpOwogICAgIGlmICghYnVmKSB7CiAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CiAgICAgICAgIGdvdG8gZXhpdDsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2x6bWFtb2R1bGUuYyBiL01vZHVsZXMvX2x6bWFtb2R1bGUuYwppbmRleCBmYjE1MjMzLi5iYWU3ZGY2IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19sem1hbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fbHptYW1vZHVsZS5jCkBAIC0xMDg3LDcgKzEwODcsNyBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogX2x6bWFfTFpNQURlY29tcHJlc3Nvcl9kZWNvbXByZXNzX2ltcGwoRGVjb21wcmVzc29yICpzZWxmLCBQeV9idWZmZXIgKmRhdGEsIFB5X3NzaXplX3QgbWF4X2xlbmd0aCkKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0xNTMyYTViYjIzNjI5MDAxIGlucHV0PTI2MmU0ZTIxN2Y0OTAzOWJdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0xNTMyYTViYjIzNjI5MDAxIGlucHV0PWYyYmI5MDJjYzFjYWYyMDNdKi8KIHsKICAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fcGlja2xlLmMgYi9Nb2R1bGVzL19waWNrbGUuYwppbmRleCA3YTIzNGYxLi41MWUyZjgzIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19waWNrbGUuYworKysgYi9Nb2R1bGVzL19waWNrbGUuYwpAQCAtMTk3OSw3ICsxOTc5LDcgQEAKICAgICAgICAgaWYgKF9QaWNrbGVyX1dyaXRlKHNlbGYsICZvcCwgMSkgPCAwKQogICAgICAgICAgICAgZ290byBkb25lOwogCi0gICAgICAgIGJ1ZiA9IFB5T1NfZG91YmxlX3RvX3N0cmluZyh4LCAnZycsIDE3LCAwLCBOVUxMKTsKKyAgICAgICAgYnVmID0gUHlPU19kb3VibGVfdG9fc3RyaW5nKHgsICdyJywgMCwgUHlfRFRTRl9BRERfRE9UXzAsIE5VTEwpOwogICAgICAgICBpZiAoIWJ1ZikgewogICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKICAgICAgICAgICAgIGdvdG8gZG9uZTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3JhbmRvbW1vZHVsZS5jIGIvTW9kdWxlcy9fcmFuZG9tbW9kdWxlLmMKaW5kZXggNDM3N2VlMC4uYWY4NjE4MiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fcmFuZG9tbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fcmFuZG9tbW9kdWxlLmMKQEAgLTc4LDggKzc4LDggQEAKIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X0hFQUQKLSAgICB1bnNpZ25lZCBsb25nIHN0YXRlW05dOwogICAgIGludCBpbmRleDsKKyAgICB1bnNpZ25lZCBsb25nIHN0YXRlW05dOwogfSBSYW5kb21PYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgUmFuZG9tX1R5cGU7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvY29ubmVjdGlvbi5oIGIvTW9kdWxlcy9fc3FsaXRlL2Nvbm5lY3Rpb24uaAppbmRleCAwYzk3MzRjLi5mYmQ5MDYzIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19zcWxpdGUvY29ubmVjdGlvbi5oCisrKyBiL01vZHVsZXMvX3NxbGl0ZS9jb25uZWN0aW9uLmgKQEAgLTUyLDcgKzUyLDcgQEAKICAgICAgKiBmaXJzdCBnZXQgY2FsbGVkIHdpdGggY291bnQ9MD8gKi8KICAgICBkb3VibGUgdGltZW91dF9zdGFydGVkOwogCi0gICAgLyogTm9uZSBmb3IgYXV0b2NvbW1pdCwgb3RoZXJ3aXNlIGEgUHlTdHJpbmcgd2l0aCB0aGUgaXNvbGF0aW9uIGxldmVsICovCisgICAgLyogTm9uZSBmb3IgYXV0b2NvbW1pdCwgb3RoZXJ3aXNlIGEgUHlVbmljb2RlIHdpdGggdGhlIGlzb2xhdGlvbiBsZXZlbCAqLwogICAgIFB5T2JqZWN0KiBpc29sYXRpb25fbGV2ZWw7CiAKICAgICAvKiBOVUxMIGZvciBhdXRvY29tbWl0LCBvdGhlcndpc2UgYSBzdHJpbmcgd2l0aCB0aGUgQkVHSU4gc3RhdGVtZW50OyB3aWxsIGJlCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvY3Vyc29yLmMgYi9Nb2R1bGVzL19zcWxpdGUvY3Vyc29yLmMKaW5kZXggN2ZlMDBlMy4uYzE1OTljMCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3FsaXRlL2N1cnNvci5jCisrKyBiL01vZHVsZXMvX3NxbGl0ZS9jdXJzb3IuYwpAQCAtMzM0LDExICszMzQsNyBAQAogICAgICAgICAgICAgICAgIGlmIChzZWxmLT5jb25uZWN0aW9uLT50ZXh0X2ZhY3RvcnkgPT0gKFB5T2JqZWN0KikmUHlVbmljb2RlX1R5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgY29udmVydGVkID0gUHlVbmljb2RlX0Zyb21TdHJpbmdBbmRTaXplKHZhbF9zdHIsIG5ieXRlcyk7CiAgICAgICAgICAgICAgICAgICAgIGlmICghY29udmVydGVkKSB7Ci0jaWZkZWYgUHlfREVCVUcKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluIGRlYnVnIG1vZGUsIHR5cGVfY2FsbCgpIGZhaWxzIHdpdGggYW4gYXNzZXJ0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciBpZiBhbiBleGNlcHRpb24gaXMgc2V0IHdoZW4gaXQgaXMgY2FsbGVkICovCiAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOwotI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lID0gc3FsaXRlM19jb2x1bW5fbmFtZShzZWxmLT5zdGF0ZW1lbnQtPnN0LCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29sbmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWUgPSAiPHVua25vd24gY29sdW1uIG5hbWU+IjsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9yb3cuYyBiL01vZHVsZXMvX3NxbGl0ZS9yb3cuYwppbmRleCA2NGRmZDA2Li5lZDhhZDQ3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19zcWxpdGUvcm93LmMKKysrIGIvTW9kdWxlcy9fc3FsaXRlL3Jvdy5jCkBAIC0xNTksNyArMTU5LDcgQEAKIFB5T2JqZWN0KiBweXNxbGl0ZV9yb3dfa2V5cyhweXNxbGl0ZV9Sb3cqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQogewogICAgIFB5T2JqZWN0KiBsaXN0OwotICAgIGludCBuaXRlbXMsIGk7CisgICAgUHlfc3NpemVfdCBuaXRlbXMsIGk7CiAKICAgICBsaXN0ID0gUHlMaXN0X05ldygwKTsKICAgICBpZiAoIWxpc3QpIHsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NzbC5jIGIvTW9kdWxlcy9fc3NsLmMKaW5kZXggNDM3ZDJiMi4uODU5NjIyNSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3NsLmMKKysrIGIvTW9kdWxlcy9fc3NsLmMKQEAgLTE4NDEsMjYgKzE4NDEsNiBAQAogICAgICAgICBCSU9fc2V0X25iaW8oU1NMX2dldF93YmlvKHNlbGYtPnNzbCksIG5vbmJsb2NraW5nKTsKICAgICB9CiAKLSAgICAvKiBmaXJzdCBjaGVjayBpZiB0aGVyZSBhcmUgYnl0ZXMgcmVhZHkgdG8gYmUgcmVhZCAqLwotICAgIFB5U1NMX0JFR0lOX0FMTE9XX1RIUkVBRFMKLSAgICBjb3VudCA9IFNTTF9wZW5kaW5nKHNlbGYtPnNzbCk7Ci0gICAgUHlTU0xfRU5EX0FMTE9XX1RIUkVBRFMKLQotICAgIGlmICghY291bnQpIHsKLSAgICAgICAgc29ja3N0YXRlID0gY2hlY2tfc29ja2V0X2FuZF93YWl0X2Zvcl90aW1lb3V0KHNvY2ssIDApOwotICAgICAgICBpZiAoc29ja3N0YXRlID09IFNPQ0tFVF9IQVNfVElNRURfT1VUKSB7Ci0gICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlTb2NrZXRNb2R1bGUudGltZW91dF9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIHJlYWQgb3BlcmF0aW9uIHRpbWVkIG91dCIpOwotICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgfSBlbHNlIGlmIChzb2Nrc3RhdGUgPT0gU09DS0VUX1RPT19MQVJHRV9GT1JfU0VMRUNUKSB7Ci0gICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlTU0xFcnJvck9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5kZXJseWluZyBzb2NrZXQgdG9vIGxhcmdlIGZvciBzZWxlY3QoKS4iKTsKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIH0gZWxzZSBpZiAoc29ja3N0YXRlID09IFNPQ0tFVF9IQVNfQkVFTl9DTE9TRUQpIHsKLSAgICAgICAgICAgIGNvdW50ID0gMDsKLSAgICAgICAgICAgIGdvdG8gZG9uZTsKLSAgICAgICAgfQotICAgIH0KICAgICBkbyB7CiAgICAgICAgIFB5U1NMX0JFR0lOX0FMTE9XX1RIUkVBRFMKICAgICAgICAgY291bnQgPSBTU0xfcmVhZChzZWxmLT5zc2wsIG1lbSwgbGVuKTsKQEAgLTIyMTksNiArMjE5OSwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoU0lEX0NUWCkpOwogI3VuZGVmIFNJRF9DVFgKIAorI2lmZGVmIFg1MDlfVl9GTEFHX1RSVVNURURfRklSU1QKKyAgICB7CisgICAgICAgIC8qIEltcHJvdmUgdHJ1c3QgY2hhaW4gYnVpbGRpbmcgd2hlbiBjcm9zcy1zaWduZWQgaW50ZXJtZWRpYXRlCisgICAgICAgICAgIGNlcnRpZmljYXRlcyBhcmUgcHJlc2VudC4gU2VlIGh0dHBzOi8vYnVncy5weXRob24ub3JnL2lzc3VlMjM0NzYuICovCisgICAgICAgIFg1MDlfU1RPUkUgKnN0b3JlID0gU1NMX0NUWF9nZXRfY2VydF9zdG9yZShzZWxmLT5jdHgpOworICAgICAgICBYNTA5X1NUT1JFX3NldF9mbGFncyhzdG9yZSwgWDUwOV9WX0ZMQUdfVFJVU1RFRF9GSVJTVCk7CisgICAgfQorI2VuZGlmCisKICAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKIH0KIApAQCAtNDI4NywxMCArNDI3NiwxMSBAQAogCiAgICAgaWYgKF9zc2xfbG9ja3MgPT0gTlVMTCkgewogICAgICAgICBfc3NsX2xvY2tzX2NvdW50ID0gQ1JZUFRPX251bV9sb2NrcygpOwotICAgICAgICBfc3NsX2xvY2tzID0gKFB5VGhyZWFkX3R5cGVfbG9jayAqKQotICAgICAgICAgICAgUHlNZW1fTWFsbG9jKHNpemVvZihQeVRocmVhZF90eXBlX2xvY2spICogX3NzbF9sb2Nrc19jb3VudCk7Ci0gICAgICAgIGlmIChfc3NsX2xvY2tzID09IE5VTEwpCisgICAgICAgIF9zc2xfbG9ja3MgPSBQeU1lbV9OZXcoUHlUaHJlYWRfdHlwZV9sb2NrLCBfc3NsX2xvY2tzX2NvdW50KTsKKyAgICAgICAgaWYgKF9zc2xfbG9ja3MgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CiAgICAgICAgIG1lbXNldChfc3NsX2xvY2tzLCAwLAogICAgICAgICAgICAgICAgc2l6ZW9mKFB5VGhyZWFkX3R5cGVfbG9jaykgKiBfc3NsX2xvY2tzX2NvdW50KTsKICAgICAgICAgZm9yIChpID0gMDsgIGkgPCBfc3NsX2xvY2tzX2NvdW50OyAgaSsrKSB7CkBAIC00NDY4LDYgKzQ0NTgsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYNTA5X1ZfRkxBR19DUkxfQ0hFQ0t8WDUwOV9WX0ZMQUdfQ1JMX0NIRUNLX0FMTCk7CiAgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlZFUklGWV9YNTA5X1NUUklDVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDUwOV9WX0ZMQUdfWDUwOV9TVFJJQ1QpOworI2lmZGVmIFg1MDlfVl9GTEFHX1RSVVNURURfRklSU1QKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVkVSSUZZX1g1MDlfVFJVU1RFRF9GSVJTVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDUwOV9WX0ZMQUdfVFJVU1RFRF9GSVJTVCk7CisjZW5kaWYKIAogICAgIC8qIEFsZXJ0IERlc2NyaXB0aW9ucyBmcm9tIHNzbC5oICovCiAgICAgLyogbm90ZSBSRVNFUlZFRCBjb25zdGFudHMgbm8gbG9uZ2VyIGludGVuZGVkIGZvciB1c2UgaGF2ZSBiZWVuIHJlbW92ZWQgKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvX3Rlc3RidWZmZXIuYyBiL01vZHVsZXMvX3Rlc3RidWZmZXIuYwppbmRleCBhNTYzYTA0Li5kZTdiNTY3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL190ZXN0YnVmZmVyLmMKKysrIGIvTW9kdWxlcy9fdGVzdGJ1ZmZlci5jCkBAIC04NTAsNyArODUwLDcgQEAKICAgICBQeV9zc2l6ZV90ICpkZXN0OwogICAgIFB5X3NzaXplX3QgeCwgaTsKIAotICAgIGRlc3QgPSBQeU1lbV9NYWxsb2MobGVuICogKHNpemVvZiAqZGVzdCkpOworICAgIGRlc3QgPSBQeU1lbV9OZXcoUHlfc3NpemVfdCwgbGVuKTsKICAgICBpZiAoZGVzdCA9PSBOVUxMKSB7CiAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CiAgICAgICAgIHJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fdGVzdGNhcGltb2R1bGUuYyBiL01vZHVsZXMvX3Rlc3RjYXBpbW9kdWxlLmMKaW5kZXggYmVkNjU2OC4uYThjZTBkYyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fdGVzdGNhcGltb2R1bGUuYworKysgYi9Nb2R1bGVzL190ZXN0Y2FwaW1vZHVsZS5jCkBAIC02OSw2ICs2OSwxMCBAQAogc3RhdGljIFB5T2JqZWN0KgogdGVzdF9zaXplb2ZfY190eXBlcyhQeU9iamVjdCAqc2VsZikKIHsKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoKF9fR05VQ19fID4gNCkgfHwgKChfX0dOVUNfXyA9PSA0KSAmJiAoX19HTlVDX01JTk9SX18gPiA1KSkpCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVd0eXBlLWxpbWl0cyIKKyNlbmRpZgogI2RlZmluZSBDSEVDS19TSVpFT0YoVFlQRSwgRVhQRUNURUQpICAgICAgICAgXAogICAgIGlmIChFWFBFQ1RFRCAhPSBzaXplb2YoVFlQRSkpICB7ICAgICAgICAgXAogICAgICAgICBQeUVycl9Gb3JtYXQoVGVzdEVycm9yLCAgICAgICAgICAgICAgXApAQCAtMTI2LDYgKzEzMCw5IEBACiAjdW5kZWYgSVNfU0lHTkVECiAjdW5kZWYgQ0hFQ0tfU0lHTkVTUwogI3VuZGVmIENIRUNLX1NJWkVPRgorI2lmIGRlZmluZWQoX19HTlVDX18pICYmICgoX19HTlVDX18gPiA0KSB8fCAoKF9fR05VQ19fID09IDQpICYmIChfX0dOVUNfTUlOT1JfXyA+IDUpKSkKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCisjZW5kaWYKIH0KIAogCkBAIC0xNTE3LDcgKzE1MjQsNyBAQAogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJVbiIsICZ1bmljb2RlLCAmYnVmbGVuKSkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgYnVmZmVyID0gUHlNZW1fTWFsbG9jKGJ1ZmxlbiAqIHNpemVvZih3Y2hhcl90KSk7CisgICAgYnVmZmVyID0gUHlNZW1fTmV3KHdjaGFyX3QsIGJ1Zmxlbik7CiAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKQogICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fdGtpbnRlci5jIGIvTW9kdWxlcy9fdGtpbnRlci5jCmluZGV4IGQ1Mzk2ZjYuLjUyMDY5ZWMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3RraW50ZXIuYworKysgYi9Nb2R1bGVzL190a2ludGVyLmMKQEAgLTIxLDYgKzIxLDcgQEAKIAogKi8KIAorI2RlZmluZSBQWV9TU0laRV9UX0NMRUFOCiAKICNpbmNsdWRlICJQeXRob24uaCIKICNpbmNsdWRlIDxjdHlwZS5oPgpAQCAtMzQsNyArMzUsNyBAQAogI2VuZGlmCiAKICNkZWZpbmUgQ0hFQ0tfU0laRShzaXplLCBlbGVtc2l6ZSkgXAotICAgICgoc2l6ZV90KShzaXplKSA8PSBQeV9NQVgoKHNpemVfdClJTlRfTUFYLCBVSU5UX01BWCAvIChzaXplX3QpKGVsZW1zaXplKSkpCisgICAgKChzaXplX3QpKHNpemUpIDw9IFB5X01JTigoc2l6ZV90KUlOVF9NQVgsIFVJTlRfTUFYIC8gKHNpemVfdCkoZWxlbXNpemUpKSkKIAogLyogSWYgVGNsIGlzIGNvbXBpbGVkIGZvciB0aHJlYWRzLCB3ZSBtdXN0IGFsc28gZGVmaW5lIFRDTF9USFJFQUQuIFdlIGRlZmluZQogICAgaXQgYWx3YXlzOyBpZiBUY2wgaXMgbm90IHRocmVhZGVkLCB0aGUgdGhyZWFkIGZ1bmN0aW9ucyBpbgpAQCAtNDA5LDcgKzQxMCw3IEBACiBTcGxpdE9iaihQeU9iamVjdCAqYXJnKQogewogICAgIGlmIChQeVR1cGxlX0NoZWNrKGFyZykpIHsKLSAgICAgICAgaW50IGksIHNpemU7CisgICAgICAgIFB5X3NzaXplX3QgaSwgc2l6ZTsKICAgICAgICAgUHlPYmplY3QgKmVsZW0sICpuZXdlbGVtLCAqcmVzdWx0OwogCiAgICAgICAgIHNpemUgPSBQeVR1cGxlX1NpemUoYXJnKTsKQEAgLTQyNSw3ICs0MjYsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHsKLSAgICAgICAgICAgICAgICBpbnQgazsKKyAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGs7CiAgICAgICAgICAgICAgICAgaWYgKG5ld2VsZW0gPT0gZWxlbSkgewogICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYobmV3ZWxlbSk7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtNDQ2LDcgKzQ0Nyw3IEBACiAgICAgICAgIC8qIEZhbGwgdGhyb3VnaCwgcmV0dXJuaW5nIGFyZy4gKi8KICAgICB9CiAgICAgZWxzZSBpZiAoUHlMaXN0X0NoZWNrKGFyZykpIHsKLSAgICAgICAgaW50IGksIHNpemU7CisgICAgICAgIFB5X3NzaXplX3QgaSwgc2l6ZTsKICAgICAgICAgUHlPYmplY3QgKmVsZW0sICpuZXdlbGVtLCAqcmVzdWx0OwogCiAgICAgICAgIHNpemUgPSBQeUxpc3RfR0VUX1NJWkUoYXJnKTsKQEAgLTYzMiwxMiArNjMzLDEyIEBACiAgICAgLyogc29tZSBpbml0aWFsIGFyZ3VtZW50cyBuZWVkIHRvIGJlIGluIGFyZ3YgKi8KICAgICBpZiAoc3luYyB8fCB1c2UpIHsKICAgICAgICAgY2hhciAqYXJnczsKLSAgICAgICAgaW50IGxlbiA9IDA7CisgICAgICAgIFB5X3NzaXplX3QgbGVuID0gMDsKIAogICAgICAgICBpZiAoc3luYykKICAgICAgICAgICAgIGxlbiArPSBzaXplb2YgIi1zeW5jIjsKICAgICAgICAgaWYgKHVzZSkKLSAgICAgICAgICAgIGxlbiArPSBzdHJsZW4odXNlKSArIHNpemVvZiAiLXVzZSAiOworICAgICAgICAgICAgbGVuICs9IHN0cmxlbih1c2UpICsgc2l6ZW9mICItdXNlICI7ICAvKiBuZXZlciBvdmVyZmxvd3MgKi8KIAogICAgICAgICBhcmdzID0gKGNoYXIqKVB5TWVtX01hbGxvYyhsZW4pOwogICAgICAgICBpZiAoIWFyZ3MpIHsKQEAgLTg4Nyw5ICs4ODgsMTQgQEAKICAgICBsb25nIGxvbmdWYWw7CiAgICAgaW50IG92ZXJmbG93OwogCi0gICAgaWYgKFB5Qnl0ZXNfQ2hlY2sodmFsdWUpKQorICAgIGlmIChQeUJ5dGVzX0NoZWNrKHZhbHVlKSkgeworICAgICAgICBpZiAoUHlCeXRlc19HRVRfU0laRSh2YWx1ZSkgPj0gSU5UX01BWCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJieXRlcyBvYmplY3QgaXMgdG9vIGxvbmciKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBUY2xfTmV3Qnl0ZUFycmF5T2JqKCh1bnNpZ25lZCBjaGFyICopUHlCeXRlc19BU19TVFJJTkcodmFsdWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUJ5dGVzX0dFVF9TSVpFKHZhbHVlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpUHlCeXRlc19HRVRfU0laRSh2YWx1ZSkpOworICAgIH0KICAgICBlbHNlIGlmIChQeUJvb2xfQ2hlY2sodmFsdWUpKQogICAgICAgICByZXR1cm4gVGNsX05ld0Jvb2xlYW5PYmooUHlPYmplY3RfSXNUcnVlKHZhbHVlKSk7CiAgICAgZWxzZSBpZiAoUHlMb25nX0NoZWNrRXhhY3QodmFsdWUpICYmCkBAIC05MjEsNyArOTI3LDcgQEAKICAgICAgICAgfQogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQogICAgICAgICAgIGFyZ3ZbaV0gPSBBc09iaihQeVNlcXVlbmNlX0Zhc3RfR0VUX0lURU0odmFsdWUsaSkpOwotICAgICAgICByZXN1bHQgPSBUY2xfTmV3TGlzdE9iaihzaXplLCBhcmd2KTsKKyAgICAgICAgcmVzdWx0ID0gVGNsX05ld0xpc3RPYmooKGludClzaXplLCBhcmd2KTsKICAgICAgICAgUHlNZW1fRnJlZShhcmd2KTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CkBAIC05NDYsNyArOTUyLDcgQEAKICAgICAgICAgfQogICAgICAgICBraW5kID0gUHlVbmljb2RlX0tJTkQodmFsdWUpOwogICAgICAgICBpZiAoa2luZCA9PSBzaXplb2YoVGNsX1VuaUNoYXIpKQotICAgICAgICAgICAgcmV0dXJuIFRjbF9OZXdVbmljb2RlT2JqKGluYnVmLCBzaXplKTsKKyAgICAgICAgICAgIHJldHVybiBUY2xfTmV3VW5pY29kZU9iaihpbmJ1ZiwgKGludClzaXplKTsKICAgICAgICAgYWxsb2NzaXplID0gKChzaXplX3Qpc2l6ZSkgKiBzaXplb2YoVGNsX1VuaUNoYXIpOwogICAgICAgICBvdXRidWYgPSAoVGNsX1VuaUNoYXIqKVB5TWVtX01hbGxvYyhhbGxvY3NpemUpOwogICAgICAgICAvKiBFbHNlIG92ZXJmbG93IG9jY3VycmVkLCBhbmQgd2UgdGFrZSB0aGUgbmV4dCBleGl0ICovCkBAIC05NzEsNyArOTc3LDcgQEAKICNlbmRpZgogICAgICAgICAgICAgb3V0YnVmW2ldID0gY2g7CiAgICAgICAgIH0KLSAgICAgICAgcmVzdWx0ID0gVGNsX05ld1VuaWNvZGVPYmoob3V0YnVmLCBzaXplKTsKKyAgICAgICAgcmVzdWx0ID0gVGNsX05ld1VuaWNvZGVPYmoob3V0YnVmLCAoaW50KXNpemUpOwogICAgICAgICBQeU1lbV9GcmVlKG91dGJ1Zik7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQpAQCAtMTEzOSwxMCArMTE0NSwxMCBAQAogICAgICAgICAgICAgVGNsX0luY3JSZWZDb3VudChvYmp2W2ldKTsKICAgICAgICAgfQogICAgIH0KLSAgICAqcG9iamMgPSBvYmpjOworICAgICpwb2JqYyA9IChpbnQpb2JqYzsKICAgICByZXR1cm4gb2JqdjsKIGZpbmFsbHk6Ci0gICAgVGthcHBfQ2FsbERlYWxsb2NBcmdzKG9ianYsIG9ialN0b3JlLCBvYmpjKTsKKyAgICBUa2FwcF9DYWxsRGVhbGxvY0FyZ3Mob2Jqdiwgb2JqU3RvcmUsIChpbnQpb2JqYyk7CiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTE0OTUsNyArMTUwMSw2IEBACiAjaWZkZWYgV0lUSF9USFJFQUQKICAgICBUa2FwcE9iamVjdCAqc2VsZiA9IChUa2FwcE9iamVjdCopc2VsZnB0cjsKICAgICBpZiAoc2VsZi0+dGhyZWFkZWQgJiYgc2VsZi0+dGhyZWFkX2lkICE9IFRjbF9HZXRDdXJyZW50VGhyZWFkKCkpIHsKLSAgICAgICAgVGthcHBPYmplY3QgKnNlbGYgPSAoVGthcHBPYmplY3QqKXNlbGZwdHI7CiAgICAgICAgIFZhckV2ZW50ICpldjsKICAgICAgICAgUHlPYmplY3QgKnJlcywgKmV4Y190eXBlLCAqZXhjX3ZhbDsKICAgICAgICAgVGNsX0NvbmRpdGlvbiBjb25kID0gTlVMTDsKQEAgLTI0MDQsNyArMjQwOSw3IEBACiB9OwogCiBzdGF0aWMgUHlUeXBlX1NwZWMgVGt0dF9UeXBlX3NwZWMgPSB7Ci0gICAgInRrdGltZXJ0b2tlbiIsCisgICAgIl90a2ludGVyLnRrdGltZXJ0b2tlbiIsCiAgICAgc2l6ZW9mKFRrdHRPYmplY3QpLAogICAgIDAsCiAgICAgUHlfVFBGTEFHU19ERUZBVUxULApAQCAtMjcwOCw3ICsyNzEzLDcgQEAKIAogCiBzdGF0aWMgUHlUeXBlX1NwZWMgVGthcHBfVHlwZV9zcGVjID0gewotICAgICJ0a2FwcCIsCisgICAgIl90a2ludGVyLnRrYXBwIiwKICAgICBzaXplb2YoVGthcHBPYmplY3QpLAogICAgIDAsCiAgICAgUHlfVFBGTEFHU19ERUZBVUxULApAQCAtMjcyMSwyMCArMjcyNiwyMCBAQAogCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgUHlPYmplY3QqIHR1cGxlOwotICAgIGludCBzaXplOyAvKiBjdXJyZW50IHNpemUgKi8KLSAgICBpbnQgbWF4c2l6ZTsgLyogYWxsb2NhdGVkIHNpemUgKi8KKyAgICBQeV9zc2l6ZV90IHNpemU7IC8qIGN1cnJlbnQgc2l6ZSAqLworICAgIFB5X3NzaXplX3QgbWF4c2l6ZTsgLyogYWxsb2NhdGVkIHNpemUgKi8KIH0gRmxhdHRlbkNvbnRleHQ7CiAKIHN0YXRpYyBpbnQKLV9idW1wKEZsYXR0ZW5Db250ZXh0KiBjb250ZXh0LCBpbnQgc2l6ZSkKK19idW1wKEZsYXR0ZW5Db250ZXh0KiBjb250ZXh0LCBQeV9zc2l6ZV90IHNpemUpCiB7CiAgICAgLyogZXhwYW5kIHR1cGxlIHRvIGhvbGQgKGF0IGxlYXN0KSBzaXplIG5ldyBpdGVtcy4KICAgICAgICByZXR1cm4gdHJ1ZSBpZiBzdWNjZXNzZnVsLCBmYWxzZSBpZiBhbiBleGNlcHRpb24gd2FzIHJhaXNlZCAqLwogCi0gICAgaW50IG1heHNpemUgPSBjb250ZXh0LT5tYXhzaXplICogMjsKKyAgICBQeV9zc2l6ZV90IG1heHNpemUgPSBjb250ZXh0LT5tYXhzaXplICogMjsgIC8qIG5ldmVyIG92ZXJmbG93cyAqLwogCiAgICAgaWYgKG1heHNpemUgPCBjb250ZXh0LT5zaXplICsgc2l6ZSkKLSAgICAgICAgbWF4c2l6ZSA9IGNvbnRleHQtPnNpemUgKyBzaXplOworICAgICAgICBtYXhzaXplID0gY29udGV4dC0+c2l6ZSArIHNpemU7ICAvKiBuZXZlciBvdmVyZmxvd3MgKi8KIAogICAgIGNvbnRleHQtPm1heHNpemUgPSBtYXhzaXplOwogCkBAIC0yNzQ2LDcgKzI3NTEsNyBAQAogewogICAgIC8qIGFkZCB0dXBsZSBvciBsaXN0IHRvIGFyZ3VtZW50IHR1cGxlIChyZWN1cnNpdmVseSkgKi8KIAotICAgIGludCBpLCBzaXplOworICAgIFB5X3NzaXplX3QgaSwgc2l6ZTsKIAogICAgIGlmIChkZXB0aCA+IDEwMDApIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCmRpZmYgLS1naXQgYS9Nb2R1bGVzL193aW5hcGkuYyBiL01vZHVsZXMvX3dpbmFwaS5jCmluZGV4IGYxMTg0MzYuLjAyNzQ4NzQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3dpbmFwaS5jCisrKyBiL01vZHVsZXMvX3dpbmFwaS5jCkBAIC02NzAsMTMgKzY3MCwyMyBAQAogICAgICAgICAgICAgICAgICJlbnZpcm9ubWVudCBjYW4gb25seSBjb250YWluIHN0cmluZ3MiKTsKICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKHRvdGFsc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC0gUHlVbmljb2RlX0dFVF9MRU5HVEgoa2V5KSAtIDEpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAiZW52aXJvbm1lbnQgdG9vIGxvbmciKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KICAgICAgICAgdG90YWxzaXplICs9IFB5VW5pY29kZV9HRVRfTEVOR1RIKGtleSkgKyAxOyAgICAvKiArMSBmb3IgJz0nICovCisgICAgICAgIGlmICh0b3RhbHNpemUgPiBQWV9TU0laRV9UX01BWCAtIFB5VW5pY29kZV9HRVRfTEVOR1RIKHZhbHVlKSAtIDEpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAiZW52aXJvbm1lbnQgdG9vIGxvbmciKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KICAgICAgICAgdG90YWxzaXplICs9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHZhbHVlKSArIDE7ICAvKiArMSBmb3IgJ1wwJyAqLwogICAgIH0KIAotICAgIGJ1ZmZlciA9IFB5TWVtX01hbGxvYyh0b3RhbHNpemUgKiBzaXplb2YoUHlfVUNTNCkpOwotICAgIGlmICghIGJ1ZmZlcikKKyAgICBidWZmZXIgPSBQeU1lbV9ORVcoUHlfVUNTNCwgdG90YWxzaXplKTsKKyAgICBpZiAoISBidWZmZXIpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAgICAgcCA9IGJ1ZmZlcjsKICAgICBlbmQgPSBidWZmZXIgKyB0b3RhbHNpemU7CiAKQEAgLTk5MSw2ICsxMDAxLDEyIEBACiBcblwKIFJldHVybiB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGN1cnJlbnQgb3BlcmF0aW5nIHN5c3RlbS4iKTsKIAorLyogRGlzYWJsZSBkZXByZWNhdGlvbiB3YXJuaW5ncyBhYm91dCBHZXRWZXJzaW9uRXggYXMgdGhlIHJlc3VsdCBpcworICAgYmVpbmcgcGFzc2VkIHN0cmFpZ2h0IHRocm91Z2ggdG8gdGhlIGNhbGxlciwgd2hvIGlzIHJlc3BvbnNpYmxlIGZvcgorICAgdXNpbmcgaXQgY29ycmVjdGx5LiAqLworI3ByYWdtYSB3YXJuaW5nKHB1c2gpCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0OTk2KQorCiBzdGF0aWMgUHlPYmplY3QgKgogd2luYXBpX0dldFZlcnNpb24oUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQogewpAQCAtMTAwMCw2ICsxMDE2LDggQEAKICAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoR2V0VmVyc2lvbigpKTsKIH0KIAorI3ByYWdtYSB3YXJuaW5nKHBvcCkKKwogc3RhdGljIFB5T2JqZWN0ICoKIHdpbmFwaV9PcGVuUHJvY2VzcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2JpbmFzY2lpLmMgYi9Nb2R1bGVzL2JpbmFzY2lpLmMKaW5kZXggODZiNjNiYi4uNGU2OTUzYiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9iaW5hc2NpaS5jCisrKyBiL01vZHVsZXMvYmluYXNjaWkuYwpAQCAtMjI4LDEzICsyMjgsMTMgQEAKICAgICBpZiAoUHlPYmplY3RfR2V0QnVmZmVyKGFyZywgYnVmLCBQeUJVRl9TSU1QTEUpICE9IDApIHsKICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICJhcmd1bWVudCBzaG91bGQgYmUgYnl0ZXMsIGJ1ZmZlciBvciBBU0NJSSBzdHJpbmcsICIKLSAgICAgICAgICAgICAgICAgICAgICJub3QgJVIiLCBQeV9UWVBFKGFyZykpOworICAgICAgICAgICAgICAgICAgICAgIm5vdCAnJS4xMDBzJyIsIFB5X1RZUEUoYXJnKS0+dHBfbmFtZSk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICBpZiAoIVB5QnVmZmVyX0lzQ29udGlndW91cyhidWYsICdDJykpIHsKICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICJhcmd1bWVudCBzaG91bGQgYmUgYSBjb250aWd1b3VzIGJ1ZmZlciwgIgotICAgICAgICAgICAgICAgICAgICAgIm5vdCAlUiIsIFB5X1RZUEUoYXJnKSk7CisgICAgICAgICAgICAgICAgICAgICAibm90ICclLjEwMHMnIiwgUHlfVFlQRShhcmcpLT50cF9uYW1lKTsKICAgICAgICAgUHlCdWZmZXJfUmVsZWFzZShidWYpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2Nqa2NvZGVjcy9fY29kZWNzX2lzbzIwMjIuYyBiL01vZHVsZXMvY2prY29kZWNzL19jb2RlY3NfaXNvMjAyMi5jCmluZGV4IDVjNDAxYWEuLjFjZTQyMTggMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2prY29kZWNzL19jb2RlY3NfaXNvMjAyMi5jCisrKyBiL01vZHVsZXMvY2prY29kZWNzL19jb2RlY3NfaXNvMjAyMi5jCkBAIC0yOTIsNyArMjkyLDcgQEAKICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKippbmJ1ZiwgUHlfc3NpemVfdCAqaW5sZWZ0KQogewogICAgIHVuc2lnbmVkIGNoYXIgY2hhcnNldCwgZGVzaWduYXRpb247Ci0gICAgUHlfc3NpemVfdCBpLCBlc2NsZW47CisgICAgUHlfc3NpemVfdCBpLCBlc2NsZW4gPSAwOwogCiAgICAgZm9yIChpID0gMTtpIDwgTUFYX0VTQ1NFUUxFTjtpKyspIHsKICAgICAgICAgaWYgKGkgPj0gKmlubGVmdCkKQEAgLTMwNywxMCArMzA3LDkgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChpID49IE1BWF9FU0NTRVFMRU4pCi0gICAgICAgIHJldHVybiAxOyAvKiB1bnRlcm1pbmF0ZWQgZXNjYXBlIHNlcXVlbmNlICovCi0KICAgICBzd2l0Y2ggKGVzY2xlbikgeworICAgIGNhc2UgMDoKKyAgICAgICAgcmV0dXJuIDE7IC8qIHVudGVybWluYXRlZCBlc2NhcGUgc2VxdWVuY2UgKi8KICAgICBjYXNlIDM6CiAgICAgICAgIGlmIChJTkJZVEUyID09ICckJykgewogICAgICAgICAgICAgY2hhcnNldCA9IElOQllURTMgfCBDSEFSU0VUX0RCQ1M7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2Nqa2NvZGVjcy9tdWx0aWJ5dGVjb2RlYy5jIGIvTW9kdWxlcy9jamtjb2RlY3MvbXVsdGlieXRlY29kZWMuYwppbmRleCAzMWJiMzVmLi5mZTViMzYyIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2Nqa2NvZGVjcy9tdWx0aWJ5dGVjb2RlYy5jCisrKyBiL01vZHVsZXMvY2prY29kZWNzL211bHRpYnl0ZWNvZGVjLmMKQEAgLTE3NCw4ICsxNzQsMTAgQEAKICAgICBvcmdzaXplID0gUHlCeXRlc19HRVRfU0laRShidWYtPm91dG9iaik7CiAgICAgaW5jc2l6ZSA9IChlc2l6ZSA8IChvcmdzaXplID4+IDEpID8gKG9yZ3NpemUgPj4gMSkgfCAxIDogZXNpemUpOwogCi0gICAgaWYgKG9yZ3NpemUgPiBQWV9TU0laRV9UX01BWCAtIGluY3NpemUpCisgICAgaWYgKG9yZ3NpemUgPiBQWV9TU0laRV9UX01BWCAtIGluY3NpemUpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAogICAgIGlmIChfUHlCeXRlc19SZXNpemUoJmJ1Zi0+b3V0b2JqLCBvcmdzaXplICsgaW5jc2l6ZSkgPT0gLTEpCiAgICAgICAgIHJldHVybiAtMTsKQEAgLTE4NiwxMSArMTg4LDExIEBACiAKICAgICByZXR1cm4gMDsKIH0KLSNkZWZpbmUgUkVRVUlSRV9FTkNPREVCVUZGRVIoYnVmLCBzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoKHMpIDwgMSB8fCAoYnVmKS0+b3V0YnVmICsgKHMpID4gKGJ1ZiktPm91dGJ1Zl9lbmQpICAgICAgICAgICAgIFwKKyNkZWZpbmUgUkVRVUlSRV9FTkNPREVCVUZGRVIoYnVmLCBzKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKHMpIDwgMCB8fCAocykgPiAoYnVmKS0+b3V0YnVmX2VuZCAtIChidWYpLT5vdXRidWYpICAgICAgICAgICAgIFwKICAgICAgICAgaWYgKGV4cGFuZF9lbmNvZGVidWZmZXIoYnVmLCBzKSA9PSAtMSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgIGdvdG8gZXJyb3JleGl0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KK30gd2hpbGUoMCkKIAogCiAvKioKQEAgLTMyNCwxMCArMzI2LDExIEBACiAKICAgICBhc3NlcnQoUHlCeXRlc19DaGVjayhyZXRzdHIpKTsKICAgICByZXRzdHJzaXplID0gUHlCeXRlc19HRVRfU0laRShyZXRzdHIpOwotICAgIFJFUVVJUkVfRU5DT0RFQlVGRkVSKGJ1ZiwgcmV0c3Ryc2l6ZSk7Ci0KLSAgICBtZW1jcHkoYnVmLT5vdXRidWYsIFB5Qnl0ZXNfQVNfU1RSSU5HKHJldHN0ciksIHJldHN0cnNpemUpOwotICAgIGJ1Zi0+b3V0YnVmICs9IHJldHN0cnNpemU7CisgICAgaWYgKHJldHN0cnNpemUgPiAwKSB7CisgICAgICAgIFJFUVVJUkVfRU5DT0RFQlVGRkVSKGJ1ZiwgcmV0c3Ryc2l6ZSk7CisgICAgICAgIG1lbWNweShidWYtPm91dGJ1ZiwgUHlCeXRlc19BU19TVFJJTkcocmV0c3RyKSwgcmV0c3Ryc2l6ZSk7CisgICAgICAgIGJ1Zi0+b3V0YnVmICs9IHJldHN0cnNpemU7CisgICAgfQogCiAgICAgbmV3cG9zID0gUHlMb25nX0FzU3NpemVfdChQeVR1cGxlX0dFVF9JVEVNKHJldG9iaiwgMSkpOwogICAgIGlmIChuZXdwb3MgPCAwICYmICFQeUVycl9PY2N1cnJlZCgpKQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvX2J6Mm1vZHVsZS5jLmggYi9Nb2R1bGVzL2NsaW5pYy9fYnoybW9kdWxlLmMuaAppbmRleCA4YTIwMWEwLi41MjAxNDMyIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy9fYnoybW9kdWxlLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9fYnoybW9kdWxlLmMuaApAQCAtOTUsMzQgKzk1LDQzIEBACiB9CiAKIFB5RG9jX1NUUlZBUihfYnoyX0JaMkRlY29tcHJlc3Nvcl9kZWNvbXByZXNzX19kb2NfXywKLSJkZWNvbXByZXNzKCRzZWxmLCBkYXRhLCAvKVxuIgorImRlY29tcHJlc3MoJHNlbGYsIC8sIGRhdGEsIG1heF9sZW5ndGg9LTEpXG4iCiAiLS1cbiIKICJcbiIKLSJQcm92aWRlIGRhdGEgdG8gdGhlIGRlY29tcHJlc3NvciBvYmplY3QuXG4iCisiRGVjb21wcmVzcyAqZGF0YSosIHJldHVybmluZyB1bmNvbXByZXNzZWQgZGF0YSBhcyBieXRlcy5cbiIKICJcbiIKLSJSZXR1cm5zIGEgY2h1bmsgb2YgZGVjb21wcmVzc2VkIGRhdGEgaWYgcG9zc2libGUsIG9yIGJcJ1wnIG90aGVyd2lzZS5cbiIKKyJJZiAqbWF4X2xlbmd0aCogaXMgbm9ubmVnYXRpdmUsIHJldHVybnMgYXQgbW9zdCAqbWF4X2xlbmd0aCogYnl0ZXMgb2ZcbiIKKyJkZWNvbXByZXNzZWQgZGF0YS4gSWYgdGhpcyBsaW1pdCBpcyByZWFjaGVkIGFuZCBmdXJ0aGVyIG91dHB1dCBjYW4gYmVcbiIKKyJwcm9kdWNlZCwgKnNlbGYubmVlZHNfaW5wdXQqIHdpbGwgYmUgc2V0IHRvIGBgRmFsc2VgYC4gSW4gdGhpcyBjYXNlLCB0aGUgbmV4dFxuIgorImNhbGwgdG8gKmRlY29tcHJlc3MoKSogbWF5IHByb3ZpZGUgKmRhdGEqIGFzIGJcJ1wnIHRvIG9idGFpbiBtb3JlIG9mIHRoZSBvdXRwdXQuXG4iCiAiXG4iCi0iQXR0ZW1wdGluZyB0byBkZWNvbXByZXNzIGRhdGEgYWZ0ZXIgdGhlIGVuZCBvZiBzdHJlYW0gaXMgcmVhY2hlZFxuIgotInJhaXNlcyBhbiBFT0ZFcnJvci4gIEFueSBkYXRhIGZvdW5kIGFmdGVyIHRoZSBlbmQgb2YgdGhlIHN0cmVhbVxuIgotImlzIGlnbm9yZWQgYW5kIHNhdmVkIGluIHRoZSB1bnVzZWRfZGF0YSBhdHRyaWJ1dGUuIik7CisiSWYgYWxsIG9mIHRoZSBpbnB1dCBkYXRhIHdhcyBkZWNvbXByZXNzZWQgYW5kIHJldHVybmVkIChlaXRoZXIgYmVjYXVzZSB0aGlzXG4iCisid2FzIGxlc3MgdGhhbiAqbWF4X2xlbmd0aCogYnl0ZXMsIG9yIGJlY2F1c2UgKm1heF9sZW5ndGgqIHdhcyBuZWdhdGl2ZSksXG4iCisiKnNlbGYubmVlZHNfaW5wdXQqIHdpbGwgYmUgc2V0IHRvIFRydWUuXG4iCisiXG4iCisiQXR0ZW1wdGluZyB0byBkZWNvbXByZXNzIGRhdGEgYWZ0ZXIgdGhlIGVuZCBvZiBzdHJlYW0gaXMgcmVhY2hlZCByYWlzZXMgYW5cbiIKKyJFT0ZFcnJvci4gIEFueSBkYXRhIGZvdW5kIGFmdGVyIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSBpcyBpZ25vcmVkIGFuZCBzYXZlZCBpblxuIgorInRoZSB1bnVzZWRfZGF0YSBhdHRyaWJ1dGUuIik7CiAKICNkZWZpbmUgX0JaMl9CWjJERUNPTVBSRVNTT1JfREVDT01QUkVTU19NRVRIT0RERUYgICAgXAotICAgIHsiZGVjb21wcmVzcyIsIChQeUNGdW5jdGlvbilfYnoyX0JaMkRlY29tcHJlc3Nvcl9kZWNvbXByZXNzLCBNRVRIX1ZBUkFSR1MsIF9iejJfQloyRGVjb21wcmVzc29yX2RlY29tcHJlc3NfX2RvY19ffSwKKyAgICB7ImRlY29tcHJlc3MiLCAoUHlDRnVuY3Rpb24pX2J6Ml9CWjJEZWNvbXByZXNzb3JfZGVjb21wcmVzcywgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIF9iejJfQloyRGVjb21wcmVzc29yX2RlY29tcHJlc3NfX2RvY19ffSwKIAogc3RhdGljIFB5T2JqZWN0ICoKLV9iejJfQloyRGVjb21wcmVzc29yX2RlY29tcHJlc3NfaW1wbChCWjJEZWNvbXByZXNzb3IgKnNlbGYsIFB5X2J1ZmZlciAqZGF0YSk7CitfYnoyX0JaMkRlY29tcHJlc3Nvcl9kZWNvbXByZXNzX2ltcGwoQloyRGVjb21wcmVzc29yICpzZWxmLCBQeV9idWZmZXIgKmRhdGEsIFB5X3NzaXplX3QgbWF4X2xlbmd0aCk7CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1fYnoyX0JaMkRlY29tcHJlc3Nvcl9kZWNvbXByZXNzKEJaMkRlY29tcHJlc3NvciAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCitfYnoyX0JaMkRlY29tcHJlc3Nvcl9kZWNvbXByZXNzKEJaMkRlY29tcHJlc3NvciAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CisgICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJkYXRhIiwgIm1heF9sZW5ndGgiLCBOVUxMfTsKICAgICBQeV9idWZmZXIgZGF0YSA9IHtOVUxMLCBOVUxMfTsKKyAgICBQeV9zc2l6ZV90IG1heF9sZW5ndGggPSAtMTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLAotICAgICAgICAieSo6ZGVjb21wcmVzcyIsCi0gICAgICAgICZkYXRhKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsCisgICAgICAgICJ5KnxuOmRlY29tcHJlc3MiLCBfa2V5d29yZHMsCisgICAgICAgICZkYXRhLCAmbWF4X2xlbmd0aCkpCiAgICAgICAgIGdvdG8gZXhpdDsKLSAgICByZXR1cm5fdmFsdWUgPSBfYnoyX0JaMkRlY29tcHJlc3Nvcl9kZWNvbXByZXNzX2ltcGwoc2VsZiwgJmRhdGEpOworICAgIHJldHVybl92YWx1ZSA9IF9iejJfQloyRGVjb21wcmVzc29yX2RlY29tcHJlc3NfaW1wbChzZWxmLCAmZGF0YSwgbWF4X2xlbmd0aCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwpAQCAtMTU5LDQgKzE2OCw0IEBACiBleGl0OgogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9Ci0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MjFjYTQ0MDU1MTlhMDkzMSBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9OGU2NWUzOTUzNDMwYmMzZCBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9fbHptYW1vZHVsZS5jLmggYi9Nb2R1bGVzL2NsaW5pYy9fbHptYW1vZHVsZS5jLmgKaW5kZXggYTQ2YTE1Mi4uNjM2NDI3MSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvX2x6bWFtb2R1bGUuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL19sem1hbW9kdWxlLmMuaApAQCAtNjUsNyArNjUsNyBAQAogImRlY29tcHJlc3MoJHNlbGYsIC8sIGRhdGEsIG1heF9sZW5ndGg9LTEpXG4iCiAiLS1cbiIKICJcbiIKLSJEZWNvbXByZXNzZXMgKmRhdGEqLCByZXR1cm5pbmcgdW5jb21wcmVzc2VkIGRhdGEgYXMgYnl0ZXMuXG4iCisiRGVjb21wcmVzcyAqZGF0YSosIHJldHVybmluZyB1bmNvbXByZXNzZWQgZGF0YSBhcyBieXRlcy5cbiIKICJcbiIKICJJZiAqbWF4X2xlbmd0aCogaXMgbm9ubmVnYXRpdmUsIHJldHVybnMgYXQgbW9zdCAqbWF4X2xlbmd0aCogYnl0ZXMgb2ZcbiIKICJkZWNvbXByZXNzZWQgZGF0YS4gSWYgdGhpcyBsaW1pdCBpcyByZWFjaGVkIGFuZCBmdXJ0aGVyIG91dHB1dCBjYW4gYmVcbiIKQEAgLTI1MSw0ICsyNTEsNCBAQAogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1kMTdmYWMzOGIwOTYyNmQ4IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1kYzQyYjczODkwNjA5MzY5IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2xpbmljL2NtYXRobW9kdWxlLmMuaCBiL01vZHVsZXMvY2xpbmljL2NtYXRobW9kdWxlLmMuaAppbmRleCA4M2RlNTE4Li5kMGM0OGQzIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy9jbWF0aG1vZHVsZS5jLmgKKysrIGIvTW9kdWxlcy9jbGluaWMvY21hdGhtb2R1bGUuYy5oCkBAIC04NDgsNCArODQ4LDQgQEAKIGV4aXQ6CiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD00NDA3Zjg5OGFlMDdjODNkIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD05YjZkODE3MTFlNGUzYzRiIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvY21hdGhtb2R1bGUuYyBiL01vZHVsZXMvY21hdGhtb2R1bGUuYwppbmRleCA1NzQ2ZGIxLi42NzE2MWFkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NtYXRobW9kdWxlLmMKKysrIGIvTW9kdWxlcy9jbWF0aG1vZHVsZS5jCkBAIC0yMTIsNyArMjEyLDcgQEAKIAogc3RhdGljIFB5X2NvbXBsZXgKIGNtYXRoX2Fjb3NoX2ltcGwoUHlNb2R1bGVEZWYgKm1vZHVsZSwgUHlfY29tcGxleCB6KQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWMyM2M3NzY0MjlkZWY5ODEgaW5wdXQ9YmMwMTY0MTIwODBiYjNlOV0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWMyM2M3NzY0MjlkZWY5ODEgaW5wdXQ9M2Y2MWJlZTdkNzAzZTUzY10qLwogewogICAgIFB5X2NvbXBsZXggczEsIHMyLCByOwogCkBAIC0yNjcsNyArMjY3LDcgQEAKIAogc3RhdGljIFB5X2NvbXBsZXgKIGNtYXRoX2FzaW5oX2ltcGwoUHlNb2R1bGVEZWYgKm1vZHVsZSwgUHlfY29tcGxleCB6KQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTBjNjY2NDgyM2M3YjFiMzUgaW5wdXQ9NWEyMWZhMDI0MjkyOGM5Yl0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTBjNjY2NDgyM2M3YjFiMzUgaW5wdXQ9NWMwOTQ0OGZjZmM4OWE3OV0qLwogewogICAgIFB5X2NvbXBsZXggczEsIHMyLCByOwogCkBAIC0zNTgsNyArMzU4LDcgQEAKIAogc3RhdGljIFB5X2NvbXBsZXgKIGNtYXRoX2F0YW5oX2ltcGwoUHlNb2R1bGVEZWYgKm1vZHVsZSwgUHlfY29tcGxleCB6KQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTI3OWUwYjlmZWZjOGRhN2MgaW5wdXQ9ZGYxOWNkYzlmOWQ0MzFjOV0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTI3OWUwYjlmZWZjOGRhN2MgaW5wdXQ9MmIzZmRiODJmYjM0NDg3Yl0qLwogewogICAgIFB5X2NvbXBsZXggcjsKICAgICBkb3VibGUgYXksIGg7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2ZhdWx0aGFuZGxlci5jIGIvTW9kdWxlcy9mYXVsdGhhbmRsZXIuYwppbmRleCA1Njg3MjRiLi40NjQzYzBlIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2ZhdWx0aGFuZGxlci5jCisrKyBiL01vZHVsZXMvZmF1bHRoYW5kbGVyLmMKQEAgLTQ1OCw3ICs0NTgsNyBAQAogICAgICAgICBhc3NlcnQoc3QgPT0gUFlfTE9DS19GQUlMVVJFKTsKIAogICAgICAgICAvKiBnZXQgdGhlIHRocmVhZCBob2xkaW5nIHRoZSBHSUwsIE5VTEwgaWYgbm8gdGhyZWFkIGhvbGQgdGhlIEdJTCAqLwotICAgICAgICBjdXJyZW50ID0gX1B5X2F0b21pY19sb2FkX3JlbGF4ZWQoJl9QeVRocmVhZFN0YXRlX0N1cnJlbnQpOworICAgICAgICBjdXJyZW50ID0gKFB5VGhyZWFkU3RhdGUqKV9QeV9hdG9taWNfbG9hZF9yZWxheGVkKCZfUHlUaHJlYWRTdGF0ZV9DdXJyZW50KTsKIAogICAgICAgICB3cml0ZSh0aHJlYWQuZmQsIHRocmVhZC5oZWFkZXIsIChpbnQpdGhyZWFkLmhlYWRlcl9sZW4pOwogCkBAIC05MjcsMTIgKzkyNywxMiBAQAogfQogCiAjaWYgZGVmaW5lZChIQVZFX1NJR0FMVFNUQUNLKSAmJiBkZWZpbmVkKEhBVkVfU0lHQUNUSU9OKQotc3RhdGljIHZvaWQqCi1zdGFja19vdmVyZmxvdyh2b2lkICptaW5fc3AsIHZvaWQgKm1heF9zcCwgc2l6ZV90ICpkZXB0aCkKK3N0YXRpYyBQeV91aW50cHRyX3QKK3N0YWNrX292ZXJmbG93KFB5X3VpbnRwdHJfdCBtaW5fc3AsIFB5X3VpbnRwdHJfdCBtYXhfc3AsIHNpemVfdCAqZGVwdGgpCiB7CiAgICAgLyogYWxsb2NhdGUgNDA5NiBieXRlcyBvbiB0aGUgc3RhY2sgYXQgZWFjaCBjYWxsICovCiAgICAgdW5zaWduZWQgY2hhciBidWZmZXJbNDA5Nl07Ci0gICAgdm9pZCAqc3AgPSAmYnVmZmVyOworICAgIFB5X3VpbnRwdHJfdCBzcCA9IChQeV91aW50cHRyX3QpJmJ1ZmZlcjsKICAgICAqZGVwdGggKz0gMTsKICAgICBpZiAoc3AgPCBtaW5fc3AgfHwgbWF4X3NwIDwgc3ApCiAgICAgICAgIHJldHVybiBzcDsKQEAgLTk0NSw3ICs5NDUsOCBAQAogZmF1bHRoYW5kbGVyX3N0YWNrX292ZXJmbG93KFB5T2JqZWN0ICpzZWxmKQogewogICAgIHNpemVfdCBkZXB0aCwgc2l6ZTsKLSAgICBjaGFyICpzcCA9IChjaGFyICopJmRlcHRoLCAqc3RvcDsKKyAgICBQeV91aW50cHRyX3Qgc3AgPSAoUHlfdWludHB0cl90KSZkZXB0aDsKKyAgICBQeV91aW50cHRyX3Qgc3RvcDsKIAogICAgIGZhdWx0aGFuZGxlcl9zdXBwcmVzc19jcmFzaF9yZXBvcnQoKTsKICAgICBkZXB0aCA9IDA7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2ZjbnRsbW9kdWxlLmMgYi9Nb2R1bGVzL2ZjbnRsbW9kdWxlLmMKaW5kZXggMWYxY2VmOS4uNzgwZTIyMiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9mY250bG1vZHVsZS5jCisrKyBiL01vZHVsZXMvZmNudGxtb2R1bGUuYwpAQCAtMTUyLDExICsxNTIsOCBAQAogLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWFkNDc3MzhjMTE4NjIyYmYgaW5wdXQ9YTU1YTZlZThlNDk0YzQ0OV0qLwogewogI2RlZmluZSBJT0NUTF9CVUZTWiAxMDI0Ci0gICAgLyogV2UgdXNlIHRoZSB1bnNpZ25lZCBub24tY2hlY2tlZCAnSScKLSAgICAgICBmb3JtYXQgZm9yIHRoZSAnY29kZScgcGFyYW1ldGVyIGJlY2F1c2UgUHl0aG9uIHR1cm5zIDB4ODAwMDAwMAotICAgICAgIGludG8gZWl0aGVyIGEgbGFyZ2UgcG9zaXRpdmUgbnVtYmVyIChQeUxvbmcgb3IgUHlJbnQgb24gNjQtYml0Ci0gICAgICAgcGxhdGZvcm1zKSBvciBhIG5lZ2F0aXZlIG51bWJlciBvbiBvdGhlcnMgKDMyLWJpdCBQeUludCkKLSAgICAgICB3aGVyZWFzIHRoZSBzeXN0ZW0gZXhwZWN0cyBpdCB0byBiZSBhIDMyYml0IGJpdCBmaWVsZCB2YWx1ZQorICAgIC8qIFdlIHVzZSB0aGUgdW5zaWduZWQgbm9uLWNoZWNrZWQgJ0knIGZvcm1hdCBmb3IgdGhlICdjb2RlJyBwYXJhbWV0ZXIKKyAgICAgICBiZWNhdXNlIHRoZSBzeXN0ZW0gZXhwZWN0cyBpdCB0byBiZSBhIDMyYml0IGJpdCBmaWVsZCB2YWx1ZQogICAgICAgIHJlZ2FyZGxlc3Mgb2YgaXQgYmVpbmcgcGFzc2VkIGFzIGFuIGludCBvciB1bnNpZ25lZCBsb25nIG9uCiAgICAgICAgdmFyaW91cyBwbGF0Zm9ybXMuICBTZWUgdGhlIHRlcm1pb3MuVElPQ1NXSU5TWiBjb25zdGFudCBhY3Jvc3MKICAgICAgICBwbGF0Zm9ybXMgZm9yIGFuIGV4YW1wbGUgb2YgdGhpcy4KZGlmZiAtLWdpdCBhL01vZHVsZXMvZ2V0cGF0aC5jIGIvTW9kdWxlcy9nZXRwYXRoLmMKaW5kZXggMTFlZWNlNC4uMzU2NGQ3MiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9nZXRwYXRoLmMKKysrIGIvTW9kdWxlcy9nZXRwYXRoLmMKQEAgLTczNSw3ICs3MzUsNyBAQAogICAgIGJ1ZnN6ICs9IHdjc2xlbih6aXBfcGF0aCkgKyAxOwogICAgIGJ1ZnN6ICs9IHdjc2xlbihleGVjX3ByZWZpeCkgKyAxOwogCi0gICAgYnVmID0gKHdjaGFyX3QgKilQeU1lbV9NYWxsb2MoYnVmc3ogKiBzaXplb2Yod2NoYXJfdCkpOworICAgIGJ1ZiA9IFB5TWVtX05ldyh3Y2hhcl90LCBidWZzeik7CiAgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7CiAgICAgICAgIFB5X0ZhdGFsRXJyb3IoCiAgICAgICAgICAgICAiTm90IGVub3VnaCBtZW1vcnkgZm9yIGR5bmFtaWMgUFlUSE9OUEFUSCIpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9pdGVydG9vbHNtb2R1bGUuYyBiL01vZHVsZXMvaXRlcnRvb2xzbW9kdWxlLmMKaW5kZXggMWY0MjAyMi4uYWZmZjdlNCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9pdGVydG9vbHNtb2R1bGUuYworKysgYi9Nb2R1bGVzL2l0ZXJ0b29sc21vZHVsZS5jCkBAIC0zODc0LDcgKzM4NzQsNyBAQAogCiBmYXN0X21vZGU6ICB3aGVuIGNudCBhbiBpbnRlZ2VyIDwgUFlfU1NJWkVfVF9NQVggYW5kIG5vIHN0ZXAgaXMgc3BlY2lmaWVkLgogCi0gICAgYXNzZXJ0KGNudCAhPSBQWV9TU0laRV9UX01BWCAmJiBsb25nX2NudCA9PSBOVUxMICYmIGxvbmdfc3RlcD09UHlJbnQoMSkpOworICAgIGFzc2VydChjbnQgIT0gUFlfU1NJWkVfVF9NQVggJiYgbG9uZ19jbnQgPT0gTlVMTCAmJiBsb25nX3N0ZXA9PVB5TG9uZygxKSk7CiAgICAgQWR2YW5jZXMgd2l0aDogIGNudCArPSAxCiAgICAgV2hlbiBjb3VudCBoaXRzIFlfU1NJWkVfVF9NQVgsIHN3aXRjaCB0byBzbG93X21vZGUuCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvbWFpbi5jIGIvTW9kdWxlcy9tYWluLmMKaW5kZXggYzQ4ODNjOS4uNzRlNTEyYiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9tYWluLmMKKysrIGIvTW9kdWxlcy9tYWluLmMKQEAgLTUyMCwxNiArNTIwLDE2IEBACiAjaWZkZWYgTVNfV0lORE9XUwogICAgIGlmICghUHlfSWdub3JlRW52aXJvbm1lbnRGbGFnICYmICh3cCA9IF93Z2V0ZW52KEwiUFlUSE9OV0FSTklOR1MiKSkgJiYKICAgICAgICAgKndwICE9IEwnXDAnKSB7Ci0gICAgICAgIHdjaGFyX3QgKmJ1ZiwgKndhcm5pbmc7CisgICAgICAgIHdjaGFyX3QgKmJ1ZiwgKndhcm5pbmcsICpjb250ZXh0ID0gTlVMTDsKIAogICAgICAgICBidWYgPSAod2NoYXJfdCAqKVB5TWVtX1Jhd01hbGxvYygod2NzbGVuKHdwKSArIDEpICogc2l6ZW9mKHdjaGFyX3QpKTsKICAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMKQogICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICJub3QgZW5vdWdoIG1lbW9yeSB0byBjb3B5IFBZVEhPTldBUk5JTkdTIik7CiAgICAgICAgIHdjc2NweShidWYsIHdwKTsKLSAgICAgICAgZm9yICh3YXJuaW5nID0gd2NzdG9rKGJ1ZiwgTCIsIik7CisgICAgICAgIGZvciAod2FybmluZyA9IHdjc3Rva19zKGJ1ZiwgTCIsIiwgJmNvbnRleHQpOwogICAgICAgICAgICAgIHdhcm5pbmcgIT0gTlVMTDsKLSAgICAgICAgICAgICB3YXJuaW5nID0gd2NzdG9rKE5VTEwsIEwiLCIpKSB7CisgICAgICAgICAgICAgd2FybmluZyA9IHdjc3Rva19zKE5VTEwsIEwiLCIsICZjb250ZXh0KSkgewogICAgICAgICAgICAgUHlTeXNfQWRkV2Fybk9wdGlvbih3YXJuaW5nKTsKICAgICAgICAgfQogICAgICAgICBQeU1lbV9SYXdGcmVlKGJ1Zik7CkBAIC03NTIsOSArNzUyLDggQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogWFhYOiBkb2VzIHRoaXMgd29yayBvbiBXaW4vV2luNjQ/IChzZWUgcG9zaXhfZnN0YXQpICovCi0gICAgICAgICAgICAgICAgc3RydWN0IHN0YXQgc2I7Ci0gICAgICAgICAgICAgICAgaWYgKGZzdGF0KGZpbGVubyhmcCksICZzYikgPT0gMCAmJgorICAgICAgICAgICAgICAgIHN0cnVjdCBfUHlfc3RhdF9zdHJ1Y3Qgc2I7CisgICAgICAgICAgICAgICAgaWYgKF9QeV9mc3RhdChmaWxlbm8oZnApLCAmc2IpID09IDAgJiYKICAgICAgICAgICAgICAgICAgICAgU19JU0RJUihzYi5zdF9tb2RlKSkgewogICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVsczogJyVscycgaXMgYSBkaXJlY3RvcnksIGNhbm5vdCBjb250aW51ZVxuIiwgYXJndlswXSwgZmlsZW5hbWUpOwogICAgICAgICAgICAgICAgICAgICBmY2xvc2UoZnApOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9tbWFwbW9kdWxlLmMgYi9Nb2R1bGVzL21tYXBtb2R1bGUuYwppbmRleCAxMzcxNDI0Li5hYzEzNGI4IDEwMDY0NAotLS0gYS9Nb2R1bGVzL21tYXBtb2R1bGUuYworKysgYi9Nb2R1bGVzL21tYXBtb2R1bGUuYwpAQCAtNDU5LDggKzQ1OSw4IEBACiAKICNpZmRlZiBVTklYCiAgICAgewotICAgICAgICBzdHJ1Y3Qgc3RhdCBidWY7Ci0gICAgICAgIGlmICgtMSA9PSBmc3RhdChzZWxmLT5mZCwgJmJ1ZikpIHsKKyAgICAgICAgc3RydWN0IF9QeV9zdGF0X3N0cnVjdCBidWY7CisgICAgICAgIGlmICgtMSA9PSBfUHlfZnN0YXQoc2VsZi0+ZmQsICZidWYpKSB7CiAgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfT1NFcnJvcik7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQpAQCAtMTEwNyw3ICsxMTA3LDcgQEAKIG5ld19tbWFwX29iamVjdChQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkaWN0KQogewogI2lmZGVmIEhBVkVfRlNUQVQKLSAgICBzdHJ1Y3Qgc3RhdCBzdDsKKyAgICBzdHJ1Y3QgX1B5X3N0YXRfc3RydWN0IHN0OwogI2VuZGlmCiAgICAgbW1hcF9vYmplY3QgKm1fb2JqOwogICAgIFB5T2JqZWN0ICptYXBfc2l6ZV9vYmogPSBOVUxMOwpAQCAtMTE3NCw3ICsxMTc0LDcgQEAKICAgICAgICAgKHZvaWQpZmNudGwoZmQsIEZfRlVMTEZTWU5DKTsKICNlbmRpZgogI2lmZGVmIEhBVkVfRlNUQVQKLSAgICBpZiAoZmQgIT0gLTEgJiYgZnN0YXQoZmQsICZzdCkgPT0gMCAmJiBTX0lTUkVHKHN0LnN0X21vZGUpKSB7CisgICAgaWYgKGZkICE9IC0xICYmIF9QeV9mc3RhdChmZCwgJnN0KSA9PSAwICYmIFNfSVNSRUcoc3Quc3RfbW9kZSkpIHsKICAgICAgICAgaWYgKG1hcF9zaXplID09IDApIHsKICAgICAgICAgICAgIGlmIChzdC5zdF9zaXplID09IDApIHsKICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKZGlmZiAtLWdpdCBhL01vZHVsZXMvcG9zaXhtb2R1bGUuYyBiL01vZHVsZXMvcG9zaXhtb2R1bGUuYwppbmRleCAxMThhMzgwLi5lNDdiZDg0IDEwMDY0NAotLS0gYS9Nb2R1bGVzL3Bvc2l4bW9kdWxlLmMKKysrIGIvTW9kdWxlcy9wb3NpeG1vZHVsZS5jCkBAIC0yNSw2ICsyNSw3IEBACiAjZGVmaW5lIFBZX1NTSVpFX1RfQ0xFQU4KIAogI2luY2x1ZGUgIlB5dGhvbi5oIgorI2luY2x1ZGUgInN0cnVjdG1lbWJlci5oIgogI2lmbmRlZiBNU19XSU5ET1dTCiAjaW5jbHVkZSAicG9zaXhtb2R1bGUuaCIKICNlbHNlCkBAIC0zNTAsOCArMzUxLDggQEAKICNpZmRlZiBNU19XSU5ET1dTCiAjICAgICAgIGRlZmluZSBTVEFUIHdpbjMyX3N0YXQKICMgICAgICAgZGVmaW5lIExTVEFUIHdpbjMyX2xzdGF0Ci0jICAgICAgIGRlZmluZSBGU1RBVCB3aW4zMl9mc3RhdAotIyAgICAgICBkZWZpbmUgU1RSVUNUX1NUQVQgc3RydWN0IHdpbjMyX3N0YXQKKyMgICAgICAgZGVmaW5lIEZTVEFUIF9QeV9mc3RhdAorIyAgICAgICBkZWZpbmUgU1RSVUNUX1NUQVQgc3RydWN0IF9QeV9zdGF0X3N0cnVjdAogI2Vsc2UKICMgICAgICAgZGVmaW5lIFNUQVQgc3RhdAogIyAgICAgICBkZWZpbmUgTFNUQVQgbHN0YXQKQEAgLTM3Miw2ICszNzMsMjAgQEAKIAogI2RlZmluZSBEV09SRF9NQVggNDI5NDk2NzI5NVUKIAorI2lmZGVmIE1TX1dJTkRPV1MKKyNkZWZpbmUgSU5JVEZVTkMgUHlJbml0X250CisjZGVmaW5lIE1PRE5BTUUgIm50IgorI2Vsc2UKKyNkZWZpbmUgSU5JVEZVTkMgUHlJbml0X3Bvc2l4CisjZGVmaW5lIE1PRE5BTUUgInBvc2l4IgorI2VuZGlmCisKKyNpZmRlZiBNU19XSU5ET1dTCisvKiBkZWZpbmVkIGluIGZpbGV1dGlscy5jICovCitQeUFQSV9GVU5DKHZvaWQpIF9QeV90aW1lX3RfdG9fRklMRV9USU1FKHRpbWVfdCwgaW50LCBGSUxFVElNRSAqKTsKK1B5QVBJX0ZVTkModm9pZCkgX1B5X2F0dHJpYnV0ZV9kYXRhX3RvX3N0YXQoQllfSEFORExFX0ZJTEVfSU5GT1JNQVRJT04gKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUxPTkcsIHN0cnVjdCBfUHlfc3RhdF9zdHJ1Y3QgKik7CisjZW5kaWYKIAogI2lmZGVmIE1TX1dJTkRPV1MKIHN0YXRpYyBpbnQKQEAgLTEwNDUsOTkgKzEwNjAsMTYgQEAKIH0KIAogCi0jaWYgZGVmaW5lZCBfTVNDX1ZFUiAmJiBfTVNDX1ZFUiA+PSAxNDAwCi0vKiBNaWNyb3NvZnQgQ1JUIGluIFZTMjAwNSBhbmQgaGlnaGVyIHdpbGwgdmVyaWZ5IHRoYXQgYSBmaWxlaGFuZGxlIGlzCi0gKiB2YWxpZCBhbmQgcmFpc2UgYW4gYXNzZXJ0aW9uIGlmIGl0IGlzbid0LgotICogTm9ybWFsbHksIGFuIGludmFsaWQgZmQgaXMgbGlrZWx5IHRvIGJlIGEgQyBwcm9ncmFtIGVycm9yIGFuZCB0aGVyZWZvcmUKLSAqIGFuIGFzc2VydGlvbiBjYW4gYmUgdXNlZnVsLCBidXQgaXQgZG9lcyBjb250cmFkaWN0IHRoZSBQT1NJWCBzdGFuZGFyZAotICogd2hpY2ggZm9yIHdyaXRlKDIpIHN0YXRlczoKLSAqICAgICJPdGhlcndpc2UsIC0xIHNoYWxsIGJlIHJldHVybmVkIGFuZCBlcnJubyBzZXQgdG8gaW5kaWNhdGUgdGhlIGVycm9yLiIKLSAqICAgICJbRUJBREZdIFRoZSBmaWxkZXMgYXJndW1lbnQgaXMgbm90IGEgdmFsaWQgZmlsZSBkZXNjcmlwdG9yIG9wZW4gZm9yCi0gKiAgICAgd3JpdGluZy4iCi0gKiBGdXJ0aGVybW9yZSwgcHl0aG9uIGFsbG93cyB0aGUgdXNlciB0byBlbnRlciBhbnkgb2xkIGludGVnZXIKLSAqIGFzIGEgZmQgYW5kIHNob3VsZCBtZXJlbHkgcmFpc2UgYSBweXRob24gZXhjZXB0aW9uIG9uIGVycm9yLgotICogVGhlIE1pY3Jvc29mdCBDUlQgZG9lc24ndCBwcm92aWRlIGFuIG9mZmljaWFsIHdheSB0byBjaGVjayBmb3IgdGhlCi0gKiB2YWxpZGl0eSBvZiBhIGZpbGUgZGVzY3JpcHRvciwgYnV0IHdlIGNhbiBlbXVsYXRlIGl0cyBpbnRlcm5hbCBiZWhhdmlvdXIKLSAqIGJ5IHVzaW5nIHRoZSBleHBvcnRlZCBfX3BpbmZvIGRhdGEgbWVtYmVyIGFuZCBrbm93bGVkZ2Ugb2YgdGhlCi0gKiBpbnRlcm5hbCBzdHJ1Y3R1cmVzIGludm9sdmVkLgotICogVGhlIHN0cnVjdHVyZXMgYmVsb3cgbXVzdCBiZSB1cGRhdGVkIGZvciBlYWNoIHZlcnNpb24gb2YgdmlzdWFsIHN0dWRpbwotICogYWNjb3JkaW5nIHRvIHRoZSBmaWxlIGludGVybmFsLmggaW4gdGhlIENSVCBzb3VyY2UsIHVudGlsIE1TIGNvbWVzCi0gKiB1cCB3aXRoIGEgbGVzcyBoYWNreSB3YXkgdG8gZG8gdGhpcy4KLSAqIChhbGwgb2YgdGhpcyBpcyB0byBhdm9pZCBnbG9iYWxseSBtb2RpZnlpbmcgdGhlIENSVCBiZWhhdmlvdXIgdXNpbmcKLSAqIF9zZXRfaW52YWxpZF9wYXJhbWV0ZXJfaGFuZGxlcigpIGFuZCBfQ3J0U2V0UmVwb3J0TW9kZSgpKQorI2lmIGRlZmluZWQgX01TQ19WRVIgJiYgX01TQ19WRVIgPj0gMTQwMCAmJiBfTVNDX1ZFUiA8IDE5MDAKKy8qIExlZ2FjeSBpbXBsZW1lbnRhdGlvbiBvZiBfUHlWZXJpZnlfZmRfZHVwMiB3aGlsZSB0cmFuc2l0aW9uaW5nIHRvCisgKiBNU1ZDIDE0LjAuIFRoaXMgc2hvdWxkIGV2ZW50dWFsbHkgYmUgcmVtb3ZlZC4gKGlzc3VlMjM1MjQpCiAgKi8KLS8qIFRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGlzIGRldGVybWluZWQgYXQgcnVudGltZS4KLSAqIE9ubHkgdGhlIGZpcnN0IGl0ZW1zIG11c3QgYmUgcHJlc2VudC4KLSAqLwotCi0jaWYgX01TQ19WRVIgPj0gMTkwMAotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgQ1JJVElDQUxfU0VDVElPTiBsb2NrOwotICAgIGludHB0cl90IG9zZmhuZDsKLSAgICBfX2ludDY0IHN0YXJ0cG9zOwotICAgIGNoYXIgb3NmaWxlOwotfSBteV9pb2luZm87Ci0KLSNkZWZpbmUgSU9JTkZPX0wyRSA2Ci0jZGVmaW5lIElPSU5GT19BUlJBWVMgMTI4Ci0KLSNlbHNlCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBpbnRwdHJfdCBvc2ZobmQ7Ci0gICAgY2hhciBvc2ZpbGU7Ci19IG15X2lvaW5mbzsKLQogI2RlZmluZSBJT0lORk9fTDJFIDUKICNkZWZpbmUgSU9JTkZPX0FSUkFZUyA2NAotCi0jZW5kaWYKLQotZXh0ZXJuIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBjaGFyICogX19waW9pbmZvW107CiAjZGVmaW5lIElPSU5GT19BUlJBWV9FTFRTICAgKDEgPDwgSU9JTkZPX0wyRSkKICNkZWZpbmUgX05IQU5ETEVfICAgICAgICAgICAoSU9JTkZPX0FSUkFZUyAqIElPSU5GT19BUlJBWV9FTFRTKQotI2RlZmluZSBGT1BFTiAweDAxCiAjZGVmaW5lIF9OT19DT05TT0xFX0ZJTEVOTyAoaW50cHRyX3QpLTIKIAotLyogVGhpcyBmdW5jdGlvbiBlbXVsYXRlcyB3aGF0IHRoZSB3aW5kb3dzIENSVCBkb2VzIHRvIHZhbGlkYXRlIGZpbGUgaGFuZGxlcyAqLwotaW50Ci1fUHlWZXJpZnlfZmQoaW50IGZkKQotewotICAgIGNvbnN0IGludCBpMSA9IGZkID4+IElPSU5GT19MMkU7Ci0gICAgY29uc3QgaW50IGkyID0gZmQgJiAoKDEgPDwgSU9JTkZPX0wyRSkgLSAxKTsKLQotICAgIHN0YXRpYyBzaXplX3Qgc2l6ZW9mX2lvaW5mbyA9IDA7Ci0KLSAgICAvKiBEZXRlcm1pbmUgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBpb2luZm8gc3RydWN0dXJlLAotICAgICAqIGFzIHVzZWQgYnkgdGhlIENSVCBsb2FkZWQgaW4gbWVtb3J5Ci0gICAgICovCi0gICAgaWYgKHNpemVvZl9pb2luZm8gPT0gMCAmJiBfX3Bpb2luZm9bMF0gIT0gTlVMTCkgewotICAgICAgICBzaXplb2ZfaW9pbmZvID0gX21zaXplKF9fcGlvaW5mb1swXSkgLyBJT0lORk9fQVJSQVlfRUxUUzsKLSAgICB9Ci0gICAgaWYgKHNpemVvZl9pb2luZm8gPT0gMCkgewotICAgICAgICAvKiBUaGlzIHNob3VsZCBub3QgaGFwcGVuLi4uICovCi0gICAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0KLSAgICAvKiBTZWUgdGhhdCBpdCBpc24ndCBhIHNwZWNpYWwgQ0xFQVIgZmlsZW5vICovCi0gICAgaWYgKGZkICE9IF9OT19DT05TT0xFX0ZJTEVOTykgewotICAgICAgICAvKiBNaWNyb3NvZnQgQ1JUIHdvdWxkIGNoZWNrIHRoYXQgMDw9ZmQ8X25oYW5kbGUgYnV0IHdlIGNhbid0IGRvIHRoYXQuICBJbnN0ZWFkCi0gICAgICAgICAqIHdlIGNoZWNrIHBvaW50ZXIgdmFsaWRpdHkgYW5kIG90aGVyIGluZm8KLSAgICAgICAgICovCi0gICAgICAgIGlmICgwIDw9IGkxICYmIGkxIDwgSU9JTkZPX0FSUkFZUyAmJiBfX3Bpb2luZm9baTFdICE9IE5VTEwpIHsKLSAgICAgICAgICAgIC8qIGZpbmFsbHksIGNoZWNrIHRoYXQgdGhlIGZpbGUgaXMgb3BlbiAqLwotICAgICAgICAgICAgbXlfaW9pbmZvKiBpbmZvID0gKG15X2lvaW5mbyopKF9fcGlvaW5mb1tpMV0gKyBpMiAqIHNpemVvZl9pb2luZm8pOwotICAgICAgICAgICAgaWYgKGluZm8tPm9zZmlsZSAmIEZPUEVOKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gIGZhaWw6Ci0gICAgZXJybm8gPSBFQkFERjsKLSAgICByZXR1cm4gMDsKLX0KLQogLyogdGhlIHNwZWNpYWwgY2FzZSBvZiBjaGVja2luZyBkdXAyLiAgVGhlIHRhcmdldCBmZCBtdXN0IGJlIGluIGEgc2Vuc2libGUgcmFuZ2UgKi8KIHN0YXRpYyBpbnQKIF9QeVZlcmlmeV9mZF9kdXAyKGludCBmZDEsIGludCBmZDIpCkBAIC0xMTUyLDggKzEwODQsNyBAQAogICAgICAgICByZXR1cm4gMDsKIH0KICNlbHNlCi0vKiBkdW1teSB2ZXJzaW9uLiBfUHlWZXJpZnlfZmQoKSBpcyBhbHJlYWR5IGRlZmluZWQgaW4gZmlsZW9iamVjdC5oICovCi0jZGVmaW5lIF9QeVZlcmlmeV9mZF9kdXAyKEEsIEIpICgxKQorI2RlZmluZSBfUHlWZXJpZnlfZmRfZHVwMihmZDEsIGZkMikgKF9QeVZlcmlmeV9mZChmZDEpICYmIChmZDIpID49IDApCiAjZW5kaWYKIAogI2lmZGVmIE1TX1dJTkRPV1MKQEAgLTE0NTEsOTEgKzEzODIsNiBAQAogI2RlZmluZSBIQVZFX1NUQVRfTlNFQyAxCiAjZGVmaW5lIEhBVkVfU1RSVUNUX1NUQVRfU1RfRklMRV9BVFRSSUJVVEVTIDEKIAotc3RydWN0IHdpbjMyX3N0YXR7Ci0gICAgdW5zaWduZWQgbG9uZyBzdF9kZXY7Ci0gICAgX19pbnQ2NCBzdF9pbm87Ci0gICAgdW5zaWduZWQgc2hvcnQgc3RfbW9kZTsKLSAgICBpbnQgc3Rfbmxpbms7Ci0gICAgaW50IHN0X3VpZDsKLSAgICBpbnQgc3RfZ2lkOwotICAgIHVuc2lnbmVkIGxvbmcgc3RfcmRldjsKLSAgICBfX2ludDY0IHN0X3NpemU7Ci0gICAgdGltZV90IHN0X2F0aW1lOwotICAgIGludCBzdF9hdGltZV9uc2VjOwotICAgIHRpbWVfdCBzdF9tdGltZTsKLSAgICBpbnQgc3RfbXRpbWVfbnNlYzsKLSAgICB0aW1lX3Qgc3RfY3RpbWU7Ci0gICAgaW50IHN0X2N0aW1lX25zZWM7Ci0gICAgdW5zaWduZWQgbG9uZyBzdF9maWxlX2F0dHJpYnV0ZXM7Ci19OwotCi1zdGF0aWMgX19pbnQ2NCBzZWNzX2JldHdlZW5fZXBvY2hzID0gMTE2NDQ0NzM2MDA7IC8qIFNlY29uZHMgYmV0d2VlbiAxLjEuMTYwMSBhbmQgMS4xLjE5NzAgKi8KLQotc3RhdGljIHZvaWQKLUZJTEVfVElNRV90b190aW1lX3RfbnNlYyhGSUxFVElNRSAqaW5fcHRyLCB0aW1lX3QgKnRpbWVfb3V0LCBpbnQqIG5zZWNfb3V0KQotewotICAgIC8qIFhYWCBlbmRpYW5uZXNzLiBTaG91bGRuJ3QgbWF0dGVyLCBhcyBhbGwgV2luZG93cyBpbXBsZW1lbnRhdGlvbnMgYXJlIGxpdHRsZS1lbmRpYW4gKi8KLSAgICAvKiBDYW5ub3Qgc2ltcGx5IGNhc3QgYW5kIGRlcmVmZXJlbmNlIGluX3B0ciwKLSAgICAgICBzaW5jZSBpdCBtaWdodCBub3QgYmUgYWxpZ25lZCBwcm9wZXJseSAqLwotICAgIF9faW50NjQgaW47Ci0gICAgbWVtY3B5KCZpbiwgaW5fcHRyLCBzaXplb2YoaW4pKTsKLSAgICAqbnNlY19vdXQgPSAoaW50KShpbiAlIDEwMDAwMDAwKSAqIDEwMDsgLyogRklMRVRJTUUgaXMgaW4gdW5pdHMgb2YgMTAwIG5zZWMuICovCi0gICAgKnRpbWVfb3V0ID0gUHlfU0FGRV9ET1dOQ0FTVCgoaW4gLyAxMDAwMDAwMCkgLSBzZWNzX2JldHdlZW5fZXBvY2hzLCBfX2ludDY0LCB0aW1lX3QpOwotfQotCi1zdGF0aWMgdm9pZAotdGltZV90X3RvX0ZJTEVfVElNRSh0aW1lX3QgdGltZV9pbiwgaW50IG5zZWNfaW4sIEZJTEVUSU1FICpvdXRfcHRyKQotewotICAgIC8qIFhYWCBlbmRpYW5uZXNzICovCi0gICAgX19pbnQ2NCBvdXQ7Ci0gICAgb3V0ID0gdGltZV9pbiArIHNlY3NfYmV0d2Vlbl9lcG9jaHM7Ci0gICAgb3V0ID0gb3V0ICogMTAwMDAwMDAgKyBuc2VjX2luIC8gMTAwOwotICAgIG1lbWNweShvdXRfcHRyLCAmb3V0LCBzaXplb2Yob3V0KSk7Ci19Ci0KLS8qIEJlbG93LCB3ZSAqa25vdyogdGhhdCB1Z28rciBpcyAwNDQ0ICovCi0jaWYgX1NfSVJFQUQgIT0gMDQwMAotI2Vycm9yIFVuc3VwcG9ydGVkIEMgbGlicmFyeQotI2VuZGlmCi1zdGF0aWMgaW50Ci1hdHRyaWJ1dGVzX3RvX21vZGUoRFdPUkQgYXR0cikKLXsKLSAgICBpbnQgbSA9IDA7Ci0gICAgaWYgKGF0dHIgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpCi0gICAgICAgIG0gfD0gX1NfSUZESVIgfCAwMTExOyAvKiBJRkVYRUMgZm9yIHVzZXIsZ3JvdXAsb3RoZXIgKi8KLSAgICBlbHNlCi0gICAgICAgIG0gfD0gX1NfSUZSRUc7Ci0gICAgaWYgKGF0dHIgJiBGSUxFX0FUVFJJQlVURV9SRUFET05MWSkKLSAgICAgICAgbSB8PSAwNDQ0OwotICAgIGVsc2UKLSAgICAgICAgbSB8PSAwNjY2OwotICAgIHJldHVybiBtOwotfQotCi1zdGF0aWMgaW50Ci1hdHRyaWJ1dGVfZGF0YV90b19zdGF0KEJZX0hBTkRMRV9GSUxFX0lORk9STUFUSU9OICppbmZvLCBVTE9ORyByZXBhcnNlX3RhZywgc3RydWN0IHdpbjMyX3N0YXQgKnJlc3VsdCkKLXsKLSAgICBtZW1zZXQocmVzdWx0LCAwLCBzaXplb2YoKnJlc3VsdCkpOwotICAgIHJlc3VsdC0+c3RfbW9kZSA9IGF0dHJpYnV0ZXNfdG9fbW9kZShpbmZvLT5kd0ZpbGVBdHRyaWJ1dGVzKTsKLSAgICByZXN1bHQtPnN0X3NpemUgPSAoKChfX2ludDY0KWluZm8tPm5GaWxlU2l6ZUhpZ2gpPDwzMikgKyBpbmZvLT5uRmlsZVNpemVMb3c7Ci0gICAgcmVzdWx0LT5zdF9kZXYgPSBpbmZvLT5kd1ZvbHVtZVNlcmlhbE51bWJlcjsKLSAgICByZXN1bHQtPnN0X3JkZXYgPSByZXN1bHQtPnN0X2RldjsKLSAgICBGSUxFX1RJTUVfdG9fdGltZV90X25zZWMoJmluZm8tPmZ0Q3JlYXRpb25UaW1lLCAmcmVzdWx0LT5zdF9jdGltZSwgJnJlc3VsdC0+c3RfY3RpbWVfbnNlYyk7Ci0gICAgRklMRV9USU1FX3RvX3RpbWVfdF9uc2VjKCZpbmZvLT5mdExhc3RXcml0ZVRpbWUsICZyZXN1bHQtPnN0X210aW1lLCAmcmVzdWx0LT5zdF9tdGltZV9uc2VjKTsKLSAgICBGSUxFX1RJTUVfdG9fdGltZV90X25zZWMoJmluZm8tPmZ0TGFzdEFjY2Vzc1RpbWUsICZyZXN1bHQtPnN0X2F0aW1lLCAmcmVzdWx0LT5zdF9hdGltZV9uc2VjKTsKLSAgICByZXN1bHQtPnN0X25saW5rID0gaW5mby0+bk51bWJlck9mTGlua3M7Ci0gICAgcmVzdWx0LT5zdF9pbm8gPSAoKChfX2ludDY0KWluZm8tPm5GaWxlSW5kZXhIaWdoKTw8MzIpICsgaW5mby0+bkZpbGVJbmRleExvdzsKLSAgICBpZiAocmVwYXJzZV90YWcgPT0gSU9fUkVQQVJTRV9UQUdfU1lNTElOSykgewotICAgICAgICAvKiBmaXJzdCBjbGVhciB0aGUgU19JRk1UIGJpdHMgKi8KLSAgICAgICAgcmVzdWx0LT5zdF9tb2RlIF49IChyZXN1bHQtPnN0X21vZGUgJiBTX0lGTVQpOwotICAgICAgICAvKiBub3cgc2V0IHRoZSBiaXRzIHRoYXQgbWFrZSB0aGlzIGEgc3ltbGluayAqLwotICAgICAgICByZXN1bHQtPnN0X21vZGUgfD0gU19JRkxOSzsKLSAgICB9Ci0gICAgcmVzdWx0LT5zdF9maWxlX2F0dHJpYnV0ZXMgPSBpbmZvLT5kd0ZpbGVBdHRyaWJ1dGVzOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBCT09MCiBhdHRyaWJ1dGVzX2Zyb21fZGlyKExQQ1NUUiBwc3pGaWxlLCBCWV9IQU5ETEVfRklMRV9JTkZPUk1BVElPTiAqaW5mbywgVUxPTkcgKnJlcGFyc2VfdGFnKQogewpAQCAtMTU1OSw2ICsxNDA1LDI1IEBACiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKK3N0YXRpYyB2b2lkCitmaW5kX2RhdGFfdG9fZmlsZV9pbmZvX3coV0lOMzJfRklORF9EQVRBVyAqcEZpbGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIEJZX0hBTkRMRV9GSUxFX0lORk9STUFUSU9OICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgIFVMT05HICpyZXBhcnNlX3RhZykKK3sKKyAgICBtZW1zZXQoaW5mbywgMCwgc2l6ZW9mKCppbmZvKSk7CisgICAgaW5mby0+ZHdGaWxlQXR0cmlidXRlcyA9IHBGaWxlRGF0YS0+ZHdGaWxlQXR0cmlidXRlczsKKyAgICBpbmZvLT5mdENyZWF0aW9uVGltZSAgID0gcEZpbGVEYXRhLT5mdENyZWF0aW9uVGltZTsKKyAgICBpbmZvLT5mdExhc3RBY2Nlc3NUaW1lID0gcEZpbGVEYXRhLT5mdExhc3RBY2Nlc3NUaW1lOworICAgIGluZm8tPmZ0TGFzdFdyaXRlVGltZSAgPSBwRmlsZURhdGEtPmZ0TGFzdFdyaXRlVGltZTsKKyAgICBpbmZvLT5uRmlsZVNpemVIaWdoICAgID0gcEZpbGVEYXRhLT5uRmlsZVNpemVIaWdoOworICAgIGluZm8tPm5GaWxlU2l6ZUxvdyAgICAgPSBwRmlsZURhdGEtPm5GaWxlU2l6ZUxvdzsKKy8qICBpbmZvLT5uTnVtYmVyT2ZMaW5rcyAgID0gMTsgKi8KKyAgICBpZiAocEZpbGVEYXRhLT5kd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfUkVQQVJTRV9QT0lOVCkKKyAgICAgICAgKnJlcGFyc2VfdGFnID0gcEZpbGVEYXRhLT5kd1Jlc2VydmVkMDsKKyAgICBlbHNlCisgICAgICAgICpyZXBhcnNlX3RhZyA9IDA7Cit9CisKIHN0YXRpYyBCT09MCiBhdHRyaWJ1dGVzX2Zyb21fZGlyX3coTFBDV1NUUiBwc3pGaWxlLCBCWV9IQU5ETEVfRklMRV9JTkZPUk1BVElPTiAqaW5mbywgVUxPTkcgKnJlcGFyc2VfdGFnKQogewpAQCAtMTU2OCwxNyArMTQzMyw3IEBACiAgICAgaWYgKGhGaW5kRmlsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIEZpbmRDbG9zZShoRmluZEZpbGUpOwotICAgIG1lbXNldChpbmZvLCAwLCBzaXplb2YoKmluZm8pKTsKLSAgICAqcmVwYXJzZV90YWcgPSAwOwotICAgIGluZm8tPmR3RmlsZUF0dHJpYnV0ZXMgPSBGaWxlRGF0YS5kd0ZpbGVBdHRyaWJ1dGVzOwotICAgIGluZm8tPmZ0Q3JlYXRpb25UaW1lICAgPSBGaWxlRGF0YS5mdENyZWF0aW9uVGltZTsKLSAgICBpbmZvLT5mdExhc3RBY2Nlc3NUaW1lID0gRmlsZURhdGEuZnRMYXN0QWNjZXNzVGltZTsKLSAgICBpbmZvLT5mdExhc3RXcml0ZVRpbWUgID0gRmlsZURhdGEuZnRMYXN0V3JpdGVUaW1lOwotICAgIGluZm8tPm5GaWxlU2l6ZUhpZ2ggICAgPSBGaWxlRGF0YS5uRmlsZVNpemVIaWdoOwotICAgIGluZm8tPm5GaWxlU2l6ZUxvdyAgICAgPSBGaWxlRGF0YS5uRmlsZVNpemVMb3c7Ci0vKiAgaW5mby0+bk51bWJlck9mTGlua3MgICA9IDE7ICovCi0gICAgaWYgKEZpbGVEYXRhLmR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9SRVBBUlNFX1BPSU5UKQotICAgICAgICAqcmVwYXJzZV90YWcgPSBGaWxlRGF0YS5kd1Jlc2VydmVkMDsKKyAgICBmaW5kX2RhdGFfdG9fZmlsZV9pbmZvX3coJkZpbGVEYXRhLCBpbmZvLCByZXBhcnNlX3RhZyk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKQEAgLTE2MjAsNyArMTQ3NSw3IEBACiAgICAgaWYoIWJ1Zl9zaXplKQogICAgICAgICByZXR1cm4gRkFMU0U7CiAKLSAgICBidWYgPSAod2NoYXJfdCAqKVB5TWVtX01hbGxvYygoYnVmX3NpemUrMSkqc2l6ZW9mKHdjaGFyX3QpKTsKKyAgICBidWYgPSBQeU1lbV9OZXcod2NoYXJfdCwgYnVmX3NpemUrMSk7CiAgICAgaWYgKCFidWYpIHsKICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX09VVE9GTUVNT1JZKTsKICAgICAgICAgcmV0dXJuIEZBTFNFOwpAQCAtMTY0NiwxMCArMTUwMSwxMCBAQAogfQogCiBzdGF0aWMgaW50Ci13aW4zMl94c3RhdF9pbXBsX3coY29uc3Qgd2NoYXJfdCAqcGF0aCwgc3RydWN0IHdpbjMyX3N0YXQgKnJlc3VsdCwKK3dpbjMyX3hzdGF0X2ltcGxfdyhjb25zdCB3Y2hhcl90ICpwYXRoLCBzdHJ1Y3QgX1B5X3N0YXRfc3RydWN0ICpyZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgQk9PTCB0cmF2ZXJzZSk7CiBzdGF0aWMgaW50Ci13aW4zMl94c3RhdF9pbXBsKGNvbnN0IGNoYXIgKnBhdGgsIHN0cnVjdCB3aW4zMl9zdGF0ICpyZXN1bHQsCit3aW4zMl94c3RhdF9pbXBsKGNvbnN0IGNoYXIgKnBhdGgsIHN0cnVjdCBfUHlfc3RhdF9zdHJ1Y3QgKnJlc3VsdCwKICAgICAgICAgICAgICAgICAgQk9PTCB0cmF2ZXJzZSkKIHsKICAgICBpbnQgY29kZTsKQEAgLTE3MzIsNyArMTU4Nyw3IEBACiAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgQ2xvc2VIYW5kbGUoaEZpbGUpOwogICAgIH0KLSAgICBhdHRyaWJ1dGVfZGF0YV90b19zdGF0KCZpbmZvLCByZXBhcnNlX3RhZywgcmVzdWx0KTsKKyAgICBfUHlfYXR0cmlidXRlX2RhdGFfdG9fc3RhdCgmaW5mbywgcmVwYXJzZV90YWcsIHJlc3VsdCk7CiAKICAgICAvKiBTZXQgU19JRVhFQyBpZiBpdCBpcyBhbiAuZXhlLCAuYmF0LCAuLi4gKi8KICAgICBkb3QgPSBzdHJyY2hyKHBhdGgsICcuJyk7CkBAIC0xNzQ1LDcgKzE2MDAsNyBAQAogfQogCiBzdGF0aWMgaW50Ci13aW4zMl94c3RhdF9pbXBsX3coY29uc3Qgd2NoYXJfdCAqcGF0aCwgc3RydWN0IHdpbjMyX3N0YXQgKnJlc3VsdCwKK3dpbjMyX3hzdGF0X2ltcGxfdyhjb25zdCB3Y2hhcl90ICpwYXRoLCBzdHJ1Y3QgX1B5X3N0YXRfc3RydWN0ICpyZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgQk9PTCB0cmF2ZXJzZSkKIHsKICAgICBpbnQgY29kZTsKQEAgLTE4MjgsNyArMTY4Myw3IEBACiAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgQ2xvc2VIYW5kbGUoaEZpbGUpOwogICAgIH0KLSAgICBhdHRyaWJ1dGVfZGF0YV90b19zdGF0KCZpbmZvLCByZXBhcnNlX3RhZywgcmVzdWx0KTsKKyAgICBfUHlfYXR0cmlidXRlX2RhdGFfdG9fc3RhdCgmaW5mbywgcmVwYXJzZV90YWcsIHJlc3VsdCk7CiAKICAgICAvKiBTZXQgU19JRVhFQyBpZiBpdCBpcyBhbiAuZXhlLCAuYmF0LCAuLi4gKi8KICAgICBkb3QgPSB3Y3NyY2hyKHBhdGgsICcuJyk7CkBAIC0xODQxLDcgKzE2OTYsNyBAQAogfQogCiBzdGF0aWMgaW50Ci13aW4zMl94c3RhdChjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3Qgd2luMzJfc3RhdCAqcmVzdWx0LCBCT09MIHRyYXZlcnNlKQord2luMzJfeHN0YXQoY29uc3QgY2hhciAqcGF0aCwgc3RydWN0IF9QeV9zdGF0X3N0cnVjdCAqcmVzdWx0LCBCT09MIHRyYXZlcnNlKQogewogICAgIC8qIFByb3RvY29sIHZpb2xhdGlvbjogd2UgZXhwbGljaXRseSBjbGVhciBlcnJubywgaW5zdGVhZCBvZgogICAgICAgIHNldHRpbmcgaXQgdG8gYSBQT1NJWCBlcnJvci4gQ2FsbGVycyBzaG91bGQgdXNlIEdldExhc3RFcnJvci4gKi8KQEAgLTE4NTEsNyArMTcwNiw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLXdpbjMyX3hzdGF0X3coY29uc3Qgd2NoYXJfdCAqcGF0aCwgc3RydWN0IHdpbjMyX3N0YXQgKnJlc3VsdCwgQk9PTCB0cmF2ZXJzZSkKK3dpbjMyX3hzdGF0X3coY29uc3Qgd2NoYXJfdCAqcGF0aCwgc3RydWN0IF9QeV9zdGF0X3N0cnVjdCAqcmVzdWx0LCBCT09MIHRyYXZlcnNlKQogewogICAgIC8qIFByb3RvY29sIHZpb2xhdGlvbjogd2UgZXhwbGljaXRseSBjbGVhciBlcnJubywgaW5zdGVhZCBvZgogICAgICAgIHNldHRpbmcgaXQgdG8gYSBQT1NJWCBlcnJvci4gQ2FsbGVycyBzaG91bGQgdXNlIEdldExhc3RFcnJvci4gKi8KQEAgLTE4NzMsODAgKzE3MjgsMjkgQEAKICAgIFRoZSBfdyByZXByZXNlbnQgVW5pY29kZSBlcXVpdmFsZW50cyBvZiB0aGUgYWZvcmVtZW50aW9uZWQgQU5TSSBmdW5jdGlvbnMuICovCiAKIHN0YXRpYyBpbnQKLXdpbjMyX2xzdGF0KGNvbnN0IGNoYXIqIHBhdGgsIHN0cnVjdCB3aW4zMl9zdGF0ICpyZXN1bHQpCit3aW4zMl9sc3RhdChjb25zdCBjaGFyKiBwYXRoLCBzdHJ1Y3QgX1B5X3N0YXRfc3RydWN0ICpyZXN1bHQpCiB7CiAgICAgcmV0dXJuIHdpbjMyX3hzdGF0KHBhdGgsIHJlc3VsdCwgRkFMU0UpOwogfQogCiBzdGF0aWMgaW50Ci13aW4zMl9sc3RhdF93KGNvbnN0IHdjaGFyX3QqIHBhdGgsIHN0cnVjdCB3aW4zMl9zdGF0ICpyZXN1bHQpCit3aW4zMl9sc3RhdF93KGNvbnN0IHdjaGFyX3QqIHBhdGgsIHN0cnVjdCBfUHlfc3RhdF9zdHJ1Y3QgKnJlc3VsdCkKIHsKICAgICByZXR1cm4gd2luMzJfeHN0YXRfdyhwYXRoLCByZXN1bHQsIEZBTFNFKTsKIH0KIAogc3RhdGljIGludAotd2luMzJfc3RhdChjb25zdCBjaGFyKiBwYXRoLCBzdHJ1Y3Qgd2luMzJfc3RhdCAqcmVzdWx0KQord2luMzJfc3RhdChjb25zdCBjaGFyKiBwYXRoLCBzdHJ1Y3QgX1B5X3N0YXRfc3RydWN0ICpyZXN1bHQpCiB7CiAgICAgcmV0dXJuIHdpbjMyX3hzdGF0KHBhdGgsIHJlc3VsdCwgVFJVRSk7CiB9CiAKIHN0YXRpYyBpbnQKLXdpbjMyX3N0YXRfdyhjb25zdCB3Y2hhcl90KiBwYXRoLCBzdHJ1Y3Qgd2luMzJfc3RhdCAqcmVzdWx0KQord2luMzJfc3RhdF93KGNvbnN0IHdjaGFyX3QqIHBhdGgsIHN0cnVjdCBfUHlfc3RhdF9zdHJ1Y3QgKnJlc3VsdCkKIHsKICAgICByZXR1cm4gd2luMzJfeHN0YXRfdyhwYXRoLCByZXN1bHQsIFRSVUUpOwogfQogCi1zdGF0aWMgaW50Ci13aW4zMl9mc3RhdChpbnQgZmlsZV9udW1iZXIsIHN0cnVjdCB3aW4zMl9zdGF0ICpyZXN1bHQpCi17Ci0gICAgQllfSEFORExFX0ZJTEVfSU5GT1JNQVRJT04gaW5mbzsKLSAgICBIQU5ETEUgaDsKLSAgICBpbnQgdHlwZTsKLQotICAgIGlmICghX1B5VmVyaWZ5X2ZkKGZpbGVfbnVtYmVyKSkKLSAgICAgICAgaCA9IElOVkFMSURfSEFORExFX1ZBTFVFOwotICAgIGVsc2UKLSAgICAgICAgaCA9IChIQU5ETEUpX2dldF9vc2ZoYW5kbGUoZmlsZV9udW1iZXIpOwotCi0gICAgLyogUHJvdG9jb2wgdmlvbGF0aW9uOiB3ZSBleHBsaWNpdGx5IGNsZWFyIGVycm5vLCBpbnN0ZWFkIG9mCi0gICAgICAgc2V0dGluZyBpdCB0byBhIFBPU0lYIGVycm9yLiBDYWxsZXJzIHNob3VsZCB1c2UgR2V0TGFzdEVycm9yLiAqLwotICAgIGVycm5vID0gMDsKLQotICAgIGlmIChoID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7Ci0gICAgICAgIC8qIFRoaXMgaXMgcmVhbGx5IGEgQyBsaWJyYXJ5IGVycm9yIChpbnZhbGlkIGZpbGUgaGFuZGxlKS4KLSAgICAgICAgICAgV2Ugc2V0IHRoZSBXaW4zMiBlcnJvciB0byB0aGUgY2xvc2VzIG9uZSBtYXRjaGluZy4gKi8KLSAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfSEFORExFKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBtZW1zZXQocmVzdWx0LCAwLCBzaXplb2YoKnJlc3VsdCkpOwotCi0gICAgdHlwZSA9IEdldEZpbGVUeXBlKGgpOwotICAgIGlmICh0eXBlID09IEZJTEVfVFlQRV9VTktOT1dOKSB7Ci0gICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7Ci0gICAgICAgIGlmIChlcnJvciAhPSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgLyogZWxzZTogdmFsaWQgYnV0IHVua25vd24gZmlsZSAqLwotICAgIH0KLQotICAgIGlmICh0eXBlICE9IEZJTEVfVFlQRV9ESVNLKSB7Ci0gICAgICAgIGlmICh0eXBlID09IEZJTEVfVFlQRV9DSEFSKQotICAgICAgICAgICAgcmVzdWx0LT5zdF9tb2RlID0gX1NfSUZDSFI7Ci0gICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gRklMRV9UWVBFX1BJUEUpCi0gICAgICAgICAgICByZXN1bHQtPnN0X21vZGUgPSBfU19JRklGTzsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKCFHZXRGaWxlSW5mb3JtYXRpb25CeUhhbmRsZShoLCAmaW5mbykpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGF0dHJpYnV0ZV9kYXRhX3RvX3N0YXQoJmluZm8sIDAsIHJlc3VsdCk7Ci0gICAgLyogc3BlY2lmaWMgdG8gZnN0YXQoKSAqLwotICAgIHJlc3VsdC0+c3RfaW5vID0gKCgoX19pbnQ2NClpbmZvLm5GaWxlSW5kZXhIaWdoKTw8MzIpICsgaW5mby5uRmlsZUluZGV4TG93OwotICAgIHJldHVybiAwOwotfQotCiAjZW5kaWYgLyogTVNfV0lORE9XUyAqLwogCiBQeURvY19TVFJWQVIoc3RhdF9yZXN1bHRfX2RvY19fLApAQCAtNDQ3Miw3ICs0Mjc2LDcgQEAKICAgICAgICAgICAgIGxlbiA9IHdjc2xlbihwYXRoLT53aWRlKTsKICAgICAgICAgfQogICAgICAgICAvKiBUaGUgKzUgaXMgc28gd2UgY2FuIGFwcGVuZCAiXFwqLipcMCIgKi8KLSAgICAgICAgd25hbWVidWYgPSBQeU1lbV9NYWxsb2MoKGxlbiArIDUpICogc2l6ZW9mKHdjaGFyX3QpKTsKKyAgICAgICAgd25hbWVidWYgPSBQeU1lbV9OZXcod2NoYXJfdCwgbGVuICsgNSk7CiAgICAgICAgIGlmICghd25hbWVidWYpIHsKICAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CiAgICAgICAgICAgICBnb3RvIGV4aXQ7CkBAIC00ODA5LDcgKzQ2MTMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0FSUkFZX0xFTkdUSCh3b3V0YnVmKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3V0YnVmLCAmd3RlbXApOwogICAgICAgICBpZiAocmVzdWx0ID4gUHlfQVJSQVlfTEVOR1RIKHdvdXRidWYpKSB7Ci0gICAgICAgICAgICB3b3V0YnVmcCA9IFB5TWVtX01hbGxvYyhyZXN1bHQgKiBzaXplb2Yod2NoYXJfdCkpOworICAgICAgICAgICAgd291dGJ1ZnAgPSBQeU1lbV9OZXcod2NoYXJfdCwgcmVzdWx0KTsKICAgICAgICAgICAgIGlmICghd291dGJ1ZnApCiAgICAgICAgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAgICAgICAgICAgICByZXN1bHQgPSBHZXRGdWxsUGF0aE5hbWVXKHdwYXRoLCByZXN1bHQsIHdvdXRidWZwLCAmd3RlbXApOwpAQCAtNDkyMyw3ICs0NzI3LDcgQEAKICAgICBpZighYnVmX3NpemUpCiAgICAgICAgIHJldHVybiB3aW4zMl9lcnJvcl9vYmplY3QoIkdldEZpbmFsUGF0aE5hbWVCeUhhbmRsZSIsIHBhdGgpOwogCi0gICAgdGFyZ2V0X3BhdGggPSAod2NoYXJfdCAqKVB5TWVtX01hbGxvYygoYnVmX3NpemUrMSkqc2l6ZW9mKHdjaGFyX3QpKTsKKyAgICB0YXJnZXRfcGF0aCA9IFB5TWVtX05ldyh3Y2hhcl90LCBidWZfc2l6ZSsxKTsKICAgICBpZighdGFyZ2V0X3BhdGgpCiAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwogCkBAIC01MDQxLDcgKzQ4NDUsNyBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBtb3VudHBhdGggPSAod2NoYXJfdCAqKVB5TWVtX01hbGxvYyhidWZsZW4gKiBzaXplb2Yod2NoYXJfdCkpOworICAgIG1vdW50cGF0aCA9IFB5TWVtX05ldyh3Y2hhcl90LCBidWZsZW4pOwogICAgIGlmIChtb3VudHBhdGggPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAKQEAgLTY0MzYsOCArNjI0MCw4IEBACiAgICAgICAgIGF0aW1lID0gbXRpbWU7CiAgICAgfQogICAgIGVsc2UgewotICAgICAgICB0aW1lX3RfdG9fRklMRV9USU1FKHV0aW1lLmF0aW1lX3MsIHV0aW1lLmF0aW1lX25zLCAmYXRpbWUpOwotICAgICAgICB0aW1lX3RfdG9fRklMRV9USU1FKHV0aW1lLm10aW1lX3MsIHV0aW1lLm10aW1lX25zLCAmbXRpbWUpOworICAgICAgICBfUHlfdGltZV90X3RvX0ZJTEVfVElNRSh1dGltZS5hdGltZV9zLCB1dGltZS5hdGltZV9ucywgJmF0aW1lKTsKKyAgICAgICAgX1B5X3RpbWVfdF90b19GSUxFX1RJTUUodXRpbWUubXRpbWVfcywgdXRpbWUubXRpbWVfbnMsICZtdGltZSk7CiAgICAgfQogICAgIGlmICghU2V0RmlsZVRpbWUoaEZpbGUsIE5VTEwsICZhdGltZSwgJm10aW1lKSkgewogICAgICAgICAvKiBBdm9pZCBwdXR0aW5nIHRoZSBmaWxlIG5hbWUgaW50byB0aGUgZXJyb3IgaGVyZSwKQEAgLTg0MjEsOSArODIyNSw5IEBACiAjZW5kaWYKIAogI2lmZGVmIF9fQVBQTEVfXwotICAgIGdyb3VwcyA9IFB5TWVtX01hbGxvYyhuZ3JvdXBzICogc2l6ZW9mKGludCkpOworICAgIGdyb3VwcyA9IFB5TWVtX05ldyhpbnQsIG5ncm91cHMpOwogI2Vsc2UKLSAgICBncm91cHMgPSBQeU1lbV9NYWxsb2Mobmdyb3VwcyAqIHNpemVvZihnaWRfdCkpOworICAgIGdyb3VwcyA9IFB5TWVtX05ldyhnaWRfdCwgbmdyb3Vwcyk7CiAjZW5kaWYKICAgICBpZiAoZ3JvdXBzID09IE5VTEwpCiAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwpAQCAtODUyMyw3ICs4MzI3LDcgQEAKICAgICAgICAgLyogZ3JvdXBzIHdpbGwgZml0IGluIGV4aXN0aW5nIGFycmF5ICovCiAgICAgICAgIGFsdF9ncm91cGxpc3QgPSBncm91cGxpc3Q7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgYWx0X2dyb3VwbGlzdCA9IFB5TWVtX01hbGxvYyhuICogc2l6ZW9mKGdpZF90KSk7CisgICAgICAgIGFsdF9ncm91cGxpc3QgPSBQeU1lbV9OZXcoZ2lkX3QsIG4pOwogICAgICAgICBpZiAoYWx0X2dyb3VwbGlzdCA9PSBOVUxMKSB7CiAgICAgICAgICAgICBlcnJubyA9IEVJTlZBTDsKICAgICAgICAgICAgIHJldHVybiBwb3NpeF9lcnJvcigpOwpAQCAtODU0OSw3ICs4MzUzLDcgQEAKICAgICAgICAgICAgICAgICAvKiBBdm9pZCBtYWxsb2MoMCkgKi8KICAgICAgICAgICAgICAgICBhbHRfZ3JvdXBsaXN0ID0gZ3JvdXBsaXN0OwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhbHRfZ3JvdXBsaXN0ID0gUHlNZW1fTWFsbG9jKG4gKiBzaXplb2YoZ2lkX3QpKTsKKyAgICAgICAgICAgICAgICBhbHRfZ3JvdXBsaXN0ID0gUHlNZW1fTmV3KGdpZF90LCBuKTsKICAgICAgICAgICAgICAgICBpZiAoYWx0X2dyb3VwbGlzdCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIGVycm5vID0gRUlOVkFMOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gcG9zaXhfZXJyb3IoKTsKQEAgLTE2NTQ0LDYgKzE2MzQ4LDc4MiBAQAogI2VuZGlmICAgLyogIU1TX1dJTkRPV1MgKi8KIAogCitQeURvY19TVFJWQVIocG9zaXhfc2NhbmRpcl9fZG9jX18sCisic2NhbmRpcihwYXRoPScuJykgLT4gaXRlcmF0b3Igb2YgRGlyRW50cnkgb2JqZWN0cyBmb3IgZ2l2ZW4gcGF0aCIpOworCitzdGF0aWMgY2hhciAqZm9sbG93X3N5bWxpbmtzX2tleXdvcmRzW10gPSB7ImZvbGxvd19zeW1saW5rcyIsIE5VTEx9OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICpuYW1lOworICAgIFB5T2JqZWN0ICpwYXRoOworICAgIFB5T2JqZWN0ICpzdGF0OworICAgIFB5T2JqZWN0ICpsc3RhdDsKKyNpZmRlZiBNU19XSU5ET1dTCisgICAgc3RydWN0IF9QeV9zdGF0X3N0cnVjdCB3aW4zMl9sc3RhdDsKKyAgICBfX2ludDY0IHdpbjMyX2ZpbGVfaW5kZXg7CisgICAgaW50IGdvdF9maWxlX2luZGV4OworI2Vsc2UgLyogUE9TSVggKi8KKyNpZmRlZiBIQVZFX0RJUkVOVF9EX1RZUEUKKyAgICB1bnNpZ25lZCBjaGFyIGRfdHlwZTsKKyNlbmRpZgorICAgIGlub190IGRfaW5vOworI2VuZGlmCit9IERpckVudHJ5OworCitzdGF0aWMgdm9pZAorRGlyRW50cnlfZGVhbGxvYyhEaXJFbnRyeSAqZW50cnkpCit7CisgICAgUHlfWERFQ1JFRihlbnRyeS0+bmFtZSk7CisgICAgUHlfWERFQ1JFRihlbnRyeS0+cGF0aCk7CisgICAgUHlfWERFQ1JFRihlbnRyeS0+c3RhdCk7CisgICAgUHlfWERFQ1JFRihlbnRyeS0+bHN0YXQpOworICAgIFB5X1RZUEUoZW50cnkpLT50cF9mcmVlKChQeU9iamVjdCAqKWVudHJ5KTsKK30KKworLyogRm9yd2FyZCByZWZlcmVuY2UgKi8KK3N0YXRpYyBpbnQKK0RpckVudHJ5X3Rlc3RfbW9kZShEaXJFbnRyeSAqc2VsZiwgaW50IGZvbGxvd19zeW1saW5rcywgdW5zaWduZWQgc2hvcnQgbW9kZV9iaXRzKTsKKworLyogU2V0IGV4Y2VwdGlvbiBhbmQgcmV0dXJuIC0xIG9uIGVycm9yLCAwIGZvciBGYWxzZSwgMSBmb3IgVHJ1ZSAqLworc3RhdGljIGludAorRGlyRW50cnlfaXNfc3ltbGluayhEaXJFbnRyeSAqc2VsZikKK3sKKyNpZmRlZiBNU19XSU5ET1dTCisgICAgcmV0dXJuIChzZWxmLT53aW4zMl9sc3RhdC5zdF9tb2RlICYgU19JRk1UKSA9PSBTX0lGTE5LOworI2VsaWYgZGVmaW5lZChIQVZFX0RJUkVOVF9EX1RZUEUpCisgICAgLyogUE9TSVggKi8KKyAgICBpZiAoc2VsZi0+ZF90eXBlICE9IERUX1VOS05PV04pCisgICAgICAgIHJldHVybiBzZWxmLT5kX3R5cGUgPT0gRFRfTE5LOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIERpckVudHJ5X3Rlc3RfbW9kZShzZWxmLCAwLCBTX0lGTE5LKTsKKyNlbHNlCisgICAgLyogUE9TSVggd2l0aG91dCBkX3R5cGUgKi8KKyAgICByZXR1cm4gRGlyRW50cnlfdGVzdF9tb2RlKHNlbGYsIDAsIFNfSUZMTkspOworI2VuZGlmCit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitEaXJFbnRyeV9weV9pc19zeW1saW5rKERpckVudHJ5ICpzZWxmKQoreworICAgIGludCByZXN1bHQ7CisKKyAgICByZXN1bHQgPSBEaXJFbnRyeV9pc19zeW1saW5rKHNlbGYpOworICAgIGlmIChyZXN1bHQgPT0gLTEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcocmVzdWx0KTsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK0RpckVudHJ5X2ZldGNoX3N0YXQoRGlyRW50cnkgKnNlbGYsIGludCBmb2xsb3dfc3ltbGlua3MpCit7CisgICAgaW50IHJlc3VsdDsKKyAgICBzdHJ1Y3QgX1B5X3N0YXRfc3RydWN0IHN0OworCisjaWZkZWYgTVNfV0lORE9XUworICAgIHdjaGFyX3QgKnBhdGg7CisKKyAgICBwYXRoID0gUHlVbmljb2RlX0FzVW5pY29kZShzZWxmLT5wYXRoKTsKKyAgICBpZiAoIXBhdGgpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKGZvbGxvd19zeW1saW5rcykKKyAgICAgICAgcmVzdWx0ID0gd2luMzJfc3RhdF93KHBhdGgsICZzdCk7CisgICAgZWxzZQorICAgICAgICByZXN1bHQgPSB3aW4zMl9sc3RhdF93KHBhdGgsICZzdCk7CisKKyAgICBpZiAocmVzdWx0ICE9IDApIHsKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEV4Y0Zyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lT2JqZWN0KFB5RXhjX09TRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBzZWxmLT5wYXRoKTsKKyAgICB9CisjZWxzZSAvKiBQT1NJWCAqLworICAgIFB5T2JqZWN0ICpieXRlczsKKyAgICBjaGFyICpwYXRoOworCisgICAgaWYgKCFQeVVuaWNvZGVfRlNDb252ZXJ0ZXIoc2VsZi0+cGF0aCwgJmJ5dGVzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcGF0aCA9IFB5Qnl0ZXNfQVNfU1RSSU5HKGJ5dGVzKTsKKworICAgIGlmIChmb2xsb3dfc3ltbGlua3MpCisgICAgICAgIHJlc3VsdCA9IFNUQVQocGF0aCwgJnN0KTsKKyAgICBlbHNlCisgICAgICAgIHJlc3VsdCA9IExTVEFUKHBhdGgsICZzdCk7CisgICAgUHlfREVDUkVGKGJ5dGVzKTsKKworICAgIGlmIChyZXN1bHQgIT0gMCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZU9iamVjdChQeUV4Y19PU0Vycm9yLCBzZWxmLT5wYXRoKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIF9weXN0YXRfZnJvbXN0cnVjdHN0YXQoJnN0KTsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK0RpckVudHJ5X2dldF9sc3RhdChEaXJFbnRyeSAqc2VsZikKK3sKKyAgICBpZiAoIXNlbGYtPmxzdGF0KSB7CisjaWZkZWYgTVNfV0lORE9XUworICAgICAgICBzZWxmLT5sc3RhdCA9IF9weXN0YXRfZnJvbXN0cnVjdHN0YXQoJnNlbGYtPndpbjMyX2xzdGF0KTsKKyNlbHNlIC8qIFBPU0lYICovCisgICAgICAgIHNlbGYtPmxzdGF0ID0gRGlyRW50cnlfZmV0Y2hfc3RhdChzZWxmLCAwKTsKKyNlbmRpZgorICAgIH0KKyAgICBQeV9YSU5DUkVGKHNlbGYtPmxzdGF0KTsKKyAgICByZXR1cm4gc2VsZi0+bHN0YXQ7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitEaXJFbnRyeV9nZXRfc3RhdChEaXJFbnRyeSAqc2VsZiwgaW50IGZvbGxvd19zeW1saW5rcykKK3sKKyAgICBpZiAoIWZvbGxvd19zeW1saW5rcykKKyAgICAgICAgcmV0dXJuIERpckVudHJ5X2dldF9sc3RhdChzZWxmKTsKKworICAgIGlmICghc2VsZi0+c3RhdCkgeworICAgICAgICBpbnQgcmVzdWx0ID0gRGlyRW50cnlfaXNfc3ltbGluayhzZWxmKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBlbHNlIGlmIChyZXN1bHQpCisgICAgICAgICAgICBzZWxmLT5zdGF0ID0gRGlyRW50cnlfZmV0Y2hfc3RhdChzZWxmLCAxKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2VsZi0+c3RhdCA9IERpckVudHJ5X2dldF9sc3RhdChzZWxmKTsKKyAgICB9CisKKyAgICBQeV9YSU5DUkVGKHNlbGYtPnN0YXQpOworICAgIHJldHVybiBzZWxmLT5zdGF0OworfQorCitzdGF0aWMgUHlPYmplY3QgKgorRGlyRW50cnlfc3RhdChEaXJFbnRyeSAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCit7CisgICAgaW50IGZvbGxvd19zeW1saW5rcyA9IDE7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8JHA6RGlyRW50cnkuc3RhdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93X3N5bWxpbmtzX2tleXdvcmRzLCAmZm9sbG93X3N5bWxpbmtzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gRGlyRW50cnlfZ2V0X3N0YXQoc2VsZiwgZm9sbG93X3N5bWxpbmtzKTsKK30KKworLyogU2V0IGV4Y2VwdGlvbiBhbmQgcmV0dXJuIC0xIG9uIGVycm9yLCAwIGZvciBGYWxzZSwgMSBmb3IgVHJ1ZSAqLworc3RhdGljIGludAorRGlyRW50cnlfdGVzdF9tb2RlKERpckVudHJ5ICpzZWxmLCBpbnQgZm9sbG93X3N5bWxpbmtzLCB1bnNpZ25lZCBzaG9ydCBtb2RlX2JpdHMpCit7CisgICAgUHlPYmplY3QgKnN0YXQgPSBOVUxMOworICAgIFB5T2JqZWN0ICpzdF9tb2RlID0gTlVMTDsKKyAgICBsb25nIG1vZGU7CisgICAgaW50IHJlc3VsdDsKKyNpZiBkZWZpbmVkKE1TX1dJTkRPV1MpIHx8IGRlZmluZWQoSEFWRV9ESVJFTlRfRF9UWVBFKQorICAgIGludCBpc19zeW1saW5rOworICAgIGludCBuZWVkX3N0YXQ7CisjZW5kaWYKKyNpZmRlZiBNU19XSU5ET1dTCisgICAgdW5zaWduZWQgbG9uZyBkaXJfYml0czsKKyNlbmRpZgorICAgIF9QeV9JREVOVElGSUVSKHN0X21vZGUpOworCisjaWZkZWYgTVNfV0lORE9XUworICAgIGlzX3N5bWxpbmsgPSAoc2VsZi0+d2luMzJfbHN0YXQuc3RfbW9kZSAmIFNfSUZNVCkgPT0gU19JRkxOSzsKKyAgICBuZWVkX3N0YXQgPSBmb2xsb3dfc3ltbGlua3MgJiYgaXNfc3ltbGluazsKKyNlbGlmIGRlZmluZWQoSEFWRV9ESVJFTlRfRF9UWVBFKQorICAgIGlzX3N5bWxpbmsgPSBzZWxmLT5kX3R5cGUgPT0gRFRfTE5LOworICAgIG5lZWRfc3RhdCA9IHNlbGYtPmRfdHlwZSA9PSBEVF9VTktOT1dOIHx8IChmb2xsb3dfc3ltbGlua3MgJiYgaXNfc3ltbGluayk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoTVNfV0lORE9XUykgfHwgZGVmaW5lZChIQVZFX0RJUkVOVF9EX1RZUEUpCisgICAgaWYgKG5lZWRfc3RhdCkgeworI2VuZGlmCisgICAgICAgIHN0YXQgPSBEaXJFbnRyeV9nZXRfc3RhdChzZWxmLCBmb2xsb3dfc3ltbGlua3MpOworICAgICAgICBpZiAoIXN0YXQpIHsKKyAgICAgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0ZpbGVOb3RGb3VuZEVycm9yKSkgeworICAgICAgICAgICAgICAgIC8qIElmIGZpbGUgZG9lc24ndCBleGlzdCAoYW55bW9yZSksIHRoZW4gcmV0dXJuIEZhbHNlCisgICAgICAgICAgICAgICAgICAgKGkuZS4sIHNheSBpdCdzIG5vdCBhIGZpbGUvZGlyZWN0b3J5KSAqLworICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIHN0X21vZGUgPSBfUHlPYmplY3RfR2V0QXR0cklkKHN0YXQsICZQeUlkX3N0X21vZGUpOworICAgICAgICBpZiAoIXN0X21vZGUpCisgICAgICAgICAgICBnb3RvIGVycm9yOworCisgICAgICAgIG1vZGUgPSBQeUxvbmdfQXNMb25nKHN0X21vZGUpOworICAgICAgICBpZiAobW9kZSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgUHlfQ0xFQVIoc3RfbW9kZSk7CisgICAgICAgIFB5X0NMRUFSKHN0YXQpOworICAgICAgICByZXN1bHQgPSAobW9kZSAmIFNfSUZNVCkgPT0gbW9kZV9iaXRzOworI2lmIGRlZmluZWQoTVNfV0lORE9XUykgfHwgZGVmaW5lZChIQVZFX0RJUkVOVF9EX1RZUEUpCisgICAgfQorICAgIGVsc2UgaWYgKGlzX3N5bWxpbmspIHsKKyAgICAgICAgYXNzZXJ0KG1vZGVfYml0cyAhPSBTX0lGTE5LKTsKKyAgICAgICAgcmVzdWx0ID0gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGFzc2VydChtb2RlX2JpdHMgPT0gU19JRkRJUiB8fCBtb2RlX2JpdHMgPT0gU19JRlJFRyk7CisjaWZkZWYgTVNfV0lORE9XUworICAgICAgICBkaXJfYml0cyA9IHNlbGYtPndpbjMyX2xzdGF0LnN0X2ZpbGVfYXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWTsKKyAgICAgICAgaWYgKG1vZGVfYml0cyA9PSBTX0lGRElSKQorICAgICAgICAgICAgcmVzdWx0ID0gZGlyX2JpdHMgIT0gMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVzdWx0ID0gZGlyX2JpdHMgPT0gMDsKKyNlbHNlIC8qIFBPU0lYICovCisgICAgICAgIGlmIChtb2RlX2JpdHMgPT0gU19JRkRJUikKKyAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYtPmRfdHlwZSA9PSBEVF9ESVI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYtPmRfdHlwZSA9PSBEVF9SRUc7CisjZW5kaWYKKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiByZXN1bHQ7CisKK2Vycm9yOgorICAgIFB5X1hERUNSRUYoc3RfbW9kZSk7CisgICAgUHlfWERFQ1JFRihzdGF0KTsKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitEaXJFbnRyeV9weV90ZXN0X21vZGUoRGlyRW50cnkgKnNlbGYsIGludCBmb2xsb3dfc3ltbGlua3MsIHVuc2lnbmVkIHNob3J0IG1vZGVfYml0cykKK3sKKyAgICBpbnQgcmVzdWx0OworCisgICAgcmVzdWx0ID0gRGlyRW50cnlfdGVzdF9tb2RlKHNlbGYsIGZvbGxvd19zeW1saW5rcywgbW9kZV9iaXRzKTsKKyAgICBpZiAocmVzdWx0ID09IC0xKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKHJlc3VsdCk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitEaXJFbnRyeV9pc19kaXIoRGlyRW50cnkgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQoreworICAgIGludCBmb2xsb3dfc3ltbGlua3MgPSAxOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifCRwOkRpckVudHJ5LmlzX2RpciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93X3N5bWxpbmtzX2tleXdvcmRzLCAmZm9sbG93X3N5bWxpbmtzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gRGlyRW50cnlfcHlfdGVzdF9tb2RlKHNlbGYsIGZvbGxvd19zeW1saW5rcywgU19JRkRJUik7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitEaXJFbnRyeV9pc19maWxlKERpckVudHJ5ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKK3sKKyAgICBpbnQgZm9sbG93X3N5bWxpbmtzID0gMTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInwkcDpEaXJFbnRyeS5pc19maWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dfc3ltbGlua3Nfa2V5d29yZHMsICZmb2xsb3dfc3ltbGlua3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJldHVybiBEaXJFbnRyeV9weV90ZXN0X21vZGUoc2VsZiwgZm9sbG93X3N5bWxpbmtzLCBTX0lGUkVHKTsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK0RpckVudHJ5X2lub2RlKERpckVudHJ5ICpzZWxmKQoreworI2lmZGVmIE1TX1dJTkRPV1MKKyAgICBpZiAoIXNlbGYtPmdvdF9maWxlX2luZGV4KSB7CisgICAgICAgIHdjaGFyX3QgKnBhdGg7CisgICAgICAgIHN0cnVjdCBfUHlfc3RhdF9zdHJ1Y3Qgc3RhdDsKKworICAgICAgICBwYXRoID0gUHlVbmljb2RlX0FzVW5pY29kZShzZWxmLT5wYXRoKTsKKyAgICAgICAgaWYgKCFwYXRoKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAgICAgaWYgKHdpbjMyX2xzdGF0X3cocGF0aCwgJnN0YXQpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycldpdGhGaWxlbmFtZU9iamVjdChQeUV4Y19PU0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIHNlbGYtPnBhdGgpOworICAgICAgICB9CisKKyAgICAgICAgc2VsZi0+d2luMzJfZmlsZV9pbmRleCA9IHN0YXQuc3RfaW5vOworICAgICAgICBzZWxmLT5nb3RfZmlsZV9pbmRleCA9IDE7CisgICAgfQorICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKChQWV9MT05HX0xPTkcpc2VsZi0+d2luMzJfZmlsZV9pbmRleCk7CisjZWxzZSAvKiBQT1NJWCAqLworI2lmZGVmIEhBVkVfTEFSR0VGSUxFX1NVUFBPUlQKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZygoUFlfTE9OR19MT05HKXNlbGYtPmRfaW5vKTsKKyNlbHNlCisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZygobG9uZylzZWxmLT5kX2lubyk7CisjZW5kaWYKKyNlbmRpZgorfQorCitzdGF0aWMgUHlPYmplY3QgKgorRGlyRW50cnlfcmVwcihEaXJFbnRyeSAqc2VsZikKK3sKKyAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21Gb3JtYXQoIjxEaXJFbnRyeSAlUj4iLCBzZWxmLT5uYW1lKTsKK30KKworc3RhdGljIFB5TWVtYmVyRGVmIERpckVudHJ5X21lbWJlcnNbXSA9IHsKKyAgICB7Im5hbWUiLCBUX09CSkVDVF9FWCwgb2Zmc2V0b2YoRGlyRW50cnksIG5hbWUpLCBSRUFET05MWSwKKyAgICAgInRoZSBlbnRyeSdzIGJhc2UgZmlsZW5hbWUsIHJlbGF0aXZlIHRvIHNjYW5kaXIoKSBcInBhdGhcIiBhcmd1bWVudCJ9LAorICAgIHsicGF0aCIsIFRfT0JKRUNUX0VYLCBvZmZzZXRvZihEaXJFbnRyeSwgcGF0aCksIFJFQURPTkxZLAorICAgICAidGhlIGVudHJ5J3MgZnVsbCBwYXRoIG5hbWU7IGVxdWl2YWxlbnQgdG8gb3MucGF0aC5qb2luKHNjYW5kaXJfcGF0aCwgZW50cnkubmFtZSkifSwKKyAgICB7TlVMTH0KK307CisKK3N0YXRpYyBQeU1ldGhvZERlZiBEaXJFbnRyeV9tZXRob2RzW10gPSB7CisgICAgeyJpc19kaXIiLCAoUHlDRnVuY3Rpb24pRGlyRW50cnlfaXNfZGlyLCBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAorICAgICAicmV0dXJuIFRydWUgaWYgdGhlIGVudHJ5IGlzIGEgZGlyZWN0b3J5OyBjYWNoZWQgcGVyIGVudHJ5IgorICAgIH0sCisgICAgeyJpc19maWxlIiwgKFB5Q0Z1bmN0aW9uKURpckVudHJ5X2lzX2ZpbGUsIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCisgICAgICJyZXR1cm4gVHJ1ZSBpZiB0aGUgZW50cnkgaXMgYSBmaWxlOyBjYWNoZWQgcGVyIGVudHJ5IgorICAgIH0sCisgICAgeyJpc19zeW1saW5rIiwgKFB5Q0Z1bmN0aW9uKURpckVudHJ5X3B5X2lzX3N5bWxpbmssIE1FVEhfTk9BUkdTLAorICAgICAicmV0dXJuIFRydWUgaWYgdGhlIGVudHJ5IGlzIGEgc3ltYm9saWMgbGluazsgY2FjaGVkIHBlciBlbnRyeSIKKyAgICB9LAorICAgIHsic3RhdCIsIChQeUNGdW5jdGlvbilEaXJFbnRyeV9zdGF0LCBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAorICAgICAicmV0dXJuIHN0YXRfcmVzdWx0IG9iamVjdCBmb3IgdGhlIGVudHJ5OyBjYWNoZWQgcGVyIGVudHJ5IgorICAgIH0sCisgICAgeyJpbm9kZSIsIChQeUNGdW5jdGlvbilEaXJFbnRyeV9pbm9kZSwgTUVUSF9OT0FSR1MsCisgICAgICJyZXR1cm4gaW5vZGUgb2YgdGhlIGVudHJ5OyBjYWNoZWQgcGVyIGVudHJ5IiwKKyAgICB9LAorICAgIHtOVUxMfQorfTsKKworUHlUeXBlT2JqZWN0IERpckVudHJ5VHlwZSA9IHsKKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICBNT0ROQU1FICIuRGlyRW50cnkiLCAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihEaXJFbnRyeSksICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpRGlyRW50cnlfZGVhbGxvYywgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpRGlyRW50cnlfcmVwciwgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIERpckVudHJ5X21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgRGlyRW50cnlfbWVtYmVycywgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KK307CisKKyNpZmRlZiBNU19XSU5ET1dTCisKK3N0YXRpYyB3Y2hhcl90ICoKK2pvaW5fcGF0aF9maWxlbmFtZVcod2NoYXJfdCAqcGF0aF93aWRlLCB3Y2hhcl90KiBmaWxlbmFtZSkKK3sKKyAgICBQeV9zc2l6ZV90IHBhdGhfbGVuOworICAgIFB5X3NzaXplX3Qgc2l6ZTsKKyAgICB3Y2hhcl90ICpyZXN1bHQ7CisgICAgd2NoYXJfdCBjaDsKKworICAgIGlmICghcGF0aF93aWRlKSB7IC8qIERlZmF1bHQgYXJnOiAiLiIgKi8KKyAgICAgICAgcGF0aF93aWRlID0gTCIuIjsKKyAgICAgICAgcGF0aF9sZW4gPSAxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcGF0aF9sZW4gPSB3Y3NsZW4ocGF0aF93aWRlKTsKKyAgICB9CisKKyAgICAvKiBUaGUgKzEncyBhcmUgZm9yIHRoZSBwYXRoIHNlcGFyYXRvciBhbmQgdGhlIE5VTCAqLworICAgIHNpemUgPSBwYXRoX2xlbiArIDEgKyB3Y3NsZW4oZmlsZW5hbWUpICsgMTsKKyAgICByZXN1bHQgPSBQeU1lbV9OZXcod2NoYXJfdCwgc2l6ZSk7CisgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHdjc2NweShyZXN1bHQsIHBhdGhfd2lkZSk7CisgICAgaWYgKHBhdGhfbGVuID4gMCkgeworICAgICAgICBjaCA9IHJlc3VsdFtwYXRoX2xlbiAtIDFdOworICAgICAgICBpZiAoY2ggIT0gU0VQICYmIGNoICE9IEFMVFNFUCAmJiBjaCAhPSBMJzonKQorICAgICAgICAgICAgcmVzdWx0W3BhdGhfbGVuKytdID0gU0VQOworICAgICAgICB3Y3NjcHkocmVzdWx0ICsgcGF0aF9sZW4sIGZpbGVuYW1lKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK0RpckVudHJ5X2Zyb21fZmluZF9kYXRhKHBhdGhfdCAqcGF0aCwgV0lOMzJfRklORF9EQVRBVyAqZGF0YVcpCit7CisgICAgRGlyRW50cnkgKmVudHJ5OworICAgIEJZX0hBTkRMRV9GSUxFX0lORk9STUFUSU9OIGZpbGVfaW5mbzsKKyAgICBVTE9ORyByZXBhcnNlX3RhZzsKKyAgICB3Y2hhcl90ICpqb2luZWRfcGF0aDsKKworICAgIGVudHJ5ID0gUHlPYmplY3RfTmV3KERpckVudHJ5LCAmRGlyRW50cnlUeXBlKTsKKyAgICBpZiAoIWVudHJ5KQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlbnRyeS0+bmFtZSA9IE5VTEw7CisgICAgZW50cnktPnBhdGggPSBOVUxMOworICAgIGVudHJ5LT5zdGF0ID0gTlVMTDsKKyAgICBlbnRyeS0+bHN0YXQgPSBOVUxMOworICAgIGVudHJ5LT5nb3RfZmlsZV9pbmRleCA9IDA7CisKKyAgICBlbnRyeS0+bmFtZSA9IFB5VW5pY29kZV9Gcm9tV2lkZUNoYXIoZGF0YVctPmNGaWxlTmFtZSwgLTEpOworICAgIGlmICghZW50cnktPm5hbWUpCisgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICBqb2luZWRfcGF0aCA9IGpvaW5fcGF0aF9maWxlbmFtZVcocGF0aC0+d2lkZSwgZGF0YVctPmNGaWxlTmFtZSk7CisgICAgaWYgKCFqb2luZWRfcGF0aCkKKyAgICAgICAgZ290byBlcnJvcjsKKworICAgIGVudHJ5LT5wYXRoID0gUHlVbmljb2RlX0Zyb21XaWRlQ2hhcihqb2luZWRfcGF0aCwgLTEpOworICAgIFB5TWVtX0ZyZWUoam9pbmVkX3BhdGgpOworICAgIGlmICghZW50cnktPnBhdGgpCisgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICBmaW5kX2RhdGFfdG9fZmlsZV9pbmZvX3coZGF0YVcsICZmaWxlX2luZm8sICZyZXBhcnNlX3RhZyk7CisgICAgX1B5X2F0dHJpYnV0ZV9kYXRhX3RvX3N0YXQoJmZpbGVfaW5mbywgcmVwYXJzZV90YWcsICZlbnRyeS0+d2luMzJfbHN0YXQpOworCisgICAgcmV0dXJuIChQeU9iamVjdCAqKWVudHJ5OworCitlcnJvcjoKKyAgICBQeV9ERUNSRUYoZW50cnkpOworICAgIHJldHVybiBOVUxMOworfQorCisjZWxzZSAvKiBQT1NJWCAqLworCitzdGF0aWMgY2hhciAqCitqb2luX3BhdGhfZmlsZW5hbWUoY2hhciAqcGF0aF9uYXJyb3csIGNoYXIqIGZpbGVuYW1lLCBQeV9zc2l6ZV90IGZpbGVuYW1lX2xlbikKK3sKKyAgICBQeV9zc2l6ZV90IHBhdGhfbGVuOworICAgIFB5X3NzaXplX3Qgc2l6ZTsKKyAgICBjaGFyICpyZXN1bHQ7CisKKyAgICBpZiAoIXBhdGhfbmFycm93KSB7IC8qIERlZmF1bHQgYXJnOiAiLiIgKi8KKyAgICAgICAgcGF0aF9uYXJyb3cgPSAiLiI7CisgICAgICAgIHBhdGhfbGVuID0gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHBhdGhfbGVuID0gc3RybGVuKHBhdGhfbmFycm93KTsKKyAgICB9CisKKyAgICBpZiAoZmlsZW5hbWVfbGVuID09IC0xKQorICAgICAgICBmaWxlbmFtZV9sZW4gPSBzdHJsZW4oZmlsZW5hbWUpOworCisgICAgLyogVGhlICsxJ3MgYXJlIGZvciB0aGUgcGF0aCBzZXBhcmF0b3IgYW5kIHRoZSBOVUwgKi8KKyAgICBzaXplID0gcGF0aF9sZW4gKyAxICsgZmlsZW5hbWVfbGVuICsgMTsKKyAgICByZXN1bHQgPSBQeU1lbV9OZXcoY2hhciwgc2l6ZSk7CisgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHN0cmNweShyZXN1bHQsIHBhdGhfbmFycm93KTsKKyAgICBpZiAocGF0aF9sZW4gPiAwICYmIHJlc3VsdFtwYXRoX2xlbiAtIDFdICE9ICcvJykKKyAgICAgICAgcmVzdWx0W3BhdGhfbGVuKytdID0gJy8nOworICAgIHN0cmNweShyZXN1bHQgKyBwYXRoX2xlbiwgZmlsZW5hbWUpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitEaXJFbnRyeV9mcm9tX3Bvc2l4X2luZm8ocGF0aF90ICpwYXRoLCBjaGFyICpuYW1lLCBQeV9zc2l6ZV90IG5hbWVfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgIGlub190IGRfaW5vCisjaWZkZWYgSEFWRV9ESVJFTlRfRF9UWVBFCisgICAgICAgICAgICAgICAgICAgICAgICAgLCB1bnNpZ25lZCBjaGFyIGRfdHlwZQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworICAgIERpckVudHJ5ICplbnRyeTsKKyAgICBjaGFyICpqb2luZWRfcGF0aDsKKworICAgIGVudHJ5ID0gUHlPYmplY3RfTmV3KERpckVudHJ5LCAmRGlyRW50cnlUeXBlKTsKKyAgICBpZiAoIWVudHJ5KQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlbnRyeS0+bmFtZSA9IE5VTEw7CisgICAgZW50cnktPnBhdGggPSBOVUxMOworICAgIGVudHJ5LT5zdGF0ID0gTlVMTDsKKyAgICBlbnRyeS0+bHN0YXQgPSBOVUxMOworCisgICAgam9pbmVkX3BhdGggPSBqb2luX3BhdGhfZmlsZW5hbWUocGF0aC0+bmFycm93LCBuYW1lLCBuYW1lX2xlbik7CisgICAgaWYgKCFqb2luZWRfcGF0aCkKKyAgICAgICAgZ290byBlcnJvcjsKKworICAgIGlmICghcGF0aC0+bmFycm93IHx8ICFQeUJ5dGVzX0NoZWNrKHBhdGgtPm9iamVjdCkpIHsKKyAgICAgICAgZW50cnktPm5hbWUgPSBQeVVuaWNvZGVfRGVjb2RlRlNEZWZhdWx0QW5kU2l6ZShuYW1lLCBuYW1lX2xlbik7CisgICAgICAgIGVudHJ5LT5wYXRoID0gUHlVbmljb2RlX0RlY29kZUZTRGVmYXVsdChqb2luZWRfcGF0aCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBlbnRyeS0+bmFtZSA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUobmFtZSwgbmFtZV9sZW4pOworICAgICAgICBlbnRyeS0+cGF0aCA9IFB5Qnl0ZXNfRnJvbVN0cmluZyhqb2luZWRfcGF0aCk7CisgICAgfQorICAgIFB5TWVtX0ZyZWUoam9pbmVkX3BhdGgpOworICAgIGlmICghZW50cnktPm5hbWUgfHwgIWVudHJ5LT5wYXRoKQorICAgICAgICBnb3RvIGVycm9yOworCisjaWZkZWYgSEFWRV9ESVJFTlRfRF9UWVBFCisgICAgZW50cnktPmRfdHlwZSA9IGRfdHlwZTsKKyNlbmRpZgorICAgIGVudHJ5LT5kX2lubyA9IGRfaW5vOworCisgICAgcmV0dXJuIChQeU9iamVjdCAqKWVudHJ5OworCitlcnJvcjoKKyAgICBQeV9YREVDUkVGKGVudHJ5KTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworI2VuZGlmCisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBwYXRoX3QgcGF0aDsKKyNpZmRlZiBNU19XSU5ET1dTCisgICAgSEFORExFIGhhbmRsZTsKKyAgICBXSU4zMl9GSU5EX0RBVEFXIGZpbGVfZGF0YTsKKyAgICBpbnQgZmlyc3RfdGltZTsKKyNlbHNlIC8qIFBPU0lYICovCisgICAgRElSICpkaXJwOworI2VuZGlmCit9IFNjYW5kaXJJdGVyYXRvcjsKKworI2lmZGVmIE1TX1dJTkRPV1MKKworc3RhdGljIHZvaWQKK1NjYW5kaXJJdGVyYXRvcl9jbG9zZShTY2FuZGlySXRlcmF0b3IgKml0ZXJhdG9yKQoreworICAgIGlmIChpdGVyYXRvci0+aGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgICAgICByZXR1cm47CisKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgRmluZENsb3NlKGl0ZXJhdG9yLT5oYW5kbGUpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgaXRlcmF0b3ItPmhhbmRsZSA9IElOVkFMSURfSEFORExFX1ZBTFVFOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorU2NhbmRpckl0ZXJhdG9yX2l0ZXJuZXh0KFNjYW5kaXJJdGVyYXRvciAqaXRlcmF0b3IpCit7CisgICAgV0lOMzJfRklORF9EQVRBVyAqZmlsZV9kYXRhID0gJml0ZXJhdG9yLT5maWxlX2RhdGE7CisgICAgQk9PTCBzdWNjZXNzOworCisgICAgLyogSGFwcGVucyBpZiB0aGUgaXRlcmF0b3IgaXMgaXRlcmF0ZWQgdHdpY2UgKi8KKyAgICBpZiAoaXRlcmF0b3ItPmhhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgICAgICBQeUVycl9TZXROb25lKFB5RXhjX1N0b3BJdGVyYXRpb24pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoIWl0ZXJhdG9yLT5maXJzdF90aW1lKSB7CisgICAgICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgICAgICBzdWNjZXNzID0gRmluZE5leHRGaWxlVyhpdGVyYXRvci0+aGFuZGxlLCBmaWxlX2RhdGEpOworICAgICAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgICAgIGlmICghc3VjY2VzcykgeworICAgICAgICAgICAgICAgIGlmIChHZXRMYXN0RXJyb3IoKSAhPSBFUlJPUl9OT19NT1JFX0ZJTEVTKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGF0aF9lcnJvcigmaXRlcmF0b3ItPnBhdGgpOworICAgICAgICAgICAgICAgIC8qIE5vIG1vcmUgZmlsZXMgZm91bmQgaW4gZGlyZWN0b3J5LCBzdG9wIGl0ZXJhdGluZyAqLworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGl0ZXJhdG9yLT5maXJzdF90aW1lID0gMDsKKworICAgICAgICAvKiBTa2lwIG92ZXIgLiBhbmQgLi4gKi8KKyAgICAgICAgaWYgKHdjc2NtcChmaWxlX2RhdGEtPmNGaWxlTmFtZSwgTCIuIikgIT0gMCAmJgorICAgICAgICAgICAgICAgIHdjc2NtcChmaWxlX2RhdGEtPmNGaWxlTmFtZSwgTCIuLiIpICE9IDApCisgICAgICAgICAgICByZXR1cm4gRGlyRW50cnlfZnJvbV9maW5kX2RhdGEoJml0ZXJhdG9yLT5wYXRoLCBmaWxlX2RhdGEpOworCisgICAgICAgIC8qIExvb3AgdGlsbCB3ZSBnZXQgYSBub24tZG90IGRpcmVjdG9yeSBvciBmaW5pc2ggaXRlcmF0aW5nICovCisgICAgfQorCisgICAgU2NhbmRpckl0ZXJhdG9yX2Nsb3NlKGl0ZXJhdG9yKTsKKworICAgIFB5RXJyX1NldE5vbmUoUHlFeGNfU3RvcEl0ZXJhdGlvbik7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKyNlbHNlIC8qIFBPU0lYICovCisKK3N0YXRpYyB2b2lkCitTY2FuZGlySXRlcmF0b3JfY2xvc2UoU2NhbmRpckl0ZXJhdG9yICppdGVyYXRvcikKK3sKKyAgICBpZiAoIWl0ZXJhdG9yLT5kaXJwKQorICAgICAgICByZXR1cm47CisKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgY2xvc2VkaXIoaXRlcmF0b3ItPmRpcnApOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgaXRlcmF0b3ItPmRpcnAgPSBOVUxMOworICAgIHJldHVybjsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK1NjYW5kaXJJdGVyYXRvcl9pdGVybmV4dChTY2FuZGlySXRlcmF0b3IgKml0ZXJhdG9yKQoreworICAgIHN0cnVjdCBkaXJlbnQgKmRpcmVudHA7CisgICAgUHlfc3NpemVfdCBuYW1lX2xlbjsKKyAgICBpbnQgaXNfZG90OworCisgICAgLyogSGFwcGVucyBpZiB0aGUgaXRlcmF0b3IgaXMgaXRlcmF0ZWQgdHdpY2UgKi8KKyAgICBpZiAoIWl0ZXJhdG9yLT5kaXJwKSB7CisgICAgICAgIFB5RXJyX1NldE5vbmUoUHlFeGNfU3RvcEl0ZXJhdGlvbik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBkaXJlbnRwID0gcmVhZGRpcihpdGVyYXRvci0+ZGlycCk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisKKyAgICAgICAgaWYgKCFkaXJlbnRwKSB7CisgICAgICAgICAgICBpZiAoZXJybm8gIT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcGF0aF9lcnJvcigmaXRlcmF0b3ItPnBhdGgpOworICAgICAgICAgICAgLyogTm8gbW9yZSBmaWxlcyBmb3VuZCBpbiBkaXJlY3RvcnksIHN0b3AgaXRlcmF0aW5nICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFNraXAgb3ZlciAuIGFuZCAuLiAqLworICAgICAgICBuYW1lX2xlbiA9IE5BTUxFTihkaXJlbnRwKTsKKyAgICAgICAgaXNfZG90ID0gZGlyZW50cC0+ZF9uYW1lWzBdID09ICcuJyAmJgorICAgICAgICAgICAgICAgICAobmFtZV9sZW4gPT0gMSB8fCAoZGlyZW50cC0+ZF9uYW1lWzFdID09ICcuJyAmJiBuYW1lX2xlbiA9PSAyKSk7CisgICAgICAgIGlmICghaXNfZG90KSB7CisgICAgICAgICAgICByZXR1cm4gRGlyRW50cnlfZnJvbV9wb3NpeF9pbmZvKCZpdGVyYXRvci0+cGF0aCwgZGlyZW50cC0+ZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX2xlbiwgZGlyZW50cC0+ZF9pbm8KKyNpZmRlZiBIQVZFX0RJUkVOVF9EX1RZUEUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBkaXJlbnRwLT5kX3R5cGUKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICB9CisKKyAgICAgICAgLyogTG9vcCB0aWxsIHdlIGdldCBhIG5vbi1kb3QgZGlyZWN0b3J5IG9yIGZpbmlzaCBpdGVyYXRpbmcgKi8KKyAgICB9CisKKyAgICBTY2FuZGlySXRlcmF0b3JfY2xvc2UoaXRlcmF0b3IpOworCisgICAgUHlFcnJfU2V0Tm9uZShQeUV4Y19TdG9wSXRlcmF0aW9uKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworI2VuZGlmCisKK3N0YXRpYyB2b2lkCitTY2FuZGlySXRlcmF0b3JfZGVhbGxvYyhTY2FuZGlySXRlcmF0b3IgKml0ZXJhdG9yKQoreworICAgIFNjYW5kaXJJdGVyYXRvcl9jbG9zZShpdGVyYXRvcik7CisgICAgUHlfWERFQ1JFRihpdGVyYXRvci0+cGF0aC5vYmplY3QpOworICAgIHBhdGhfY2xlYW51cCgmaXRlcmF0b3ItPnBhdGgpOworICAgIFB5X1RZUEUoaXRlcmF0b3IpLT50cF9mcmVlKChQeU9iamVjdCAqKWl0ZXJhdG9yKTsKK30KKworUHlUeXBlT2JqZWN0IFNjYW5kaXJJdGVyYXRvclR5cGUgPSB7CisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgTU9ETkFNRSAiLlNjYW5kaXJJdGVyYXRvciIsICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoU2NhbmRpckl0ZXJhdG9yKSwgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKVNjYW5kaXJJdGVyYXRvcl9kZWFsbG9jLCAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAoaXRlcm5leHRmdW5jKVNjYW5kaXJJdGVyYXRvcl9pdGVybmV4dCwgLyogdHBfaXRlcm5leHQgKi8KK307CisKK3N0YXRpYyBQeU9iamVjdCAqCitwb3NpeF9zY2FuZGlyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKK3sKKyAgICBTY2FuZGlySXRlcmF0b3IgKml0ZXJhdG9yOworICAgIHN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geyJwYXRoIiwgTlVMTH07CisjaWZkZWYgTVNfV0lORE9XUworICAgIHdjaGFyX3QgKnBhdGhfc3RyVzsKKyNlbHNlCisgICAgY2hhciAqcGF0aDsKKyNlbmRpZgorCisgICAgaXRlcmF0b3IgPSBQeU9iamVjdF9OZXcoU2NhbmRpckl0ZXJhdG9yLCAmU2NhbmRpckl0ZXJhdG9yVHlwZSk7CisgICAgaWYgKCFpdGVyYXRvcikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbWVtc2V0KCZpdGVyYXRvci0+cGF0aCwgMCwgc2l6ZW9mKHBhdGhfdCkpOworICAgIGl0ZXJhdG9yLT5wYXRoLmZ1bmN0aW9uX25hbWUgPSAic2NhbmRpciI7CisgICAgaXRlcmF0b3ItPnBhdGgubnVsbGFibGUgPSAxOworCisjaWZkZWYgTVNfV0lORE9XUworICAgIGl0ZXJhdG9yLT5oYW5kbGUgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyNlbHNlCisgICAgaXRlcmF0b3ItPmRpcnAgPSBOVUxMOworI2VuZGlmCisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8TyY6c2NhbmRpciIsIGtleXdvcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhfY29udmVydGVyLCAmaXRlcmF0b3ItPnBhdGgpKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgLyogcGF0aF9jb252ZXJ0ZXIgZG9lc24ndCBrZWVwIHBhdGgub2JqZWN0IGFyb3VuZCwgc28gZG8gaXQKKyAgICAgICBtYW51YWxseSBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBpdGVyYXRvciBoZXJlICh0aGUgcmVmY291bnQKKyAgICAgICBpcyBkZWNyZW1lbnRlZCBpbiBTY2FuZGlySXRlcmF0b3JfZGVhbGxvYykKKyAgICAqLworICAgIFB5X1hJTkNSRUYoaXRlcmF0b3ItPnBhdGgub2JqZWN0KTsKKworI2lmZGVmIE1TX1dJTkRPV1MKKyAgICBpZiAoaXRlcmF0b3ItPnBhdGgubmFycm93KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAib3Muc2NhbmRpcigpIGRvZXNuJ3Qgc3VwcG9ydCBieXRlcyBwYXRoIG9uIFdpbmRvd3MsIHVzZSBVbmljb2RlIGluc3RlYWQiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgaXRlcmF0b3ItPmZpcnN0X3RpbWUgPSAxOworCisgICAgcGF0aF9zdHJXID0gam9pbl9wYXRoX2ZpbGVuYW1lVyhpdGVyYXRvci0+cGF0aC53aWRlLCBMIiouKiIpOworICAgIGlmICghcGF0aF9zdHJXKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGl0ZXJhdG9yLT5oYW5kbGUgPSBGaW5kRmlyc3RGaWxlVyhwYXRoX3N0clcsICZpdGVyYXRvci0+ZmlsZV9kYXRhKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworCisgICAgUHlNZW1fRnJlZShwYXRoX3N0clcpOworCisgICAgaWYgKGl0ZXJhdG9yLT5oYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKyAgICAgICAgcGF0aF9lcnJvcigmaXRlcmF0b3ItPnBhdGgpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyNlbHNlIC8qIFBPU0lYICovCisgICAgaWYgKGl0ZXJhdG9yLT5wYXRoLm5hcnJvdykKKyAgICAgICAgcGF0aCA9IGl0ZXJhdG9yLT5wYXRoLm5hcnJvdzsKKyAgICBlbHNlCisgICAgICAgIHBhdGggPSAiLiI7CisKKyAgICBlcnJubyA9IDA7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGl0ZXJhdG9yLT5kaXJwID0gb3BlbmRpcihwYXRoKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworCisgICAgaWYgKCFpdGVyYXRvci0+ZGlycCkgeworICAgICAgICBwYXRoX2Vycm9yKCZpdGVyYXRvci0+cGF0aCk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXRlcmF0b3I7CisKK2Vycm9yOgorICAgIFB5X0RFQ1JFRihpdGVyYXRvcik7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKwogLypbY2xpbmljIGlucHV0XQogZHVtcCBidWZmZXIKIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KQEAgLTE3MjE2LDYgKzE3Nzk2LDkgQEAKICAgICB7ImdldF9ibG9ja2luZyIsIHBvc2l4X2dldF9ibG9ja2luZywgTUVUSF9WQVJBUkdTLCBnZXRfYmxvY2tpbmdfX2RvY19ffSwKICAgICB7InNldF9ibG9ja2luZyIsIHBvc2l4X3NldF9ibG9ja2luZywgTUVUSF9WQVJBUkdTLCBzZXRfYmxvY2tpbmdfX2RvY19ffSwKICNlbmRpZgorICAgIHsic2NhbmRpciIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKXBvc2l4X3NjYW5kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAorICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXhfc2NhbmRpcl9fZG9jX199LAogICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgICAvKiBTZW50aW5lbCAqLwogfTsKIApAQCAtMTc2NTgsMTUgKzE4MjQxLDYgQEAKIH0KIAogCi0jaWZkZWYgTVNfV0lORE9XUwotI2RlZmluZSBJTklURlVOQyBQeUluaXRfbnQKLSNkZWZpbmUgTU9ETkFNRSAibnQiCi0KLSNlbHNlCi0jZGVmaW5lIElOSVRGVU5DIFB5SW5pdF9wb3NpeAotI2RlZmluZSBNT0ROQU1FICJwb3NpeCIKLSNlbmRpZgotCiBzdGF0aWMgc3RydWN0IFB5TW9kdWxlRGVmIHBvc2l4bW9kdWxlID0gewogICAgIFB5TW9kdWxlRGVmX0hFQURfSU5JVCwKICAgICBNT0ROQU1FLApAQCAtMTc4ODcsNiArMTg0NjEsMTIgQEAKICAgICAgICAgaWYgKFB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUyKCZUZXJtaW5hbFNpemVUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlRlcm1pbmFsU2l6ZV9kZXNjKSA8IDApCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgICAvKiBpbml0aWFsaXplIHNjYW5kaXIgdHlwZXMgKi8KKyAgICAgICAgaWYgKFB5VHlwZV9SZWFkeSgmU2NhbmRpckl0ZXJhdG9yVHlwZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChQeVR5cGVfUmVhZHkoJkRpckVudHJ5VHlwZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogI2lmIGRlZmluZWQoSEFWRV9XQUlUSUQpICYmICFkZWZpbmVkKF9fQVBQTEVfXykKICAgICBQeV9JTkNSRUYoKFB5T2JqZWN0KikgJldhaXRpZFJlc3VsdFR5cGUpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9weWV4cGF0LmMgYi9Nb2R1bGVzL3B5ZXhwYXQuYwppbmRleCAzZjM0ZTYzLi4yMWNiMDRhIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3B5ZXhwYXQuYworKysgYi9Nb2R1bGVzL3B5ZXhwYXQuYwpAQCAtMTA5Myw3ICsxMDkzLDcgQEAKICAgICBmb3IgKGkgPSAwOyBoYW5kbGVyX2luZm9baV0ubmFtZSAhPSBOVUxMOyBpKyspCiAgICAgICAgIC8qIGRvIG5vdGhpbmcgKi87CiAKLSAgICBuZXdfcGFyc2VyLT5oYW5kbGVycyA9IFB5TWVtX01hbGxvYyhzaXplb2YoUHlPYmplY3QgKikgKiBpKTsKKyAgICBuZXdfcGFyc2VyLT5oYW5kbGVycyA9IFB5TWVtX05ldyhQeU9iamVjdCAqLCBpKTsKICAgICBpZiAoIW5ld19wYXJzZXItPmhhbmRsZXJzKSB7CiAgICAgICAgIFB5X0RFQ1JFRihuZXdfcGFyc2VyKTsKICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CkBAIC0xNDE2LDcgKzE0MTYsNyBAQAogICAgIGZvciAoaSA9IDA7IGhhbmRsZXJfaW5mb1tpXS5uYW1lICE9IE5VTEw7IGkrKykKICAgICAgICAgLyogZG8gbm90aGluZyAqLzsKIAotICAgIHNlbGYtPmhhbmRsZXJzID0gUHlNZW1fTWFsbG9jKHNpemVvZihQeU9iamVjdCAqKSAqIGkpOworICAgIHNlbGYtPmhhbmRsZXJzID0gUHlNZW1fTmV3KFB5T2JqZWN0ICosIGkpOwogICAgIGlmICghc2VsZi0+aGFuZGxlcnMpIHsKICAgICAgICAgUHlfREVDUkVGKHNlbGYpOwogICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvc2lnbmFsbW9kdWxlLmMgYi9Nb2R1bGVzL3NpZ25hbG1vZHVsZS5jCmluZGV4IGVhYmUyZjAuLjNhZDhlYmIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvc2lnbmFsbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9zaWduYWxtb2R1bGUuYwpAQCAtNTAzLDI0ICs1MDMsMjMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzaWduYWxfc2V0X3dha2V1cF9mZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CisgICAgc3RydWN0IF9QeV9zdGF0X3N0cnVjdCBzdDsKICNpZmRlZiBNU19XSU5ET1dTCiAgICAgUHlPYmplY3QgKmZkb2JqOwotICAgIFNPQ0tFVF9UIGZkLCBvbGRfZmQ7CisgICAgU09DS0VUX1Qgc29ja2ZkLCBvbGRfc29ja2ZkOwogICAgIGludCByZXM7CiAgICAgaW50IHJlc19zaXplID0gc2l6ZW9mIHJlczsKICAgICBQeU9iamVjdCAqbW9kOwotICAgIHN0cnVjdCBzdGF0IHN0OwogICAgIGludCBpc19zb2NrZXQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86c2V0X3dha2V1cF9mZCIsICZmZG9iaikpCiAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgZmQgPSBQeUxvbmdfQXNTb2NrZXRfdChmZG9iaik7Ci0gICAgaWYgKGZkID09IChTT0NLRVRfVCkoLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgc29ja2ZkID0gUHlMb25nX0FzU29ja2V0X3QoZmRvYmopOworICAgIGlmIChzb2NrZmQgPT0gKFNPQ0tFVF9UKSgtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAjZWxzZQogICAgIGludCBmZCwgb2xkX2ZkOwotICAgIHN0cnVjdCBzdGF0IHN0OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnNldF93YWtldXBfZmQiLCAmZmQpKQogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTUzNiw3ICs1MzUsNyBAQAogCiAjaWZkZWYgTVNfV0lORE9XUwogICAgIGlzX3NvY2tldCA9IDA7Ci0gICAgaWYgKGZkICE9IElOVkFMSURfRkQpIHsKKyAgICBpZiAoc29ja2ZkICE9IElOVkFMSURfRkQpIHsKICAgICAgICAgLyogSW1wb3J0IHRoZSBfc29ja2V0IG1vZHVsZSB0byBjYWxsIFdTQVN0YXJ0dXAoKSAqLwogICAgICAgICBtb2QgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrKCJfc29ja2V0Iik7CiAgICAgICAgIGlmIChtb2QgPT0gTlVMTCkKQEAgLTU0NCwyMSArNTQzLDI0IEBACiAgICAgICAgIFB5X0RFQ1JFRihtb2QpOwogCiAgICAgICAgIC8qIHRlc3QgdGhlIHNvY2tldCAqLwotICAgICAgICBpZiAoZ2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgU09fRVJST1IsCisgICAgICAgIGlmIChnZXRzb2Nrb3B0KHNvY2tmZCwgU09MX1NPQ0tFVCwgU09fRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJnJlcywgJnJlc19zaXplKSAhPSAwKSB7Ci0gICAgICAgICAgICBpbnQgZXJyID0gV1NBR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBpbnQgZmQsIGVycjsKKworICAgICAgICAgICAgZXJyID0gV1NBR2V0TGFzdEVycm9yKCk7CiAgICAgICAgICAgICBpZiAoZXJyICE9IFdTQUVOT1RTT0NLKSB7CiAgICAgICAgICAgICAgICAgUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnIoUHlFeGNfT1NFcnJvciwgZXJyKTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKCFfUHlWZXJpZnlfZmQoZmQpKSB7CisgICAgICAgICAgICBmZCA9IChpbnQpc29ja2ZkOworICAgICAgICAgICAgaWYgKChTT0NLRVRfVClmZCAhPSBzb2NrZmQgfHwgIV9QeVZlcmlmeV9mZChmZCkpIHsKICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImludmFsaWQgZmQiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGZzdGF0KGZkLCAmc3QpICE9IDApIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfT1NFcnJvcik7CisgICAgICAgICAgICBpZiAoX1B5X2ZzdGF0KGZkLCAmc3QpICE9IDApIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycihQeUV4Y19PU0Vycm9yLCBHZXRMYXN0RXJyb3IoKSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9CiAKQEAgLTU3MiwxMiArNTc0LDEyIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBvbGRfZmQgPSB3YWtldXAuZmQ7Ci0gICAgd2FrZXVwLmZkID0gZmQ7CisgICAgb2xkX3NvY2tmZCA9IHdha2V1cC5mZDsKKyAgICB3YWtldXAuZmQgPSBzb2NrZmQ7CiAgICAgd2FrZXVwLnVzZV9zZW5kID0gaXNfc29ja2V0OwogCi0gICAgaWYgKG9sZF9mZCAhPSBJTlZBTElEX0ZEKQotICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21Tb2NrZXRfdChvbGRfZmQpOworICAgIGlmIChvbGRfc29ja2ZkICE9IElOVkFMSURfRkQpCisgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbVNvY2tldF90KG9sZF9zb2NrZmQpOwogICAgIGVsc2UKICAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZygtMSk7CiAjZWxzZQpAQCAtNTg5LDcgKzU5MSw3IEBACiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChmc3RhdChmZCwgJnN0KSAhPSAwKSB7CisgICAgICAgIGlmIChfUHlfZnN0YXQoZmQsICZzdCkgIT0gMCkgewogICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX09TRXJyb3IpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvc29ja2V0bW9kdWxlLmMgYi9Nb2R1bGVzL3NvY2tldG1vZHVsZS5jCmluZGV4IDU5MTNlNjUuLjA1NzQzMGIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvc29ja2V0bW9kdWxlLmMKKysrIGIvTW9kdWxlcy9zb2NrZXRtb2R1bGUuYwpAQCAtMTk2Niw4ICsxOTY2LDE1IEBACiAgICAgI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKICAgICAjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVd0YXV0b2xvZ2ljYWwtY29tcGFyZSIKICAgICAjZW5kaWYKKyAgICAjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKChfX0dOVUNfXyA+IDQpIHx8ICgoX19HTlVDX18gPT0gNCkgJiYgKF9fR05VQ19NSU5PUl9fID4gNSkpKQorICAgICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcHVzaAorICAgICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVd0eXBlLWxpbWl0cyIKKyAgICAjZW5kaWYKICAgICBpZiAobXNnLT5tc2dfY29udHJvbGxlbiA8IDApCiAgICAgICAgIHJldHVybiAwOworICAgICNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoKF9fR05VQ19fID4gNCkgfHwgKChfX0dOVUNfXyA9PSA0KSAmJiAoX19HTlVDX01JTk9SX18gPiA1KSkpCisgICAgI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKKyAgICAjZW5kaWYKICAgICAjaWZkZWYgX19jbGFuZ19fCiAgICAgI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAogICAgICNlbmRpZgpAQCAtNDIxMyw5ICs0MjIwLDExIEBACiAKICAgICAvKiBNU0ROIHNheXMgRVJST1JfTU9SRV9EQVRBIG1heSBvY2N1ciBiZWNhdXNlIEROUyBhbGxvd3MgbG9uZ2VyCiAgICAgICAgbmFtZXMgKi8KLSAgICBuYW1lID0gUHlNZW1fTWFsbG9jKHNpemUgKiBzaXplb2Yod2NoYXJfdCkpOwotICAgIGlmICghbmFtZSkKKyAgICBuYW1lID0gUHlNZW1fTmV3KHdjaGFyX3QsIHNpemUpOworICAgIGlmICghbmFtZSkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOwogICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAgICAgaWYgKCFHZXRDb21wdXRlck5hbWVFeFcoQ29tcHV0ZXJOYW1lUGh5c2ljYWxEbnNIb3N0bmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSkpCmRpZmYgLS1naXQgYS9Nb2R1bGVzL3NvY2tldG1vZHVsZS5oIGIvTW9kdWxlcy9zb2NrZXRtb2R1bGUuaAppbmRleCBiODNmOWFmLi40YjZhMTBlIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3NvY2tldG1vZHVsZS5oCisrKyBiL01vZHVsZXMvc29ja2V0bW9kdWxlLmgKQEAgLTE0LDYgKzE0LDEzIEBACiAKICNlbHNlIC8qIE1TX1dJTkRPV1MgKi8KICMgaW5jbHVkZSA8d2luc29jazIuaD4KKy8qIFdpbmRvd3MgJ3N1cHBvcnRzJyBDTVNHX0xFTiwgYnV0IGRvZXMgbm90IGZvbGxvdyB0aGUgUE9TSVggc3RhbmRhcmQKKyAqIGludGVyZmFjZSBhdCBhbGwsIHNvIHRoZXJlIGlzIG5vIHBvaW50IGluY2x1ZGluZyB0aGUgY29kZSB0aGF0CisgKiBhdHRlbXB0cyB0byB1c2UgaXQuCisgKi8KKyMgaWZkZWYgUHlTb2NrZXRfQlVJTERJTkdfU09DS0VUCisjICB1bmRlZiBDTVNHX0xFTgorIyBlbmRpZgogIyBpbmNsdWRlIDx3czJ0Y3BpcC5oPgogLyogVkM2IGlzIHNoaXBwZWQgd2l0aCBvbGQgcGxhdGZvcm0gaGVhZGVycywgYW5kIGRvZXMgbm90IGhhdmUgTVNUY3BJUC5oCiAgKiBTZXBhcmF0ZSBTREtzIGhhdmUgYWxsIHRoZSBmdW5jdGlvbnMgd2Ugd2FudCwgYnV0IG9sZGVyIG9uZXMgZG9uJ3QgaGF2ZQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy91bmljb2RlZGF0YS5jIGIvTW9kdWxlcy91bmljb2RlZGF0YS5jCmluZGV4IGVjNzBlN2EuLjUwN2NlZjMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvdW5pY29kZWRhdGEuYworKysgYi9Nb2R1bGVzL3VuaWNvZGVkYXRhLmMKQEAgLTU1MywxMCArNTUzLDE3IEBACiAKICAgICBzdGFja3B0ciA9IDA7CiAgICAgaXNpemUgPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChpbnB1dCk7CisgICAgc3BhY2UgPSBpc2l6ZTsKICAgICAvKiBPdmVyYWxsb2NhdGUgYXQgbW9zdCAxMCBjaGFyYWN0ZXJzLiAqLwotICAgIHNwYWNlID0gKGlzaXplID4gMTAgPyAxMCA6IGlzaXplKSArIGlzaXplOworICAgIGlmIChzcGFjZSA+IDEwKSB7CisgICAgICAgIGlmIChzcGFjZSA8PSBQWV9TU0laRV9UX01BWCAtIDEwKQorICAgICAgICAgICAgc3BhY2UgKz0gMTA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzcGFjZSAqPSAyOworICAgIH0KICAgICBvc2l6ZSA9IHNwYWNlOwotICAgIG91dHB1dCA9IFB5TWVtX01hbGxvYyhzcGFjZSAqIHNpemVvZihQeV9VQ1M0KSk7CisgICAgb3V0cHV0ID0gUHlNZW1fTkVXKFB5X1VDUzQsIHNwYWNlKTsKICAgICBpZiAoIW91dHB1dCkgewogICAgICAgICBQeUVycl9Ob01lbW9yeSgpOwogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTcwMyw3ICs3MTAsNyBAQAogICAgIC8qIFdlIGFsbG9jYXRlIGEgYnVmZmVyIGZvciB0aGUgb3V0cHV0LgogICAgICAgIElmIHdlIGZpbmQgdGhhdCB3ZSBtYWRlIG5vIGNoYW5nZXMsIHdlIHN0aWxsIHJldHVybgogICAgICAgIHRoZSBORkQgcmVzdWx0LiAqLwotICAgIG91dHB1dCA9IFB5TWVtX01hbGxvYyhsZW4gKiBzaXplb2YoUHlfVUNTNCkpOworICAgIG91dHB1dCA9IFB5TWVtX05FVyhQeV9VQ1M0LCBsZW4pOwogICAgIGlmICghb3V0cHV0KSB7CiAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CiAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy96aXBpbXBvcnQuYyBiL01vZHVsZXMvemlwaW1wb3J0LmMKaW5kZXggOGZlOTE5NS4uZjJjYzI0NSAxMDA2NDQKLS0tIGEvTW9kdWxlcy96aXBpbXBvcnQuYworKysgYi9Nb2R1bGVzL3ppcGltcG9ydC5jCkBAIC0yMzMsNyArMjMzLDcgQEAKICAgICBQeV9zc2l6ZV90IGxlbjsKIAogICAgIGxlbiA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHByZWZpeCkgKyBQeVVuaWNvZGVfR0VUX0xFTkdUSChuYW1lKSArIDE7Ci0gICAgcCA9IGJ1ZiA9IFB5TWVtX01hbGxvYyhzaXplb2YoUHlfVUNTNCkgKiBsZW4pOworICAgIHAgPSBidWYgPSBQeU1lbV9OZXcoUHlfVUNTNCwgbGVuKTsKICAgICBpZiAoYnVmID09IE5VTEwpIHsKICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9PYmplY3RzL2Fic3RyYWN0LmMgYi9PYmplY3RzL2Fic3RyYWN0LmMKaW5kZXggMDZlMzM4Mi4uYWIxMzQ3NiAxMDA2NDQKLS0tIGEvT2JqZWN0cy9hYnN0cmFjdC5jCisrKyBiL09iamVjdHMvYWJzdHJhY3QuYwpAQCAtMjA3MywzNyArMjA3Myw3MCBAQAogICAgIHJldHVybiBQeUV2YWxfQ2FsbE9iamVjdFdpdGhLZXl3b3JkcyhvLCBhLCBOVUxMKTsKIH0KIAorUHlPYmplY3QqCitfUHlfQ2hlY2tGdW5jdGlvblJlc3VsdChQeU9iamVjdCAqcmVzdWx0LCBjb25zdCBjaGFyICpmdW5jX25hbWUpCit7CisgICAgaW50IGVycl9vY2N1cnJlZCA9IChQeUVycl9PY2N1cnJlZCgpICE9IE5VTEwpOworCisjaWZkZWYgTkRFQlVHCisgICAgLyogSW4gZGVidWcgbW9kZTogYWJvcnQoKSB3aXRoIGFuIGFzc2VydGlvbiBlcnJvci4gVXNlIHR3byBkaWZmZXJlbnQKKyAgICAgICBhc3NlcnRpb25zLCBzbyBpZiBhbiBhc3NlcnRpb24gZmFpbHMsIGl0J3MgcG9zc2libGUgdG8ga25vdworICAgICAgIGlmIHJlc3VsdCB3YXMgc2V0IG9yIG5vdCBhbmQgaWYgYW4gZXhjZXB0aW9uIHdhcyByYWlzZWQgb3Igbm90LiAqLworICAgIGlmIChyZXN1bHQgIT0gTlVMTCkKKyAgICAgICAgYXNzZXJ0KCFlcnJfb2NjdXJyZWQpOworICAgIGVsc2UKKyAgICAgICAgYXNzZXJ0KGVycl9vY2N1cnJlZCk7CisjZW5kaWYKKworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICBpZiAoIWVycl9vY2N1cnJlZCkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJOVUxMIHJlc3VsdCB3aXRob3V0IGVycm9yIGluICVzIiwgZnVuY19uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoZXJyX29jY3VycmVkKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqZXhjLCAqdmFsLCAqdGI7CisgICAgICAgICAgICBQeUVycl9GZXRjaCgmZXhjLCAmdmFsLCAmdGIpOworCisgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJyZXN1bHQgd2l0aCBlcnJvciBpbiAlcyIsIGZ1bmNfbmFtZSk7CisgICAgICAgICAgICBfUHlFcnJfQ2hhaW5FeGNlcHRpb25zKGV4YywgdmFsLCB0Yik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCiBQeU9iamVjdCAqCiBQeU9iamVjdF9DYWxsKFB5T2JqZWN0ICpmdW5jLCBQeU9iamVjdCAqYXJnLCBQeU9iamVjdCAqa3cpCiB7CiAgICAgdGVybmFyeWZ1bmMgY2FsbDsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCiAgICAgLyogUHlPYmplY3RfQ2FsbCgpIG11c3Qgbm90IGJlIGNhbGxlZCB3aXRoIGFuIGV4Y2VwdGlvbiBzZXQsCiAgICAgICAgYmVjYXVzZSBpdCBtYXkgY2xlYXIgaXQgKGRpcmVjdGx5IG9yIGluZGlyZWN0bHkpIGFuZCBzbyB0aGUKICAgICAgICBjYWxsZXIgbG9vc2VzIGl0cyBleGNlcHRpb24gKi8KICAgICBhc3NlcnQoIVB5RXJyX09jY3VycmVkKCkpOwogCi0gICAgaWYgKChjYWxsID0gZnVuYy0+b2JfdHlwZS0+dHBfY2FsbCkgIT0gTlVMTCkgewotICAgICAgICBQeU9iamVjdCAqcmVzdWx0OwotICAgICAgICBpZiAoUHlfRW50ZXJSZWN1cnNpdmVDYWxsKCIgd2hpbGUgY2FsbGluZyBhIFB5dGhvbiBvYmplY3QiKSkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICByZXN1bHQgPSAoKmNhbGwpKGZ1bmMsIGFyZywga3cpOwotICAgICAgICBQeV9MZWF2ZVJlY3Vyc2l2ZUNhbGwoKTsKLSNpZmRlZiBOREVCVUcKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMICYmICFQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgUHlFeGNfU3lzdGVtRXJyb3IsCi0gICAgICAgICAgICAgICAgIk5VTEwgcmVzdWx0IHdpdGhvdXQgZXJyb3IgaW4gUHlPYmplY3RfQ2FsbCIpOwotICAgICAgICB9Ci0jZWxzZQotICAgICAgICBhc3NlcnQoKHJlc3VsdCAhPSBOVUxMICYmICFQeUVycl9PY2N1cnJlZCgpKQotICAgICAgICAgICAgICAgIHx8IChyZXN1bHQgPT0gTlVMTCAmJiBQeUVycl9PY2N1cnJlZCgpKSk7Ci0jZW5kaWYKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICBjYWxsID0gZnVuYy0+b2JfdHlwZS0+dHBfY2FsbDsKKyAgICBpZiAoY2FsbCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICInJS4yMDBzJyBvYmplY3QgaXMgbm90IGNhbGxhYmxlIiwKKyAgICAgICAgICAgICAgICAgICAgIGZ1bmMtPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIiclLjIwMHMnIG9iamVjdCBpcyBub3QgY2FsbGFibGUiLAotICAgICAgICAgICAgICAgICBmdW5jLT5vYl90eXBlLT50cF9uYW1lKTsKLSAgICByZXR1cm4gTlVMTDsKKworICAgIGlmIChQeV9FbnRlclJlY3Vyc2l2ZUNhbGwoIiB3aGlsZSBjYWxsaW5nIGEgUHl0aG9uIG9iamVjdCIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJlc3VsdCA9ICgqY2FsbCkoZnVuYywgYXJnLCBrdyk7CisKKyAgICBQeV9MZWF2ZVJlY3Vyc2l2ZUNhbGwoKTsKKworICAgIHJldHVybiBfUHlfQ2hlY2tGdW5jdGlvblJlc3VsdChyZXN1bHQsICJQeU9iamVjdF9DYWxsIik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKZGlmZiAtLWdpdCBhL09iamVjdHMvYnl0ZXNvYmplY3QuYyBiL09iamVjdHMvYnl0ZXNvYmplY3QuYwppbmRleCBiMmJmMDk4Li5iMDE1OTc0IDEwMDY0NAotLS0gYS9PYmplY3RzL2J5dGVzb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9ieXRlc29iamVjdC5jCkBAIC00MzMsMTA1ICs0MzMsNDYgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi0vKiBmb3JtYXRfbG9uZyBlbXVsYXRlcyB0aGUgZm9ybWF0IGNvZGVzIGQsIHUsIG8sIHggYW5kIFgsIGFuZAotICogdGhlIEZfQUxUIGZsYWcsIGZvciBQeXRob24ncyBsb25nICh1bmJvdW5kZWQpIGludHMuICBJdCdzIG5vdCB1c2VkIGZvcgotICogUHl0aG9uJ3MgcmVndWxhciBpbnRzLgotICogUmV0dXJuIHZhbHVlOiAgYSBuZXcgUHlCeXRlcyosIG9yIE5VTEwgaWYgZXJyb3IuCi0gKiAgLiAgKnBidWYgaXMgc2V0IHRvIHBvaW50IGludG8gaXQsCi0gKiAgICAgKnBsZW4gc2V0IHRvIHRoZSAjIG9mIGNoYXJzIGZvbGxvd2luZyB0aGF0LgotICogICAgIENhbGxlciBtdXN0IGRlY3JlZiBpdCB3aGVuIGRvbmUgdXNpbmcgcGJ1Zi4KLSAqICAgICBUaGUgc3RyaW5nIHN0YXJ0aW5nIGF0ICpwYnVmIGlzIG9mIHRoZSBmb3JtCi0gKiAgICAgICAgICItIj8gKCIweCIgfCAiMFgiKT8gZGlnaXQrCi0gKiAgICAgIjB4Ii8iMFgiIGFyZSBwcmVzZW50IG9ubHkgZm9yIHggYW5kIFggY29udmVyc2lvbnMsIHdpdGggRl9BTFQKLSAqICAgICAgICAgc2V0IGluIGZsYWdzLiAgVGhlIGNhc2Ugb2YgaGV4IGRpZ2l0cyB3aWxsIGJlIGNvcnJlY3QsCi0gKiAgICAgVGhlcmUgd2lsbCBiZSBhdCBsZWFzdCBwcmVjIGRpZ2l0cywgemVyby1maWxsZWQgb24gdGhlIGxlZnQgaWYKLSAqICAgICAgICAgbmVjZXNzYXJ5IHRvIGdldCB0aGF0IG1hbnkuCi0gKiB2YWwgICAgICAgICAgb2JqZWN0IHRvIGJlIGNvbnZlcnRlZAotICogZmxhZ3MgICAgICAgIGJpdG1hc2sgb2YgZm9ybWF0IGZsYWdzOyBvbmx5IEZfQUxUIGlzIGxvb2tlZCBhdAotICogcHJlYyAgICAgICAgIG1pbmltdW0gbnVtYmVyIG9mIGRpZ2l0czsgMC1maWxsIG9uIGxlZnQgaWYgbmVlZGVkCi0gKiB0eXBlICAgICAgICAgYSBjaGFyYWN0ZXIgaW4gW2R1b3hYXTsgdSBhY3RzIHRoZSBzYW1lIGFzIGQKLSAqCi0gKiBDQVVUSU9OOiAgbywgeCBhbmQgWCBjb252ZXJzaW9ucyBvbiByZWd1bGFyIGludHMgY2FuIG5ldmVyCi0gKiBwcm9kdWNlIGEgJy0nIHNpZ24sIGJ1dCBjYW4gZm9yIFB5dGhvbidzIHVuYm91bmRlZCBpbnRzLgotICovCi0KLXN0YXRpYyBQeU9iamVjdCAqCi1mb3JtYXRfbG9uZyhQeU9iamVjdCAqdmFsLCBpbnQgZmxhZ3MsIGludCBwcmVjLCBpbnQgdHlwZSwKLQkgICAgY2hhciAqKnBidWYsIGludCAqcGxlbikKLXsKLSAgICBQeU9iamVjdCAqczsKLSAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKLQotICAgIHMgPSBfUHlVbmljb2RlX0Zvcm1hdExvbmcodmFsLCBmbGFncyAmIEZfQUxULCBwcmVjLCB0eXBlKTsKLSAgICBpZiAoIXMpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHJlc3VsdCA9IF9QeVVuaWNvZGVfQXNBU0NJSVN0cmluZyhzLCAic3RyaWN0Iik7Ci0gICAgUHlfREVDUkVGKHMpOwotICAgIGlmICghcmVzdWx0KQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAqcGJ1ZiA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHJlc3VsdCk7Ci0gICAgKnBsZW4gPSBQeUJ5dGVzX0dFVF9TSVpFKHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQogUHlfTE9DQUxfSU5MSU5FKGludCkKLWZvcm1hdGNoYXIoY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuLCBQeU9iamVjdCAqdikKK2J5dGVfY29udmVydGVyKFB5T2JqZWN0ICphcmcsIGNoYXIgKnApCiB7Ci0gICAgUHlPYmplY3QgKncgPSBOVUxMOwotICAgIC8qIGNvbnZlcnQgYnl0ZWFycmF5IHRvIGJ5dGVzICovCi0gICAgaWYgKFB5Qnl0ZUFycmF5X0NoZWNrKHYpKSB7Ci0gICAgICAgIHcgPSBQeUJ5dGVzX0Zyb21PYmplY3Qodik7Ci0gICAgICAgIGlmICh3ID09IE5VTEwpCi0gICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICB2ID0gdzsKKyAgICBpZiAoUHlCeXRlc19DaGVjayhhcmcpICYmIFB5Qnl0ZXNfU2l6ZShhcmcpID09IDEpIHsKKyAgICAgICAgKnAgPSBQeUJ5dGVzX0FTX1NUUklORyhhcmcpWzBdOworICAgICAgICByZXR1cm4gMTsKICAgICB9Ci0gICAgLyogcHJlc3VtZSB0aGF0IHRoZSBidWZmZXIgaXMgYXQgbGVhc3QgMiBjaGFyYWN0ZXJzIGxvbmcgKi8KLSAgICBpZiAoUHlCeXRlc19DaGVjayh2KSkgewotICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKHYsICJjOyVjIHJlcXVpcmVzIGFuIGludGVnZXIgaW4gcmFuZ2UoMjU2KSBvciBhIHNpbmdsZSBieXRlIiwgJmJ1ZlswXSkpCi0gICAgICAgICAgICBnb3RvIGVycm9yOworICAgIGVsc2UgaWYgKFB5Qnl0ZUFycmF5X0NoZWNrKGFyZykgJiYgUHlCeXRlQXJyYXlfU2l6ZShhcmcpID09IDEpIHsKKyAgICAgICAgKnAgPSBQeUJ5dGVBcnJheV9BU19TVFJJTkcoYXJnKVswXTsKKyAgICAgICAgcmV0dXJuIDE7CiAgICAgfQogICAgIGVsc2UgewotICAgICAgICBsb25nIGl2YWwgPSBQeUxvbmdfQXNMb25nKHYpOwotICAgICAgICBpZiAoaXZhbCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICIlYyByZXF1aXJlcyBhbiBpbnRlZ2VyIGluIHJhbmdlKDI1Nikgb3IgYSBzaW5nbGUgYnl0ZSIpOwotICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgbG9uZyBpdmFsID0gUHlMb25nX0FzTG9uZyhhcmcpOworICAgICAgICBpZiAoMCA8PSBpdmFsICYmIGl2YWwgPD0gMjU1KSB7CisgICAgICAgICAgICAqcCA9IChjaGFyKWl2YWw7CisgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgfQotICAgICAgICBpZiAoaXZhbCA8IDAgfHwgaXZhbCA+IDI1NSkgewotICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAiJWMgcmVxdWlyZXMgYW4gaW50ZWdlciBpbiByYW5nZSgyNTYpIG9yIGEgc2luZ2xlIGJ5dGUiKTsKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIH0KLSAgICAgICAgYnVmWzBdID0gKGNoYXIpaXZhbDsKICAgICB9Ci0gICAgUHlfWERFQ1JFRih3KTsKLSAgICBidWZbMV0gPSAnXDAnOwotICAgIHJldHVybiAxOwotCi0gZXJyb3I6Ci0gICAgUHlfWERFQ1JFRih3KTsKLSAgICByZXR1cm4gLTE7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgIiVjIHJlcXVpcmVzIGFuIGludGVnZXIgaW4gcmFuZ2UoMjU2KSBvciBhIHNpbmdsZSBieXRlIik7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1mb3JtYXRfb2JqKFB5T2JqZWN0ICp2KQorZm9ybWF0X29iaihQeU9iamVjdCAqdiwgY29uc3QgY2hhciAqKnBidWYsIFB5X3NzaXplX3QgKnBsZW4pCiB7Ci0gICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEwsICp3ID0gTlVMTDsKLSAgICBQeU9iamVjdCAqZnVuYzsKKyAgICBQeU9iamVjdCAqZnVuYywgKnJlc3VsdDsKICAgICBfUHlfSURFTlRJRklFUihfX2J5dGVzX18pOwotICAgIC8qIGNvbnZlcnQgYnl0ZWFycmF5IHRvIGJ5dGVzICovCi0gICAgaWYgKFB5Qnl0ZUFycmF5X0NoZWNrKHYpKSB7Ci0gICAgICAgIHcgPSBQeUJ5dGVzX0Zyb21PYmplY3Qodik7Ci0gICAgICAgIGlmICh3ID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgdiA9IHc7Ci0gICAgfQogICAgIC8qIGlzIGl0IGEgYnl0ZXMgb2JqZWN0PyAqLwogICAgIGlmIChQeUJ5dGVzX0NoZWNrKHYpKSB7Ci0gICAgICAgIHJlc3VsdCA9IHY7CisgICAgICAgICpwYnVmID0gUHlCeXRlc19BU19TVFJJTkcodik7CisgICAgICAgICpwbGVuID0gUHlCeXRlc19HRVRfU0laRSh2KTsKICAgICAgICAgUHlfSU5DUkVGKHYpOwotICAgICAgICBQeV9YREVDUkVGKHcpOwotICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICByZXR1cm4gdjsKKyAgICB9CisgICAgaWYgKFB5Qnl0ZUFycmF5X0NoZWNrKHYpKSB7CisgICAgICAgICpwYnVmID0gUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHYpOworICAgICAgICAqcGxlbiA9IFB5Qnl0ZUFycmF5X0dFVF9TSVpFKHYpOworICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgIHJldHVybiB2OwogICAgIH0KICAgICAvKiBkb2VzIGl0IHN1cHBvcnQgX19ieXRlc19fPyAqLwogICAgIGZ1bmMgPSBfUHlPYmplY3RfTG9va3VwU3BlY2lhbCh2LCAmUHlJZF9fX2J5dGVzX18pOwpAQCAtNTQ3LDYgKzQ4OCw4IEBACiAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CisgICAgICAgICpwYnVmID0gUHlCeXRlc19BU19TVFJJTkcocmVzdWx0KTsKKyAgICAgICAgKnBsZW4gPSBQeUJ5dGVzX0dFVF9TSVpFKHJlc3VsdCk7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCkBAIC01NzMsNyArNTE2LDYgQEAKICAgICBQeV9zc2l6ZV90IHJlc2xlbiwgcmVzY250LCBmbXRjbnQ7CiAgICAgaW50IGFyZ3Nfb3duZWQgPSAwOwogICAgIFB5T2JqZWN0ICpyZXN1bHQ7Ci0gICAgUHlPYmplY3QgKnJlcHI7CiAgICAgUHlPYmplY3QgKmRpY3QgPSBOVUxMOwogICAgIGlmIChmb3JtYXQgPT0gTlVMTCB8fCAhUHlCeXRlc19DaGVjayhmb3JtYXQpIHx8IGFyZ3MgPT0gTlVMTCkgewogICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKQEAgLTYxOSwxNSArNTYxLDEzIEBACiAgICAgICAgICAgICBpbnQgcHJlYyA9IC0xOwogICAgICAgICAgICAgaW50IGMgPSAnXDAnOwogICAgICAgICAgICAgaW50IGZpbGw7Ci0gICAgICAgICAgICBpbnQgaXNudW1vazsKKyAgICAgICAgICAgIFB5T2JqZWN0ICppb2JqOwogICAgICAgICAgICAgUHlPYmplY3QgKnYgPSBOVUxMOwogICAgICAgICAgICAgUHlPYmplY3QgKnRlbXAgPSBOVUxMOwotICAgICAgICAgICAgUHlfYnVmZmVyIGJ1ZiA9IHtOVUxMLCBOVUxMfTsKLSAgICAgICAgICAgIGNoYXIgKnBidWY7CisgICAgICAgICAgICBjb25zdCBjaGFyICpwYnVmID0gTlVMTDsKICAgICAgICAgICAgIGludCBzaWduOwotICAgICAgICAgICAgUHlfc3NpemVfdCBsZW47Ci0gICAgICAgICAgICBjaGFyIGZvcm1hdGJ1ZltGT1JNQVRCVUZMRU5dOwotICAgICAgICAgICAgICAgICAvKiBGb3IgZm9ybWF0e2ludCxjaGFyfSgpICovCisgICAgICAgICAgICBQeV9zc2l6ZV90IGxlbiA9IDA7CisgICAgICAgICAgICBjaGFyIG9uZWNoYXI7IC8qIEZvciBieXRlX2NvbnZlcnRlcigpICovCiAKICAgICAgICAgICAgIGZtdCsrOwogICAgICAgICAgICAgaWYgKCpmbXQgPT0gJygnKSB7CkBAIC03MzMsNyArNjczLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKiB3YW50cyBpbnQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcHJlYyA9IFB5TG9uZ19Bc1NzaXplX3Qodik7CisgICAgICAgICAgICAgICAgICAgIHByZWMgPSBfUHlMb25nX0FzSW50KHYpOwogICAgICAgICAgICAgICAgICAgICBpZiAocHJlYyA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWMgPCAwKQpAQCAtNzgxLDM3ICs3MjEsMjEgQEAKICAgICAgICAgICAgICAgICBsZW4gPSAxOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAnYSc6Ci0gICAgICAgICAgICAgICAgdGVtcCA9IFB5T2JqZWN0X1JlcHIodik7CisgICAgICAgICAgICAgICAgdGVtcCA9IFB5T2JqZWN0X0FTQ0lJKHYpOwogICAgICAgICAgICAgICAgIGlmICh0ZW1wID09IE5VTEwpCiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICAgICAgcmVwciA9IFB5VW5pY29kZV9Bc0VuY29kZWRPYmplY3QodGVtcCwgImFzY2lpIiwgImJhY2tzbGFzaHJlcGxhY2UiKTsKLSAgICAgICAgICAgICAgICBpZiAocmVwciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih0ZW1wKTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcihyZXByLCAmYnVmLCBQeUJVRl9TSU1QTEUpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdGVtcCA9IGZvcm1hdF9vYmoocmVwcik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXByKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlcHIpOwotICAgICAgICAgICAgICAgICAgICByZXByID0gdGVtcDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcGJ1ZiA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHJlcHIpOwotICAgICAgICAgICAgICAgIGxlbiA9IFB5Qnl0ZXNfR0VUX1NJWkUocmVwcik7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlcHIpOworICAgICAgICAgICAgICAgIGFzc2VydChQeVVuaWNvZGVfSVNfQVNDSUkodGVtcCkpOworICAgICAgICAgICAgICAgIHBidWYgPSAoY29uc3QgY2hhciAqKVB5VW5pY29kZV8xQllURV9EQVRBKHRlbXApOworICAgICAgICAgICAgICAgIGxlbiA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHRlbXApOwogICAgICAgICAgICAgICAgIGlmIChwcmVjID49IDAgJiYgbGVuID4gcHJlYykKICAgICAgICAgICAgICAgICAgICAgbGVuID0gcHJlYzsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgJ3MnOgogICAgICAgICAgICAgICAgIC8vICVzIGlzIG9ubHkgZm9yIDIvMyBjb2RlOyAzIG9ubHkgY29kZSBzaG91bGQgdXNlICViCiAgICAgICAgICAgICBjYXNlICdiJzoKLSAgICAgICAgICAgICAgICB0ZW1wID0gZm9ybWF0X29iaih2KTsKKyAgICAgICAgICAgICAgICB0ZW1wID0gZm9ybWF0X29iaih2LCAmcGJ1ZiwgJmxlbik7CiAgICAgICAgICAgICAgICAgaWYgKHRlbXAgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgICAgICBwYnVmID0gUHlCeXRlc19BU19TVFJJTkcodGVtcCk7Ci0gICAgICAgICAgICAgICAgbGVuID0gUHlCeXRlc19HRVRfU0laRSh0ZW1wKTsKICAgICAgICAgICAgICAgICBpZiAocHJlYyA+PSAwICYmIGxlbiA+IHByZWMpCiAgICAgICAgICAgICAgICAgICAgIGxlbiA9IHByZWM7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC04MjMsNDEgKzc0NywzMiBAQAogICAgICAgICAgICAgY2FzZSAnWCc6CiAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJ2knKQogICAgICAgICAgICAgICAgICAgICBjID0gJ2QnOwotICAgICAgICAgICAgICAgIGlzbnVtb2sgPSAwOworICAgICAgICAgICAgICAgIGlvYmogPSBOVUxMOwogICAgICAgICAgICAgICAgIGlmIChQeU51bWJlcl9DaGVjayh2KSkgewotICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqaW9iaj1OVUxMOwotCiAgICAgICAgICAgICAgICAgICAgIGlmICgoUHlMb25nX0NoZWNrKHYpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgaW9iaiA9IHY7CiAgICAgICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYoaW9iaik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpb2JqID0gUHlOdW1iZXJfTG9uZyh2KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoaW9iaiE9TlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFB5TG9uZ19DaGVjayhpb2JqKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbGVuOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNudW1vayA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9IGZvcm1hdF9sb25nKGlvYmosIGZsYWdzLCBwcmVjLCBjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBidWYsICZpbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaW9iaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0ZW1wKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IGlsZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbiA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaW9iaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW9iaiAhPSBOVUxMICYmICFQeUxvbmdfQ2hlY2soaW9iaikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfQ0xFQVIoaW9iaik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFpc251bW9rKSB7CisgICAgICAgICAgICAgICAgaWYgKGlvYmogPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgIiUlJWMgZm9ybWF0OiBhIG51bWJlciBpcyByZXF1aXJlZCwgIgogICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCAlLjIwMHMiLCBjLCBQeV9UWVBFKHYpLT50cF9uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGVtcCA9IF9QeVVuaWNvZGVfRm9ybWF0TG9uZyhpb2JqLCBmbGFncyAmIEZfQUxULCBwcmVjLCBjKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaW9iaik7CisgICAgICAgICAgICAgICAgaWYgKCF0ZW1wKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIGFzc2VydChQeVVuaWNvZGVfSVNfQVNDSUkodGVtcCkpOworICAgICAgICAgICAgICAgIHBidWYgPSAoY29uc3QgY2hhciAqKVB5VW5pY29kZV8xQllURV9EQVRBKHRlbXApOworICAgICAgICAgICAgICAgIGxlbiA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHRlbXApOworICAgICAgICAgICAgICAgIHNpZ24gPSAxOwogICAgICAgICAgICAgICAgIGlmIChmbGFncyAmIEZfWkVSTykKICAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICcwJzsKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTg3Nyw5ICs3OTIsOSBAQAogICAgICAgICAgICAgICAgICAgICBmaWxsID0gJzAnOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAnYyc6Ci0gICAgICAgICAgICAgICAgcGJ1ZiA9IGZvcm1hdGJ1ZjsKLSAgICAgICAgICAgICAgICBsZW4gPSBmb3JtYXRjaGFyKHBidWYsIHNpemVvZihmb3JtYXRidWYpLCB2KTsKLSAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkKKyAgICAgICAgICAgICAgICBwYnVmID0gJm9uZWNoYXI7CisgICAgICAgICAgICAgICAgbGVuID0gYnl0ZV9jb252ZXJ0ZXIodiwgJm9uZWNoYXIpOworICAgICAgICAgICAgICAgIGlmICghbGVuKQogICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKQEAgLTkxMSwxMiArODI2LDEwIEBACiAgICAgICAgICAgICAgICAgcmVzbGVuICs9IHJlc2NudDsKICAgICAgICAgICAgICAgICBpZiAocmVzbGVuIDwgMCkgewogICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmYnVmKTsKICAgICAgICAgICAgICAgICAgICAgUHlfWERFQ1JFRih0ZW1wKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChfUHlCeXRlc19SZXNpemUoJnJlc3VsdCwgcmVzbGVuKSkgewotICAgICAgICAgICAgICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZidWYpOwogICAgICAgICAgICAgICAgICAgICBQeV9YREVDUkVGKHRlbXApOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgICB9CkBAIC05NzAsMTEgKzg4Myw5IEBACiAgICAgICAgICAgICBpZiAoZGljdCAmJiAoYXJnaWR4IDwgYXJnbGVuKSAmJiBjICE9ICclJykgewogICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90IGFsbCBhcmd1bWVudHMgY29udmVydGVkIGR1cmluZyBieXRlcyBmb3JtYXR0aW5nIik7Ci0gICAgICAgICAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmYnVmKTsKICAgICAgICAgICAgICAgICBQeV9YREVDUkVGKHRlbXApOwogICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZidWYpOwogICAgICAgICAgICAgUHlfWERFQ1JFRih0ZW1wKTsKICAgICAgICAgfSAvKiAnJScgKi8KICAgICB9IC8qIHVudGlsIGVuZCAqLwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9mbG9hdG9iamVjdC5jIGIvT2JqZWN0cy9mbG9hdG9iamVjdC5jCmluZGV4IDhkODUxMjEuLjFkMzY5ZjkgMTAwNjQ0Ci0tLSBhL09iamVjdHMvZmxvYXRvYmplY3QuYworKysgYi9PYmplY3RzL2Zsb2F0b2JqZWN0LmMKQEAgLTIyMCw2ICsyMjAsNyBAQAogICAgIGlmIChmbyA9PSBOVUxMKQogICAgICAgICByZXR1cm4gLTE7CiAgICAgaWYgKCFQeUZsb2F0X0NoZWNrKGZvKSkgeworICAgICAgICBQeV9ERUNSRUYoZm8pOwogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgIm5iX2Zsb2F0IHNob3VsZCByZXR1cm4gZmxvYXQgb2JqZWN0Iik7CiAgICAgICAgIHJldHVybiAtMTsKZGlmZiAtLWdpdCBhL09iamVjdHMvbGlzdG9iamVjdC5jIGIvT2JqZWN0cy9saXN0b2JqZWN0LmMKaW5kZXggZTdjNGM4Mi4uOGY4OGQxOCAxMDA2NDQKLS0tIGEvT2JqZWN0cy9saXN0b2JqZWN0LmMKKysrIGIvT2JqZWN0cy9saXN0b2JqZWN0LmMKQEAgLTE4MzIsNyArMTgzMiw4IEBACiAgICAgYXNzZXJ0KG1zKTsKICAgICB3aGlsZSAobXMtPm4gPiAxKSB7CiAgICAgICAgIFB5X3NzaXplX3QgbiA9IG1zLT5uIC0gMjsKLSAgICAgICAgaWYgKG4gPiAwICYmIHBbbi0xXS5sZW4gPD0gcFtuXS5sZW4gKyBwW24rMV0ubGVuKSB7CisgICAgICAgIGlmICgobiA+IDAgJiYgcFtuLTFdLmxlbiA8PSBwW25dLmxlbiArIHBbbisxXS5sZW4pIHx8CisgICAgICAgICAgICAobiA+IDEgJiYgcFtuLTJdLmxlbiA8PSBwW24tMV0ubGVuICsgcFtuXS5sZW4pKSB7CiAgICAgICAgICAgICBpZiAocFtuLTFdLmxlbiA8IHBbbisxXS5sZW4pCiAgICAgICAgICAgICAgICAgLS1uOwogICAgICAgICAgICAgaWYgKG1lcmdlX2F0KG1zLCBuKSA8IDApCmRpZmYgLS1naXQgYS9PYmplY3RzL21ldGhvZG9iamVjdC5jIGIvT2JqZWN0cy9tZXRob2RvYmplY3QuYwppbmRleCA2ODZiYWY5Li44NWI0MTNmIDEwMDY0NAotLS0gYS9PYmplY3RzL21ldGhvZG9iamVjdC5jCisrKyBiL09iamVjdHMvbWV0aG9kb2JqZWN0LmMKQEAgLTc4LDY4ICs3OCw3MSBAQAogfQogCiBQeU9iamVjdCAqCi1QeUNGdW5jdGlvbl9DYWxsKFB5T2JqZWN0ICpmdW5jLCBQeU9iamVjdCAqYXJnLCBQeU9iamVjdCAqa3cpCitQeUNGdW5jdGlvbl9DYWxsKFB5T2JqZWN0ICpmdW5jLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0jZGVmaW5lIENIRUNLX1JFU1VMVChyZXMpIGFzc2VydChyZXMgIT0gTlVMTCB8fCBQeUVycl9PY2N1cnJlZCgpKQotCiAgICAgUHlDRnVuY3Rpb25PYmplY3QqIGYgPSAoUHlDRnVuY3Rpb25PYmplY3QqKWZ1bmM7CiAgICAgUHlDRnVuY3Rpb24gbWV0aCA9IFB5Q0Z1bmN0aW9uX0dFVF9GVU5DVElPTihmdW5jKTsKICAgICBQeU9iamVjdCAqc2VsZiA9IFB5Q0Z1bmN0aW9uX0dFVF9TRUxGKGZ1bmMpOwotICAgIFB5T2JqZWN0ICpyZXM7CisgICAgUHlPYmplY3QgKmFyZywgKnJlczsKICAgICBQeV9zc2l6ZV90IHNpemU7CisgICAgaW50IGZsYWdzOwogCi0gICAgc3dpdGNoIChQeUNGdW5jdGlvbl9HRVRfRkxBR1MoZnVuYykgJiB+KE1FVEhfQ0xBU1MgfCBNRVRIX1NUQVRJQyB8IE1FVEhfQ09FWElTVCkpIHsKLSAgICBjYXNlIE1FVEhfVkFSQVJHUzoKLSAgICAgICAgaWYgKGt3ID09IE5VTEwgfHwgUHlEaWN0X1NpemUoa3cpID09IDApIHsKLSAgICAgICAgICAgIHJlcyA9ICgqbWV0aCkoc2VsZiwgYXJnKTsKLSAgICAgICAgICAgIENIRUNLX1JFU1VMVChyZXMpOwotICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFM6Ci0gICAgICAgIHJlcyA9ICgqKFB5Q0Z1bmN0aW9uV2l0aEtleXdvcmRzKW1ldGgpKHNlbGYsIGFyZywga3cpOwotICAgICAgICBDSEVDS19SRVNVTFQocmVzKTsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICBjYXNlIE1FVEhfTk9BUkdTOgotICAgICAgICBpZiAoa3cgPT0gTlVMTCB8fCBQeURpY3RfU2l6ZShrdykgPT0gMCkgewotICAgICAgICAgICAgc2l6ZSA9IFB5VHVwbGVfR0VUX1NJWkUoYXJnKTsKLSAgICAgICAgICAgIGlmIChzaXplID09IDApIHsKLSAgICAgICAgICAgICAgICByZXMgPSAoKm1ldGgpKHNlbGYsIE5VTEwpOwotICAgICAgICAgICAgICAgIENIRUNLX1JFU1VMVChyZXMpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICIlLjIwMHMoKSB0YWtlcyBubyBhcmd1bWVudHMgKCV6ZCBnaXZlbikiLAotICAgICAgICAgICAgICAgIGYtPm1fbWwtPm1sX25hbWUsIHNpemUpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNRVRIX086Ci0gICAgICAgIGlmIChrdyA9PSBOVUxMIHx8IFB5RGljdF9TaXplKGt3KSA9PSAwKSB7Ci0gICAgICAgICAgICBzaXplID0gUHlUdXBsZV9HRVRfU0laRShhcmcpOwotICAgICAgICAgICAgaWYgKHNpemUgPT0gMSkgewotICAgICAgICAgICAgICAgIHJlcyA9ICgqbWV0aCkoc2VsZiwgUHlUdXBsZV9HRVRfSVRFTShhcmcsIDApKTsKLSAgICAgICAgICAgICAgICBDSEVDS19SRVNVTFQocmVzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAiJS4yMDBzKCkgdGFrZXMgZXhhY3RseSBvbmUgYXJndW1lbnQgKCV6ZCBnaXZlbikiLAotICAgICAgICAgICAgICAgIGYtPm1fbWwtPm1sX25hbWUsIHNpemUpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLCAiQmFkIGNhbGwgZmxhZ3MgaW4gIgotICAgICAgICAgICAgICAgICAgICAgICAgIlB5Q0Z1bmN0aW9uX0NhbGwuIE1FVEhfT0xEQVJHUyBpcyBubyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAibG9uZ2VyIHN1cHBvcnRlZCEiKTsKKyAgICAvKiBQeUNGdW5jdGlvbl9DYWxsKCkgbXVzdCBub3QgYmUgY2FsbGVkIHdpdGggYW4gZXhjZXB0aW9uIHNldCwKKyAgICAgICBiZWNhdXNlIGl0IG1heSBjbGVhciBpdCAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkgYW5kIHNvIHRoZQorICAgICAgIGNhbGxlciBsb29zZXMgaXRzIGV4Y2VwdGlvbiAqLworICAgIGFzc2VydCghUHlFcnJfT2NjdXJyZWQoKSk7CiAKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZmxhZ3MgPSBQeUNGdW5jdGlvbl9HRVRfRkxBR1MoZnVuYykgJiB+KE1FVEhfQ0xBU1MgfCBNRVRIX1NUQVRJQyB8IE1FVEhfQ09FWElTVCk7CisKKyAgICBpZiAoZmxhZ3MgPT0gKE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMpKSB7CisgICAgICAgIHJlcyA9ICgqKFB5Q0Z1bmN0aW9uV2l0aEtleXdvcmRzKW1ldGgpKHNlbGYsIGFyZ3MsIGt3ZHMpOwogICAgIH0KLSAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiJS4yMDBzKCkgdGFrZXMgbm8ga2V5d29yZCBhcmd1bWVudHMiLAotICAgICAgICAgICAgICAgICBmLT5tX21sLT5tbF9uYW1lKTsKLSAgICByZXR1cm4gTlVMTDsKKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKGt3ZHMgIT0gTlVMTCAmJiBQeURpY3RfU2l6ZShrd2RzKSAhPSAwKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiJS4yMDBzKCkgdGFrZXMgbm8ga2V5d29yZCBhcmd1bWVudHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGYtPm1fbWwtPm1sX25hbWUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KIAotI3VuZGVmIENIRUNLX1JFU1VMVAorICAgICAgICBzd2l0Y2ggKGZsYWdzKSB7CisgICAgICAgIGNhc2UgTUVUSF9WQVJBUkdTOgorICAgICAgICAgICAgcmVzID0gKCptZXRoKShzZWxmLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTUVUSF9OT0FSR1M6CisgICAgICAgICAgICBzaXplID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKKyAgICAgICAgICAgIGlmIChzaXplICE9IDApIHsKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAiJS4yMDBzKCkgdGFrZXMgbm8gYXJndW1lbnRzICglemQgZ2l2ZW4pIiwKKyAgICAgICAgICAgICAgICAgICAgZi0+bV9tbC0+bWxfbmFtZSwgc2l6ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlcyA9ICgqbWV0aCkoc2VsZiwgTlVMTCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE1FVEhfTzoKKyAgICAgICAgICAgIHNpemUgPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOworICAgICAgICAgICAgaWYgKHNpemUgIT0gMSkgeworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICIlLjIwMHMoKSB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCAoJXpkIGdpdmVuKSIsCisgICAgICAgICAgICAgICAgICAgIGYtPm1fbWwtPm1sX25hbWUsIHNpemUpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhcmcgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOworICAgICAgICAgICAgcmVzID0gKCptZXRoKShzZWxmLCBhcmcpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIGNhbGwgZmxhZ3MgaW4gUHlDRnVuY3Rpb25fQ2FsbC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNRVRIX09MREFSR1MgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCEiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIF9QeV9DaGVja0Z1bmN0aW9uUmVzdWx0KHJlcywgIlB5Q0Z1bmN0aW9uX0NhbGwiKTsKIH0KIAogLyogTWV0aG9kcyAodGhlIHN0YW5kYXJkIGJ1aWx0LWluIG1ldGhvZHMsIHRoYXQgaXMpICovCmRpZmYgLS1naXQgYS9PYmplY3RzL29iamVjdC5jIGIvT2JqZWN0cy9vYmplY3QuYwppbmRleCA0MmNiYmNkLi5jMWQ3YTA1IDEwMDY0NAotLS0gYS9PYmplY3RzL29iamVjdC5jCisrKyBiL09iamVjdHMvb2JqZWN0LmMKQEAgLTE4MjUsOSArMTgyNSw2IEBACiAKICNlbmRpZgogCi0vKiBIYWNrIHRvIGZvcmNlIGxvYWRpbmcgb2YgcHljYXBzdWxlLm8gKi8KLVB5VHlwZU9iamVjdCAqX1B5Q2Fwc3VsZV9oYWNrID0gJlB5Q2Fwc3VsZV9UeXBlOwotCiAKIC8qIEhhY2sgdG8gZm9yY2UgbG9hZGluZyBvZiBhYnN0cmFjdC5vICovCiBQeV9zc2l6ZV90ICgqX1B5X2Fic3RyYWN0X2hhY2spKFB5T2JqZWN0ICopID0gUHlPYmplY3RfU2l6ZTsKZGlmZiAtLWdpdCBhL09iamVjdHMvb2JtYWxsb2MuYyBiL09iamVjdHMvb2JtYWxsb2MuYwppbmRleCBlOTAwY2MzLi43Y2M4ODlmIDEwMDY0NAotLS0gYS9PYmplY3RzL29ibWFsbG9jLmMKKysrIGIvT2JqZWN0cy9vYm1hbGxvYy5jCkBAIC0xMzM5LDcgKzEzMzksNyBAQAogICAgICAgICBwb29sID0gKHBvb2xwKXVzYWJsZV9hcmVuYXMtPnBvb2xfYWRkcmVzczsKICAgICAgICAgYXNzZXJ0KChibG9jayopcG9vbCA8PSAoYmxvY2sqKXVzYWJsZV9hcmVuYXMtPmFkZHJlc3MgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSRU5BX1NJWkUgLSBQT09MX1NJWkUpOwotICAgICAgICBwb29sLT5hcmVuYWluZGV4ID0gdXNhYmxlX2FyZW5hcyAtIGFyZW5hczsKKyAgICAgICAgcG9vbC0+YXJlbmFpbmRleCA9ICh1aW50KSh1c2FibGVfYXJlbmFzIC0gYXJlbmFzKTsKICAgICAgICAgYXNzZXJ0KCZhcmVuYXNbcG9vbC0+YXJlbmFpbmRleF0gPT0gdXNhYmxlX2FyZW5hcyk7CiAgICAgICAgIHBvb2wtPnN6aWR4ID0gRFVNTVlfU0laRV9JRFg7CiAgICAgICAgIHVzYWJsZV9hcmVuYXMtPnBvb2xfYWRkcmVzcyArPSBQT09MX1NJWkU7CmRpZmYgLS1naXQgYS9PYmplY3RzL3NldG9iamVjdC5jIGIvT2JqZWN0cy9zZXRvYmplY3QuYwppbmRleCAyM2FiOTVjLi44MTk3Y2Q5IDEwMDY0NAotLS0gYS9PYmplY3RzL3NldG9iamVjdC5jCisrKyBiL09iamVjdHMvc2V0b2JqZWN0LmMKQEAgLTg0LDggKzg0LDkgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gc2V0X2xvb2trZXkoc28sIGtleSwgaGFzaCk7CiAgICAgICAgICAgICBpZiAoY21wID4gMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsaWtlbHkgKi8KICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7CisgICAgICAgICAgICBtYXNrID0gc28tPm1hc2s7ICAgICAgICAgICAgICAgICAvKiBoZWxwIGF2b2lkIGEgcmVnaXN0ZXIgc3BpbGwgKi8KICAgICAgICAgfQotICAgICAgICBpZiAoZW50cnktPmtleSA9PSBkdW1teSAmJiBmcmVlc2xvdCA9PSBOVUxMKQorICAgICAgICBpZiAoZW50cnktPmhhc2ggPT0gLTEgJiYgZnJlZXNsb3QgPT0gTlVMTCkKICAgICAgICAgICAgIGZyZWVzbG90ID0gZW50cnk7CiAKICAgICAgICAgaWYgKGkgKyBMSU5FQVJfUFJPQkVTIDw9IG1hc2spIHsKQEAgLTExMSw4ICsxMTIsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldF9sb29ra2V5KHNvLCBrZXksIGhhc2gpOwogICAgICAgICAgICAgICAgICAgICBpZiAoY21wID4gMCkKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeTsKKyAgICAgICAgICAgICAgICAgICAgbWFzayA9IHNvLT5tYXNrOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZW50cnktPmtleSA9PSBkdW1teSAmJiBmcmVlc2xvdCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGlmIChlbnRyeS0+aGFzaCA9PSAtMSAmJiBmcmVlc2xvdCA9PSBOVUxMKQogICAgICAgICAgICAgICAgICAgICBmcmVlc2xvdCA9IGVudHJ5OwogICAgICAgICAgICAgfQogICAgICAgICB9CmRpZmYgLS1naXQgYS9PYmplY3RzL3R5cGVvYmplY3QuYyBiL09iamVjdHMvdHlwZW9iamVjdC5jCmluZGV4IGYwYWQ3ZmQuLmJlNTM4NjggMTAwNjQ0Ci0tLSBhL09iamVjdHMvdHlwZW9iamVjdC5jCisrKyBiL09iamVjdHMvdHlwZW9iamVjdC5jCkBAIC0yODA4LDYgKzI4MDgsMTIgQEAKICAgICAgICAgX1B5RGljdF9TZXRJdGVtSWQodHlwZS0+dHBfZGljdCwgJlB5SWRfX19tb2R1bGVfXywKICAgICAgICAgICAgIFB5VW5pY29kZV9Gcm9tU3RyaW5nQW5kU2l6ZSgKICAgICAgICAgICAgICAgICBzcGVjLT5uYW1lLCAoUHlfc3NpemVfdCkocyAtIHNwZWMtPm5hbWUpKSk7CisgICAgZWxzZSB7CisgICAgICAgIGlmIChQeUVycl9XYXJuRm9ybWF0KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywgMSwKKyAgICAgICAgICAgICAgICAiYnVpbHRpbiB0eXBlICUuMjAwcyBoYXMgbm8gX19tb2R1bGVfXyBhdHRyaWJ1dGUiLAorICAgICAgICAgICAgICAgIHNwZWMtPm5hbWUpKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgIH0KIAogICAgIHJldHVybiAoUHlPYmplY3QqKXJlczsKIApkaWZmIC0tZ2l0IGEvT2JqZWN0cy91bmljb2Rlb2JqZWN0LmMgYi9PYmplY3RzL3VuaWNvZGVvYmplY3QuYwppbmRleCAxMDFiZmJjLi4wZGVhODNlIDEwMDY0NAotLS0gYS9PYmplY3RzL3VuaWNvZGVvYmplY3QuYworKysgYi9PYmplY3RzL3VuaWNvZGVvYmplY3QuYwpAQCAtNTE5LDEwICs1MTksNiBAQAogICAgICAgICByZXR1cm4gX1B5VW5pY29kZV9Db3B5KHVuaWNvZGUpOwogfQogCi0jaWZkZWYgSEFWRV9NQkNTCi1zdGF0aWMgT1NWRVJTSU9OSU5GT0VYIHdpbnZlcjsKLSNlbmRpZgotCiAvKiAtLS0gQmxvb20gRmlsdGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAvKiBzdHVmZiB0byBpbXBsZW1lbnQgc2ltcGxlICJibG9vbSBmaWx0ZXJzIiBmb3IgVW5pY29kZSBjaGFyYWN0ZXJzLgpAQCAtMTUzNSw2ICsxNTMxLDEwIEBACiAgICAgICAgIC8qIGluIGNhc2UgdGhlIG5hdGl2ZSByZXByZXNlbnRhdGlvbiBpcyAyLWJ5dGVzLCB3ZSBuZWVkIHRvIGFsbG9jYXRlIGEKICAgICAgICAgICAgbmV3IG5vcm1hbGl6ZWQgNC1ieXRlIHZlcnNpb24uICovCiAgICAgICAgIGxlbmd0aF93b19zdXJyb2dhdGVzID0gX1B5VW5pY29kZV9XU1RSX0xFTkdUSCh1bmljb2RlKSAtIG51bV9zdXJyb2dhdGVzOworICAgICAgICBpZiAobGVuZ3RoX3dvX3N1cnJvZ2F0ZXMgPiBQWV9TU0laRV9UX01BWCAvIDQgLSAxKSB7CisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CiAgICAgICAgIF9QeVVuaWNvZGVfREFUQV9BTlkodW5pY29kZSkgPSBQeU9iamVjdF9NQUxMT0MoNCAqIChsZW5ndGhfd29fc3Vycm9nYXRlcyArIDEpKTsKICAgICAgICAgaWYgKCFfUHlVbmljb2RlX0RBVEFfQU5ZKHVuaWNvZGUpKSB7CiAgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOwpAQCAtMjE4Niw3ICsyMTg2LDcgQEAKICAgICB9CiAgICAgc3dpdGNoIChraW5kKSB7CiAgICAgY2FzZSBQeVVuaWNvZGVfMkJZVEVfS0lORDoKLSAgICAgICAgcmVzdWx0ID0gUHlNZW1fTWFsbG9jKGxlbiAqIHNpemVvZihQeV9VQ1MyKSk7CisgICAgICAgIHJlc3VsdCA9IFB5TWVtX05ldyhQeV9VQ1MyLCBsZW4pOwogICAgICAgICBpZiAoIXJlc3VsdCkKICAgICAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwogICAgICAgICBhc3NlcnQoc2tpbmQgPT0gUHlVbmljb2RlXzFCWVRFX0tJTkQpOwpAQCAtMjE5Nyw3ICsyMTk3LDcgQEAKICAgICAgICAgICAgIHJlc3VsdCk7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgY2FzZSBQeVVuaWNvZGVfNEJZVEVfS0lORDoKLSAgICAgICAgcmVzdWx0ID0gUHlNZW1fTWFsbG9jKGxlbiAqIHNpemVvZihQeV9VQ1M0KSk7CisgICAgICAgIHJlc3VsdCA9IFB5TWVtX05ldyhQeV9VQ1M0LCBsZW4pOwogICAgICAgICBpZiAoIXJlc3VsdCkKICAgICAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwogICAgICAgICBpZiAoc2tpbmQgPT0gUHlVbmljb2RlXzJCWVRFX0tJTkQpIHsKQEAgLTIyMzksMTEgKzIyMzksNyBAQAogICAgIGlmIChjb3B5X251bGwpCiAgICAgICAgIHRhcmdldGxlbisrOwogICAgIGlmICghdGFyZ2V0KSB7Ci0gICAgICAgIGlmIChQWV9TU0laRV9UX01BWCAvIChQeV9zc2l6ZV90KXNpemVvZihQeV9VQ1M0KSA8IHRhcmdldGxlbikgewotICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIHRhcmdldCA9IFB5TWVtX01hbGxvYyh0YXJnZXRsZW4gKiBzaXplb2YoUHlfVUNTNCkpOworICAgICAgICB0YXJnZXQgPSBQeU1lbV9OZXcoUHlfVUNTNCwgdGFyZ2V0bGVuKTsKICAgICAgICAgaWYgKCF0YXJnZXQpIHsKICAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTI4MTcsMTIgKzI4MTMsNyBAQAogICAgIGJ1ZmxlbiA9IHVuaWNvZGVfYXN3aWRlY2hhcih1bmljb2RlLCBOVUxMLCAwKTsKICAgICBpZiAoYnVmbGVuID09IC0xKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBpZiAoUFlfU1NJWkVfVF9NQVggLyAoUHlfc3NpemVfdClzaXplb2Yod2NoYXJfdCkgPCBidWZsZW4pIHsKLSAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgYnVmZmVyID0gUHlNZW1fTUFMTE9DKGJ1ZmxlbiAqIHNpemVvZih3Y2hhcl90KSk7CisgICAgYnVmZmVyID0gUHlNZW1fTkVXKHdjaGFyX3QsIGJ1Zmxlbik7CiAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CiAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMzUxNSwxMCArMzUwNiw3IEBACiAgICAgICAgICAgICB3c3RyID0gc21hbGxidWY7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpZiAod2xlbiA+IFBZX1NTSVpFX1RfTUFYIC8gc2l6ZW9mKHdjaGFyX3QpIC0gMSkKLSAgICAgICAgICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQotICAgICAgICAgICAgd3N0ciA9IFB5TWVtX01hbGxvYygod2xlbisxKSAqIHNpemVvZih3Y2hhcl90KSk7CisgICAgICAgICAgICB3c3RyID0gUHlNZW1fTmV3KHdjaGFyX3QsIHdsZW4rMSk7CiAgICAgICAgICAgICBpZiAoIXdzdHIpCiAgICAgICAgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAgICAgICAgIH0KQEAgLTM4MjMsNiArMzgxMSwxMSBAQAogI2VuZGlmCiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoKHNpemVfdClfUHlVbmljb2RlX0xFTkdUSCh1bmljb2RlKSA+CisgICAgICAgICAgICAgICAgICAgIFBZX1NTSVpFX1RfTUFYIC8gc2l6ZW9mKHdjaGFyX3QpIC0gMSkgeworICAgICAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBfUHlVbmljb2RlX1dTVFIodW5pY29kZSkgPSAod2NoYXJfdCAqKSBQeU9iamVjdF9NQUxMT0Moc2l6ZW9mKHdjaGFyX3QpICoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9QeVVuaWNvZGVfTEVOR1RIKHVuaWNvZGUpICsgMSkpOwogICAgICAgICAgICAgaWYgKCFfUHlVbmljb2RlX1dTVFIodW5pY29kZSkpIHsKQEAgLTcxMTUsMTMgKzcxMDgsNyBAQAogZW5jb2RlX2NvZGVfcGFnZV9mbGFncyhVSU5UIGNvZGVfcGFnZSwgY29uc3QgY2hhciAqZXJyb3JzKQogewogICAgIGlmIChjb2RlX3BhZ2UgPT0gQ1BfVVRGOCkgewotICAgICAgICBpZiAod2ludmVyLmR3TWFqb3JWZXJzaW9uID49IDYpCi0gICAgICAgICAgICAvKiBDUF9VVEY4IHN1cHBvcnRzIFdDX0VSUl9JTlZBTElEX0NIQVJTIG9uIFdpbmRvd3MgVmlzdGEKLSAgICAgICAgICAgICAgIGFuZCBsYXRlciAqLwotICAgICAgICAgICAgcmV0dXJuIFdDX0VSUl9JTlZBTElEX0NIQVJTOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAvKiBDUF9VVEY4IG9ubHkgc3VwcG9ydHMgZmxhZ3M9MCBvbiBXaW5kb3dzIG9sZGVyIHRoYW4gVmlzdGEgKi8KLSAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gV0NfRVJSX0lOVkFMSURfQ0hBUlM7CiAgICAgfQogICAgIGVsc2UgaWYgKGNvZGVfcGFnZSA9PSBDUF9VVEY3KSB7CiAgICAgICAgIC8qIENQX1VURjcgb25seSBzdXBwb3J0cyBmbGFncz0wICovCkBAIC0xNDk3OSwxMyArMTQ5NjYsNiBAQAogICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5Rm9ybWF0dGVySXRlcl9UeXBlKSA8IDApCiAgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgZm9ybWF0dGVyIGl0ZXIgdHlwZSIpOwogCi0jaWZkZWYgSEFWRV9NQkNTCi0gICAgd2ludmVyLmR3T1NWZXJzaW9uSW5mb1NpemUgPSBzaXplb2Yod2ludmVyKTsKLSAgICBpZiAoIUdldFZlcnNpb25FeCgoT1NWRVJTSU9OSU5GTyopJndpbnZlcikpIHsKLSAgICAgICAgUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoMCk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0jZW5kaWYKICAgICByZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvUEMvZ2V0cGF0aHAuYyBiL1BDL2dldHBhdGhwLmMKaW5kZXggZGViNDBlNy4uZDRmNDU3NCAxMDA2NDQKLS0tIGEvUEMvZ2V0cGF0aHAuYworKysgYi9QQy9nZXRwYXRocC5jCkBAIC00NTEsMTEgKzQ1MSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcGJ1ZmZlciwgTUFYUEFUSExFTiAqIDIpOwogICAgICAgICAgICAgUHlfREVDUkVGKGRlY29kZWQpOwogICAgICAgICAgICAgaWYgKGsgPj0gMCkgewotICAgICAgICAgICAgICAgIHdjaGFyX3QgKiB0b2sgPSB3Y3N0b2sodG1wYnVmZmVyLCBMIiBcdFxyXG4iKTsKKyAgICAgICAgICAgICAgICB3Y2hhcl90ICogY29udGV4dCA9IE5VTEw7CisgICAgICAgICAgICAgICAgd2NoYXJfdCAqIHRvayA9IHdjc3Rva19zKHRtcGJ1ZmZlciwgTCIgXHRcclxuIiwgJmNvbnRleHQpOwogICAgICAgICAgICAgICAgIGlmICgodG9rICE9IE5VTEwpICYmICF3Y3NjbXAodG9rLCBrZXkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRvayA9IHdjc3RvayhOVUxMLCBMIiBcdCIpOworICAgICAgICAgICAgICAgICAgICB0b2sgPSB3Y3N0b2tfcyhOVUxMLCBMIiBcdCIsICZjb250ZXh0KTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCh0b2sgIT0gTlVMTCkgJiYgIXdjc2NtcCh0b2ssIEwiPSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b2sgPSB3Y3N0b2soTlVMTCwgTCJcclxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICB0b2sgPSB3Y3N0b2tfcyhOVUxMLCBMIlxyXG4iLCAmY29udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9rICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Y3NuY3B5KHZhbHVlLCB0b2ssIE1BWFBBVEhMRU4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IDE7CmRpZmYgLS1naXQgYS9QQy9pbnZhbGlkX3BhcmFtZXRlcl9oYW5kbGVyLmMgYi9QQy9pbnZhbGlkX3BhcmFtZXRlcl9oYW5kbGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JjMDEwNAotLS0gL2Rldi9udWxsCisrKyBiL1BDL2ludmFsaWRfcGFyYW1ldGVyX2hhbmRsZXIuYwpAQCAtMCwwICsxLDIyIEBACisjaWZkZWYgX01TQ19WRVIKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaWYgX01TQ19WRVIgPj0gMTkwMAorLyogcHljb25maWcuaCB1c2VzIHRoaXMgZnVuY3Rpb24gaW4gdGhlIF9QeV9CRUdJTi9FTkRfU1VQUFJFU1NfSVBICisgKiBtYWNyb3MuIEl0IGRvZXMgbm90IG5lZWQgdG8gYmUgZGVmaW5lZCB3aGVuIGJ1aWxkaW5nIHVzaW5nIE1TVkMKKyAqIGVhcmxpZXIgdGhhbiAxNC4wIChfTVNDX1ZFUiA9PSAxOTAwKS4KKyAqLworCitzdGF0aWMgdm9pZCBfX2NkZWNsIF9zaWxlbnRfaW52YWxpZF9wYXJhbWV0ZXJfaGFuZGxlcigKKyAgICB3Y2hhcl90IGNvbnN0KiBleHByZXNzaW9uLAorICAgIHdjaGFyX3QgY29uc3QqIGZ1bmN0aW9uLAorICAgIHdjaGFyX3QgY29uc3QqIGZpbGUsCisgICAgdW5zaWduZWQgaW50IGxpbmUsCisgICAgdWludHB0cl90IHBSZXNlcnZlZCkgeyB9CisKK3ZvaWQgKl9QeV9zaWxlbnRfaW52YWxpZF9wYXJhbWV0ZXJfaGFuZGxlciA9CisgICAgKHZvaWQqKV9zaWxlbnRfaW52YWxpZF9wYXJhbWV0ZXJfaGFuZGxlcjsKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1BDL2xhdW5jaGVyLmMgYi9QQy9sYXVuY2hlci5jCmluZGV4IGQ0NTBkOWYuLjMzZGQ1ZGEgMTAwNjQ0Ci0tLSBhL1BDL2xhdW5jaGVyLmMKKysrIGIvUEMvbGF1bmNoZXIuYwpAQCAtMzg0LDYgKzM4NCwzMSBAQAogfQogCiAKK3N0YXRpYyB3Y2hhcl90ICoKK2ZpbmRfcHl0aG9uX2J5X3ZlbnYoKQoreworICAgIHN0YXRpYyB3Y2hhcl90IHZlbnZfcHl0aG9uW01BWF9QQVRIXTsKKyAgICB3Y2hhcl90ICp2aXJ0dWFsX2VudiA9IGdldF9lbnYoTCJWSVJUVUFMX0VOViIpOworICAgIERXT1JEIGF0dHJzOworCisgICAgLyogQ2hlY2sgZm9yIFZJUlRVQUxfRU5WIGVudmlyb25tZW50IHZhcmlhYmxlICovCisgICAgaWYgKHZpcnR1YWxfZW52ID09IE5VTEwgfHwgdmlydHVhbF9lbnZbMF0gPT0gTCdcMCcpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLyogQ2hlY2sgZm9yIGEgcHl0aG9uIGV4ZWN1dGFibGUgaW4gdGhlIHZlbnYgKi8KKyAgICBkZWJ1ZyhMIkNoZWNraW5nIGZvciBQeXRob24gZXhlY3V0YWJsZSBpbiB2aXJ0dWFsIGVudiAnJWxzJ1xuIiwgdmlydHVhbF9lbnYpOworICAgIF9zbndwcmludGZfcyh2ZW52X3B5dGhvbiwgTUFYX1BBVEgsIF9UUlVOQ0FURSwKKyAgICAgICAgICAgIEwiJWxzXFxTY3JpcHRzXFwlbHMiLCB2aXJ0dWFsX2VudiwgUFlUSE9OX0VYRUNVVEFCTEUpOworICAgIGF0dHJzID0gR2V0RmlsZUF0dHJpYnV0ZXNXKHZlbnZfcHl0aG9uKTsKKyAgICBpZiAoYXR0cnMgPT0gSU5WQUxJRF9GSUxFX0FUVFJJQlVURVMpIHsKKyAgICAgICAgZGVidWcoTCJQeXRob24gZXhlY3V0YWJsZSAlbHMgbWlzc2luZyBmcm9tIHZpcnR1YWwgZW52XG4iLCB2ZW52X3B5dGhvbik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiB2ZW52X3B5dGhvbjsKK30KKwogc3RhdGljIHdjaGFyX3QgYXBwZGF0YV9pbmlfcGF0aFtNQVhfUEFUSF07CiBzdGF0aWMgd2NoYXJfdCBsYXVuY2hlcl9pbmlfcGF0aFtNQVhfUEFUSF07CiAKQEAgLTEzMDksNiArMTMzNCw3IEBACiB7CiAgICAgd2NoYXJfdCAqIHdwOwogICAgIHdjaGFyX3QgKiBjb21tYW5kOworICAgIHdjaGFyX3QgKiBleGVjdXRhYmxlOwogICAgIHdjaGFyX3QgKiBwOwogICAgIGludCByYyA9IDA7CiAgICAgc2l6ZV90IHBsZW47CkBAIC0xNDUzLDYgKzE0NzksNyBAQAogICAgICAgICAgICAgaWYgKGlwID09IE5VTEwpCiAgICAgICAgICAgICAgICAgZXJyb3IoUkNfTk9fUFlUSE9OLCBMIlJlcXVlc3RlZCBQeXRob24gdmVyc2lvbiAoJWxzKSBub3QgXAogaW5zdGFsbGVkIiwgJnBbMV0pOworICAgICAgICAgICAgZXhlY3V0YWJsZSA9IGlwLT5leGVjdXRhYmxlOwogICAgICAgICAgICAgY29tbWFuZCArPSB3Y3NsZW4ocCk7CiAgICAgICAgICAgICBjb21tYW5kID0gc2tpcF93aGl0ZXNwYWNlKGNvbW1hbmQpOwogICAgICAgICB9CkBAIC0xNDcwLDkgKzE0OTcsMTYgQEAKICNlbmRpZgogCiAgICAgaWYgKCF2YWxpZCkgewotICAgICAgICBpcCA9IGxvY2F0ZV9weXRob24oTCIiKTsKLSAgICAgICAgaWYgKGlwID09IE5VTEwpCi0gICAgICAgICAgICBlcnJvcihSQ19OT19QWVRIT04sIEwiQ2FuJ3QgZmluZCBhIGRlZmF1bHQgUHl0aG9uLiIpOworICAgICAgICAvKiBMb29rIGZvciBhbiBhY3RpdmUgdmlydHVhbGVudiAqLworICAgICAgICBleGVjdXRhYmxlID0gZmluZF9weXRob25fYnlfdmVudigpOworCisgICAgICAgIC8qIElmIHdlIGRpZG4ndCBmaW5kIG9uZSwgbG9vayBmb3IgdGhlIGRlZmF1bHQgUHl0aG9uICovCisgICAgICAgIGlmIChleGVjdXRhYmxlID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlwID0gbG9jYXRlX3B5dGhvbihMIiIpOworICAgICAgICAgICAgaWYgKGlwID09IE5VTEwpCisgICAgICAgICAgICAgICAgZXJyb3IoUkNfTk9fUFlUSE9OLCBMIkNhbid0IGZpbmQgYSBkZWZhdWx0IFB5dGhvbi4iKTsKKyAgICAgICAgICAgIGV4ZWN1dGFibGUgPSBpcC0+ZXhlY3V0YWJsZTsKKyAgICAgICAgfQogICAgICAgICBpZiAoKGFyZ2MgPT0gMikgJiYgKCFfd2NzaWNtcChwLCBMIi1oIikgfHwgIV93Y3NpY21wKHAsIEwiLS1oZWxwIikpKSB7CiAjaWYgZGVmaW5lZChfTV9YNjQpCiAgICAgICAgICAgICBCT09MIGNhbkRvNjRiaXQgPSBUUlVFOwpAQCAtMTUwMCw3ICsxNTM0LDcgQEAKICAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOwogICAgICAgICB9CiAgICAgfQotICAgIGludm9rZV9jaGlsZChpcC0+ZXhlY3V0YWJsZSwgTlVMTCwgY29tbWFuZCk7CisgICAgaW52b2tlX2NoaWxkKGV4ZWN1dGFibGUsIE5VTEwsIGNvbW1hbmQpOwogICAgIHJldHVybiByYzsKIH0KIApkaWZmIC0tZ2l0IGEvUEMvcHljb25maWcuaCBiL1BDL3B5Y29uZmlnLmgKaW5kZXggMzI4YmUwZi4uMzI0YTEzMCAxMDA2NDQKLS0tIGEvUEMvcHljb25maWcuaAorKysgYi9QQy9weWNvbmZpZy5oCkBAIC0xNTYsOSArMTU2LDkgQEAKICNlbmRpZiAvKiBNU19XSU42NCAqLwogCiAvKiBzZXQgdGhlIHZlcnNpb24gbWFjcm9zIGZvciB0aGUgd2luZG93cyBoZWFkZXJzICovCi0vKiBQeXRob24gMy40KyByZXF1aXJlcyBXaW5kb3dzIFhQIG9yIGdyZWF0ZXIgKi8KLSNkZWZpbmUgUHlfV0lOVkVSIDB4MDUwMSAvKiBfV0lOMzJfV0lOTlRfV0lOWFAgKi8KLSNkZWZpbmUgUHlfTlREREkgTlRERElfV0lOWFAKKy8qIFB5dGhvbiAzLjUrIHJlcXVpcmVzIFdpbmRvd3MgVmlzdGEgb3IgZ3JlYXRlciAqLworI2RlZmluZSBQeV9XSU5WRVIgMHgwNjAwIC8qIF9XSU4zMl9XSU5OVF9WSVNUQSAqLworI2RlZmluZSBQeV9OVERESSBOVERESV9WSVNUQQogCiAvKiBXZSBvbmx5IHNldCB0aGVzZSB2YWx1ZXMgd2hlbiBidWlsZGluZyBQeXRob24gLSB3ZSBkb24ndCB3YW50IHRvIGZvcmNlCiAgICB0aGVzZSB2YWx1ZXMgb24gZXh0ZW5zaW9ucywgYXMgdGhhdCB3aWxsIGFmZmVjdCB0aGUgcHJvdG90eXBlcyBhbmQKZGlmZiAtLWdpdCBhL1BDL3B5dGhvbl92ZXJfcmMuaCBiL1BDL3B5dGhvbl92ZXJfcmMuaAppbmRleCAxZjFiZWJjLi44MjdlOWJlIDEwMDY0NAotLS0gYS9QQy9weXRob25fdmVyX3JjLmgKKysrIGIvUEMvcHl0aG9uX3Zlcl9yYy5oCkBAIC00LDcgKzQsNyBAQAogI2luY2x1ZGUgIndpbnZlci5oIgogCiAjZGVmaW5lIFBZVEhPTl9DT01QQU5ZICAgIlB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uIgotI2RlZmluZSBQWVRIT05fQ09QWVJJR0hUICJDb3B5cmlnaHQgqSAyMDAxLTIwMTUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24uIENvcHlyaWdodCCpIDIwMDAgQmVPcGVuLmNvbS4gQ29weXJpZ2h0IKkgMTk5NS0yMDAxIENOUkkuIENvcHlyaWdodCCpIDE5OTEtMTk5NSBTTUMuIgorI2RlZmluZSBQWVRIT05fQ09QWVJJR0hUICJDb3B5cmlnaHQgXHhBOSAyMDAxLTIwMTUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24uIENvcHlyaWdodCBceEE5IDIwMDAgQmVPcGVuLmNvbS4gQ29weXJpZ2h0IFx4QTkgMTk5NS0yMDAxIENOUkkuIENvcHlyaWdodCBceEE5IDE5OTEtMTk5NSBTTUMuIgogCiAjZGVmaW5lIE1TX1dJTkRPV1MKICNpbmNsdWRlICJtb2RzdXBwb3J0LmgiCmRpZmYgLS1naXQgYS9QQy93aW5yZWcuYyBiL1BDL3dpbnJlZy5jCmluZGV4IDYzYzQzN2UuLjE5ZDVhNzAgMTAwNjQ0Ci0tLSBhL1BDL3dpbnJlZy5jCisrKyBiL1BDL3dpbnJlZy5jCkBAIC05MzksNyArOTM5LDcgQEAKICAgICAgICAgICAgICAgICB3Y2hhcl90ICpkYXRhID0gKHdjaGFyX3QgKilyZXREYXRhQnVmOwogICAgICAgICAgICAgICAgIGludCBsZW4gPSByZXREYXRhU2l6ZSAvIDI7CiAgICAgICAgICAgICAgICAgaW50IHMgPSBjb3VudFN0cmluZ3MoZGF0YSwgbGVuKTsKLSAgICAgICAgICAgICAgICB3Y2hhcl90ICoqc3RyID0gKHdjaGFyX3QgKiopUHlNZW1fTWFsbG9jKHNpemVvZih3Y2hhcl90ICopKnMpOworICAgICAgICAgICAgICAgIHdjaGFyX3QgKipzdHIgPSBQeU1lbV9OZXcod2NoYXJfdCAqLCBzKTsKICAgICAgICAgICAgICAgICBpZiAoc3RyID09IE5VTEwpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwogCkBAIC0xMjA2LDcgKzEyMDYsNyBAQAogICAgICsrcmV0RGF0YVNpemU7CiAgICAgYnVmRGF0YVNpemUgPSByZXREYXRhU2l6ZTsKICAgICBidWZWYWx1ZVNpemUgPSByZXRWYWx1ZVNpemU7Ci0gICAgcmV0VmFsdWVCdWYgPSAod2NoYXJfdCAqKVB5TWVtX01hbGxvYyhzaXplb2Yod2NoYXJfdCkgKiByZXRWYWx1ZVNpemUpOworICAgIHJldFZhbHVlQnVmID0gUHlNZW1fTmV3KHdjaGFyX3QsIHJldFZhbHVlU2l6ZSk7CiAgICAgaWYgKHJldFZhbHVlQnVmID09IE5VTEwpCiAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwogICAgIHJldERhdGFCdWYgPSAoQllURSAqKVB5TWVtX01hbGxvYyhyZXREYXRhU2l6ZSk7CkBAIC0xMjc3LDcgKzEyNzcsNyBAQAogICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmV0VmFsdWVTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBhbmRFbnZpcm9ubWVudFN0cmluZ3MiKTsKICAgICB9Ci0gICAgcmV0VmFsdWUgPSAod2NoYXJfdCAqKVB5TWVtX01hbGxvYyhyZXRWYWx1ZVNpemUgKiBzaXplb2Yod2NoYXJfdCkpOworICAgIHJldFZhbHVlID0gUHlNZW1fTmV3KHdjaGFyX3QsIHJldFZhbHVlU2l6ZSk7CiAgICAgaWYgKHJldFZhbHVlID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvUENidWlsZC9fZnJlZXplX2ltcG9ydGxpYi52Y3hwcm9qIGIvUENidWlsZC9fZnJlZXplX2ltcG9ydGxpYi52Y3hwcm9qCmluZGV4IDdmNGU0MTkuLmY3NzE0YzAgMTAwNjQ0Ci0tLSBhL1BDYnVpbGQvX2ZyZWV6ZV9pbXBvcnRsaWIudmN4cHJvagorKysgYi9QQ2J1aWxkL19mcmVlemVfaW1wb3J0bGliLnZjeHByb2oKQEAgLTg1LDggKzg1LDggQEAKICAgICA8RXhlYyBDb21tYW5kPSciJChUYXJnZXRQYXRoKSIgIiQoUHlTb3VyY2VQYXRoKUxpYlxpbXBvcnRsaWJcX2Jvb3RzdHJhcC5weSIgIiQoSW50RGlyKWltcG9ydGxpYi5nLmgiJyAvPgogICAgIAogICAgIDxQcm9wZXJ0eUdyb3VwPgotICAgICAgPF9PbGRDb250ZW50IENvbmRpdGlvbj0iRXhpc3RzKCckKFB5U291cmNlUGF0aClQeXRob25caW1wb3J0bGliLmgnKSI+JChbU3lzdGVtLklPLkZpbGVdOjpSZWFkQWxsVGV4dCgnJChQeVNvdXJjZVBhdGgpUHl0aG9uXGltcG9ydGxpYi5oJykpPC9fT2xkQ29udGVudD4KLSAgICAgIDxfTmV3Q29udGVudCBDb25kaXRpb249IkV4aXN0cygnJChJbnREaXIpaW1wb3J0bGliLmcuaCcpIj4kKFtTeXN0ZW0uSU8uRmlsZV06OlJlYWRBbGxUZXh0KCckKEludERpcilpbXBvcnRsaWIuZy5oJykpPC9fTmV3Q29udGVudD4KKyAgICAgIDxfT2xkQ29udGVudCBDb25kaXRpb249IkV4aXN0cygnJChQeVNvdXJjZVBhdGgpUHl0aG9uXGltcG9ydGxpYi5oJykiPiQoW1N5c3RlbS5JTy5GaWxlXTo6UmVhZEFsbFRleHQoJyQoUHlTb3VyY2VQYXRoKVB5dGhvblxpbXBvcnRsaWIuaCcpLlJlcGxhY2UoYCYjeDBEOyYjeDBBO2AsIGAmI3gwQTtgKSk8L19PbGRDb250ZW50PgorICAgICAgPF9OZXdDb250ZW50IENvbmRpdGlvbj0iRXhpc3RzKCckKEludERpcilpbXBvcnRsaWIuZy5oJykiPiQoW1N5c3RlbS5JTy5GaWxlXTo6UmVhZEFsbFRleHQoJyQoSW50RGlyKWltcG9ydGxpYi5nLmgnKS5SZXBsYWNlKGAmI3gwRDsmI3gwQTtgLCBgJiN4MEE7YCkpPC9fTmV3Q29udGVudD4KICAgICA8L1Byb3BlcnR5R3JvdXA+CiAgICAgCiAgICAgPENvcHkgU291cmNlRmlsZXM9IiQoSW50RGlyKWltcG9ydGxpYi5nLmgiCmRpZmYgLS1naXQgYS9QQ2J1aWxkL3B5dGhvbmNvcmUudmN4cHJvaiBiL1BDYnVpbGQvcHl0aG9uY29yZS52Y3hwcm9qCmluZGV4IDQ3OWY2OGQuLmE1NjkwZjYgMTAwNjQ0Ci0tLSBhL1BDYnVpbGQvcHl0aG9uY29yZS52Y3hwcm9qCisrKyBiL1BDYnVpbGQvcHl0aG9uY29yZS52Y3hwcm9qCkBAIC0zMzMsNiArMzMzLDcgQEAKICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXFBhcnNlclxwYXJzZXIuYyIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXFBhcnNlclxwYXJzZXRvay5jIiAvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cUGFyc2VyXHRva2VuaXplci5jIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cUENcaW52YWxpZF9wYXJhbWV0ZXJfaGFuZGxlci5jIiAvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cUENcd2lucmVnLmMiIC8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxQQ1xjb25maWcuYyIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXFBDXGdldHBhdGhwLmMiIC8+CkBAIC0zOTQsMjUgKzM5NSwyMSBAQAogICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC50YXJnZXRzIiAvPgogICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblRhcmdldHMiPgogICA8L0ltcG9ydEdyb3VwPgotICAKICAgPFRhcmdldCBOYW1lPSJfR2V0QnVpbGRJbmZvIiBCZWZvcmVUYXJnZXRzPSJQcmVwYXJlRm9yQnVpbGQiPgotICAgIDxFeGVjIENvbW1hbmQ9J2hnIGlkIC1iICZndDsgIiQoSW50RGlyKWhnYnJhbmNoLnR4dCInIENvbnRpbnVlT25FcnJvcj0idHJ1ZSIgLz4KLSAgICA8RXhlYyBDb21tYW5kPSdoZyBpZCAtaSAmZ3Q7ICIkKEludERpciloZ3ZlcnNpb24udHh0IicgQ29udGludWVPbkVycm9yPSJ0cnVlIiAvPgotICAgIDxFeGVjIENvbW1hbmQ9J2hnIGlkIC10ICZndDsgIiQoSW50RGlyKWhndGFnLnR4dCInIENvbnRpbnVlT25FcnJvcj0idHJ1ZSIgLz4KLSAgICAKKyAgICA8RXhlYyBDb21tYW5kPSJoZyBpZCAtYiAmZ3Q7ICZxdW90OyQoSW50RGlyKWhnYnJhbmNoLnR4dCZxdW90OyIgQ29udGludWVPbkVycm9yPSJ0cnVlIiAvPgorICAgIDxFeGVjIENvbW1hbmQ9ImhnIGlkIC1pICZndDsgJnF1b3Q7JChJbnREaXIpaGd2ZXJzaW9uLnR4dCZxdW90OyIgQ29udGludWVPbkVycm9yPSJ0cnVlIiAvPgorICAgIDxFeGVjIENvbW1hbmQ9ImhnIGlkIC10ICZndDsgJnF1b3Q7JChJbnREaXIpaGd0YWcudHh0JnF1b3Q7IiBDb250aW51ZU9uRXJyb3I9InRydWUiIC8+CiAgICAgPFByb3BlcnR5R3JvdXA+CiAgICAgICA8SGdCcmFuY2ggQ29uZGl0aW9uPSJFeGlzdHMoJyQoSW50RGlyKWhnYnJhbmNoLnR4dCcpIj4kKFtTeXN0ZW0uSU8uRmlsZV06OlJlYWRBbGxUZXh0KCckKEludERpciloZ2JyYW5jaC50eHQnKS5UcmltKCkpPC9IZ0JyYW5jaD4KICAgICAgIDxIZ1ZlcnNpb24gQ29uZGl0aW9uPSJFeGlzdHMoJyQoSW50RGlyKWhndmVyc2lvbi50eHQnKSI+JChbU3lzdGVtLklPLkZpbGVdOjpSZWFkQWxsVGV4dCgnJChJbnREaXIpaGd2ZXJzaW9uLnR4dCcpLlRyaW0oKSk8L0hnVmVyc2lvbj4KICAgICAgIDxIZ1RhZyBDb25kaXRpb249IkV4aXN0cygnJChJbnREaXIpaGd0YWcudHh0JykiPiQoW1N5c3RlbS5JTy5GaWxlXTo6UmVhZEFsbFRleHQoJyQoSW50RGlyKWhndGFnLnR4dCcpLlRyaW0oKSk8L0hnVGFnPgogICAgIDwvUHJvcGVydHlHcm91cD4KLSAgICAKICAgICA8SXRlbUdyb3VwPgogICAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxNb2R1bGVzXGdldGJ1aWxkaW5mby5jIj4KICAgICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPkhHVkVSU0lPTj0iJChIZ1ZlcnNpb24pIjtIR1RBRz0iJChIZ1RhZykiO0hHQlJBTkNIPSIkKEhnQnJhbmNoKSI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgogICAgICAgPC9DbENvbXBpbGU+CiAgICAgPC9JdGVtR3JvdXA+CiAgIDwvVGFyZ2V0PgotCiAgIDxUYXJnZXQgTmFtZT0iX1dhcm5BYm91dFRvb2xzZXQiIEJlZm9yZVRhcmdldHM9IlByZXBhcmVGb3JCdWlsZCIgQ29uZGl0aW9uPSIkKFBsYXRmb3JtVG9vbHNldCkgIT0gJ3YxNDAnIj4KICAgICA8V2FybmluZyBUZXh0PSJUb29sc2V0ICQoUGxhdGZvcm1Ub29sc2V0KSBpcyBub3QgdXNlZCBmb3Igb2ZmaWNpYWwgYnVpbGRzLiBZb3VyIGJ1aWxkIG1heSBoYXZlIGVycm9ycyBvciBpbmNvbXBhdGliaWxpdGllcy4iIC8+CiAgIDwvVGFyZ2V0PgpkaWZmIC0tZ2l0IGEvUENidWlsZC9weXRob25jb3JlLnZjeHByb2ouZmlsdGVycyBiL1BDYnVpbGQvcHl0aG9uY29yZS52Y3hwcm9qLmZpbHRlcnMKaW5kZXggMTc0MTQwYS4uYjQxNTQwNSAxMDA2NDQKLS0tIGEvUENidWlsZC9weXRob25jb3JlLnZjeHByb2ouZmlsdGVycworKysgYi9QQ2J1aWxkL3B5dGhvbmNvcmUudmN4cHJvai5maWx0ZXJzCkBAIC05NTksNiArOTU5LDkgQEAKICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXE1vZHVsZXNcaGFzaHRhYmxlLmMiPgogICAgICAgPEZpbHRlcj5Nb2R1bGVzPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxQQ1xpbnZhbGlkX3BhcmFtZXRlcl9oYW5kbGVyLmMiPgorICAgICAgPEZpbHRlcj5QQzwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgogICA8L0l0ZW1Hcm91cD4KICAgPEl0ZW1Hcm91cD4KICAgICA8UmVzb3VyY2VDb21waWxlIEluY2x1ZGU9Ii4uXFBDXHB5dGhvbl9udC5yYyI+CmRpZmYgLS1naXQgYS9Qcm9ncmFtcy9fZnJlZXplX2ltcG9ydGxpYi5jIGIvUHJvZ3JhbXMvX2ZyZWV6ZV9pbXBvcnRsaWIuYwppbmRleCBiODg5OWVjLi4zMWIzZDMxIDEwMDY0NAotLS0gYS9Qcm9ncmFtcy9fZnJlZXplX2ltcG9ydGxpYi5jCisrKyBiL1Byb2dyYW1zL19mcmVlemVfaW1wb3J0bGliLmMKQEAgLTE3LDcgKzE3LDcgQEAKICAgIG9mIGZyb3plbiBtb2R1bGVzIGluc3RlYWQsIGxlZnQgZGVsaWJlcmF0ZWx5IGJsYW5rIHNvIGFzIHRvIGF2b2lkCiAgICB1bmludGVudGlvbmFsIGltcG9ydCBvZiBhIHN0YWxlIHZlcnNpb24gb2YgX2Zyb3plbl9pbXBvcnRsaWIuICovCiAKLWNvbnN0IHN0YXRpYyBzdHJ1Y3QgX2Zyb3plbiBfUHlJbXBvcnRfRnJvemVuTW9kdWxlc1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBfZnJvemVuIF9QeUltcG9ydF9Gcm96ZW5Nb2R1bGVzW10gPSB7CiAgICAgezAsIDAsIDB9IC8qIHNlbnRpbmVsICovCiB9OwogCkBAIC0zNSw3ICszNSw3IEBACiB7CiAgICAgY2hhciAqaW5wYXRoLCAqb3V0cGF0aDsKICAgICBGSUxFICppbmZpbGUgPSBOVUxMLCAqb3V0ZmlsZSA9IE5VTEw7Ci0gICAgc3RydWN0IHN0YXQgc3Q7CisgICAgc3RydWN0IF9QeV9zdGF0X3N0cnVjdCBzdDsKICAgICBzaXplX3QgdGV4dF9zaXplLCBkYXRhX3NpemUsIG47CiAgICAgY2hhciAqdGV4dCA9IE5VTEw7CiAgICAgdW5zaWduZWQgY2hhciAqZGF0YTsKQEAgLTU0LDcgKzU0LDcgQEAKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJjYW5ub3Qgb3BlbiAnJXMnIGZvciByZWFkaW5nXG4iLCBpbnBhdGgpOwogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KLSAgICBpZiAoZnN0YXQoZmlsZW5vKGluZmlsZSksICZzdCkpIHsKKyAgICBpZiAoX1B5X2ZzdGF0KGZpbGVubyhpbmZpbGUpLCAmc3QpKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY2Fubm90IGZzdGF0ICclcydcbiIsIGlucGF0aCk7CiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL2NldmFsLmMgYi9QeXRob24vY2V2YWwuYwppbmRleCBlMDlmZjM0Li4xYzYwODlkIDEwMDY0NAotLS0gYS9QeXRob24vY2V2YWwuYworKysgYi9QeXRob24vY2V2YWwuYwpAQCAtMzE5Miw4ICszMTkyLDcgQEAKICAgICBpZiAod2h5ICE9IFdIWV9SRVRVUk4pCiAgICAgICAgIHJldHZhbCA9IE5VTEw7CiAKLSAgICBhc3NlcnQoKHJldHZhbCAhPSBOVUxMICYmICFQeUVycl9PY2N1cnJlZCgpKQotICAgICAgICAgICAgfHwgKHJldHZhbCA9PSBOVUxMICYmIFB5RXJyX09jY3VycmVkKCkpKTsKKyAgICBhc3NlcnQoKHJldHZhbCAhPSBOVUxMKSBeIChQeUVycl9PY2N1cnJlZCgpICE9IE5VTEwpKTsKIAogZmFzdF95aWVsZDoKICAgICBpZiAoY28tPmNvX2ZsYWdzICYgQ09fR0VORVJBVE9SKSB7CkBAIC0zMjU0LDcgKzMyNTMsNyBAQAogICAgIGYtPmZfZXhlY3V0aW5nID0gMDsKICAgICB0c3RhdGUtPmZyYW1lID0gZi0+Zl9iYWNrOwogCi0gICAgcmV0dXJuIHJldHZhbDsKKyAgICByZXR1cm4gX1B5X0NoZWNrRnVuY3Rpb25SZXN1bHQocmV0dmFsLCAiUHlFdmFsX0V2YWxGcmFtZUV4Iik7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC00MTE5LDEzICs0MTE4LDYgQEAKIHsKICAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0jaWZkZWYgUHlfREVCVUcKLSAgICAvKiBQeUV2YWxfQ2FsbE9iamVjdFdpdGhLZXl3b3JkcygpIG11c3Qgbm90IGJlIGNhbGxlZCB3aXRoIGFuIGV4Y2VwdGlvbgotICAgICAgIHNldCwgYmVjYXVzZSBpdCBtYXkgY2xlYXIgaXQgKGRpcmVjdGx5IG9yIGluZGlyZWN0bHkpCi0gICAgICAgYW5kIHNvIHRoZSBjYWxsZXIgbG9vc2VzIGl0cyBleGNlcHRpb24gKi8KLSAgICBhc3NlcnQoIVB5RXJyX09jY3VycmVkKCkpOwotI2VuZGlmCi0KICAgICBpZiAoYXJnID09IE5VTEwpIHsKICAgICAgICAgYXJnID0gUHlUdXBsZV9OZXcoMCk7CiAgICAgICAgIGlmIChhcmcgPT0gTlVMTCkKQEAgLTQxNDksOCArNDE0MSw2IEBACiAgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbChmdW5jLCBhcmcsIGt3KTsKICAgICBQeV9ERUNSRUYoYXJnKTsKIAotICAgIGFzc2VydCgocmVzdWx0ICE9IE5VTEwgJiYgIVB5RXJyX09jY3VycmVkKCkpCi0gICAgICAgICAgIHx8IChyZXN1bHQgPT0gTlVMTCAmJiBQeUVycl9PY2N1cnJlZCgpKSk7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtNDI1MywxMSArNDI0MywxNSBAQAogICAgICAgICAgICAgUHlPYmplY3QgKnNlbGYgPSBQeUNGdW5jdGlvbl9HRVRfU0VMRihmdW5jKTsKICAgICAgICAgICAgIGlmIChmbGFncyAmIE1FVEhfTk9BUkdTICYmIG5hID09IDApIHsKICAgICAgICAgICAgICAgICBDX1RSQUNFKHgsICgqbWV0aCkoc2VsZixOVUxMKSk7CisKKyAgICAgICAgICAgICAgICB4ID0gX1B5X0NoZWNrRnVuY3Rpb25SZXN1bHQoeCwgImNhbGxfZnVuY3Rpb24iKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgaWYgKGZsYWdzICYgTUVUSF9PICYmIG5hID09IDEpIHsKICAgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJnID0gRVhUX1BPUCgqcHBfc3RhY2spOwogICAgICAgICAgICAgICAgIENfVFJBQ0UoeCwgKCptZXRoKShzZWxmLGFyZykpOwogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhcmcpOworCisgICAgICAgICAgICAgICAgeCA9IF9QeV9DaGVja0Z1bmN0aW9uUmVzdWx0KHgsICJjYWxsX2Z1bmN0aW9uIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICBlcnJfYXJncyhmdW5jLCBmbGFncywgbmEpOwpAQCAtNDI3Nyw3ICs0MjcxLDggQEAKICAgICAgICAgICAgICAgICB4ID0gTlVMTDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgIH0gZWxzZSB7CisgICAgfQorICAgIGVsc2UgewogICAgICAgICBpZiAoUHlNZXRob2RfQ2hlY2soZnVuYykgJiYgUHlNZXRob2RfR0VUX1NFTEYoZnVuYykgIT0gTlVMTCkgewogICAgICAgICAgICAgLyogb3B0aW1pemUgYWNjZXNzIHRvIGJvdW5kIG1ldGhvZHMgKi8KICAgICAgICAgICAgIFB5T2JqZWN0ICpzZWxmID0gUHlNZXRob2RfR0VUX1NFTEYoZnVuYyk7CkBAIC00Mjk5LDkgKzQyOTQsOSBAQAogICAgICAgICAgICAgeCA9IGRvX2NhbGwoZnVuYywgcHBfc3RhY2ssIG5hLCBuayk7CiAgICAgICAgIFJFQURfVElNRVNUQU1QKCpwaW50cjEpOwogICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CisKKyAgICAgICAgYXNzZXJ0KCh4ICE9IE5VTEwpIF4gKFB5RXJyX09jY3VycmVkKCkgIT0gTlVMTCkpOwogICAgIH0KLSAgICBhc3NlcnQoKHggIT0gTlVMTCAmJiAhUHlFcnJfT2NjdXJyZWQoKSkKLSAgICAgICAgICAgfHwgKHggPT0gTlVMTCAmJiBQeUVycl9PY2N1cnJlZCgpKSk7CiAKICAgICAvKiBDbGVhciB0aGUgc3RhY2sgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdC4gIEFsc28gcmVtb3ZlcwogICAgICAgIHRoZSBhcmd1bWVudHMgaW4gY2FzZSB0aGV5IHdlcmVuJ3QgY29uc3VtZWQgYWxyZWFkeQpAQCAtNDMxMyw4ICs0MzA4LDcgQEAKICAgICAgICAgUENBTEwoUENBTExfUE9QKTsKICAgICB9CiAKLSAgICBhc3NlcnQoKHggIT0gTlVMTCAmJiAhUHlFcnJfT2NjdXJyZWQoKSkKLSAgICAgICAgICAgfHwgKHggPT0gTlVMTCAmJiBQeUVycl9PY2N1cnJlZCgpKSk7CisgICAgYXNzZXJ0KCh4ICE9IE5VTEwpIF4gKFB5RXJyX09jY3VycmVkKCkgIT0gTlVMTCkpOwogICAgIHJldHVybiB4OwogfQogCkBAIC00NjAxLDEyICs0NTk1LDEwIEBACiAgICAgUHlfWERFQ1JFRihjYWxsYXJncyk7CiAgICAgUHlfWERFQ1JFRihrd2RpY3QpOwogICAgIFB5X1hERUNSRUYoc3RhcmFyZyk7Ci0gICAgYXNzZXJ0KChyZXN1bHQgIT0gTlVMTCAmJiAhUHlFcnJfT2NjdXJyZWQoKSkKLSAgICAgICAgICAgfHwgKHJlc3VsdCA9PSBOVUxMICYmIFB5RXJyX09jY3VycmVkKCkpKTsKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi0vKiBFeHRyYWN0IGEgc2xpY2UgaW5kZXggZnJvbSBhIFB5SW50IG9yIFB5TG9uZyBvciBhbiBvYmplY3Qgd2l0aCB0aGUKKy8qIEV4dHJhY3QgYSBzbGljZSBpbmRleCBmcm9tIGEgUHlMb25nIG9yIGFuIG9iamVjdCB3aXRoIHRoZQogICAgbmJfaW5kZXggc2xvdCBkZWZpbmVkLCBhbmQgc3RvcmUgaW4gKnBpLgogICAgU2lsZW50bHkgcmVkdWNlIHZhbHVlcyBsYXJnZXIgdGhhbiBQWV9TU0laRV9UX01BWCB0byBQWV9TU0laRV9UX01BWCwKICAgIGFuZCBzaWxlbnRseSBib29zdCB2YWx1ZXMgbGVzcyB0aGFuIC1QWV9TU0laRV9UX01BWC0xIHRvIC1QWV9TU0laRV9UX01BWC0xLgpkaWZmIC0tZ2l0IGEvUHl0aG9uL2NldmFsX2dpbC5oIGIvUHl0aG9uL2NldmFsX2dpbC5oCmluZGV4IDI3MDJkNWMuLjRkYjU2YjYgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9jZXZhbF9naWwuaAorKysgYi9QeXRob24vY2V2YWxfZ2lsLmgKQEAgLTE5MSw3ICsxOTEsNyBAQAogICAgIGlmIChfUHlfYXRvbWljX2xvYWRfcmVsYXhlZCgmZ2lsX2Ryb3BfcmVxdWVzdCkgJiYgdHN0YXRlICE9IE5VTEwpIHsKICAgICAgICAgTVVURVhfTE9DSyhzd2l0Y2hfbXV0ZXgpOwogICAgICAgICAvKiBOb3Qgc3dpdGNoZWQgeWV0ID0+IHdhaXQgKi8KLSAgICAgICAgaWYgKF9QeV9hdG9taWNfbG9hZF9yZWxheGVkKCZnaWxfbGFzdF9ob2xkZXIpID09IHRzdGF0ZSkgeworICAgICAgICBpZiAoKFB5VGhyZWFkU3RhdGUqKV9QeV9hdG9taWNfbG9hZF9yZWxheGVkKCZnaWxfbGFzdF9ob2xkZXIpID09IHRzdGF0ZSkgewogICAgICAgICBSRVNFVF9HSUxfRFJPUF9SRVFVRVNUKCk7CiAgICAgICAgICAgICAvKiBOT1RFOiBpZiBDT05EX1dBSVQgZG9lcyBub3QgYXRvbWljYWxseSBzdGFydCB3YWl0aW5nIHdoZW4KICAgICAgICAgICAgICAgIHJlbGVhc2luZyB0aGUgbXV0ZXgsIGFub3RoZXIgdGhyZWFkIGNhbiBydW4gdGhyb3VnaCwgdGFrZQpAQCAtMjM5LDcgKzIzOSw3IEBACiAgICAgX1B5X2F0b21pY19zdG9yZV9yZWxheGVkKCZnaWxfbG9ja2VkLCAxKTsKICAgICBfUHlfQU5OT1RBVEVfUldMT0NLX0FDUVVJUkVEKCZnaWxfbG9ja2VkLCAvKmlzX3dyaXRlPSovMSk7CiAKLSAgICBpZiAodHN0YXRlICE9IF9QeV9hdG9taWNfbG9hZF9yZWxheGVkKCZnaWxfbGFzdF9ob2xkZXIpKSB7CisgICAgaWYgKHRzdGF0ZSAhPSAoUHlUaHJlYWRTdGF0ZSopX1B5X2F0b21pY19sb2FkX3JlbGF4ZWQoJmdpbF9sYXN0X2hvbGRlcikpIHsKICAgICAgICAgX1B5X2F0b21pY19zdG9yZV9yZWxheGVkKCZnaWxfbGFzdF9ob2xkZXIsIHRzdGF0ZSk7CiAgICAgICAgICsrZ2lsX3N3aXRjaF9udW1iZXI7CiAgICAgfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL2NvZGVjcy5jIGIvUHl0aG9uL2NvZGVjcy5jCmluZGV4IGE1NTg4NTkuLjY0ZmMzZDYgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9jb2RlY3MuYworKysgYi9QeXRob24vY29kZWNzLmMKQEAgLTEwMDYsNyArMTAwNiw3IEBACiAgICAgICAgICAgICBjID0gUHlVbmljb2RlX1JFQURfQ0hBUihvYmplY3QsIGkpOwogICAgICAgICAgICAgaWYgKHVjbmhhc2hfQ0FQSSAmJgogICAgICAgICAgICAgICAgIHVjbmhhc2hfQ0FQSS0+Z2V0bmFtZShOVUxMLCBjLCBidWZmZXIsIHNpemVvZihidWZmZXIpLCAxKSkgewotICAgICAgICAgICAgICAgIHJlcGxzaXplID0gMSsxKzErc3RybGVuKGJ1ZmZlcikrMTsKKyAgICAgICAgICAgICAgICByZXBsc2l6ZSA9IDErMSsxKyhpbnQpc3RybGVuKGJ1ZmZlcikrMTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgaWYgKGMgPj0gMHgxMDAwMCkgewogICAgICAgICAgICAgICAgIHJlcGxzaXplID0gMSsxKzg7CmRpZmYgLS1naXQgYS9QeXRob24vZHlubG9hZF9zaGxpYi5jIGIvUHl0aG9uL2R5bmxvYWRfc2hsaWIuYwppbmRleCA1Y2QxZWZkLi42NTlhZGFjIDEwMDY0NAotLS0gYS9QeXRob24vZHlubG9hZF9zaGxpYi5jCisrKyBiL1B5dGhvbi9keW5sb2FkX3NobGliLmMKQEAgLTcxLDggKzcxLDggQEAKIAogICAgIGlmIChmcCAhPSBOVUxMKSB7CiAgICAgICAgIGludCBpOwotICAgICAgICBzdHJ1Y3Qgc3RhdCBzdGF0YjsKLSAgICAgICAgaWYgKGZzdGF0KGZpbGVubyhmcCksICZzdGF0YikgPT0gLTEpIHsKKyAgICAgICAgc3RydWN0IF9QeV9zdGF0X3N0cnVjdCBzdGF0YjsKKyAgICAgICAgaWYgKF9QeV9mc3RhdChmaWxlbm8oZnApLCAmc3RhdGIpID09IC0xKSB7CiAgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL2ZpbGV1dGlscy5jIGIvUHl0aG9uL2ZpbGV1dGlscy5jCmluZGV4IGM1YzhkNGUuLjY1MDI4MjMgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9maWxldXRpbHMuYworKysgYi9QeXRob24vZmlsZXV0aWxzLmMKQEAgLTMsNiArMyw3IEBACiAjaW5jbHVkZSA8bG9jYWxlLmg+CiAKICNpZmRlZiBNU19XSU5ET1dTCisjICBpbmNsdWRlIDxtYWxsb2MuaD4KICMgIGluY2x1ZGUgPHdpbmRvd3MuaD4KICNlbmRpZgogCkBAIC01NDQsOCArNTQ1LDE0MyBAQAogfQogI2VuZGlmCiAKLSNpZmRlZiBIQVZFX1NUQVQKIAorI2lmIGRlZmluZWQoSEFWRV9GU1RBVCkgfHwgZGVmaW5lZChNU19XSU5ET1dTKQorCisjaWZkZWYgTVNfV0lORE9XUworc3RhdGljIF9faW50NjQgc2Vjc19iZXR3ZWVuX2Vwb2NocyA9IDExNjQ0NDczNjAwOyAvKiBTZWNvbmRzIGJldHdlZW4gMS4xLjE2MDEgYW5kIDEuMS4xOTcwICovCisKK3N0YXRpYyB2b2lkCitGSUxFX1RJTUVfdG9fdGltZV90X25zZWMoRklMRVRJTUUgKmluX3B0ciwgdGltZV90ICp0aW1lX291dCwgaW50KiBuc2VjX291dCkKK3sKKyAgICAvKiBYWFggZW5kaWFubmVzcy4gU2hvdWxkbid0IG1hdHRlciwgYXMgYWxsIFdpbmRvd3MgaW1wbGVtZW50YXRpb25zIGFyZSBsaXR0bGUtZW5kaWFuICovCisgICAgLyogQ2Fubm90IHNpbXBseSBjYXN0IGFuZCBkZXJlZmVyZW5jZSBpbl9wdHIsCisgICAgICAgc2luY2UgaXQgbWlnaHQgbm90IGJlIGFsaWduZWQgcHJvcGVybHkgKi8KKyAgICBfX2ludDY0IGluOworICAgIG1lbWNweSgmaW4sIGluX3B0ciwgc2l6ZW9mKGluKSk7CisgICAgKm5zZWNfb3V0ID0gKGludCkoaW4gJSAxMDAwMDAwMCkgKiAxMDA7IC8qIEZJTEVUSU1FIGlzIGluIHVuaXRzIG9mIDEwMCBuc2VjLiAqLworICAgICp0aW1lX291dCA9IFB5X1NBRkVfRE9XTkNBU1QoKGluIC8gMTAwMDAwMDApIC0gc2Vjc19iZXR3ZWVuX2Vwb2NocywgX19pbnQ2NCwgdGltZV90KTsKK30KKwordm9pZAorX1B5X3RpbWVfdF90b19GSUxFX1RJTUUodGltZV90IHRpbWVfaW4sIGludCBuc2VjX2luLCBGSUxFVElNRSAqb3V0X3B0cikKK3sKKyAgICAvKiBYWFggZW5kaWFubmVzcyAqLworICAgIF9faW50NjQgb3V0OworICAgIG91dCA9IHRpbWVfaW4gKyBzZWNzX2JldHdlZW5fZXBvY2hzOworICAgIG91dCA9IG91dCAqIDEwMDAwMDAwICsgbnNlY19pbiAvIDEwMDsKKyAgICBtZW1jcHkob3V0X3B0ciwgJm91dCwgc2l6ZW9mKG91dCkpOworfQorCisvKiBCZWxvdywgd2UgKmtub3cqIHRoYXQgdWdvK3IgaXMgMDQ0NCAqLworI2lmIF9TX0lSRUFEICE9IDA0MDAKKyNlcnJvciBVbnN1cHBvcnRlZCBDIGxpYnJhcnkKKyNlbmRpZgorc3RhdGljIGludAorYXR0cmlidXRlc190b19tb2RlKERXT1JEIGF0dHIpCit7CisgICAgaW50IG0gPSAwOworICAgIGlmIChhdHRyICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKQorICAgICAgICBtIHw9IF9TX0lGRElSIHwgMDExMTsgLyogSUZFWEVDIGZvciB1c2VyLGdyb3VwLG90aGVyICovCisgICAgZWxzZQorICAgICAgICBtIHw9IF9TX0lGUkVHOworICAgIGlmIChhdHRyICYgRklMRV9BVFRSSUJVVEVfUkVBRE9OTFkpCisgICAgICAgIG0gfD0gMDQ0NDsKKyAgICBlbHNlCisgICAgICAgIG0gfD0gMDY2NjsKKyAgICByZXR1cm4gbTsKK30KKwordm9pZAorX1B5X2F0dHJpYnV0ZV9kYXRhX3RvX3N0YXQoQllfSEFORExFX0ZJTEVfSU5GT1JNQVRJT04gKmluZm8sIFVMT05HIHJlcGFyc2VfdGFnLCBzdHJ1Y3QgX1B5X3N0YXRfc3RydWN0ICpyZXN1bHQpCit7CisgICAgbWVtc2V0KHJlc3VsdCwgMCwgc2l6ZW9mKCpyZXN1bHQpKTsKKyAgICByZXN1bHQtPnN0X21vZGUgPSBhdHRyaWJ1dGVzX3RvX21vZGUoaW5mby0+ZHdGaWxlQXR0cmlidXRlcyk7CisgICAgcmVzdWx0LT5zdF9zaXplID0gKCgoX19pbnQ2NClpbmZvLT5uRmlsZVNpemVIaWdoKTw8MzIpICsgaW5mby0+bkZpbGVTaXplTG93OworICAgIHJlc3VsdC0+c3RfZGV2ID0gaW5mby0+ZHdWb2x1bWVTZXJpYWxOdW1iZXI7CisgICAgcmVzdWx0LT5zdF9yZGV2ID0gcmVzdWx0LT5zdF9kZXY7CisgICAgRklMRV9USU1FX3RvX3RpbWVfdF9uc2VjKCZpbmZvLT5mdENyZWF0aW9uVGltZSwgJnJlc3VsdC0+c3RfY3RpbWUsICZyZXN1bHQtPnN0X2N0aW1lX25zZWMpOworICAgIEZJTEVfVElNRV90b190aW1lX3RfbnNlYygmaW5mby0+ZnRMYXN0V3JpdGVUaW1lLCAmcmVzdWx0LT5zdF9tdGltZSwgJnJlc3VsdC0+c3RfbXRpbWVfbnNlYyk7CisgICAgRklMRV9USU1FX3RvX3RpbWVfdF9uc2VjKCZpbmZvLT5mdExhc3RBY2Nlc3NUaW1lLCAmcmVzdWx0LT5zdF9hdGltZSwgJnJlc3VsdC0+c3RfYXRpbWVfbnNlYyk7CisgICAgcmVzdWx0LT5zdF9ubGluayA9IGluZm8tPm5OdW1iZXJPZkxpbmtzOworICAgIHJlc3VsdC0+c3RfaW5vID0gKCgoX19pbnQ2NClpbmZvLT5uRmlsZUluZGV4SGlnaCk8PDMyKSArIGluZm8tPm5GaWxlSW5kZXhMb3c7CisgICAgaWYgKHJlcGFyc2VfdGFnID09IElPX1JFUEFSU0VfVEFHX1NZTUxJTkspIHsKKyAgICAgICAgLyogZmlyc3QgY2xlYXIgdGhlIFNfSUZNVCBiaXRzICovCisgICAgICAgIHJlc3VsdC0+c3RfbW9kZSBePSAocmVzdWx0LT5zdF9tb2RlICYgU19JRk1UKTsKKyAgICAgICAgLyogbm93IHNldCB0aGUgYml0cyB0aGF0IG1ha2UgdGhpcyBhIHN5bWxpbmsgKi8KKyAgICAgICAgcmVzdWx0LT5zdF9tb2RlIHw9IFNfSUZMTks7CisgICAgfQorICAgIHJlc3VsdC0+c3RfZmlsZV9hdHRyaWJ1dGVzID0gaW5mby0+ZHdGaWxlQXR0cmlidXRlczsKK30KKyNlbmRpZgorCisvKiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgYSBmaWxlLgorCisgICBPbiBQT1NJWCwgdXNlIGZzdGF0KCkuCisKKyAgIE9uIFdpbmRvd3MsIHVzZSBHZXRGaWxlVHlwZSgpIGFuZCBHZXRGaWxlSW5mb3JtYXRpb25CeUhhbmRsZSgpIHdoaWNoIHN1cHBvcnQKKyAgIGZpbGVzIGxhcmdlciB0aGFuIDIgR0IuICBmc3RhdCgpIG1heSBmYWlsIHdpdGggRU9WRVJGTE9XIG9uIGZpbGVzIGxhcmdlcgorICAgdGhhbiAyIEdCIGJlY2F1c2UgdGhlIGZpbGUgc2l6ZSB0eXBlIGlzIGFuIHNpZ25lZCAzMi1iaXQgaW50ZWdlcjogc2VlIGlzc3VlCisgICAjMjMxNTIuCisgICAqLworaW50CitfUHlfZnN0YXQoaW50IGZkLCBzdHJ1Y3QgX1B5X3N0YXRfc3RydWN0ICpyZXN1bHQpCit7CisjaWZkZWYgTVNfV0lORE9XUworICAgIEJZX0hBTkRMRV9GSUxFX0lORk9STUFUSU9OIGluZm87CisgICAgSEFORExFIGg7CisgICAgaW50IHR5cGU7CisKKyAgICBpZiAoIV9QeVZlcmlmeV9mZChmZCkpCisgICAgICAgIGggPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgICBlbHNlCisgICAgICAgIGggPSAoSEFORExFKV9nZXRfb3NmaGFuZGxlKGZkKTsKKworICAgIC8qIFByb3RvY29sIHZpb2xhdGlvbjogd2UgZXhwbGljaXRseSBjbGVhciBlcnJubywgaW5zdGVhZCBvZgorICAgICAgIHNldHRpbmcgaXQgdG8gYSBQT1NJWCBlcnJvci4gQ2FsbGVycyBzaG91bGQgdXNlIEdldExhc3RFcnJvci4gKi8KKyAgICBlcnJubyA9IDA7CisKKyAgICBpZiAoaCA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgICAgICAvKiBUaGlzIGlzIHJlYWxseSBhIEMgbGlicmFyeSBlcnJvciAoaW52YWxpZCBmaWxlIGhhbmRsZSkuCisgICAgICAgICAgIFdlIHNldCB0aGUgV2luMzIgZXJyb3IgdG8gdGhlIGNsb3NlcyBvbmUgbWF0Y2hpbmcuICovCisgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX0hBTkRMRSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWVtc2V0KHJlc3VsdCwgMCwgc2l6ZW9mKCpyZXN1bHQpKTsKKworICAgIHR5cGUgPSBHZXRGaWxlVHlwZShoKTsKKyAgICBpZiAodHlwZSA9PSBGSUxFX1RZUEVfVU5LTk9XTikgeworICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICBpZiAoZXJyb3IgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIC8qIGVsc2U6IHZhbGlkIGJ1dCB1bmtub3duIGZpbGUgKi8KKyAgICB9CisKKyAgICBpZiAodHlwZSAhPSBGSUxFX1RZUEVfRElTSykgeworICAgICAgICBpZiAodHlwZSA9PSBGSUxFX1RZUEVfQ0hBUikKKyAgICAgICAgICAgIHJlc3VsdC0+c3RfbW9kZSA9IF9TX0lGQ0hSOworICAgICAgICBlbHNlIGlmICh0eXBlID09IEZJTEVfVFlQRV9QSVBFKQorICAgICAgICAgICAgcmVzdWx0LT5zdF9tb2RlID0gX1NfSUZJRk87CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICghR2V0RmlsZUluZm9ybWF0aW9uQnlIYW5kbGUoaCwgJmluZm8pKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBfUHlfYXR0cmlidXRlX2RhdGFfdG9fc3RhdCgmaW5mbywgMCwgcmVzdWx0KTsKKyAgICAvKiBzcGVjaWZpYyB0byBmc3RhdCgpICovCisgICAgcmVzdWx0LT5zdF9pbm8gPSAoKChfX2ludDY0KWluZm8ubkZpbGVJbmRleEhpZ2gpPDwzMikgKyBpbmZvLm5GaWxlSW5kZXhMb3c7CisgICAgcmV0dXJuIDA7CisjZWxzZQorICAgIHJldHVybiBmc3RhdChmZCwgcmVzdWx0KTsKKyNlbmRpZgorfQorI2VuZGlmICAgLyogSEFWRV9GU1RBVCB8fCBNU19XSU5ET1dTICovCisKKworI2lmZGVmIEhBVkVfU1RBVAogLyogQ2FsbCBfd3N0YXQoKSBvbiBXaW5kb3dzLCBvciBlbmNvZGUgdGhlIHBhdGggdG8gdGhlIGZpbGVzeXN0ZW0gZW5jb2RpbmcgYW5kCiAgICBjYWxsIHN0YXQoKSBvdGhlcndpc2UuIE9ubHkgZmlsbCBzdF9tb2RlIGF0dHJpYnV0ZSBvbiBXaW5kb3dzLgogCkBAIC01NzgsNyArNzE0LDggQEAKICNlbmRpZgogfQogCi0jZW5kaWYKKyNlbmRpZiAgIC8qIEhBVkVfU1RBVCAqLworCiAKIHN0YXRpYyBpbnQKIGdldF9pbmhlcml0YWJsZShpbnQgZmQsIGludCByYWlzZSkKQEAgLTExMzEsMyArMTI2OCwxMDIgQEAKIH0KICNlbmRpZgogCisjaWZkZWYgX01TQ19WRVIKKyNpZiBfTVNDX1ZFUiA+PSAxOTAwCisKKy8qIFRoaXMgZnVuY3Rpb24gbGV0cyB0aGUgV2luZG93cyBDUlQgdmFsaWRhdGUgdGhlIGZpbGUgaGFuZGxlIHdpdGhvdXQKKyAgIHRlcm1pbmF0aW5nIHRoZSBwcm9jZXNzIGlmIGl0J3MgaW52YWxpZC4gKi8KK2ludAorX1B5VmVyaWZ5X2ZkKGludCBmZCkKK3sKKyAgICBpbnRwdHJfdCBvc2g7CisgICAgLyogRmFzdCBjaGVjayBmb3IgdGhlIG9ubHkgY29uZGl0aW9uIHdlIGtub3cgKi8KKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIF9zZXRfZXJybm8oRUJBREYpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgb3NoID0gX2dldF9vc2ZoYW5kbGUoZmQpOworICAgIHJldHVybiBvc2ggIT0gKGludHB0cl90KS0xOworfQorCisjZWxpZiBfTVNDX1ZFUiA+PSAxNDAwCisvKiBMZWdhY3kgaW1wbGVtZW50YXRpb24gb2YgX1B5VmVyaWZ5X2ZkIHdoaWxlIHRyYW5zaXRpb25pbmcgdG8KKyAqIE1TVkMgMTQuMC4gVGhpcyBzaG91bGQgZXZlbnR1YWxseSBiZSByZW1vdmVkLiAoaXNzdWUyMzUyNCkKKyAqLworCisvKiBNaWNyb3NvZnQgQ1JUIGluIFZTMjAwNSBhbmQgaGlnaGVyIHdpbGwgdmVyaWZ5IHRoYXQgYSBmaWxlaGFuZGxlIGlzCisgKiB2YWxpZCBhbmQgcmFpc2UgYW4gYXNzZXJ0aW9uIGlmIGl0IGlzbid0LgorICogTm9ybWFsbHksIGFuIGludmFsaWQgZmQgaXMgbGlrZWx5IHRvIGJlIGEgQyBwcm9ncmFtIGVycm9yIGFuZCB0aGVyZWZvcmUKKyAqIGFuIGFzc2VydGlvbiBjYW4gYmUgdXNlZnVsLCBidXQgaXQgZG9lcyBjb250cmFkaWN0IHRoZSBQT1NJWCBzdGFuZGFyZAorICogd2hpY2ggZm9yIHdyaXRlKDIpIHN0YXRlczoKKyAqICAgICJPdGhlcndpc2UsIC0xIHNoYWxsIGJlIHJldHVybmVkIGFuZCBlcnJubyBzZXQgdG8gaW5kaWNhdGUgdGhlIGVycm9yLiIKKyAqICAgICJbRUJBREZdIFRoZSBmaWxkZXMgYXJndW1lbnQgaXMgbm90IGEgdmFsaWQgZmlsZSBkZXNjcmlwdG9yIG9wZW4gZm9yCisgKiAgICAgd3JpdGluZy4iCisgKiBGdXJ0aGVybW9yZSwgcHl0aG9uIGFsbG93cyB0aGUgdXNlciB0byBlbnRlciBhbnkgb2xkIGludGVnZXIKKyAqIGFzIGEgZmQgYW5kIHNob3VsZCBtZXJlbHkgcmFpc2UgYSBweXRob24gZXhjZXB0aW9uIG9uIGVycm9yLgorICogVGhlIE1pY3Jvc29mdCBDUlQgZG9lc24ndCBwcm92aWRlIGFuIG9mZmljaWFsIHdheSB0byBjaGVjayBmb3IgdGhlCisgKiB2YWxpZGl0eSBvZiBhIGZpbGUgZGVzY3JpcHRvciwgYnV0IHdlIGNhbiBlbXVsYXRlIGl0cyBpbnRlcm5hbCBiZWhhdmlvdXIKKyAqIGJ5IHVzaW5nIHRoZSBleHBvcnRlZCBfX3BpbmZvIGRhdGEgbWVtYmVyIGFuZCBrbm93bGVkZ2Ugb2YgdGhlCisgKiBpbnRlcm5hbCBzdHJ1Y3R1cmVzIGludm9sdmVkLgorICogVGhlIHN0cnVjdHVyZXMgYmVsb3cgbXVzdCBiZSB1cGRhdGVkIGZvciBlYWNoIHZlcnNpb24gb2YgdmlzdWFsIHN0dWRpbworICogYWNjb3JkaW5nIHRvIHRoZSBmaWxlIGludGVybmFsLmggaW4gdGhlIENSVCBzb3VyY2UsIHVudGlsIE1TIGNvbWVzCisgKiB1cCB3aXRoIGEgbGVzcyBoYWNreSB3YXkgdG8gZG8gdGhpcy4KKyAqIChhbGwgb2YgdGhpcyBpcyB0byBhdm9pZCBnbG9iYWxseSBtb2RpZnlpbmcgdGhlIENSVCBiZWhhdmlvdXIgdXNpbmcKKyAqIF9zZXRfaW52YWxpZF9wYXJhbWV0ZXJfaGFuZGxlcigpIGFuZCBfQ3J0U2V0UmVwb3J0TW9kZSgpKQorICovCisvKiBUaGUgYWN0dWFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpcyBkZXRlcm1pbmVkIGF0IHJ1bnRpbWUuCisgKiBPbmx5IHRoZSBmaXJzdCBpdGVtcyBtdXN0IGJlIHByZXNlbnQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnRwdHJfdCBvc2ZobmQ7CisgICAgY2hhciBvc2ZpbGU7Cit9IG15X2lvaW5mbzsKKworZXh0ZXJuIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBjaGFyICogX19waW9pbmZvW107CisjZGVmaW5lIElPSU5GT19MMkUgNQorI2RlZmluZSBJT0lORk9fQVJSQVlTIDY0CisjZGVmaW5lIElPSU5GT19BUlJBWV9FTFRTICAgKDEgPDwgSU9JTkZPX0wyRSkKKyNkZWZpbmUgX05IQU5ETEVfICAgICAgICAgICAoSU9JTkZPX0FSUkFZUyAqIElPSU5GT19BUlJBWV9FTFRTKQorI2RlZmluZSBGT1BFTiAweDAxCisjZGVmaW5lIF9OT19DT05TT0xFX0ZJTEVOTyAoaW50cHRyX3QpLTIKKworLyogVGhpcyBmdW5jdGlvbiBlbXVsYXRlcyB3aGF0IHRoZSB3aW5kb3dzIENSVCBkb2VzIHRvIHZhbGlkYXRlIGZpbGUgaGFuZGxlcyAqLworaW50CitfUHlWZXJpZnlfZmQoaW50IGZkKQoreworICAgIGNvbnN0IGludCBpMSA9IGZkID4+IElPSU5GT19MMkU7CisgICAgY29uc3QgaW50IGkyID0gZmQgJiAoKDEgPDwgSU9JTkZPX0wyRSkgLSAxKTsKKworICAgIHN0YXRpYyBzaXplX3Qgc2l6ZW9mX2lvaW5mbyA9IDA7CisKKyAgICAvKiBEZXRlcm1pbmUgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBpb2luZm8gc3RydWN0dXJlLAorICAgICAqIGFzIHVzZWQgYnkgdGhlIENSVCBsb2FkZWQgaW4gbWVtb3J5CisgICAgICovCisgICAgaWYgKHNpemVvZl9pb2luZm8gPT0gMCAmJiBfX3Bpb2luZm9bMF0gIT0gTlVMTCkgeworICAgICAgICBzaXplb2ZfaW9pbmZvID0gX21zaXplKF9fcGlvaW5mb1swXSkgLyBJT0lORk9fQVJSQVlfRUxUUzsKKyAgICB9CisgICAgaWYgKHNpemVvZl9pb2luZm8gPT0gMCkgeworICAgICAgICAvKiBUaGlzIHNob3VsZCBub3QgaGFwcGVuLi4uICovCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICAvKiBTZWUgdGhhdCBpdCBpc24ndCBhIHNwZWNpYWwgQ0xFQVIgZmlsZW5vICovCisgICAgaWYgKGZkICE9IF9OT19DT05TT0xFX0ZJTEVOTykgeworICAgICAgICAvKiBNaWNyb3NvZnQgQ1JUIHdvdWxkIGNoZWNrIHRoYXQgMDw9ZmQ8X25oYW5kbGUgYnV0IHdlIGNhbid0IGRvIHRoYXQuICBJbnN0ZWFkCisgICAgICAgICAqIHdlIGNoZWNrIHBvaW50ZXIgdmFsaWRpdHkgYW5kIG90aGVyIGluZm8KKyAgICAgICAgICovCisgICAgICAgIGlmICgwIDw9IGkxICYmIGkxIDwgSU9JTkZPX0FSUkFZUyAmJiBfX3Bpb2luZm9baTFdICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIGZpbmFsbHksIGNoZWNrIHRoYXQgdGhlIGZpbGUgaXMgb3BlbiAqLworICAgICAgICAgICAgbXlfaW9pbmZvKiBpbmZvID0gKG15X2lvaW5mbyopKF9fcGlvaW5mb1tpMV0gKyBpMiAqIHNpemVvZl9pb2luZm8pOworICAgICAgICAgICAgaWYgKGluZm8tPm9zZmlsZSAmIEZPUEVOKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgIGZhaWw6CisgICAgZXJybm8gPSBFQkFERjsKKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIF9NU0NfVkVSID49IDE5MDAgfHwgX01TQ19WRVIgPj0gMTQwMCAqLworI2VuZGlmIC8qIGRlZmluZWQgX01TQ19WRVIgKi8KZGlmZiAtLWdpdCBhL1B5dGhvbi9mcm96ZW5tYWluLmMgYi9QeXRob24vZnJvemVubWFpbi5jCmluZGV4IGNiODRlZDUuLmRlOGJkMzUgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9mcm96ZW5tYWluLmMKKysrIGIvUHl0aG9uL2Zyb3plbm1haW4uYwpAQCAtMjQsMTEgKzI0LDEzIEBACiAgICAgLyogV2UgbmVlZCBhIHNlY29uZCBjb3BpZXMsIGFzIFB5dGhvbiBtaWdodCBtb2RpZnkgdGhlIGZpcnN0IG9uZS4gKi8KICAgICB3Y2hhcl90ICoqYXJndl9jb3B5MiA9IE5VTEw7CiAKLSAgICBhcmd2X2NvcHkgPSBQeU1lbV9SYXdNYWxsb2Moc2l6ZW9mKHdjaGFyX3QqKSAqIGFyZ2MpOwotICAgIGFyZ3ZfY29weTIgPSBQeU1lbV9SYXdNYWxsb2Moc2l6ZW9mKHdjaGFyX3QqKSAqIGFyZ2MpOwotICAgIGlmICghYXJndl9jb3B5IHx8ICFhcmd2X2NvcHkyKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAib3V0IG9mIG1lbW9yeVxuIik7Ci0gICAgICAgIGdvdG8gZXJyb3I7CisgICAgaWYgKGFyZ2MgPiAwKSB7CisgICAgICAgIGFyZ3ZfY29weSA9IFB5TWVtX1Jhd01hbGxvYyhzaXplb2Yod2NoYXJfdCopICogYXJnYyk7CisgICAgICAgIGFyZ3ZfY29weTIgPSBQeU1lbV9SYXdNYWxsb2Moc2l6ZW9mKHdjaGFyX3QqKSAqIGFyZ2MpOworICAgICAgICBpZiAoIWFyZ3ZfY29weSB8fCAhYXJndl9jb3B5MikgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJvdXQgb2YgbWVtb3J5XG4iKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KICAgICB9CiAKICAgICBQeV9Gcm96ZW5GbGFnID0gMTsgLyogU3VwcHJlc3MgZXJyb3JzIGZyb20gZ2V0cGF0aC5jICovCkBAIC02OCw3ICs3MCw4IEBACiAjaWZkZWYgTVNfV0lORE9XUwogICAgIFB5SW5pdEZyb3plbkV4dGVuc2lvbnMoKTsKICNlbmRpZiAvKiBNU19XSU5ET1dTICovCi0gICAgUHlfU2V0UHJvZ3JhbU5hbWUoYXJndl9jb3B5WzBdKTsKKyAgICBpZiAoYXJnYyA+PSAxKQorICAgICAgICBQeV9TZXRQcm9ncmFtTmFtZShhcmd2X2NvcHlbMF0pOwogICAgIFB5X0luaXRpYWxpemUoKTsKICNpZmRlZiBNU19XSU5ET1dTCiAgICAgUHlXaW5GcmVlemVfRXhlSW5pdCgpOwpkaWZmIC0tZ2l0IGEvUHl0aG9uL21hcnNoYWwuYyBiL1B5dGhvbi9tYXJzaGFsLmMKaW5kZXggNWFjZjBkZS4uOTNkOWQxZCAxMDA2NDQKLS0tIGEvUHl0aG9uL21hcnNoYWwuYworKysgYi9QeXRob24vbWFyc2hhbC5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSAibG9uZ2ludHJlcHIuaCIKICNpbmNsdWRlICJjb2RlLmgiCiAjaW5jbHVkZSAibWFyc2hhbC5oIgorI2luY2x1ZGUgIi4uL01vZHVsZXMvaGFzaHRhYmxlLmgiCiAKIC8qIEhpZ2ggd2F0ZXIgbWFyayB0byBkZXRlcm1pbmUgd2hlbiB0aGUgbWFyc2hhbGxlZCBvYmplY3QgaXMgZGFuZ2Vyb3VzbHkgZGVlcAogICogYW5kIHJpc2tzIGNvcmluZyB0aGUgaW50ZXJwcmV0ZXIuICBXaGVuIHRoZSBvYmplY3Qgc3RhY2sgZ2V0cyB0aGlzIGRlZXAsCkBAIC02NCw1NCArNjUsODMgQEAKICAgICBGSUxFICpmcDsKICAgICBpbnQgZXJyb3I7ICAvKiBzZWUgV0ZFUlJfKiB2YWx1ZXMgKi8KICAgICBpbnQgZGVwdGg7Ci0gICAgLyogSWYgZnAgPT0gTlVMTCwgdGhlIGZvbGxvd2luZyBhcmUgdmFsaWQ6ICovCi0gICAgUHlPYmplY3QgKnJlYWRhYmxlOyAgICAvKiBTdHJlYW0tbGlrZSBvYmplY3QgYmVpbmcgcmVhZCBmcm9tICovCiAgICAgUHlPYmplY3QgKnN0cjsKLSAgICBQeU9iamVjdCAqY3VycmVudF9maWxlbmFtZTsKICAgICBjaGFyICpwdHI7CiAgICAgY2hhciAqZW5kOwogICAgIGNoYXIgKmJ1ZjsKLSAgICBQeV9zc2l6ZV90IGJ1Zl9zaXplOwotICAgIFB5T2JqZWN0ICpyZWZzOyAvKiBkaWN0IG9uIG1hcnNoYWwsIGxpc3Qgb24gdW5tYXJzaGFsICovCisgICAgX1B5X2hhc2h0YWJsZV90ICpoYXNodGFibGU7CiAgICAgaW50IHZlcnNpb247CiB9IFdGSUxFOwogCi0jZGVmaW5lIHdfYnl0ZShjLCBwKSBpZiAoKChwKS0+ZnApKSBwdXRjKChjKSwgKHApLT5mcCk7IFwKLSAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgocCktPnB0ciAhPSAocCktPmVuZCkgKihwKS0+cHRyKysgPSAoYyk7IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugd19tb3JlKChjKSwgcCkKKyNkZWZpbmUgd19ieXRlKGMsIHApIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKHApLT5wdHIgIT0gKHApLT5lbmQgfHwgd19yZXNlcnZlKChwKSwgMSkpICBcCisgICAgICAgICAgICAqKHApLT5wdHIrKyA9IChjKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlKDApCiAKIHN0YXRpYyB2b2lkCi13X21vcmUoY2hhciBjLCBXRklMRSAqcCkKK3dfZmx1c2goV0ZJTEUgKnApCiB7Ci0gICAgUHlfc3NpemVfdCBzaXplLCBuZXdzaXplOwotICAgIGlmIChwLT5zdHIgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuOyAvKiBBbiBlcnJvciBhbHJlYWR5IG9jY3VycmVkICovCi0gICAgc2l6ZSA9IFB5Qnl0ZXNfU2l6ZShwLT5zdHIpOwotICAgIG5ld3NpemUgPSBzaXplICsgc2l6ZSArIDEwMjQ7Ci0gICAgaWYgKG5ld3NpemUgPiAzMioxMDI0KjEwMjQpIHsKLSAgICAgICAgbmV3c2l6ZSA9IHNpemUgKyAoc2l6ZSA+PiAzKTsgICAgICAgICAgIC8qIDEyLjUlIG92ZXJhbGxvY2F0aW9uICovCisgICAgYXNzZXJ0KHAtPmZwICE9IE5VTEwpOworICAgIGZ3cml0ZShwLT5idWYsIDEsIHAtPnB0ciAtIHAtPmJ1ZiwgcC0+ZnApOworICAgIHAtPnB0ciA9IHAtPmJ1ZjsKK30KKworc3RhdGljIGludAord19yZXNlcnZlKFdGSUxFICpwLCBQeV9zc2l6ZV90IG5lZWRlZCkKK3sKKyAgICBQeV9zc2l6ZV90IHBvcywgc2l6ZSwgZGVsdGE7CisgICAgaWYgKHAtPnB0ciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsgLyogQW4gZXJyb3IgYWxyZWFkeSBvY2N1cnJlZCAqLworICAgIGlmIChwLT5mcCAhPSBOVUxMKSB7CisgICAgICAgIHdfZmx1c2gocCk7CisgICAgICAgIHJldHVybiBuZWVkZWQgPD0gcC0+ZW5kIC0gcC0+cHRyOwogICAgIH0KLSAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZwLT5zdHIsIG5ld3NpemUpICE9IDApIHsKLSAgICAgICAgcC0+cHRyID0gcC0+ZW5kID0gTlVMTDsKKyAgICBhc3NlcnQocC0+c3RyICE9IE5VTEwpOworICAgIHBvcyA9IHAtPnB0ciAtIHAtPmJ1ZjsKKyAgICBzaXplID0gUHlCeXRlc19TaXplKHAtPnN0cik7CisgICAgaWYgKHNpemUgPiAxNioxMDI0KjEwMjQpCisgICAgICAgIGRlbHRhID0gKHNpemUgPj4gMyk7ICAgICAgICAgICAgLyogMTIuNSUgb3ZlcmFsbG9jYXRpb24gKi8KKyAgICBlbHNlCisgICAgICAgIGRlbHRhID0gc2l6ZSArIDEwMjQ7CisgICAgZGVsdGEgPSBQeV9NQVgoZGVsdGEsIG5lZWRlZCk7CisgICAgaWYgKGRlbHRhID4gUFlfU1NJWkVfVF9NQVggLSBzaXplKSB7CisgICAgICAgIHAtPmVycm9yID0gV0ZFUlJfTk9NRU1PUlk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBzaXplICs9IGRlbHRhOworICAgIGlmIChfUHlCeXRlc19SZXNpemUoJnAtPnN0ciwgc2l6ZSkgIT0gMCkgeworICAgICAgICBwLT5wdHIgPSBwLT5idWYgPSBwLT5lbmQgPSBOVUxMOworICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgZWxzZSB7Ci0gICAgICAgIHAtPnB0ciA9IFB5Qnl0ZXNfQVNfU1RSSU5HKChQeUJ5dGVzT2JqZWN0ICopcC0+c3RyKSArIHNpemU7Ci0gICAgICAgIHAtPmVuZCA9Ci0gICAgICAgICAgICBQeUJ5dGVzX0FTX1NUUklORygoUHlCeXRlc09iamVjdCAqKXAtPnN0cikgKyBuZXdzaXplOwotICAgICAgICAqcC0+cHRyKysgPSBjOworICAgICAgICBwLT5idWYgPSBQeUJ5dGVzX0FTX1NUUklORyhwLT5zdHIpOworICAgICAgICBwLT5wdHIgPSBwLT5idWYgKyBwb3M7CisgICAgICAgIHAtPmVuZCA9IHAtPmJ1ZiArIHNpemU7CisgICAgICAgIHJldHVybiAxOwogICAgIH0KIH0KIAogc3RhdGljIHZvaWQKIHdfc3RyaW5nKGNvbnN0IGNoYXIgKnMsIFB5X3NzaXplX3QgbiwgV0ZJTEUgKnApCiB7CisgICAgUHlfc3NpemVfdCBtOworICAgIGlmICghbiB8fCBwLT5wdHIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIG0gPSBwLT5lbmQgLSBwLT5wdHI7CiAgICAgaWYgKHAtPmZwICE9IE5VTEwpIHsKLSAgICAgICAgZndyaXRlKHMsIDEsIG4sIHAtPmZwKTsKKyAgICAgICAgaWYgKG4gPD0gbSkgeworICAgICAgICAgICAgUHlfTUVNQ1BZKHAtPnB0ciwgcywgbik7CisgICAgICAgICAgICBwLT5wdHIgKz0gbjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHdfZmx1c2gocCk7CisgICAgICAgICAgICBmd3JpdGUocywgMSwgbiwgcC0+ZnApOworICAgICAgICB9CiAgICAgfQogICAgIGVsc2UgewotICAgICAgICB3aGlsZSAoLS1uID49IDApIHsKLSAgICAgICAgICAgIHdfYnl0ZSgqcywgcCk7Ci0gICAgICAgICAgICBzKys7CisgICAgICAgIGlmIChuIDw9IG0gfHwgd19yZXNlcnZlKHAsIG4gLSBtKSkgeworICAgICAgICAgICAgUHlfTUVNQ1BZKHAtPnB0ciwgcywgbik7CisgICAgICAgICAgICBwLT5wdHIgKz0gbjsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTIyMyw0NiArMjUzLDM4IEBACiBzdGF0aWMgaW50CiB3X3JlZihQeU9iamVjdCAqdiwgY2hhciAqZmxhZywgV0ZJTEUgKnApCiB7Ci0gICAgUHlPYmplY3QgKmlkOwotICAgIFB5T2JqZWN0ICppZHg7CisgICAgX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeTsKKyAgICBpbnQgdzsKIAotICAgIGlmIChwLT52ZXJzaW9uIDwgMyB8fCBwLT5yZWZzID09IE5VTEwpCisgICAgaWYgKHAtPnZlcnNpb24gPCAzIHx8IHAtPmhhc2h0YWJsZSA9PSBOVUxMKQogICAgICAgICByZXR1cm4gMDsgLyogbm90IHdyaXRpbmcgb2JqZWN0IHJlZmVyZW5jZXMgKi8KIAogICAgIC8qIGlmIGl0IGhhcyBvbmx5IG9uZSByZWZlcmVuY2UsIGl0IGRlZmluaXRlbHkgaXNuJ3Qgc2hhcmVkICovCiAgICAgaWYgKFB5X1JFRkNOVCh2KSA9PSAxKQogICAgICAgICByZXR1cm4gMDsKIAotICAgIGlkID0gUHlMb25nX0Zyb21Wb2lkUHRyKCh2b2lkKil2KTsKLSAgICBpZiAoaWQgPT0gTlVMTCkKLSAgICAgICAgZ290byBlcnI7Ci0gICAgaWR4ID0gUHlEaWN0X0dldEl0ZW0ocC0+cmVmcywgaWQpOwotICAgIGlmIChpZHggIT0gTlVMTCkgeworICAgIGVudHJ5ID0gX1B5X2hhc2h0YWJsZV9nZXRfZW50cnkocC0+aGFzaHRhYmxlLCB2KTsKKyAgICBpZiAoZW50cnkgIT0gTlVMTCkgewogICAgICAgICAvKiB3cml0ZSB0aGUgcmVmZXJlbmNlIGluZGV4IHRvIHRoZSBzdHJlYW0gKi8KLSAgICAgICAgbG9uZyB3ID0gUHlMb25nX0FzTG9uZyhpZHgpOwotICAgICAgICBQeV9ERUNSRUYoaWQpOwotICAgICAgICBpZiAodyA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICAgICAgICBnb3RvIGVycjsKLSAgICAgICAgfQorICAgICAgICBfUHlfSEFTSFRBQkxFX0VOVFJZX1JFQURfREFUQShwLT5oYXNodGFibGUsICZ3LCBzaXplb2YodyksIGVudHJ5KTsKICAgICAgICAgLyogd2UgZG9uJ3Qgc3RvcmUgImxvbmciIGluZGljZXMgaW4gdGhlIGRpY3QgKi8KICAgICAgICAgYXNzZXJ0KDAgPD0gdyAmJiB3IDw9IDB4N2ZmZmZmZmYpOwogICAgICAgICB3X2J5dGUoVFlQRV9SRUYsIHApOwogICAgICAgICB3X2xvbmcodywgcCk7CiAgICAgICAgIHJldHVybiAxOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCBvazsKLSAgICAgICAgUHlfc3NpemVfdCBzID0gUHlEaWN0X1NpemUocC0+cmVmcyk7CisgICAgICAgIHNpemVfdCBzID0gcC0+aGFzaHRhYmxlLT5lbnRyaWVzOwogICAgICAgICAvKiB3ZSBkb24ndCBzdXBwb3J0IGxvbmcgaW5kaWNlcyAqLwogICAgICAgICBpZiAocyA+PSAweDdmZmZmZmZmKSB7CiAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInRvbyBtYW55IG9iamVjdHMiKTsKICAgICAgICAgICAgIGdvdG8gZXJyOwogICAgICAgICB9Ci0gICAgICAgIGlkeCA9IFB5TG9uZ19Gcm9tU3NpemVfdChzKTsKLSAgICAgICAgb2sgPSBpZHggJiYgUHlEaWN0X1NldEl0ZW0ocC0+cmVmcywgaWQsIGlkeCkgPT0gMDsKLSAgICAgICAgUHlfREVDUkVGKGlkKTsKLSAgICAgICAgUHlfWERFQ1JFRihpZHgpOwotICAgICAgICBpZiAoIW9rKQorICAgICAgICB3ID0gKGludClzOworICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgIGlmIChfUHlfSEFTSFRBQkxFX1NFVChwLT5oYXNodGFibGUsIHYsIHcpIDwgMCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHYpOwogICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIH0KICAgICAgICAgKmZsYWcgfD0gRkxBR19SRUY7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTU0NSwzNyArNTY3LDgxIEBACiAgICAgfQogfQogCitzdGF0aWMgaW50Cit3X2luaXRfcmVmcyhXRklMRSAqd2YsIGludCB2ZXJzaW9uKQoreworICAgIGlmICh2ZXJzaW9uID49IDMpIHsKKyAgICAgICAgd2YtPmhhc2h0YWJsZSA9IF9QeV9oYXNodGFibGVfbmV3KHNpemVvZihpbnQpLCBfUHlfaGFzaHRhYmxlX2hhc2hfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5X2hhc2h0YWJsZV9jb21wYXJlX2RpcmVjdCk7CisgICAgICAgIGlmICh3Zi0+aGFzaHRhYmxlID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3dfZGVjcmVmX2VudHJ5KF9QeV9oYXNodGFibGVfZW50cnlfdCAqZW50cnksIHZvaWQgKlB5X1VOVVNFRChkYXRhKSkKK3sKKyAgICBQeV9YREVDUkVGKGVudHJ5LT5rZXkpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAord19jbGVhcl9yZWZzKFdGSUxFICp3ZikKK3sKKyAgICBpZiAod2YtPmhhc2h0YWJsZSAhPSBOVUxMKSB7CisgICAgICAgIF9QeV9oYXNodGFibGVfZm9yZWFjaCh3Zi0+aGFzaHRhYmxlLCB3X2RlY3JlZl9lbnRyeSwgTlVMTCk7CisgICAgICAgIF9QeV9oYXNodGFibGVfZGVzdHJveSh3Zi0+aGFzaHRhYmxlKTsKKyAgICB9Cit9CisKIC8qIHZlcnNpb24gY3VycmVudGx5IGhhcyBubyBlZmZlY3QgZm9yIHdyaXRpbmcgaW50cy4gKi8KIHZvaWQKIFB5TWFyc2hhbF9Xcml0ZUxvbmdUb0ZpbGUobG9uZyB4LCBGSUxFICpmcCwgaW50IHZlcnNpb24pCiB7CisgICAgY2hhciBidWZbNF07CiAgICAgV0ZJTEUgd2Y7CisgICAgbWVtc2V0KCZ3ZiwgMCwgc2l6ZW9mKHdmKSk7CiAgICAgd2YuZnAgPSBmcDsKKyAgICB3Zi5wdHIgPSB3Zi5idWYgPSBidWY7CisgICAgd2YuZW5kID0gd2YucHRyICsgc2l6ZW9mKGJ1Zik7CiAgICAgd2YuZXJyb3IgPSBXRkVSUl9PSzsKLSAgICB3Zi5kZXB0aCA9IDA7Ci0gICAgd2YucmVmcyA9IE5VTEw7CiAgICAgd2YudmVyc2lvbiA9IHZlcnNpb247CiAgICAgd19sb25nKHgsICZ3Zik7CisgICAgd19mbHVzaCgmd2YpOwogfQogCiB2b2lkCiBQeU1hcnNoYWxfV3JpdGVPYmplY3RUb0ZpbGUoUHlPYmplY3QgKngsIEZJTEUgKmZwLCBpbnQgdmVyc2lvbikKIHsKKyAgICBjaGFyIGJ1ZltCVUZTSVpdOwogICAgIFdGSUxFIHdmOworICAgIG1lbXNldCgmd2YsIDAsIHNpemVvZih3ZikpOwogICAgIHdmLmZwID0gZnA7CisgICAgd2YucHRyID0gd2YuYnVmID0gYnVmOworICAgIHdmLmVuZCA9IHdmLnB0ciArIHNpemVvZihidWYpOwogICAgIHdmLmVycm9yID0gV0ZFUlJfT0s7Ci0gICAgd2YuZGVwdGggPSAwOwotICAgIGlmICh2ZXJzaW9uID49IDMpIHsKLSAgICAgICAgaWYgKCh3Zi5yZWZzID0gUHlEaWN0X05ldygpKSA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuOyAvKiBjYWxsZXIgbXVzaCBjaGVjayBQeUVycl9PY2N1cnJlZCgpICovCi0gICAgfSBlbHNlCi0gICAgICAgIHdmLnJlZnMgPSBOVUxMOwogICAgIHdmLnZlcnNpb24gPSB2ZXJzaW9uOworICAgIGlmICh3X2luaXRfcmVmcygmd2YsIHZlcnNpb24pKQorICAgICAgICByZXR1cm47IC8qIGNhbGxlciBtdXNoIGNoZWNrIFB5RXJyX09jY3VycmVkKCkgKi8KICAgICB3X29iamVjdCh4LCAmd2YpOwotICAgIFB5X1hERUNSRUYod2YucmVmcyk7CisgICAgd19jbGVhcl9yZWZzKCZ3Zik7CisgICAgd19mbHVzaCgmd2YpOwogfQogCi10eXBlZGVmIFdGSUxFIFJGSUxFOyAvKiBTYW1lIHN0cnVjdCB3aXRoIGRpZmZlcmVudCBpbnZhcmlhbnRzICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRklMRSAqZnA7CisgICAgaW50IGRlcHRoOworICAgIFB5T2JqZWN0ICpyZWFkYWJsZTsgIC8qIFN0cmVhbS1saWtlIG9iamVjdCBiZWluZyByZWFkIGZyb20gKi8KKyAgICBQeU9iamVjdCAqY3VycmVudF9maWxlbmFtZTsKKyAgICBjaGFyICpwdHI7CisgICAgY2hhciAqZW5kOworICAgIGNoYXIgKmJ1ZjsKKyAgICBQeV9zc2l6ZV90IGJ1Zl9zaXplOworICAgIFB5T2JqZWN0ICpyZWZzOyAgLyogYSBsaXN0ICovCit9IFJGSUxFOwogCiBzdGF0aWMgY2hhciAqCiByX3N0cmluZyhQeV9zc2l6ZV90IG4sIFJGSUxFICpwKQpAQCAtMTQxNSwxNiArMTQ4MSwyMCBAQAogICAgIHJldHVybiByZXM7CiB9CiAKLSNpZmRlZiBIQVZFX0ZTVEFUCi0vKiBSZXR1cm4gc2l6ZSBvZiBmaWxlIGluIGJ5dGVzOyA8IDAgaWYgdW5rbm93bi4gKi8KKyNpZiBkZWZpbmVkKEhBVkVfRlNUQVQpIHx8IGRlZmluZWQoTVNfV0lORE9XUykKKy8qIFJldHVybiBzaXplIG9mIGZpbGUgaW4gYnl0ZXM7IDwgMCBpZiB1bmtub3duIG9yIElOVF9NQVggaWYgdG9vIGJpZyAqLwogc3RhdGljIG9mZl90CiBnZXRmaWxlc2l6ZShGSUxFICpmcCkKIHsKLSAgICBzdHJ1Y3Qgc3RhdCBzdDsKLSAgICBpZiAoZnN0YXQoZmlsZW5vKGZwKSwgJnN0KSAhPSAwKQorICAgIHN0cnVjdCBfUHlfc3RhdF9zdHJ1Y3Qgc3Q7CisgICAgaWYgKF9QeV9mc3RhdChmaWxlbm8oZnApLCAmc3QpICE9IDApCiAgICAgICAgIHJldHVybiAtMTsKKyNpZiBTSVpFT0ZfT0ZGX1QgPT0gNAorICAgIGVsc2UgaWYgKHN0LnN0X3NpemUgPj0gSU5UX01BWCkKKyAgICAgICAgcmV0dXJuIChvZmZfdClJTlRfTUFYOworI2VuZGlmCiAgICAgZWxzZQotICAgICAgICByZXR1cm4gc3Quc3Rfc2l6ZTsKKyAgICAgICAgcmV0dXJuIChvZmZfdClzdC5zdF9zaXplOwogfQogI2VuZGlmCiAKQEAgLTE0MzksNyArMTUwOSw3IEBACiB7CiAvKiBSRUFTT05BQkxFX0ZJTEVfTElNSVQgaXMgYnkgZGVmbiBzb21ldGhpbmcgYmlnIGVub3VnaCBmb3IgVGtpbnRlci5weWMuICovCiAjZGVmaW5lIFJFQVNPTkFCTEVfRklMRV9MSU1JVCAoMUwgPDwgMTgpCi0jaWZkZWYgSEFWRV9GU1RBVAorI2lmIGRlZmluZWQoSEFWRV9GU1RBVCkgfHwgZGVmaW5lZChNU19XSU5ET1dTKQogICAgIG9mZl90IGZpbGVzaXplOwogICAgIGZpbGVzaXplID0gZ2V0ZmlsZXNpemUoZnApOwogICAgIGlmIChmaWxlc2l6ZSA+IDAgJiYgZmlsZXNpemUgPD0gUkVBU09OQUJMRV9GSUxFX0xJTUlUKSB7CkBAIC0xNTA5LDI1ICsxNTc5LDIwIEBACiB7CiAgICAgV0ZJTEUgd2Y7CiAKLSAgICB3Zi5mcCA9IE5VTEw7Ci0gICAgd2YucmVhZGFibGUgPSBOVUxMOworICAgIG1lbXNldCgmd2YsIDAsIHNpemVvZih3ZikpOwogICAgIHdmLnN0ciA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCA1MCk7CiAgICAgaWYgKHdmLnN0ciA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB3Zi5wdHIgPSBQeUJ5dGVzX0FTX1NUUklORygoUHlCeXRlc09iamVjdCAqKXdmLnN0cik7CisgICAgd2YucHRyID0gd2YuYnVmID0gUHlCeXRlc19BU19TVFJJTkcoKFB5Qnl0ZXNPYmplY3QgKil3Zi5zdHIpOwogICAgIHdmLmVuZCA9IHdmLnB0ciArIFB5Qnl0ZXNfU2l6ZSh3Zi5zdHIpOwogICAgIHdmLmVycm9yID0gV0ZFUlJfT0s7Ci0gICAgd2YuZGVwdGggPSAwOwogICAgIHdmLnZlcnNpb24gPSB2ZXJzaW9uOwotICAgIGlmICh2ZXJzaW9uID49IDMpIHsKLSAgICAgICAgaWYgKCh3Zi5yZWZzID0gUHlEaWN0X05ldygpKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBQeV9ERUNSRUYod2Yuc3RyKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgfSBlbHNlCi0gICAgICAgIHdmLnJlZnMgPSBOVUxMOworICAgIGlmICh3X2luaXRfcmVmcygmd2YsIHZlcnNpb24pKSB7CisgICAgICAgIFB5X0RFQ1JFRih3Zi5zdHIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAgICAgd19vYmplY3QoeCwgJndmKTsKLSAgICBQeV9YREVDUkVGKHdmLnJlZnMpOworICAgIHdfY2xlYXJfcmVmcygmd2YpOwogICAgIGlmICh3Zi5zdHIgIT0gTlVMTCkgewogICAgICAgICBjaGFyICpiYXNlID0gUHlCeXRlc19BU19TVFJJTkcoKFB5Qnl0ZXNPYmplY3QgKil3Zi5zdHIpOwogICAgICAgICBpZiAod2YucHRyIC0gYmFzZSA+IFBZX1NTSVpFX1RfTUFYKSB7CmRpZmYgLS1naXQgYS9QeXRob24vcGVlcGhvbGUuYyBiL1B5dGhvbi9wZWVwaG9sZS5jCmluZGV4IDQxODU0NjIuLjJmOGYwZTUgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9wZWVwaG9sZS5jCisrKyBiL1B5dGhvbi9wZWVwaG9sZS5jCkBAIC0xOCw3ICsxOCwxMSBAQAogICAgIHx8IG9wPT1KVU1QX0lGX0ZBTFNFX09SX1BPUCB8fCBvcD09SlVNUF9JRl9UUlVFX09SX1BPUCkKICNkZWZpbmUgSlVNUFNfT05fVFJVRShvcCkgKG9wPT1QT1BfSlVNUF9JRl9UUlVFIHx8IG9wPT1KVU1QX0lGX1RSVUVfT1JfUE9QKQogI2RlZmluZSBHRVRKVU1QVEdUKGFyciwgaSkgKEdFVEFSRyhhcnIsaSkgKyAoQUJTT0xVVEVfSlVNUChhcnJbaV0pID8gMCA6IGkrMykpCi0jZGVmaW5lIFNFVEFSRyhhcnIsIGksIHZhbCkgYXJyW2krMl0gPSB2YWw+Pjg7IGFycltpKzFdID0gdmFsICYgMjU1CisjZGVmaW5lIFNFVEFSRyhhcnIsIGksIHZhbCkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXNzZXJ0KDAgPD0gdmFsICYmIHZhbCA8PSAweGZmZmYpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXJyW2krMl0gPSAodW5zaWduZWQgY2hhcikoKCh1bnNpZ25lZCBpbnQpdmFsKT4+OCk7ICAgICBcCisgICAgYXJyW2krMV0gPSAodW5zaWduZWQgY2hhcikoKCh1bnNpZ25lZCBpbnQpdmFsKSAmIDI1NSk7ICBcCit9IHdoaWxlKDApCiAjZGVmaW5lIENPREVTSVpFKG9wKSAgKEhBU19BUkcob3ApID8gMyA6IDEpCiAjZGVmaW5lIElTQkFTSUNCTE9DSyhibG9ja3MsIHN0YXJ0LCBieXRlcykgXAogICAgIChibG9ja3Nbc3RhcnRdPT1ibG9ja3Nbc3RhcnQrYnl0ZXMtMV0pCkBAIC0yOTAsNyArMjk0LDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgKgogbWFya2Jsb2Nrcyh1bnNpZ25lZCBjaGFyICpjb2RlLCBQeV9zc2l6ZV90IGxlbikKIHsKLSAgICB1bnNpZ25lZCBpbnQgKmJsb2NrcyA9ICh1bnNpZ25lZCBpbnQgKilQeU1lbV9NYWxsb2MobGVuKnNpemVvZihpbnQpKTsKKyAgICB1bnNpZ25lZCBpbnQgKmJsb2NrcyA9IFB5TWVtX05ldyh1bnNpZ25lZCBpbnQsIGxlbik7CiAgICAgaW50IGksaiwgb3Bjb2RlLCBibG9ja2NudCA9IDA7CiAKICAgICBpZiAoYmxvY2tzID09IE5VTEwpIHsKQEAgLTM1NSw3ICszNTksOCBAQAogICAgIHVuc2lnbmVkIGNoYXIgKmNvZGVzdHIgPSBOVUxMOwogICAgIHVuc2lnbmVkIGNoYXIgKmxpbmVubzsKICAgICBpbnQgKmFkZHJtYXAgPSBOVUxMOwotICAgIGludCBuZXdfbGluZSwgY3VtX29yaWdfbGluZSwgbGFzdF9saW5lLCB0YWJzaXo7CisgICAgaW50IG5ld19saW5lLCBjdW1fb3JpZ19saW5lLCBsYXN0X2xpbmU7CisgICAgUHlfc3NpemVfdCB0YWJzaXo7CiAgICAgUHlPYmplY3QgKipjb25zdF9zdGFjayA9IE5VTEw7CiAgICAgUHlfc3NpemVfdCAqbG9hZF9jb25zdF9zdGFjayA9IE5VTEw7CiAgICAgUHlfc3NpemVfdCBjb25zdF9zdGFja190b3AgPSAtMTsKQEAgLTM5OCw3ICs0MDMsNyBAQAogICAgICAgICBnb3RvIGV4aXRVbmNoYW5nZWQ7CiAKICAgICAvKiBNYXBwaW5nIHRvIG5ldyBqdW1wIHRhcmdldHMgYWZ0ZXIgTk9QcyBhcmUgcmVtb3ZlZCAqLwotICAgIGFkZHJtYXAgPSAoaW50ICopUHlNZW1fTWFsbG9jKGNvZGVsZW4gKiBzaXplb2YoaW50KSk7CisgICAgYWRkcm1hcCA9IFB5TWVtX05ldyhpbnQsIGNvZGVsZW4pOwogICAgIGlmIChhZGRybWFwID09IE5VTEwpIHsKICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKICAgICAgICAgZ290byBleGl0RXJyb3I7CkBAIC02NjAsNyArNjY1LDggQEAKIAogICAgIC8qIEZpeHVwIGxpbmVub3RhYiAqLwogICAgIGZvciAoaT0wLCBub3BzPTAgOyBpPGNvZGVsZW4gOyBpICs9IENPREVTSVpFKGNvZGVzdHJbaV0pKSB7Ci0gICAgICAgIGFkZHJtYXBbaV0gPSBpIC0gbm9wczsKKyAgICAgICAgYXNzZXJ0KGkgLSBub3BzIDw9IElOVF9NQVgpOworICAgICAgICBhZGRybWFwW2ldID0gKGludCkoaSAtIG5vcHMpOwogICAgICAgICBpZiAoY29kZXN0cltpXSA9PSBOT1ApCiAgICAgICAgICAgICBub3BzKys7CiAgICAgfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL3B5bGlmZWN5Y2xlLmMgYi9QeXRob24vcHlsaWZlY3ljbGUuYwppbmRleCAyNWE0YTYwLi4yYTM2YjUzIDEwMDY0NAotLS0gYS9QeXRob24vcHlsaWZlY3ljbGUuYworKysgYi9QeXRob24vcHlsaWZlY3ljbGUuYwpAQCAtMTI1OCw3ICsxMjU4LDcgQEAKICAgICAgICAgUHlFcnJfUHJpbnRFeCgwKTsKICAgICB9CiAgICAgZWxzZSB7Ci0gICAgICAgIHRzdGF0ZSA9IF9QeV9hdG9taWNfbG9hZF9yZWxheGVkKCZfUHlUaHJlYWRTdGF0ZV9DdXJyZW50KTsKKyAgICAgICAgdHN0YXRlID0gKFB5VGhyZWFkU3RhdGUqKV9QeV9hdG9taWNfbG9hZF9yZWxheGVkKCZfUHlUaHJlYWRTdGF0ZV9DdXJyZW50KTsKICAgICAgICAgaWYgKHRzdGF0ZSAhPSBOVUxMKSB7CiAgICAgICAgICAgICBmcHV0YygnXG4nLCBzdGRlcnIpOwogICAgICAgICAgICAgZmZsdXNoKHN0ZGVycik7CmRpZmYgLS1naXQgYS9QeXRob24vcHlzdGF0ZS5jIGIvUHl0aG9uL3B5c3RhdGUuYwppbmRleCAyYWMyZmQ1Li5lZTFlNDY5IDEwMDY0NAotLS0gYS9QeXRob24vcHlzdGF0ZS5jCisrKyBiL1B5dGhvbi9weXN0YXRlLmMKQEAgLTIyLDYgKzIyLDEyIEBACiAjZW5kaWYKICNlbmRpZgogCisjaWYgZGVmaW5lZCBfTVNDX1ZFUiAmJiBfTVNDX1ZFUiA+PSAxOTAwCisvKiBJc3N1ZSAjMjM1MjQ6IFRlbXBvcmFyeSBmaXggdG8gZGlzYWJsZSB0ZXJtaW5hdGlvbiBkdWUgdG8gaW52YWxpZCBwYXJhbWV0ZXJzICovCitQeUFQSV9EQVRBKHZvaWQqKSBfUHlfc2lsZW50X2ludmFsaWRfcGFyYW1ldGVyX2hhbmRsZXI7CisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKwogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKICNlbmRpZgpAQCAtMjIyLDYgKzIyOCwxMSBAQAogICAgICAgICAgICAgdHN0YXRlLT5uZXh0LT5wcmV2ID0gdHN0YXRlOwogICAgICAgICBpbnRlcnAtPnRzdGF0ZV9oZWFkID0gdHN0YXRlOwogICAgICAgICBIRUFEX1VOTE9DSygpOworICAgICAgICAKKyNpZiBkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSID49IDE5MDAKKyAgICAgICAgLyogSXNzdWUgIzIzNTI0OiBUZW1wb3JhcnkgZml4IHRvIGRpc2FibGUgdGVybWluYXRpb24gZHVlIHRvIGludmFsaWQgcGFyYW1ldGVycyAqLworICAgICAgICBfc2V0X3RocmVhZF9sb2NhbF9pbnZhbGlkX3BhcmFtZXRlcl9oYW5kbGVyKChfaW52YWxpZF9wYXJhbWV0ZXJfaGFuZGxlcilfUHlfc2lsZW50X2ludmFsaWRfcGFyYW1ldGVyX2hhbmRsZXIpOworI2VuZGlmCiAgICAgfQogCiAgICAgcmV0dXJuIHRzdGF0ZTsKQEAgLTQwMyw3ICs0MTQsNyBAQAogdm9pZAogUHlUaHJlYWRTdGF0ZV9EZWxldGUoUHlUaHJlYWRTdGF0ZSAqdHN0YXRlKQogewotICAgIGlmICh0c3RhdGUgPT0gX1B5X2F0b21pY19sb2FkX3JlbGF4ZWQoJl9QeVRocmVhZFN0YXRlX0N1cnJlbnQpKQorICAgIGlmICh0c3RhdGUgPT0gKFB5VGhyZWFkU3RhdGUqKV9QeV9hdG9taWNfbG9hZF9yZWxheGVkKCZfUHlUaHJlYWRTdGF0ZV9DdXJyZW50KSkKICAgICAgICAgUHlfRmF0YWxFcnJvcigiUHlUaHJlYWRTdGF0ZV9EZWxldGU6IHRzdGF0ZSBpcyBzdGlsbCBjdXJyZW50Iik7CiAjaWZkZWYgV0lUSF9USFJFQUQKICAgICBpZiAoYXV0b0ludGVycHJldGVyU3RhdGUgJiYgUHlUaHJlYWRfZ2V0X2tleV92YWx1ZShhdXRvVExTa2V5KSA9PSB0c3RhdGUpCkBAIC02NjIsNyArNjczLDcgQEAKIHsKICAgICAvKiBNdXN0IGJlIHRoZSB0c3RhdGUgZm9yIHRoaXMgdGhyZWFkICovCiAgICAgYXNzZXJ0KFB5R0lMU3RhdGVfR2V0VGhpc1RocmVhZFN0YXRlKCk9PXRzdGF0ZSk7Ci0gICAgcmV0dXJuIHRzdGF0ZSA9PSBfUHlfYXRvbWljX2xvYWRfcmVsYXhlZCgmX1B5VGhyZWFkU3RhdGVfQ3VycmVudCk7CisgICAgcmV0dXJuIHRzdGF0ZSA9PSAoUHlUaHJlYWRTdGF0ZSopX1B5X2F0b21pY19sb2FkX3JlbGF4ZWQoJl9QeVRocmVhZFN0YXRlX0N1cnJlbnQpOwogfQogCiAvKiBJbnRlcm5hbCBpbml0aWFsaXphdGlvbi9maW5hbGl6YXRpb24gZnVuY3Rpb25zIGNhbGxlZCBieQpkaWZmIC0tZ2l0IGEvUHl0aG9uL3B5dGltZS5jIGIvUHl0aG9uL3B5dGltZS5jCmluZGV4IGE4NDYwYzYuLmNkYWEyMmUgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9weXRpbWUuYworKysgYi9QeXRob24vcHl0aW1lLmMKQEAgLTcsMTAgKzcsNiBAQAogI2luY2x1ZGUgPG1hY2gvbWFjaF90aW1lLmg+ICAgLyogbWFjaF9hYnNvbHV0ZV90aW1lKCksIG1hY2hfdGltZWJhc2VfaW5mbygpICovCiAjZW5kaWYKIAotI2lmZGVmIE1TX1dJTkRPV1MKLXN0YXRpYyBPU1ZFUlNJT05JTkZPRVggd2ludmVyOwotI2VuZGlmCi0KIHN0YXRpYyBpbnQKIHB5Z2V0dGltZW9mZGF5KF9QeVRpbWVfdGltZXZhbCAqdHAsIF9QeV9jbG9ja19pbmZvX3QgKmluZm8sIGludCByYWlzZSkKIHsKQEAgLTEyNCw0MSArMTIwLDExIEBACiAgICAgc3RhdGljIF9QeVRpbWVfdGltZXZhbCBsYXN0ID0gezAsIC0xfTsKICNlbmRpZgogI2lmIGRlZmluZWQoTVNfV0lORE9XUykKLSAgICBzdGF0aWMgVUxPTkdMT05HICgqR2V0VGlja0NvdW50NjQpICh2b2lkKSA9IE5VTEw7Ci0gICAgc3RhdGljIFVMT05HTE9ORyAoQ0FMTEJBQ0sgKlB5X0dldFRpY2tDb3VudDY0KSh2b2lkKTsKLSAgICBzdGF0aWMgaW50IGhhc19nZXR0aWNrY291bnQ2NCA9IC0xOwogICAgIFVMT05HTE9ORyByZXN1bHQ7CiAKICAgICBhc3NlcnQoaW5mbyA9PSBOVUxMIHx8IHJhaXNlKTsKIAotICAgIGlmIChoYXNfZ2V0dGlja2NvdW50NjQgPT0gLTEpIHsKLSAgICAgICAgLyogR2V0VGlja0NvdW50NjQoKSB3YXMgYWRkZWQgdG8gV2luZG93cyBWaXN0YSAqLwotICAgICAgICBoYXNfZ2V0dGlja2NvdW50NjQgPSAod2ludmVyLmR3TWFqb3JWZXJzaW9uID49IDYpOwotICAgICAgICBpZiAoaGFzX2dldHRpY2tjb3VudDY0KSB7Ci0gICAgICAgICAgICBISU5TVEFOQ0UgaEtlcm5lbDMyOwotICAgICAgICAgICAgaEtlcm5lbDMyID0gR2V0TW9kdWxlSGFuZGxlVyhMIktFUk5FTDMyIik7Ci0gICAgICAgICAgICAqKEZBUlBST0MqKSZQeV9HZXRUaWNrQ291bnQ2NCA9IEdldFByb2NBZGRyZXNzKGhLZXJuZWwzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdldFRpY2tDb3VudDY0Iik7Ci0gICAgICAgICAgICBhc3NlcnQoUHlfR2V0VGlja0NvdW50NjQgIT0gTlVMTCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoaGFzX2dldHRpY2tjb3VudDY0KSB7Ci0gICAgICAgIHJlc3VsdCA9IFB5X0dldFRpY2tDb3VudDY0KCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBzdGF0aWMgRFdPUkQgbGFzdF90aWNrcyA9IDA7Ci0gICAgICAgIHN0YXRpYyBEV09SRCBuX292ZXJmbG93ID0gMDsKLSAgICAgICAgRFdPUkQgdGlja3M7Ci0KLSAgICAgICAgdGlja3MgPSBHZXRUaWNrQ291bnQoKTsKLSAgICAgICAgaWYgKHRpY2tzIDwgbGFzdF90aWNrcykKLSAgICAgICAgICAgIG5fb3ZlcmZsb3crKzsKLSAgICAgICAgbGFzdF90aWNrcyA9IHRpY2tzOwotCi0gICAgICAgIHJlc3VsdCA9IChVTE9OR0xPTkcpbl9vdmVyZmxvdyA8PCAzMjsKLSAgICAgICAgcmVzdWx0ICs9IHRpY2tzOwotICAgIH0KKyAgICByZXN1bHQgPSBHZXRUaWNrQ291bnQ2NCgpOwogCiAgICAgdHAtPnR2X3NlYyA9IHJlc3VsdCAvIDEwMDA7CiAgICAgdHAtPnR2X3VzZWMgPSAocmVzdWx0ICUgMTAwMCkgKiAxMDAwOwpAQCAtMTY2LDEwICsxMzIsNyBAQAogICAgIGlmIChpbmZvKSB7CiAgICAgICAgIERXT1JEIHRpbWVBZGp1c3RtZW50LCB0aW1lSW5jcmVtZW50OwogICAgICAgICBCT09MIGlzVGltZUFkanVzdG1lbnREaXNhYmxlZCwgb2s7Ci0gICAgICAgIGlmIChoYXNfZ2V0dGlja2NvdW50NjQpCi0gICAgICAgICAgICBpbmZvLT5pbXBsZW1lbnRhdGlvbiA9ICJHZXRUaWNrQ291bnQ2NCgpIjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgaW5mby0+aW1wbGVtZW50YXRpb24gPSAiR2V0VGlja0NvdW50KCkiOworICAgICAgICBpbmZvLT5pbXBsZW1lbnRhdGlvbiA9ICJHZXRUaWNrQ291bnQ2NCgpIjsKICAgICAgICAgaW5mby0+bW9ub3RvbmljID0gMTsKICAgICAgICAgb2sgPSBHZXRTeXN0ZW1UaW1lQWRqdXN0bWVudCgmdGltZUFkanVzdG1lbnQsICZ0aW1lSW5jcmVtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpc1RpbWVBZGp1c3RtZW50RGlzYWJsZWQpOwpAQCAtNDA5LDE0ICszNzIsNiBAQAogewogICAgIF9QeVRpbWVfdGltZXZhbCB0djsKIAotI2lmZGVmIE1TX1dJTkRPV1MKLSAgICB3aW52ZXIuZHdPU1ZlcnNpb25JbmZvU2l6ZSA9IHNpemVvZih3aW52ZXIpOwotICAgIGlmICghR2V0VmVyc2lvbkV4KChPU1ZFUlNJT05JTkZPKikmd2ludmVyKSkgewotICAgICAgICBQeUVycl9TZXRGcm9tV2luZG93c0VycigwKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSNlbmRpZgotCiAgICAgLyogZW5zdXJlIHRoYXQgdGhlIHN5c3RlbSBjbG9jayB3b3JrcyAqLwogICAgIGlmIChfUHlUaW1lX2dldHRpbWVvZmRheV9pbmZvKCZ0diwgTlVMTCkgPCAwKQogICAgICAgICByZXR1cm4gLTE7CmRpZmYgLS1naXQgYS9QeXRob24vcmFuZG9tLmMgYi9QeXRob24vcmFuZG9tLmMKaW5kZXggOTNkMzAwZC4uMDMxZDg4NyAxMDA2NDQKLS0tIGEvUHl0aG9uL3JhbmRvbS5jCisrKyBiL1B5dGhvbi9yYW5kb20uYwpAQCAtMTM5LDE0ICsxMzksMTQgQEAKIHsKICAgICBpbnQgZmQ7CiAgICAgUHlfc3NpemVfdCBuOwotICAgIHN0cnVjdCBzdGF0IHN0OworICAgIHN0cnVjdCBfUHlfc3RhdF9zdHJ1Y3Qgc3Q7CiAKICAgICBpZiAoc2l6ZSA8PSAwKQogICAgICAgICByZXR1cm4gMDsKIAogICAgIGlmICh1cmFuZG9tX2NhY2hlLmZkID49IDApIHsKICAgICAgICAgLyogRG9lcyB0aGUgZmQgcG9pbnQgdG8gdGhlIHNhbWUgdGhpbmcgYXMgYmVmb3JlPyAoaXNzdWUgIzIxMjA3KSAqLwotICAgICAgICBpZiAoZnN0YXQodXJhbmRvbV9jYWNoZS5mZCwgJnN0KQorICAgICAgICBpZiAoX1B5X2ZzdGF0KHVyYW5kb21fY2FjaGUuZmQsICZzdCkKICAgICAgICAgICAgIHx8IHN0LnN0X2RldiAhPSB1cmFuZG9tX2NhY2hlLnN0X2RldgogICAgICAgICAgICAgfHwgc3Quc3RfaW5vICE9IHVyYW5kb21fY2FjaGUuc3RfaW5vKSB7CiAgICAgICAgICAgICAvKiBTb21ldGhpbmcgY2hhbmdlZDogZm9yZ2V0IHRoZSBjYWNoZWQgZmQgKGJ1dCBkb24ndCBjbG9zZSBpdCwKQEAgLTE3OCw3ICsxNzgsNyBAQAogICAgICAgICAgICAgZmQgPSB1cmFuZG9tX2NhY2hlLmZkOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKGZzdGF0KGZkLCAmc3QpKSB7CisgICAgICAgICAgICBpZiAoX1B5X2ZzdGF0KGZkLCAmc3QpKSB7CiAgICAgICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX09TRXJyb3IpOwogICAgICAgICAgICAgICAgIGNsb3NlKGZkKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CmRpZmYgLS1naXQgYS9QeXRob24vc3lzbW9kdWxlLmMgYi9QeXRob24vc3lzbW9kdWxlLmMKaW5kZXggMDYzOTIzMS4uNDcxMzg5YyAxMDA2NDQKLS0tIGEvUHl0aG9uL3N5c21vZHVsZS5jCisrKyBiL1B5dGhvbi9zeXNtb2R1bGUuYwpAQCAtNzcyLDYgKzc3MiwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlhIGluZGV4aW5nLCB0aGUgcmVzdCBhcmUgbmFtZSBvbmx5ICovCiB9OwogCisvKiBEaXNhYmxlIGRlcHJlY2F0aW9uIHdhcm5pbmdzIGFib3V0IEdldFZlcnNpb25FeCBhcyB0aGUgcmVzdWx0IGlzCisgICBiZWluZyBwYXNzZWQgc3RyYWlnaHQgdGhyb3VnaCB0byB0aGUgY2FsbGVyLCB3aG8gaXMgcmVzcG9uc2libGUgZm9yCisgICB1c2luZyBpdCBjb3JyZWN0bHkuICovCisjcHJhZ21hIHdhcm5pbmcocHVzaCkKKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQ5OTYpCisKIHN0YXRpYyBQeU9iamVjdCAqCiBzeXNfZ2V0d2luZG93c3ZlcnNpb24oUHlPYmplY3QgKnNlbGYpCiB7CkBAIC04MDMsNiArODA5LDggQEAKICAgICByZXR1cm4gdmVyc2lvbjsKIH0KIAorI3ByYWdtYSB3YXJuaW5nKHBvcCkKKwogI2VuZGlmIC8qIE1TX1dJTkRPV1MgKi8KIAogI2lmZGVmIEhBVkVfRExPUEVOCkBAIC0xNjgxLDggKzE2ODksOCBAQAogICAgIHRoZSBzaGVsbCBhbHJlYWR5IHByZXZlbnRzIHRoYXQuICovCiAjaWYgIWRlZmluZWQoTVNfV0lORE9XUykKICAgICB7Ci0gICAgICAgIHN0cnVjdCBzdGF0IHNiOwotICAgICAgICBpZiAoZnN0YXQoZmlsZW5vKHN0ZGluKSwgJnNiKSA9PSAwICYmCisgICAgICAgIHN0cnVjdCBfUHlfc3RhdF9zdHJ1Y3Qgc2I7CisgICAgICAgIGlmIChfUHlfZnN0YXQoZmlsZW5vKHN0ZGluKSwgJnNiKSA9PSAwICYmCiAgICAgICAgICAgICBTX0lTRElSKHNiLnN0X21vZGUpKSB7CiAgICAgICAgICAgICAvKiBUaGVyZSdzIG5vdGhpbmcgbW9yZSB3ZSBjYW4gZG8uICovCiAgICAgICAgICAgICAvKiBQeV9GYXRhbEVycm9yKCkgd2lsbCBjb3JlIGR1bXAsIHNvIGp1c3QgZXhpdC4gKi8KZGlmZiAtLWdpdCBhL1JFQURNRSBiL1JFQURNRQppbmRleCBjM2U0MWEzLi5iMDA4MjdhIDEwMDY0NAotLS0gYS9SRUFETUUKKysrIGIvUkVBRE1FCkBAIC0xLDQgKzEsNCBAQAotVGhpcyBpcyBQeXRob24gdmVyc2lvbiAzLjUuMCBhbHBoYSAxCitUaGlzIGlzIFB5dGhvbiB2ZXJzaW9uIDMuNS4wIGFscGhhIDIKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEsCmRpZmYgLS1naXQgYS9Ub29scy9tc2kvYnVpbGRyZWxlYXNlLmJhdCBiL1Rvb2xzL21zaS9idWlsZHJlbGVhc2UuYmF0CmluZGV4IDcxODNhODQuLjA5YzYzYTYgMTAwNjQ0Ci0tLSBhL1Rvb2xzL21zaS9idWlsZHJlbGVhc2UuYmF0CisrKyBiL1Rvb2xzL21zaS9idWlsZHJlbGVhc2UuYmF0CkBAIC0yNiwxNSArMjYsMjEgQEAKIAogCiA6Q2hlY2tPcHRzCitpZiAiJTEiIEVRVSAiLWgiIGdvdG8gSGVscAogaWYgIiUxIiBFUVUgIi1jIiAoc2V0IENFUlROQU1FPSV+MikgJiYgc2hpZnQgJiYgc2hpZnQgJiYgZ290byBDaGVja09wdHMKK2lmICIlMSIgRVFVICItLWNlcnRpZmljYXRlIiAoc2V0IENFUlROQU1FPSV+MikgJiYgc2hpZnQgJiYgc2hpZnQgJiYgZ290byBDaGVja09wdHMKIGlmICIlMSIgRVFVICItbyIgKHNldCBPVVRESVI9JX4yKSAmJiBzaGlmdCAmJiBzaGlmdCAmJiBnb3RvIENoZWNrT3B0cworaWYgIiUxIiBFUVUgIi0tb3V0IiAoc2V0IE9VVERJUj0lfjIpICYmIHNoaWZ0ICYmIHNoaWZ0ICYmIGdvdG8gQ2hlY2tPcHRzCiBpZiAiJTEiIEVRVSAiLUQiIChzZXQgU0tJUERPQz0xKSAmJiBzaGlmdCAmJiBnb3RvIENoZWNrT3B0cworaWYgIiUxIiBFUVUgIi0tc2tpcC1kb2MiIChzZXQgU0tJUERPQz0xKSAmJiBzaGlmdCAmJiBnb3RvIENoZWNrT3B0cwogaWYgIiUxIiBFUVUgIi1CIiAoc2V0IFNLSVBCVUlMRD0xKSAmJiBzaGlmdCAmJiBnb3RvIENoZWNrT3B0cworaWYgIiUxIiBFUVUgIi0tc2tpcC1idWlsZCIgKHNldCBTS0lQQlVJTEQ9MSkgJiYgc2hpZnQgJiYgZ290byBDaGVja09wdHMKIGlmICIlMSIgRVFVICItLWRvd25sb2FkIiAoc2V0IERPV05MT0FEX1VSTD0lfjIpICYmIHNoaWZ0ICYmIHNoaWZ0ICYmIGdvdG8gQ2hlY2tPcHRzCiBpZiAiJTEiIEVRVSAiLS10ZXN0IiAoc2V0IFRFU1RUQVJHRVRESVI9JX4yKSAmJiBzaGlmdCAmJiBzaGlmdCAmJiBnb3RvIENoZWNrT3B0cwogaWYgIiUxIiBFUVUgIi1iIiAoc2V0IFRBUkdFVD1CdWlsZCkgJiYgc2hpZnQgJiYgZ290byBDaGVja09wdHMKLWlmICclMScgRVFVICcteDg2JyAoc2V0IEJVSUxEWDg2PTEpICYmIHNoaWZ0ICYmIGdvdG8gQ2hlY2tPcHRzCi1pZiAnJTEnIEVRVSAnLXg2NCcgKHNldCBCVUlMRFg2ND0xKSAmJiBzaGlmdCAmJiBnb3RvIENoZWNrT3B0cworaWYgIiUxIiBFUVUgIi0tYnVpbGQiIChzZXQgVEFSR0VUPUJ1aWxkKSAmJiBzaGlmdCAmJiBnb3RvIENoZWNrT3B0cworaWYgIiUxIiBFUVUgIi14ODYiIChzZXQgQlVJTERYODY9MSkgJiYgc2hpZnQgJiYgZ290byBDaGVja09wdHMKK2lmICIlMSIgRVFVICIteDY0IiAoc2V0IEJVSUxEWDY0PTEpICYmIHNoaWZ0ICYmIGdvdG8gQ2hlY2tPcHRzCiAKIGlmIG5vdCBkZWZpbmVkIEJVSUxEWDg2IGlmIG5vdCBkZWZpbmVkIEJVSUxEWDY0IChzZXQgQlVJTERYODY9MSkgJiYgKHNldCBCVUlMRFg2ND0xKQogCkBAIC00MiwyMSArNDgsMjEgQEAKIGlmICIlU0tJUEJVSUxEJSIgRVFVICIxIiBnb3RvIHNraXBkb2MKIGlmICIlU0tJUERPQyUiIEVRVSAiMSIgZ290byBza2lwZG9jCiAKK2lmIG5vdCBkZWZpbmVkIFBZVEhPTiB3aGVyZSBweSAtcSB8fCBlY2hvIENhbm5vdCBmaW5kIHB5IG9uIHBhdGggYW5kIFBZVEhPTiBpcyBub3Qgc2V0LiAmJiBleGl0IC9CIDEKK2lmIG5vdCBkZWZpbmVkIFNQSElOWEJVSUxEIHdoZXJlIHNwaGlueC1idWlsZCAtcSB8fCBlY2hvIENhbm5vdCBmaW5kIHNwaGlueC1idWlsZCBvbiBwYXRoIGFuZCBTUEhJTlhCVUlMRCBpcyBub3Qgc2V0LiAmJiBleGl0IC9CIDEKIGNhbGwgIiVEJS4uXC4uXGRvY1xtYWtlLmJhdCIgaHRtbGhlbHAKIGlmIGVycm9ybGV2ZWwgMSBnb3RvIDplb2YKIDpza2lwZG9jCiAKLXdoZXJlIGhnID5udWwgMj5udWwKLWlmIGVycm9ybGV2ZWwgMSBlY2hvIENhbm5vdCBmaW5kIGhnIG9uIFBBVEggJiBleGl0IC9CIDEKK3doZXJlIGhnIC9xIHx8IGVjaG8gQ2Fubm90IGZpbmQgTWVyY3VyaWFsIG9uIFBBVEggJiYgZXhpdCAvQiAxCiAKLXdoZXJlIGRsbHRvb2wgMj5udWwgPiIlVEVNUCVcZGxsdG9vbC5sb2MiCi1pZiBlcnJvcmxldmVsIDEgZGlyICIlRCUuLlwuLlxleHRlcm5hbHNcZGxsdG9vbC5leGUiIC9zL2IgPiAiJVRFTVAlXGRsbHRvb2wubG9jIgotaWYgZXJyb3JsZXZlbCAxIGVjaG8gQ2Fubm90IGZpbmQgYmludXRpbHMgb24gUEFUSCBvciBpbiBleHRlcm5hbHMgJiBleGl0IC9CIDEKLXNldCAvUCBETExUT09MPSA8ICIlVEVNUCVcZGxsdG9vbC5sb2MiCi1zZXQgUEFUSD0lUEFUSCU7JURMTFRPT0w6fiwtMTIlCi1zZXQgRExMVE9PTD0KLWRlbCAiJVRFTVAlXGRsbHRvb2wubG9jIgotCit3aGVyZSBkbGx0b29sIC9xICYmIGdvdG8gc2tpcGRsbHRvb2xzZWFyY2gKK3NldCBfRExMVE9PTF9QQVRIPQord2hlcmUgL1IgIiVEJS4uXC4uXGV4dGVybmFscyIgZGxsdG9vbCA+ICIlVEVNUCVcZGxsdG9vbC5sb2MiIDI+IG51bCAmJiBzZXQgL1AgX0RMTFRPT0xfUEFUSD0gPCAiJVRFTVAlXGRsbHRvb2wubG9jIiAmIGRlbCAiJVRFTVAlXGRsbHRvb2wubG9jIiAKK2lmIG5vdCBleGlzdCAiJV9ETExUT09MX1BBVEglIiBlY2hvIENhbm5vdCBmaW5kIGJpbnV0aWxzIG9uIFBBVEggb3IgaW4gZXh0ZXJuYWwgJiYgZXhpdCAvQiAxCitmb3IgJSVmIGluICglX0RMTFRPT0xfUEFUSCUpIGRvIHNldCBQQVRIPSVQQVRIJTslJX5kcGYKK3NldCBfRExMVE9PTF9QQVRIPQorOnNraXBkbGx0b29sc2VhcmNoCiAKIGlmIGRlZmluZWQgQlVJTERYODYgKAogICAgIGNhbGwgOmJ1aWxkIHg4NgpAQCAtOTQsMTQgKzEwMCwxMiBAQAogICAgIHNldCBSRUxFQVNFX1VSST0lUkVMRUFTRV9VUklfWDY0JQogKQogCi1lY2hvIG9uCiBpZiBleGlzdCAiJUJVSUxEJWVuLXVzIiAoCiAgICAgZWNobyBEZWxldGluZyAlQlVJTEQlZW4tdXMKICAgICBybWRpciAvcS9zICIlQlVJTEQlZW4tdXMiCiAgICAgaWYgZXJyb3JsZXZlbCAxIGV4aXQgL0IKICkKIAotZWNobyBvbgogaWYgZXhpc3QgIiVEJW9ialxSZWxlYXNlXyVPQkpESVJfUExBVCUiICgKICAgICBlY2hvIERlbGV0aW5nICIlRCVvYmpcUmVsZWFzZV8lT0JKRElSX1BMQVQlIgogICAgIHJtZGlyIC9xL3MgIiVEJW9ialxSZWxlYXNlXyVPQkpESVJfUExBVCUiCkBAIC0xMzYsNSArMTQwLDI1IEBACiAgICAgY29weSAvWSAiJUJVSUxEJWVuLXVzXCouY2FiIiAiJU9VVERJUiVcJU9VVERJUl9QTEFUJSIKICAgICBjb3B5IC9ZICIlQlVJTEQlZW4tdXNcKi5leGUiICIlT1VURElSJVwlT1VURElSX1BMQVQlIgogICAgIGNvcHkgL1kgIiVCVUlMRCVlbi11c1wqLm1zaSIgIiVPVVRESVIlXCVPVVRESVJfUExBVCUiCisgICAgY29weSAvWSAiJUJVSUxEJWVuLXVzXCoubXN1IiAiJU9VVERJUiVcJU9VVERJUl9QTEFUJSIKICkKIAorZXhpdCAvQiAwCisKKzpIZWxwCitlY2hvIGJ1aWxkcmVsZWFzZS5iYXQgWy0tb3V0IERJUl0gWy14ODZdIFsteDY0XSBbLS1jZXJ0aWZpY2F0ZSBDRVJUTkFNRV0gWy0tYnVpbGRdIFstLXNraXAtYnVpbGRdCitlY2hvICAgICAgICAgICAgICAgICAgWy0tc2tpcC1kb2NdIFstLWRvd25sb2FkIERPV05MT0FEIFVSTF0gWy0tdGVzdCBUQVJHRVRESVJdIFstaF0KK2VjaG8uCitlY2hvICAgIC0tb3V0ICgtbykgICAgICAgICAgU3BlY2lmeSBhbiBhZGRpdGlvbmFsIG91dHB1dCBkaXJlY3RvcnkgZm9yIGluc3RhbGxlcnMKK2VjaG8gICAgLXg4NiAgICAgICAgICAgICAgICBCdWlsZCB4ODYgaW5zdGFsbGVycworZWNobyAgICAteDY0ICAgICAgICAgICAgICAgIEJ1aWxkIHg2NCBpbnN0YWxsZXJzCitlY2hvICAgIC0tYnVpbGQgKC1iKSAgICAgICAgSW5jcmVtZW50YWxseSBidWlsZCBQeXRob24gcmF0aGVyIHRoYW4gcmVidWlsZGluZworZWNobyAgICAtLXNraXAtYnVpbGQgKC1CKSAgIERvIG5vdCBidWlsZCBQeXRob24gKGp1c3QgZG8gdGhlIGluc3RhbGxlcnMpCitlY2hvICAgIC0tc2tpcC1kb2MgKC1EKSAgICAgRG8gbm90IGJ1aWxkIGRvY3VtZW50YXRpb24KK2VjaG8gICAgLS1kb3dubG9hZCAgICAgICAgICBTcGVjaWZ5IHRoZSBmdWxsIGRvd25sb2FkIFVSTCBmb3IgTVNJcyAoc2hvdWxkIGluY2x1ZGUgezJ9KQorZWNobyAgICAtLXRlc3QgICAgICAgICAgICAgIFNwZWNpZnkgdGhlIHRlc3QgZGlyZWN0b3J5IHRvIHJ1biB0aGUgaW5zdGFsbGVyIHRlc3RzCitlY2hvICAgIC1oICAgICAgICAgICAgICAgICAgRGlzcGxheSB0aGlzIGhlbHAgaW5mb3JtYXRpb24KK2VjaG8uCitlY2hvIElmIG5vIGFyY2hpdGVjdHVyZSBpcyBzcGVjaWZpZWQsIGFsbCBhcmNoaXRlY3R1cmVzIHdpbGwgYmUgYnVpbHQuCitlY2hvIElmIC0tdGVzdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgaW5zdGFsbGVyIHRlc3RzIGFyZSBub3QgcnVuLgorZWNoby4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9Ub29scy9tc2kvYnVuZGxlL0RlZmF1bHQud3hsIGIvVG9vbHMvbXNpL2J1bmRsZS9EZWZhdWx0Lnd4bAppbmRleCA2ZWZkNjE0Li5iNjJmYWY2IDEwMDY0NAotLS0gYS9Ub29scy9tc2kvYnVuZGxlL0RlZmF1bHQud3hsCisrKyBiL1Rvb2xzL21zaS9idW5kbGUvRGVmYXVsdC53eGwKQEAgLTExLDYgKzExLDExIEBACiAgIDxTdHJpbmcgSWQ9IlVuaW5zdGFsbGluZyI+UmVtb3Zpbmc8L1N0cmluZz4KICAgPFN0cmluZyBJZD0iVW5pbnN0YWxsYXRpb24iPlVuaW5zdGFsbDwvU3RyaW5nPgogICAKKyAgPFN0cmluZyBJZD0iRWxldmF0ZUZvckNSVEluc3RhbGwiPllvdSB3aWxsIGJlIHByb21wdGVkIGZvciBBZG1pbmlzdHJhdG9yIHByaXZpbGVnZXMgdG8gaW5zdGFsbCBhIEMgUnVudGltZSBMaWJyYXJ5IHVwZGF0ZSAoS0IyOTk5MjI2KS4KKworCitDb250aW51ZT88L1N0cmluZz4KKyAgCiAgIDxTdHJpbmcgSWQ9IkNhbmNlbEJ1dHRvbiI+JmFtcDtDYW5jZWw8L1N0cmluZz4KICAgPFN0cmluZyBJZD0iQ2xvc2VCdXR0b24iPiZhbXA7Q2xvc2U8L1N0cmluZz4KICAgPFN0cmluZyBJZD0iSW5zdGFsbEhlYWRlciI+SW5zdGFsbCBbV2l4QnVuZGxlTmFtZV08L1N0cmluZz4KZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9idW5kbGUvYm9vdHN0cmFwL1B5dGhvbkJvb3RzdHJhcHBlckFwcGxpY2F0aW9uLmNwcCBiL1Rvb2xzL21zaS9idW5kbGUvYm9vdHN0cmFwL1B5dGhvbkJvb3RzdHJhcHBlckFwcGxpY2F0aW9uLmNwcAppbmRleCBlYmU0ZGEzLi5kMDkwNDQzIDEwMDY0NAotLS0gYS9Ub29scy9tc2kvYnVuZGxlL2Jvb3RzdHJhcC9QeXRob25Cb290c3RyYXBwZXJBcHBsaWNhdGlvbi5jcHAKKysrIGIvVG9vbHMvbXNpL2J1bmRsZS9ib290c3RyYXAvUHl0aG9uQm9vdHN0cmFwcGVyQXBwbGljYXRpb24uY3BwCkBAIC0xMCw4ICsxMCw2IEBACiAKICNpbmNsdWRlICJwY2guaCIKIAotc3RhdGljIGNvbnN0IExQQ1dTVFIgV0lYQlVORExFX1ZBUklBQkxFX0VMRVZBVEVEID0gTCJXaXhCdW5kbGVFbGV2YXRlZCI7Ci0KIHN0YXRpYyBjb25zdCBMUENXU1RSIFBZQkFfV0lORE9XX0NMQVNTID0gTCJQeXRob25CQSI7CiBzdGF0aWMgY29uc3QgTFBDV1NUUiBQWUJBX1ZBUklBQkxFX0xBVU5DSF9UQVJHRVRfUEFUSCA9IEwiTGF1bmNoVGFyZ2V0IjsKIHN0YXRpYyBjb25zdCBMUENXU1RSIFBZQkFfVkFSSUFCTEVfTEFVTkNIX1RBUkdFVF9FTEVWQVRFRF9JRCA9IEwiTGF1bmNoVGFyZ2V0RWxldmF0ZWRJZCI7CkBAIC0yMzIsNyArMjMwLDcgQEAKICAgICB2b2lkIE9uQ29tbWFuZChDT05UUk9MX0lEIGlkKSB7CiAgICAgICAgIExQV1NUUiBkZWZhdWx0RGlyID0gbnVsbHB0cjsKICAgICAgICAgTFBXU1RSIHRhcmdldERpciA9IG51bGxwdHI7Ci0gICAgICAgIExPTkdMT05HIGVsZXZhdGVkOworICAgICAgICBMT05HTE9ORyBlbGV2YXRlZCwgY3J0SW5zdGFsbGVkOwogICAgICAgICBCT09MIGNoZWNrZWQ7CiAgICAgICAgIFdDSEFSIHd6UGF0aFtNQVhfUEFUSF0gPSB7IH07CiAgICAgICAgIEJST1dTRUlORk9XIGJyb3dzZUluZm8gPSB7IH07CkBAIC0zMjAsMTIgKzMxOCwyMCBAQAogICAgICAgICAgICAgUmVsZWFzZVN0cih0YXJnZXREaXIpOwogICAgICAgICAgICAgQmFsRXhpdE9uRmFpbHVyZShociwgIkZhaWxlZCB0byBzZXQgaW5zdGFsbCB0YXJnZXQgZGlyZWN0b3J5Iik7CiAKKyAgICAgICAgICAgIGlmICghUXVlcnlFbGV2YXRlRm9yQ3J0SW5zdGFsbCgpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIE9uUGxhbihCT09UU1RSQVBQRVJfQUNUSU9OX0lOU1RBTEwpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBJRF9DVVNUT00xX0JBQ0tfQlVUVE9OOgogICAgICAgICAgICAgU2F2ZVBhZ2VTZXR0aW5ncygpOwotICAgICAgICAgICAgR29Ub1BhZ2UoUEFHRV9JTlNUQUxMKTsKKyAgICAgICAgICAgIGlmIChfbW9kaWZ5aW5nKSB7CisgICAgICAgICAgICAgICAgR29Ub1BhZ2UoUEFHRV9NT0RJRlkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBHb1RvUGFnZShQQUdFX0lOU1RBTEwpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBJRF9JTlNUQUxMX0NVU1RPTV9CVVRUT046IF9fZmFsbHRocm91Z2g7CkBAIC0zNDgsNiArMzU0LDExIEBACiAgICAgICAgICAgICAgICAgUmVsZWFzZVN0cih0YXJnZXREaXIpOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBjaGVja2VkID0gVGhlbWVJc0NvbnRyb2xDaGVja2VkKF90aGVtZSwgSURfQ1VTVE9NX0lOU1RBTExfQUxMX1VTRVJTX0NIRUNLQk9YKTsKKyAgICAgICAgICAgIGlmICghY2hlY2tlZCAmJiAhUXVlcnlFbGV2YXRlRm9yQ3J0SW5zdGFsbCgpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIE9uUGxhbihfY29tbWFuZC5hY3Rpb24pOwogICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTQxMiw2ICs0MjMsNyBAQAogICAgICAgICAgICAgX2VuZ2luZS0+U2V0VmFyaWFibGVTdHJpbmcoTCJJbnN0YWxsQWxsVXNlcnNTdGF0ZSIsIEwiZGlzYWJsZSIpOwogICAgICAgICAgICAgX2VuZ2luZS0+U2V0VmFyaWFibGVTdHJpbmcoTCJUYXJnZXREaXJTdGF0ZSIsIEwiZGlzYWJsZSIpOwogICAgICAgICAgICAgX2VuZ2luZS0+U2V0VmFyaWFibGVTdHJpbmcoTCJDdXN0b21Ccm93c2VCdXR0b25TdGF0ZSIsIEwiZGlzYWJsZSIpOworICAgICAgICAgICAgX21vZGlmeWluZyA9IFRSVUU7CiAgICAgICAgICAgICBHb1RvUGFnZShQQUdFX0NVU1RPTTEpOwogICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTIzMDYsNiArMjMxOCw3NSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQk9PTCBJc0NydEluc3RhbGxlZCgpIHsKKyAgICAgICAgaWYgKF9jcnRJbnN0YWxsZWRUb2tlbiA+IDApIHsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9IGVsc2UgaWYgKF9jcnRJbnN0YWxsZWRUb2tlbiA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgYXQgbGVhc3QgQ1JUIHYxMC4wLjk5MjAuMCBpcyBhdmFpbGFibGUuCisgICAgICAgIC8vIEl0IHNob3VsZCBvbmx5IGJlIGluc3RhbGxlZCBhcyBhIFdpbmRvd3MgVXBkYXRlIHBhY2thZ2UsIHdoaWNoIG1lYW5zCisgICAgICAgIC8vIHdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgMzItYml0LzY0LWJpdC4KKyAgICAgICAgLy8gSG93ZXZlciwgc2luY2UgdGhlIFdVIHBhY2thZ2UgZG9lcyBub3QgaW5jbHVkZSB2Y3J1bnRpbWUxNDAuZGxsLCB3ZQorICAgICAgICAvLyBzdGlsbCBpbnN0YWxsIHRoYXQgb3Vyc2VsdmVzLgorICAgICAgICBMUENXU1RSIGNydEZpbGUgPSBMImFwaS1tcy13aW4tY3J0LXJ1bnRpbWUtbDEtMS0wLmRsbCI7CisKKyAgICAgICAgRFdPUkQgY2JWZXIgPSBHZXRGaWxlVmVyc2lvbkluZm9TaXplVyhjcnRGaWxlLCBudWxscHRyKTsKKyAgICAgICAgaWYgKCFjYlZlcikgeworICAgICAgICAgICAgX2NydEluc3RhbGxlZFRva2VuID0gMDsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgKnBEYXRhID0gbWFsbG9jKGNiVmVyKTsKKyAgICAgICAgaWYgKCFwRGF0YSkgeworICAgICAgICAgICAgX2NydEluc3RhbGxlZFRva2VuID0gMDsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghR2V0RmlsZVZlcnNpb25JbmZvVyhjcnRGaWxlLCAwLCBjYlZlciwgcERhdGEpKSB7CisgICAgICAgICAgICBmcmVlKHBEYXRhKTsKKyAgICAgICAgICAgIF9jcnRJbnN0YWxsZWRUb2tlbiA9IDA7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBWU19GSVhFREZJTEVJTkZPICpmZmk7CisgICAgICAgIFVJTlQgY2I7CisgICAgICAgIEJPT0wgcmVzdWx0ID0gRkFMU0U7CisKKyAgICAgICAgaWYgKFZlclF1ZXJ5VmFsdWVXKHBEYXRhLCBMIlxcIiwgKExQVk9JRCopJmZmaSwgJmNiKSAmJgorICAgICAgICAgICAgZmZpLT5kd0ZpbGVWZXJzaW9uTVMgPT0gMHgwMDBBMDAwMCAmJiBmZmktPmR3RmlsZVZlcnNpb25MUyA+PSAweDI2QzAwMDAwKSB7CisgICAgICAgICAgICByZXN1bHQgPSBUUlVFOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBmcmVlKHBEYXRhKTsKKyAgICAgICAgX2NydEluc3RhbGxlZFRva2VuID0gcmVzdWx0ID8gMSA6IDA7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQk9PTCBRdWVyeUVsZXZhdGVGb3JDcnRJbnN0YWxsKCkgeworICAgICAgICAvLyBDYWxsZWQgdG8gcHJvbXB0IHRoZSB1c2VyIHRoYXQgZXZlbiB0aG91Z2ggdGhleSB0aGluayB0aGV5IHdvbid0IG5lZWQKKyAgICAgICAgLy8gdG8gZWxldmF0ZSwgdGhleSBhY3R1YWxseSB3aWxsIGJlY2F1c2Ugb2YgdGhlIENSVCBpbnN0YWxsLgorICAgICAgICBpZiAoSXNDcnRJbnN0YWxsZWQoKSkgeworICAgICAgICAgICAgLy8gQ1JUIGlzIGFscmVhZHkgaW5zdGFsbGVkIC0gbm8gbmVlZCB0byBwcm9tcHQKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBMT05HTE9ORyBlbGV2YXRlZDsKKyAgICAgICAgSFJFU1VMVCBociA9IEJhbEdldE51bWVyaWNWYXJpYWJsZShMIldpeEJ1bmRsZUVsZXZhdGVkIiwgJmVsZXZhdGVkKTsKKyAgICAgICAgaWYgKFNVQ0NFRURFRChocikgJiYgZWxldmF0ZWQpIHsKKyAgICAgICAgICAgIC8vIEFscmVhZHkgZWxldmF0ZWQgLSBubyBuZWVkIHRvIHByb21wdAorICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKworICAgICAgICBMT0NfU1RSSU5HICpsb2NTdHI7CisgICAgICAgIGhyID0gTG9jR2V0U3RyaW5nKF93aXhMb2MsIEwiIyhsb2MuRWxldmF0ZUZvckNSVEluc3RhbGwpIiwgJmxvY1N0cik7CisgICAgICAgIGlmIChGQUlMRUQoaHIpKSB7CisgICAgICAgICAgICBCYWxMb2dFcnJvcihociwgIkZhaWxlZCB0byBnZXQgRWxldmF0ZUZvckNSVEluc3RhbGwgc3RyaW5nIik7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDo6TWVzc2FnZUJveFcoX2hXbmQsIGxvY1N0ci0+d3pUZXh0LCBfdGhlbWUtPnNjekNhcHRpb24sIE1CX1lFU05PKSAhPSBJRE5POworICAgIH0KIAogICAgIEhSRVNVTFQgRXZhbHVhdGVDb25kaXRpb25zKCkgewogICAgICAgICBIUkVTVUxUIGhyID0gU19PSzsKQEAgLTI0OTMsNiArMjU3NCw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBwRW5naW5lLT5TZXRWYXJpYWJsZU51bWVyaWMoTCJDUlRJbnN0YWxsZWQiLCBJc0NydEluc3RhbGxlZCgpID8gMSA6IDApOworCiAgICAgICAgIF93aXhMb2MgPSBudWxscHRyOwogICAgICAgICBtZW1zZXQoJl9idW5kbGUsIDAsIHNpemVvZihfYnVuZGxlKSk7CiAgICAgICAgIG1lbXNldCgmX2NvbmRpdGlvbnMsIDAsIHNpemVvZihfY29uZGl0aW9ucykpOwpAQCAtMjUxOCw2ICsyNjAxLDkgQEAKIAogICAgICAgICBfc3VwcHJlc3NEb3duZ3JhZGVGYWlsdXJlID0gRkFMU0U7CiAgICAgICAgIF9zdXBwcmVzc1JlcGFpciA9IEZBTFNFOworICAgICAgICBfbW9kaWZ5aW5nID0gRkFMU0U7CisKKyAgICAgICAgX2NydEluc3RhbGxlZFRva2VuID0gLTE7CiAKICAgICAgICAgX292ZXJyaWRhYmxlVmFyaWFibGVzID0gbnVsbHB0cjsKICAgICAgICAgX3Rhc2tiYXJMaXN0ID0gbnVsbHB0cjsKQEAgLTI1OTgsNiArMjY4NCw5IEBACiAKICAgICBCT09MIF9zdXBwcmVzc0Rvd25ncmFkZUZhaWx1cmU7CiAgICAgQk9PTCBfc3VwcHJlc3NSZXBhaXI7CisgICAgQk9PTCBfbW9kaWZ5aW5nOworCisgICAgaW50IF9jcnRJbnN0YWxsZWRUb2tlbjsKIAogICAgIFNUUklOR0RJQ1RfSEFORExFIF9vdmVycmlkYWJsZVZhcmlhYmxlczsKIApkaWZmIC0tZ2l0IGEvVG9vbHMvbXNpL2J1bmRsZS9idW5kbGUudGFyZ2V0cyBiL1Rvb2xzL21zaS9idW5kbGUvYnVuZGxlLnRhcmdldHMKaW5kZXggOGU0ZWI5ZS4uY2M3ZTQ0NSAxMDA2NDQKLS0tIGEvVG9vbHMvbXNpL2J1bmRsZS9idW5kbGUudGFyZ2V0cworKysgYi9Ub29scy9tc2kvYnVuZGxlL2J1bmRsZS50YXJnZXRzCkBAIC0xMCwxMiArMTAsMTQgQEAKICAgICAgICAgPE91dHB1dE5hbWUgQ29uZGl0aW9uPSIhJChCdWlsZEZvclJlbGVhc2UpIj4kKE91dHB1dE5hbWUpLSQoTWFqb3JWZXJzaW9uTnVtYmVyKS4kKE1pbm9yVmVyc2lvbk51bWJlcikuJChNaWNyb1ZlcnNpb25OdW1iZXIpLiQoUmV2aXNpb25OdW1iZXIpPC9PdXRwdXROYW1lPgogICAgICAgICA8T3V0cHV0TmFtZSBDb25kaXRpb249IiQoUGxhdGZvcm0pID09ICd4NjQnIj4kKE91dHB1dE5hbWUpLWFtZDY0PC9PdXRwdXROYW1lPgogICAgICAgICA8T3V0cHV0TmFtZSBDb25kaXRpb249IickKE91dHB1dFN1ZmZpeCknICE9ICcnIj4kKE91dHB1dE5hbWUpLSQoT3V0cHV0U3VmZml4KTwvT3V0cHV0TmFtZT4KKyAgICAgICAgPE91dHB1dE5hbWUgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKScgPT0gJ0RlYnVnJyI+JChPdXRwdXROYW1lKS1kPC9PdXRwdXROYW1lPgorICAgICAgICA8VGFyZ2V0TmFtZT4kKE91dHB1dE5hbWUpPC9UYXJnZXROYW1lPgogCiAgICAgICAgIDxPdXRwdXRQYXRoPiQoT3V0cHV0UGF0aCllbi11c1w8L091dHB1dFBhdGg+CiAgICAgICAgIDxPdXREaXI+JChPdXRwdXRQYXRoKTwvT3V0RGlyPgogICAgICAgICAKLSAgICAgICAgPERvd25sb2FkVXJsIENvbmRpdGlvbj0iJyQoRG93bmxvYWRVcmwpJyA9PSAnJyBhbmQgJyQoRG93bmxvYWRVcmxCYXNlKScgIT0gJyciPiQoRG93bmxvYWRVcmxCYXNlLlRyaW1FbmQoYC9gKSkvJChNYWpvclZlcnNpb25OdW1iZXIpLiQoTWlub3JWZXJzaW9uTnVtYmVyKS4kKE1pY3JvVmVyc2lvbk51bWJlcikvJChBcmNoTmFtZSkkKFJlbGVhc2VMZXZlbE5hbWUpL3syfTwvRG93bmxvYWRVcmw+Ci0gICAgICAgIDxEZWZpbmVDb25zdGFudHMgQ29uZGl0aW9uPSInJChEb3dubG9hZFVybCknICE9ICcnIj4kKERlZmluZUNvbnN0YW50cyk7RG93bmxvYWRVcmw9JChEb3dubG9hZFVybCk8L0RlZmluZUNvbnN0YW50cz4KKyAgICAgICAgPERvd25sb2FkVXJsIENvbmRpdGlvbj0iJyQoRG93bmxvYWRVcmwpJyA9PSAnJyBhbmQgJyQoRG93bmxvYWRVcmxCYXNlKScgIT0gJyciPiQoRG93bmxvYWRVcmxCYXNlLlRyaW1FbmQoYC9gKSkvJChNYWpvclZlcnNpb25OdW1iZXIpLiQoTWlub3JWZXJzaW9uTnVtYmVyKS4kKE1pY3JvVmVyc2lvbk51bWJlcikvJChBcmNoTmFtZSkkKFJlbGVhc2VMZXZlbE5hbWUpLzwvRG93bmxvYWRVcmw+CisgICAgICAgIDxEZWZpbmVDb25zdGFudHMgQ29uZGl0aW9uPSInJChEb3dubG9hZFVybCknICE9ICcnIj4kKERlZmluZUNvbnN0YW50cyk7RG93bmxvYWRVcmw9JChEb3dubG9hZFVybCl7Mn08L0RlZmluZUNvbnN0YW50cz4KICAgICAgICAgPERlZmluZUNvbnN0YW50cyBDb25kaXRpb249IickKERvd25sb2FkVXJsKScgPT0gJyciPiQoRGVmaW5lQ29uc3RhbnRzKTtEb3dubG9hZFVybD17Mn08L0RlZmluZUNvbnN0YW50cz4KICAgICA8L1Byb3BlcnR5R3JvdXA+CiAgICAgCkBAIC00Myw2ICs0NSw3IEBACiAgICAgICAgIDxDb250ZW50IEluY2x1ZGU9IlNpZGVCYXIucG5nIiAvPgogICAgIDwvSXRlbUdyb3VwPgogICAgIDxJdGVtR3JvdXA+CisgICAgICAgIDxFbWJlZGRlZFJlc291cmNlIEluY2x1ZGU9ImJ1bmRsZS53eGwiIC8+CiAgICAgICAgIDxXeGxUZW1wbGF0ZSBJbmNsdWRlPSIqX2VuLVVTLnd4bF90ZW1wbGF0ZSIgLz4KICAgICA8L0l0ZW1Hcm91cD4KICAgICA8SXRlbUdyb3VwPgpkaWZmIC0tZ2l0IGEvVG9vbHMvbXNpL2J1bmRsZS9idW5kbGUud3hsIGIvVG9vbHMvbXNpL2J1bmRsZS9idW5kbGUud3hsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NGUwZGEKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9tc2kvYnVuZGxlL2J1bmRsZS53eGwKQEAgLTAsMCArMSw1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPFdpeExvY2FsaXphdGlvbiBDdWx0dXJlPSJlbi11cyIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd2l4LzIwMDYvbG9jYWxpemF0aW9uIj4KKyAgPFN0cmluZyBJZD0iQ1JURGVzY3JpcHRpb24iPkMgUnVudGltZSBVcGRhdGUgKEtCMjk5OTIyNik8L1N0cmluZz4KKyAgPFN0cmluZyBJZD0iQ29tcGlsZUFsbERlc2NyaXB0aW9uIj5QcmVjb21waWxpbmcgc3RhbmRhcmQgbGlicmFyeTwvU3RyaW5nPgorPC9XaXhMb2NhbGl6YXRpb24+CmRpZmYgLS1naXQgYS9Ub29scy9tc2kvYnVuZGxlL3BhY2thZ2Vncm91cHMvY3J0Lnd4cyBiL1Rvb2xzL21zaS9idW5kbGUvcGFja2FnZWdyb3Vwcy9jcnQud3hzCmluZGV4IGUxOWI0ZjkuLmIwNzk3MDAgMTAwNjQ0Ci0tLSBhL1Rvb2xzL21zaS9idW5kbGUvcGFja2FnZWdyb3Vwcy9jcnQud3hzCisrKyBiL1Rvb2xzL21zaS9idW5kbGUvcGFja2FnZWdyb3Vwcy9jcnQud3hzCkBAIC0yLDYgKzIsMTEgQEAKIDxXaXggeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd2l4LzIwMDYvd2kiPgogICAgIDxGcmFnbWVudD4KICAgICAgICAgPFBhY2thZ2VHcm91cCBJZD0iY3J0Ij4KKyAgICAgICAgICAgIDxQYWNrYWdlR3JvdXBSZWYgSWQ9ImNydF8xNC4wX3Y2LjAiIC8+CisgICAgICAgICAgICA8UGFja2FnZUdyb3VwUmVmIElkPSJjcnRfMTQuMF92Ni4xIiAvPgorICAgICAgICAgICAgPFBhY2thZ2VHcm91cFJlZiBJZD0iY3J0XzE0LjBfdjYuMiIgLz4KKyAgICAgICAgICAgIDxQYWNrYWdlR3JvdXBSZWYgSWQ9ImNydF8xNC4wX3Y2LjMiIC8+CisKICAgICAgICAgICAgIDxNc2lQYWNrYWdlIElkPSJjcnRfQWxsVXNlcnMiCiAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VGaWxlPSJjcnQubXNpIgogICAgICAgICAgICAgICAgICAgICAgICAgQ29tcHJlc3NlZD0iJCh2YXIuQ29tcHJlc3NNU0kpIgpAQCAtMjIsNCArMjcsNDIgQEAKICAgICAgICAgICAgIDwvTXNpUGFja2FnZT4KICAgICAgICAgPC9QYWNrYWdlR3JvdXA+CiAgICAgPC9GcmFnbWVudD4KKworICAgIDw/Zm9yZWFjaCB2ZXIgaW4gdjYuMDt2Ni4xO3Y2LjI7djYuMyA/PgorICAgIDw/aWYgIiQodmFyLnZlcikiID0gInY2LjAiID8+CisgICAgPD9kZWZpbmUgbXN1dmVyPTYuMCA/PgorICAgIDw/ZWxzZWlmICIkKHZhci52ZXIpIiA9ICJ2Ni4xIiA/PgorICAgIDw/ZGVmaW5lIG1zdXZlcj02LjEgPz4KKyAgICA8P2Vsc2VpZiAiJCh2YXIudmVyKSIgPSAidjYuMiIgPz4KKyAgICA8P2RlZmluZSBtc3V2ZXI9OC1SVCA/PgorICAgIDw/ZWxzZWlmICIkKHZhci52ZXIpIiA9ICJ2Ni4zIiA/PgorICAgIDw/ZGVmaW5lIG1zdXZlcj04LjEgPz4KKyAgICA8P2Vsc2UgPz4KKyAgICA8P2Vycm9yIHVua25vd24gdmVyc2lvbiAkKHZhci52ZXIpID8+CisgICAgPD9lbmRpZiA/PgorCisgICAgPEZyYWdtZW50PgorICAgICAgICA8UGFja2FnZUdyb3VwIElkPSJjcnRfMTQuMF8kKHZhci52ZXIpIj4KKyAgICAgICAgICAgIDxNc3VQYWNrYWdlIElkPSJjcnRfMTQuMF8kKHZhci52ZXIpX3g4NiIKKyAgICAgICAgICAgICAgICAgICAgICAgIEtCPSIyOTk5MjI2IgorICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlRmlsZT0iIShiaW5kcGF0aC5yZWRpc3QpXFdpbmRvd3MkKHZhci5tc3V2ZXIpLUtCMjk5OTIyNi14ODYubXN1IgorICAgICAgICAgICAgICAgICAgICAgICAgRGlzcGxheU5hbWU9IiEobG9jLkNSVERlc2NyaXB0aW9uKSIKKyAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSIhKGxvYy5DUlREZXNjcmlwdGlvbikiCisgICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc2VkPSIkKHZhci5Db21wcmVzc01TSSkiCisgICAgICAgICAgICAgICAgICAgICAgICBEb3dubG9hZFVybD0iJCh2YXIuRG93bmxvYWRVcmwpIgorICAgICAgICAgICAgICAgICAgICAgICAgSW5zdGFsbENvbmRpdGlvbj0ibm90IENSVEluc3RhbGxlZCBhbmQgVmVyc2lvbk5UID0gJCh2YXIudmVyKSBhbmQgbm90IFZlcnNpb25OVDY0IGFuZCAoSW5jbHVkZV9jb3JlIG9yIEluY2x1ZGVfZXhlIG9yIEluY2x1ZGVfbGF1bmNoZXIgb3IgSW5jbHVkZV9waXApIiAvPgorCisgICAgICAgICAgICA8TXN1UGFja2FnZSBJZD0iY3J0XzE0LjBfJCh2YXIudmVyKV94NjQiCisgICAgICAgICAgICAgICAgICAgICAgICBLQj0iMjk5OTIyNiIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUZpbGU9IiEoYmluZHBhdGgucmVkaXN0KVxXaW5kb3dzJCh2YXIubXN1dmVyKS1LQjI5OTkyMjYteDY0Lm1zdSIKKyAgICAgICAgICAgICAgICAgICAgICAgIERpc3BsYXlOYW1lPSIhKGxvYy5DUlREZXNjcmlwdGlvbikiCisgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iIShsb2MuQ1JURGVzY3JpcHRpb24pIgorICAgICAgICAgICAgICAgICAgICAgICAgQ29tcHJlc3NlZD0iJCh2YXIuQ29tcHJlc3NNU0kpIgorICAgICAgICAgICAgICAgICAgICAgICAgRG93bmxvYWRVcmw9IiQodmFyLkRvd25sb2FkVXJsKSIKKyAgICAgICAgICAgICAgICAgICAgICAgIEluc3RhbGxDb25kaXRpb249Im5vdCBDUlRJbnN0YWxsZWQgYW5kIFZlcnNpb25OVDY0ID0gJCh2YXIudmVyKSBhbmQgKEluY2x1ZGVfY29yZSBvciBJbmNsdWRlX2V4ZSBvciBJbmNsdWRlX2xhdW5jaGVyIG9yIEluY2x1ZGVfcGlwKSIgLz4KKyAgICAgICAgPC9QYWNrYWdlR3JvdXA+CisgICAgPC9GcmFnbWVudD4KKworICAgIDw/dW5kZWYgbXN1dmVyID8+CisgICAgPD9lbmRmb3JlYWNoID8+CiA8L1dpeD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9Ub29scy9tc2kvYnVuZGxlL3Bvc3RpbnN0YWxsX2VuLVVTLnd4bF90ZW1wbGF0ZSBiL1Rvb2xzL21zaS9idW5kbGUvcG9zdGluc3RhbGxfZW4tVVMud3hsX3RlbXBsYXRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjU0YWVmLi4wMDAwMDAwCi0tLSBhL1Rvb2xzL21zaS9idW5kbGUvcG9zdGluc3RhbGxfZW4tVVMud3hsX3RlbXBsYXRlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPFdpeExvY2FsaXphdGlvbiBDdWx0dXJlPSJlbi11cyIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd2l4LzIwMDYvbG9jYWxpemF0aW9uIj4KLSAgICA8U3RyaW5nIElkPSJDb21waWxlQWxsRGVzY3JpcHRpb24iPlByZWNvbXBpbGluZyBzdGFuZGFyZCBsaWJyYXJ5PC9TdHJpbmc+Ci08L1dpeExvY2FsaXphdGlvbj4KZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9jb3JlL2NvcmUucHJvcHMgYi9Ub29scy9tc2kvY29yZS9jb3JlLnByb3BzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzIwNjA3Li4wMDAwMDAwCi0tLSBhL1Rvb2xzL21zaS9jb3JlL2NvcmUucHJvcHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+Ci0gICAgPEltcG9ydCBQcm9qZWN0PSIuLlxtc2kucHJvcHMiIC8+Ci0gICAgPEl0ZW1Hcm91cD4KLSAgICAgICAgPENvbXBpbGUgSW5jbHVkZT0iKi53eHMiIC8+Ci0gICAgPC9JdGVtR3JvdXA+Ci0gICAgPEl0ZW1Hcm91cD4KLSAgICAgICAgPEVtYmVkZGVkUmVzb3VyY2UgSW5jbHVkZT0iKi53eGwiIC8+Ci0gICAgPC9JdGVtR3JvdXA+Ci0KLSAgICA8SW1wb3J0IFByb2plY3Q9Ii4uXG1zaS50YXJnZXRzIiAvPgotPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9jb3JlL2NvcmUud2l4cHJvaiBiL1Rvb2xzL21zaS9jb3JlL2NvcmUud2l4cHJvagppbmRleCA3MjY1MTE5Li42OGU4YmFiIDEwMDY0NAotLS0gYS9Ub29scy9tc2kvY29yZS9jb3JlLndpeHByb2oKKysrIGIvVG9vbHMvbXNpL2NvcmUvY29yZS53aXhwcm9qCkBAIC01LDcgKzUsMTUgQEAKICAgICAgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgogICAgICAgICA8T3V0cHV0TmFtZT5jb3JlPC9PdXRwdXROYW1lPgogICAgICAgICA8T3V0cHV0VHlwZT5QYWNrYWdlPC9PdXRwdXRUeXBlPgotICAgICAgICA8RGVmaW5lQ29uc3RhbnRzPkluY2x1ZGVEZWZhdWx0RmVhdHVyZT0xOyQoRGVmaW5lQ29uc3RhbnRzKTwvRGVmaW5lQ29uc3RhbnRzPgogICAgIDwvUHJvcGVydHlHcm91cD4KLSAgICA8SW1wb3J0IFByb2plY3Q9ImNvcmUucHJvcHMiIC8+CisgICAgPEltcG9ydCBQcm9qZWN0PSIuLlxtc2kucHJvcHMiIC8+CisgICAgPEl0ZW1Hcm91cD4KKyAgICAgICAgPENvbXBpbGUgSW5jbHVkZT0iY29yZS53eHMiIC8+CisgICAgICAgIDxDb21waWxlIEluY2x1ZGU9ImNvcmVfZmlsZXMud3hzIiAvPgorICAgIDwvSXRlbUdyb3VwPgorICAgIDxJdGVtR3JvdXA+CisgICAgICAgIDxFbWJlZGRlZFJlc291cmNlIEluY2x1ZGU9Iioud3hsIiAvPgorICAgIDwvSXRlbUdyb3VwPgorCisgICAgPEltcG9ydCBQcm9qZWN0PSIuLlxtc2kudGFyZ2V0cyIgLz4KIDwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9Ub29scy9tc2kvY29yZS9jb3JlLnd4cyBiL1Rvb2xzL21zaS9jb3JlL2NvcmUud3hzCmluZGV4IGQzNTRlMzcuLjBkNGZiZGUgMTAwNjQ0Ci0tLSBhL1Rvb2xzL21zaS9jb3JlL2NvcmUud3hzCisrKyBiL1Rvb2xzL21zaS9jb3JlL2NvcmUud3hzCkBAIC02LDIwICs2LDggQEAKICAgICAgICAgCiAgICAgICAgIDxQcm9wZXJ0eVJlZiBJZD0iVXBncmFkZVRhYmxlIiAvPgogICAgICAgICAKLSAgICAgICAgPD9pZmRlZiBJbmNsdWRlRGVmYXVsdEZlYXR1cmUgPz4KICAgICAgICAgPEZlYXR1cmUgSWQ9IkRlZmF1bHRGZWF0dXJlIiBBbGxvd0FkdmVydGlzZT0ibm8iIFRpdGxlPSIhKGxvYy5UaXRsZSkiIERlc2NyaXB0aW9uPSIhKGxvYy5EZXNjcmlwdGlvbikiPgogICAgICAgICAgICAgPENvbXBvbmVudEdyb3VwUmVmIElkPSJjb3JlX2RsbCIgLz4KICAgICAgICAgPC9GZWF0dXJlPgotICAgICAgICA8P2VuZGlmID8+Ci0gICAgICAgIDw/aWZkZWYgSW5jbHVkZVN5bWJvbHMgPz4KLSAgICAgICAgPEZlYXR1cmUgSWQ9IlN5bWJvbHMiIEFsbG93QWR2ZXJ0aXNlPSJubyIgVGl0bGU9IiEobG9jLlRpdGxlUGRiKSIgRGVzY3JpcHRpb249IiEobG9jLkRlc2NyaXB0aW9uUGRiKSI+Ci0gICAgICAgICAgICA8Q29tcG9uZW50R3JvdXBSZWYgSWQ9ImNvcmVfc3ltYm9scyIgLz4KLSAgICAgICAgPC9GZWF0dXJlPgotICAgICAgICA8P2VuZGlmID8+Ci0gICAgICAgIDw/aWZkZWYgSW5jbHVkZURlYnVnQmluYXJpZXMgPz4KLSAgICAgICAgPEZlYXR1cmUgSWQ9IkRlYnVnQmluYXJpZXMiIEFsbG93QWR2ZXJ0aXNlPSJubyIgVGl0bGU9IiEobG9jLlRpdGxlX2QpIiBEZXNjcmlwdGlvbj0iIShsb2MuRGVzY3JpcHRpb25fZCkiPgotICAgICAgICAgICAgPENvbXBvbmVudEdyb3VwUmVmIElkPSJjb3JlX2RsbF9kIiAvPgotICAgICAgICA8L0ZlYXR1cmU+Ci0gICAgICAgIDw/ZW5kaWYgPz4KICAgICA8L1Byb2R1Y3Q+CiA8L1dpeD4KZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9jb3JlL2NvcmVfZC53aXhwcm9qIGIvVG9vbHMvbXNpL2NvcmUvY29yZV9kLndpeHByb2oKaW5kZXggZjFmNjBhOS4uNWIyOTZiZiAxMDA2NDQKLS0tIGEvVG9vbHMvbXNpL2NvcmUvY29yZV9kLndpeHByb2oKKysrIGIvVG9vbHMvbXNpL2NvcmUvY29yZV9kLndpeHByb2oKQEAgLTUsNyArNSwxNSBAQAogICAgICAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+CiAgICAgICAgIDxPdXRwdXROYW1lPmNvcmVfZDwvT3V0cHV0TmFtZT4KICAgICAgICAgPE91dHB1dFR5cGU+UGFja2FnZTwvT3V0cHV0VHlwZT4KLSAgICAgICAgPERlZmluZUNvbnN0YW50cz5JbmNsdWRlRGVidWdCaW5hcmllcz0xOyQoRGVmaW5lQ29uc3RhbnRzKTwvRGVmaW5lQ29uc3RhbnRzPgogICAgIDwvUHJvcGVydHlHcm91cD4KLSAgICA8SW1wb3J0IFByb2plY3Q9ImNvcmUucHJvcHMiIC8+CisgICAgPEltcG9ydCBQcm9qZWN0PSIuLlxtc2kucHJvcHMiIC8+CisgICAgPEl0ZW1Hcm91cD4KKyAgICAgICAgPENvbXBpbGUgSW5jbHVkZT0iY29yZV9kLnd4cyIgLz4KKyAgICAgICAgPENvbXBpbGUgSW5jbHVkZT0iY29yZV9maWxlcy53eHMiIC8+CisgICAgPC9JdGVtR3JvdXA+CisgICAgPEl0ZW1Hcm91cD4KKyAgICAgICAgPEVtYmVkZGVkUmVzb3VyY2UgSW5jbHVkZT0iKi53eGwiIC8+CisgICAgPC9JdGVtR3JvdXA+CisKKyAgICA8SW1wb3J0IFByb2plY3Q9Ii4uXG1zaS50YXJnZXRzIiAvPgogPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9jb3JlL2NvcmVfZC53eHMgYi9Ub29scy9tc2kvY29yZS9jb3JlX2Qud3hzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MjIxMTcKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9tc2kvY29yZS9jb3JlX2Qud3hzCkBAIC0wLDAgKzEsMTMgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8V2l4IHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dpeC8yMDA2L3dpIj4KKyAgICA8UHJvZHVjdCBJZD0iKiIgTGFuZ3VhZ2U9IiEobG9jLkxDSUQpIiBOYW1lPSIhKGxvYy5UaXRsZSkiIFZlcnNpb249IiQodmFyLlZlcnNpb24pIiBNYW51ZmFjdHVyZXI9IiEobG9jLk1hbnVmYWN0dXJlcikiIFVwZ3JhZGVDb2RlPSIkKHZhci5VcGdyYWRlQ29kZSkiPgorICAgICAgICA8UGFja2FnZSBJbnN0YWxsZXJWZXJzaW9uPSIzMDAiIENvbXByZXNzZWQ9InllcyIgSW5zdGFsbFNjb3BlPSJwZXJVc2VyIiBQbGF0Zm9ybT0iJCh2YXIuUGxhdGZvcm0pIiAvPgorICAgICAgICA8TWVkaWFUZW1wbGF0ZSBFbWJlZENhYj0ieWVzIiBDb21wcmVzc2lvbkxldmVsPSJoaWdoIiAvPgorICAgICAgICAKKyAgICAgICAgPFByb3BlcnR5UmVmIElkPSJVcGdyYWRlVGFibGUiIC8+CisgICAgICAgIAorICAgICAgICA8RmVhdHVyZSBJZD0iRGVidWdCaW5hcmllcyIgQWxsb3dBZHZlcnRpc2U9Im5vIiBUaXRsZT0iIShsb2MuVGl0bGVfZCkiIERlc2NyaXB0aW9uPSIhKGxvYy5EZXNjcmlwdGlvbl9kKSI+CisgICAgICAgICAgICA8Q29tcG9uZW50R3JvdXBSZWYgSWQ9ImNvcmVfZGxsX2QiIC8+CisgICAgICAgIDwvRmVhdHVyZT4KKyAgICA8L1Byb2R1Y3Q+Cis8L1dpeD4KZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9jb3JlL2NvcmVfcGRiLndpeHByb2ogYi9Ub29scy9tc2kvY29yZS9jb3JlX3BkYi53aXhwcm9qCmluZGV4IGJiZjkzNzkuLjljODgzODkgMTAwNjQ0Ci0tLSBhL1Rvb2xzL21zaS9jb3JlL2NvcmVfcGRiLndpeHByb2oKKysrIGIvVG9vbHMvbXNpL2NvcmUvY29yZV9wZGIud2l4cHJvagpAQCAtNSw3ICs1LDE1IEBACiAgICAgICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4KICAgICAgICAgPE91dHB1dE5hbWU+Y29yZV9wZGI8L091dHB1dE5hbWU+CiAgICAgICAgIDxPdXRwdXRUeXBlPlBhY2thZ2U8L091dHB1dFR5cGU+Ci0gICAgICAgIDxEZWZpbmVDb25zdGFudHM+SW5jbHVkZVN5bWJvbHM9MTskKERlZmluZUNvbnN0YW50cyk8L0RlZmluZUNvbnN0YW50cz4KICAgICA8L1Byb3BlcnR5R3JvdXA+Ci0gICAgPEltcG9ydCBQcm9qZWN0PSJjb3JlLnByb3BzIiAvPgorICAgIDxJbXBvcnQgUHJvamVjdD0iLi5cbXNpLnByb3BzIiAvPgorICAgIDxJdGVtR3JvdXA+CisgICAgICAgIDxDb21waWxlIEluY2x1ZGU9ImNvcmVfcGRiLnd4cyIgLz4KKyAgICAgICAgPENvbXBpbGUgSW5jbHVkZT0iY29yZV9maWxlcy53eHMiIC8+CisgICAgPC9JdGVtR3JvdXA+CisgICAgPEl0ZW1Hcm91cD4KKyAgICAgICAgPEVtYmVkZGVkUmVzb3VyY2UgSW5jbHVkZT0iKi53eGwiIC8+CisgICAgPC9JdGVtR3JvdXA+CisKKyAgICA8SW1wb3J0IFByb2plY3Q9Ii4uXG1zaS50YXJnZXRzIiAvPgogPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9jb3JlL2NvcmVfcGRiLnd4cyBiL1Rvb2xzL21zaS9jb3JlL2NvcmVfcGRiLnd4cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWE1NThkCi0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvbXNpL2NvcmUvY29yZV9wZGIud3hzCkBAIC0wLDAgKzEsMTMgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8V2l4IHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dpeC8yMDA2L3dpIj4KKyAgICA8UHJvZHVjdCBJZD0iKiIgTGFuZ3VhZ2U9IiEobG9jLkxDSUQpIiBOYW1lPSIhKGxvYy5UaXRsZSkiIFZlcnNpb249IiQodmFyLlZlcnNpb24pIiBNYW51ZmFjdHVyZXI9IiEobG9jLk1hbnVmYWN0dXJlcikiIFVwZ3JhZGVDb2RlPSIkKHZhci5VcGdyYWRlQ29kZSkiPgorICAgICAgICA8UGFja2FnZSBJbnN0YWxsZXJWZXJzaW9uPSIzMDAiIENvbXByZXNzZWQ9InllcyIgSW5zdGFsbFNjb3BlPSJwZXJVc2VyIiBQbGF0Zm9ybT0iJCh2YXIuUGxhdGZvcm0pIiAvPgorICAgICAgICA8TWVkaWFUZW1wbGF0ZSBFbWJlZENhYj0ieWVzIiBDb21wcmVzc2lvbkxldmVsPSJoaWdoIiAvPgorICAgICAgICAKKyAgICAgICAgPFByb3BlcnR5UmVmIElkPSJVcGdyYWRlVGFibGUiIC8+CisgICAgICAgIAorICAgICAgICA8RmVhdHVyZSBJZD0iU3ltYm9scyIgQWxsb3dBZHZlcnRpc2U9Im5vIiBUaXRsZT0iIShsb2MuVGl0bGVQZGIpIiBEZXNjcmlwdGlvbj0iIShsb2MuRGVzY3JpcHRpb25QZGIpIj4KKyAgICAgICAgICAgIDxDb21wb25lbnRHcm91cFJlZiBJZD0iY29yZV9zeW1ib2xzIiAvPgorICAgICAgICA8L0ZlYXR1cmU+CisgICAgPC9Qcm9kdWN0PgorPC9XaXg+CmRpZmYgLS1naXQgYS9Ub29scy9tc2kvY3J0L2NydC53aXhwcm9qIGIvVG9vbHMvbXNpL2NydC9jcnQud2l4cHJvagppbmRleCA4Mzg5YjNhLi43NTI5NWJhIDEwMDY0NAotLS0gYS9Ub29scy9tc2kvY3J0L2NydC53aXhwcm9qCisrKyBiL1Rvb2xzL21zaS9jcnQvY3J0LndpeHByb2oKQEAgLTEwLDcgKzEwLDcgQEAKICAgICA8SW1wb3J0IFByb2plY3Q9Ii4uXG1zaS5wcm9wcyIgLz4KICAgICA8SXRlbUdyb3VwPgogICAgICAgICA8Q29tcGlsZSBJbmNsdWRlPSJjcnQud3hzIiAvPgotICAgICAgICA8Q29tcGlsZSBJbmNsdWRlPSJjcnRfZmlsZXMuJChWaXN1YWxTdHVkaW9WZXJzaW9uKS53eHMiIC8+CisgICAgICAgIDxDb21waWxlIEluY2x1ZGU9ImNydF9maWxlcy53eHMiIC8+CiAgICAgPC9JdGVtR3JvdXA+CiAgICAgPEl0ZW1Hcm91cD4KICAgICAgICAgPEVtYmVkZGVkUmVzb3VyY2UgSW5jbHVkZT0iKi53eGwiIC8+CmRpZmYgLS1naXQgYS9Ub29scy9tc2kvY3J0L2NydF9maWxlcy4xMi4wLnd4cyBiL1Rvb2xzL21zaS9jcnQvY3J0X2ZpbGVzLjEyLjAud3hzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjI1OTNmLi4wMDAwMDAwCi0tLSBhL1Rvb2xzL21zaS9jcnQvY3J0X2ZpbGVzLjEyLjAud3hzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAot77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxXaXggeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd2l4LzIwMDYvd2kiPgotICAgIDxGcmFnbWVudD4KLSAgICAgICAgPD9pZiAkKHZhci5QbGF0Zm9ybSl+PXg2NCA/PgotICAgICAgICA8P2RlZmluZSBtc3ZjcjEyMEd1aWQ9ezA4MzVDOTQ3LUQ2RDItNEU1Mi1BRjE0LTAyMzFEMDRFODhFQX0/PgotICAgICAgICA8P2Vsc2UgPz4KLSAgICAgICAgPD9kZWZpbmUgbXN2Y3IxMjBHdWlkPXtFNUI5MjA0OC01ODU5LTRBRjEtQUVBRC1COTdFQkYwMEIwODd9ID8+Ci0gICAgICAgIDw/ZW5kaWYgPz4KLSAgICAgICAgPENvbXBvbmVudEdyb3VwIElkPSJjcnRfZmlsZXMiPgotICAgICAgICAgICAgPENvbXBvbmVudCBJZD0ibXN2Y3IxMjAuZGxsX0xNIiBEaXJlY3Rvcnk9IlN5c3RlbUluc3RhbGxEaXJlY3RvcnkiIEd1aWQ9IiQodmFyLm1zdmNyMTIwR3VpZCkiIFNoYXJlZD0ieWVzIiBTaGFyZWREbGxSZWZDb3VudD0ieWVzIj4KLSAgICAgICAgICAgICAgICA8Q29uZGl0aW9uPkFMTFVTRVJTPTE8L0NvbmRpdGlvbj4KLSAgICAgICAgICAgICAgICA8RmlsZSBJZD0ibXN2Y3IxMjAuZGxsX0xNIiBTb3VyY2U9IiEoYmluZHBhdGguY3J0KVxtc3ZjcjEyMC5kbGwiIC8+Ci0gICAgICAgICAgICA8L0NvbXBvbmVudD4KLSAgICAgICAgICAgIDxDb21wb25lbnQgSWQ9Im1zdmNyMTIwLmRsbF9DVSIgRGlyZWN0b3J5PSJJbnN0YWxsRGlyZWN0b3J5IiBHdWlkPSIqIj4KLSAgICAgICAgICAgICAgICA8Q29uZGl0aW9uPk5PVCBBTExVU0VSUz0xPC9Db25kaXRpb24+Ci0gICAgICAgICAgICAgICAgPEZpbGUgSWQ9Im1zdmNyMTIwLmRsbF9DVSIgU291cmNlPSIhKGJpbmRwYXRoLmNydClcbXN2Y3IxMjAuZGxsIiAvPgotICAgICAgICAgICAgPC9Db21wb25lbnQ+Ci0gICAgICAgIDwvQ29tcG9uZW50R3JvdXA+Ci0gICAgPC9GcmFnbWVudD4KLTwvV2l4PgpkaWZmIC0tZ2l0IGEvVG9vbHMvbXNpL2NydC9jcnRfZmlsZXMuMTQuMC53eHMgYi9Ub29scy9tc2kvY3J0L2NydF9maWxlcy4xNC4wLnd4cwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU2ODJjOS4uMDAwMDAwMAotLS0gYS9Ub29scy9tc2kvY3J0L2NydF9maWxlcy4xNC4wLnd4cworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLe+7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08V2l4IHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dpeC8yMDA2L3dpIj4KLSAgICA8RnJhZ21lbnQ+Ci0gICAgICAgIDw/aWYgJCh2YXIuUGxhdGZvcm0pfj14NjQgPz4KLSAgICAgICAgPD9kZWZpbmUgYXBwY3J0MTQwR3VpZD17Q0MxNjBGQTktQjUxOS0zOEVDLUIzNTgtQjQxNDZFODUwNkM4fT8+Ci0gICAgICAgIDw/ZGVmaW5lIGRlc2t0b3BjcnQxNDBHdWlkPXs0REI3OEE3OS04RDdGLTM1REQtQjBFOC03MzZERTQ0RDI1RjN9Pz4KLSAgICAgICAgPD9kZWZpbmUgdmNydW50aW1lMTQwR3VpZD17QjMzMjU4RkQtNzUwQy0zQjQyLThCRTQtNTM1QjQ4RTk3REI0fT8+Ci0gICAgICAgIDw/ZWxzZSA/PgotICAgICAgICA8P2RlZmluZSBhcHBjcnQxNDBHdWlkPXtFMzg1NEY5Qy00Q0ZCLTNCODUtOTBCRC04NkFBMjJEODJEQzh9Pz4KLSAgICAgICAgPD9kZWZpbmUgZGVza3RvcGNydDE0MEd1aWQ9ezQ2RUFCMUNELUMzNjItMzEzOS1CRDdFLUQ4NzgyRTY1MjUzQX0/PgotICAgICAgICA8P2RlZmluZSB2Y3J1bnRpbWUxNDBHdWlkPXtFOEUzOUQzQi00RjM1LTM2RDgtQjg5Mi00QjI4MzM2RkUwNDF9Pz4KLSAgICAgICAgPD9lbmRpZiA/PgotICAgICAgICA8Q29tcG9uZW50R3JvdXAgSWQ9ImNydF9maWxlcyI+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IElkPSJhcHBjcnQxNDAuZGxsX0xNIiBEaXJlY3Rvcnk9IlN5c3RlbUluc3RhbGxEaXJlY3RvcnkiIEd1aWQ9IiQodmFyLmFwcGNydDE0MEd1aWQpIiBTaGFyZWQ9InllcyIgU2hhcmVkRGxsUmVmQ291bnQ9InllcyI+Ci0gICAgICAgICAgICAgICAgPENvbmRpdGlvbj5BTExVU0VSUz0xPC9Db25kaXRpb24+Ci0gICAgICAgICAgICAgICAgPEZpbGUgSWQ9ImFwcGNydDE0MC5kbGxfTE0iIFNvdXJjZT0iIShiaW5kcGF0aC5jcnQpXGFwcGNydDE0MC5kbGwiIC8+Ci0gICAgICAgICAgICA8L0NvbXBvbmVudD4KLSAgICAgICAgICAgIDxDb21wb25lbnQgSWQ9ImRlc2t0b3BjcnQxNDAuZGxsX0xNIiBEaXJlY3Rvcnk9IlN5c3RlbUluc3RhbGxEaXJlY3RvcnkiIEd1aWQ9IiQodmFyLmRlc2t0b3BjcnQxNDBHdWlkKSIgU2hhcmVkPSJ5ZXMiIFNoYXJlZERsbFJlZkNvdW50PSJ5ZXMiPgotICAgICAgICAgICAgICAgIDxDb25kaXRpb24+QUxMVVNFUlM9MTwvQ29uZGl0aW9uPgotICAgICAgICAgICAgICAgIDxGaWxlIElkPSJkZXNrdG9wY3J0MTQwLmRsbF9MTSIgU291cmNlPSIhKGJpbmRwYXRoLmNydClcZGVza3RvcGNydDE0MC5kbGwiIC8+Ci0gICAgICAgICAgICA8L0NvbXBvbmVudD4KLSAgICAgICAgICAgIDxDb21wb25lbnQgSWQ9InZjcnVudGltZTE0MC5kbGxfTE0iIERpcmVjdG9yeT0iU3lzdGVtSW5zdGFsbERpcmVjdG9yeSIgR3VpZD0iJCh2YXIudmNydW50aW1lMTQwR3VpZCkiIFNoYXJlZD0ieWVzIiBTaGFyZWREbGxSZWZDb3VudD0ieWVzIj4KLSAgICAgICAgICAgICAgICA8Q29uZGl0aW9uPkFMTFVTRVJTPTE8L0NvbmRpdGlvbj4KLSAgICAgICAgICAgICAgICA8RmlsZSBJZD0idmNydW50aW1lMTQwLmRsbF9MTSIgU291cmNlPSIhKGJpbmRwYXRoLmNydClcdmNydW50aW1lMTQwLmRsbCIgLz4KLSAgICAgICAgICAgIDwvQ29tcG9uZW50PgotICAgICAgICAgICAgPENvbXBvbmVudCBJZD0iYXBwY3J0MTQwLmRsbF9DVSIgRGlyZWN0b3J5PSJJbnN0YWxsRGlyZWN0b3J5IiBHdWlkPSIqIj4KLSAgICAgICAgICAgICAgICA8Q29uZGl0aW9uPk5PVCBBTExVU0VSUz0xPC9Db25kaXRpb24+Ci0gICAgICAgICAgICAgICAgPEZpbGUgSWQ9ImFwcGNydDE0MC5kbGxfQ1UiIFNvdXJjZT0iIShiaW5kcGF0aC5jcnQpXGFwcGNydDE0MC5kbGwiIC8+Ci0gICAgICAgICAgICA8L0NvbXBvbmVudD4KLSAgICAgICAgICAgIDxDb21wb25lbnQgSWQ9ImRlc2t0b3BjcnQxNDAuZGxsX0NVIiBEaXJlY3Rvcnk9Ikluc3RhbGxEaXJlY3RvcnkiIEd1aWQ9IioiPgotICAgICAgICAgICAgICAgIDxDb25kaXRpb24+Tk9UIEFMTFVTRVJTPTE8L0NvbmRpdGlvbj4KLSAgICAgICAgICAgICAgICA8RmlsZSBJZD0iZGVza3RvcGNydDE0MC5kbGxfQ1UiIFNvdXJjZT0iIShiaW5kcGF0aC5jcnQpXGRlc2t0b3BjcnQxNDAuZGxsIiAvPgotICAgICAgICAgICAgPC9Db21wb25lbnQ+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IElkPSJ2Y3J1bnRpbWUxNDAuZGxsX0NVIiBEaXJlY3Rvcnk9Ikluc3RhbGxEaXJlY3RvcnkiIEd1aWQ9IioiPgotICAgICAgICAgICAgICAgIDxDb25kaXRpb24+Tk9UIEFMTFVTRVJTPTE8L0NvbmRpdGlvbj4KLSAgICAgICAgICAgICAgICA8RmlsZSBJZD0idmNydW50aW1lMTQwLmRsbF9DVSIgU291cmNlPSIhKGJpbmRwYXRoLmNydClcdmNydW50aW1lMTQwLmRsbCIgLz4KLSAgICAgICAgICAgIDwvQ29tcG9uZW50PgotICAgICAgICA8L0NvbXBvbmVudEdyb3VwPgotICAgIDwvRnJhZ21lbnQ+Ci08L1dpeD4KZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9jcnQvY3J0X2ZpbGVzLnd4cyBiL1Rvb2xzL21zaS9jcnQvY3J0X2ZpbGVzLnd4cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmY3ZDZlCi0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvbXNpL2NydC9jcnRfZmlsZXMud3hzCkBAIC0wLDAgKzEsMjAgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8V2l4IHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dpeC8yMDA2L3dpIj4KKyAgICA8RnJhZ21lbnQ+CisgICAgICAgIDw/aWYgJCh2YXIuUGxhdGZvcm0pfj14NjQgPz4KKyAgICAgICAgPD9kZWZpbmUgdmNydW50aW1lMTQwR3VpZD17QjMzMjU4RkQtNzUwQy0zQjQyLThCRTQtNTM1QjQ4RTk3REI0fT8+CisgICAgICAgIDw/ZWxzZSA/PgorICAgICAgICA8P2RlZmluZSB2Y3J1bnRpbWUxNDBHdWlkPXtFOEUzOUQzQi00RjM1LTM2RDgtQjg5Mi00QjI4MzM2RkUwNDF9Pz4KKyAgICAgICAgPD9lbmRpZiA/PgorICAgICAgICA8Q29tcG9uZW50R3JvdXAgSWQ9ImNydF9maWxlcyI+CisgICAgICAgICAgICA8Q29tcG9uZW50IElkPSJ2Y3J1bnRpbWUxNDAuZGxsX0xNIiBEaXJlY3Rvcnk9IlN5c3RlbUluc3RhbGxEaXJlY3RvcnkiIEd1aWQ9IiQodmFyLnZjcnVudGltZTE0MEd1aWQpIiBTaGFyZWQ9InllcyIgU2hhcmVkRGxsUmVmQ291bnQ9InllcyI+CisgICAgICAgICAgICAgICAgPENvbmRpdGlvbj5BTExVU0VSUz0xPC9Db25kaXRpb24+CisgICAgICAgICAgICAgICAgPEZpbGUgSWQ9InZjcnVudGltZTE0MC5kbGxfTE0iIFNvdXJjZT0iIShiaW5kcGF0aC5jcnQpXHZjcnVudGltZTE0MC5kbGwiIC8+CisgICAgICAgICAgICA8L0NvbXBvbmVudD4KKyAgICAgICAgICAgIDxDb21wb25lbnQgSWQ9InZjcnVudGltZTE0MC5kbGxfQ1UiIERpcmVjdG9yeT0iSW5zdGFsbERpcmVjdG9yeSIgR3VpZD0iKiI+CisgICAgICAgICAgICAgICAgPENvbmRpdGlvbj5OT1QgQUxMVVNFUlM9MTwvQ29uZGl0aW9uPgorICAgICAgICAgICAgICAgIDxGaWxlIElkPSJ2Y3J1bnRpbWUxNDAuZGxsX0NVIiBTb3VyY2U9IiEoYmluZHBhdGguY3J0KVx2Y3J1bnRpbWUxNDAuZGxsIiAvPgorICAgICAgICAgICAgPC9Db21wb25lbnQ+CisgICAgICAgIDwvQ29tcG9uZW50R3JvdXA+CisgICAgPC9GcmFnbWVudD4KKzwvV2l4PgpkaWZmIC0tZ2l0IGEvVG9vbHMvbXNpL2Rldi9kZXYucHJvcHMgYi9Ub29scy9tc2kvZGV2L2Rldi5wcm9wcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EyNTQ5ZC4uMDAwMDAwMAotLS0gYS9Ub29scy9tc2kvZGV2L2Rldi5wcm9wcworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+Ci0gICAgPEltcG9ydCBQcm9qZWN0PSIuLlxtc2kucHJvcHMiIC8+Ci0gICAgPFByb3BlcnR5R3JvdXA+Ci0gICAgICAgIDxEZWZpbmVDb25zdGFudHMgQ29uZGl0aW9uPSIkKEJ1aWxkRm9yUmVsZWFzZSkiPgotICAgICAgICAgICAgJChEZWZpbmVDb25zdGFudHMpOwotICAgICAgICAgICAgSW5jbHVkZU1pbkdXTGliPTE7Ci0gICAgICAgIDwvRGVmaW5lQ29uc3RhbnRzPgotICAgIDwvUHJvcGVydHlHcm91cD4KLSAgICA8SXRlbUdyb3VwPgotICAgICAgICA8Q29tcGlsZSBJbmNsdWRlPSIqLnd4cyIgLz4KLSAgICA8L0l0ZW1Hcm91cD4KLSAgICA8SXRlbUdyb3VwPgotICAgICAgICA8RW1iZWRkZWRSZXNvdXJjZSBJbmNsdWRlPSIqLnd4bCIgLz4KLSAgICA8L0l0ZW1Hcm91cD4KLSAgICA8SXRlbUdyb3VwPgotICAgICAgICA8SW5zdGFsbEZpbGVzIEluY2x1ZGU9IiQoUHlTb3VyY2VQYXRoKWluY2x1ZGVcKi5oIj4KLSAgICAgICAgICAgIDxTb3VyY2VCYXNlPiQoUHlTb3VyY2VQYXRoKTwvU291cmNlQmFzZT4KLSAgICAgICAgICAgIDxTb3VyY2U+IShiaW5kcGF0aC5zcmMpPC9Tb3VyY2U+Ci0gICAgICAgICAgICA8VGFyZ2V0QmFzZT4kKFB5U291cmNlUGF0aCk8L1RhcmdldEJhc2U+Ci0gICAgICAgICAgICA8VGFyZ2V0Xz48L1RhcmdldF8+Ci0gICAgICAgICAgICA8R3JvdXA+ZGV2X2luY2x1ZGU8L0dyb3VwPgotICAgICAgICA8L0luc3RhbGxGaWxlcz4KLSAgICA8L0l0ZW1Hcm91cD4KLSAgICAKLSAgICA8VGFyZ2V0IE5hbWU9IkJ1aWxkTWluR1dMaWIiCi0gICAgICAgICAgICBJbnB1dHM9IiQoQnVpbGRQYXRoKSQoUHlEbGxOYW1lKS5kbGwiCi0gICAgICAgICAgICBPdXRwdXRzPSIkKEJ1aWxkUGF0aClsaWIkKFB5RGxsTmFtZSkuYSIKLSAgICAgICAgICAgIEFmdGVyVGFyZ2V0cz0iUHJlcGFyZUZvckJ1aWxkIgotICAgICAgICAgICAgQ29uZGl0aW9uPSIkKEJ1aWxkRm9yUmVsZWFzZSkiPgotICAgICAgICA8IS0tIEJ1aWxkIGxpYnB5dGhvbiMjLmEgYXMgcGFydCBvZiB0aGlzIHByb2plY3QuIFRoaXMgcmVxdWlyZXMgZ2VuZGVmIGFuZCBkbGx0b29sIG9uIHRoZSBwYXRoLiAtLT4KLSAgICAgICAgPFByb3BlcnR5R3JvdXA+Ci0gICAgICAgICAgICA8X0dlbkRlZlBsYXRmb3JtPmkzODY8L19HZW5EZWZQbGF0Zm9ybT4KLSAgICAgICAgICAgIDxfR2VuRGVmUGxhdGZvcm0gQ29uZGl0aW9uPSIkKFBsYXRmb3JtKSA9PSAneDY0JyI+aTM4Njp4ODYtNjQ8L19HZW5EZWZQbGF0Zm9ybT4KLSAgICAgICAgPC9Qcm9wZXJ0eUdyb3VwPgotCi0gICAgICAgIDxFeGVjIENvbW1hbmQ9J2dlbmRlZiAtICIkKEJ1aWxkUGF0aCkkKFB5RGxsTmFtZSkuZGxsIiAmZ3Q7ICIkKEludGVybWVkaWF0ZU91dHB1dFBhdGgpbWluZ3dsaWIuZGVmIicgQ29udGludWVPbkVycm9yPSJmYWxzZSIgLz4KLSAgICAgICAgPEV4ZWMgQ29tbWFuZD0nZGxsdG9vbCAtLWRsbG5hbWUgJChQeURsbE5hbWUpLmRsbCAtLWRlZiAiJChJbnRlcm1lZGlhdGVPdXRwdXRQYXRoKW1pbmd3bGliLmRlZiIgLS1vdXRwdXQtbGliICIkKEJ1aWxkUGF0aClsaWIkKFB5RGxsTmFtZSkuYSIgLW0gJChfR2VuRGVmUGxhdGZvcm0pJyAvPgotICAgIDwvVGFyZ2V0PgotCi0gICAgPEltcG9ydCBQcm9qZWN0PSIuLlxtc2kudGFyZ2V0cyIgLz4KLTwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9Ub29scy9tc2kvZGV2L2Rldi53aXhwcm9qIGIvVG9vbHMvbXNpL2Rldi9kZXYud2l4cHJvagppbmRleCA4YTIyOTNmLi5lMTQ0ODc4IDEwMDY0NAotLS0gYS9Ub29scy9tc2kvZGV2L2Rldi53aXhwcm9qCisrKyBiL1Rvb2xzL21zaS9kZXYvZGV2LndpeHByb2oKQEAgLTUsNyArNSw0NSBAQAogICAgICAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+CiAgICAgICAgIDxPdXRwdXROYW1lIENvbmRpdGlvbj0iJyQoT3V0cHV0TmFtZSknID09ICcnIj5kZXY8L091dHB1dE5hbWU+CiAgICAgICAgIDxPdXRwdXRUeXBlPlBhY2thZ2U8L091dHB1dFR5cGU+Ci0gICAgICAgIDxEZWZpbmVDb25zdGFudHM+SW5jbHVkZURlZmF1bHRGZWF0dXJlPTE7JChEZWZpbmVDb25zdGFudHMpPC9EZWZpbmVDb25zdGFudHM+CiAgICAgPC9Qcm9wZXJ0eUdyb3VwPgotICAgIDxJbXBvcnQgUHJvamVjdD0iZGV2LnByb3BzIiAvPgorICAgIDxJbXBvcnQgUHJvamVjdD0iLi5cbXNpLnByb3BzIiAvPgorICAgIDxQcm9wZXJ0eUdyb3VwPgorICAgICAgICA8RGVmaW5lQ29uc3RhbnRzIENvbmRpdGlvbj0iJChCdWlsZEZvclJlbGVhc2UpIj4KKyAgICAgICAgICAgICQoRGVmaW5lQ29uc3RhbnRzKTsKKyAgICAgICAgICAgIEluY2x1ZGVNaW5HV0xpYj0xOworICAgICAgICA8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8L1Byb3BlcnR5R3JvdXA+CisgICAgPEl0ZW1Hcm91cD4KKyAgICAgICAgPENvbXBpbGUgSW5jbHVkZT0iZGV2Lnd4cyIgLz4KKyAgICAgICAgPENvbXBpbGUgSW5jbHVkZT0iZGV2X2ZpbGVzLnd4cyIgLz4KKyAgICA8L0l0ZW1Hcm91cD4KKyAgICA8SXRlbUdyb3VwPgorICAgICAgICA8RW1iZWRkZWRSZXNvdXJjZSBJbmNsdWRlPSIqLnd4bCIgLz4KKyAgICA8L0l0ZW1Hcm91cD4KKyAgICA8SXRlbUdyb3VwPgorICAgICAgICA8SW5zdGFsbEZpbGVzIEluY2x1ZGU9IiQoUHlTb3VyY2VQYXRoKWluY2x1ZGVcKi5oIj4KKyAgICAgICAgICAgIDxTb3VyY2VCYXNlPiQoUHlTb3VyY2VQYXRoKTwvU291cmNlQmFzZT4KKyAgICAgICAgICAgIDxTb3VyY2U+IShiaW5kcGF0aC5zcmMpPC9Tb3VyY2U+CisgICAgICAgICAgICA8VGFyZ2V0QmFzZT4kKFB5U291cmNlUGF0aCk8L1RhcmdldEJhc2U+CisgICAgICAgICAgICA8VGFyZ2V0Xz48L1RhcmdldF8+CisgICAgICAgICAgICA8R3JvdXA+ZGV2X2luY2x1ZGU8L0dyb3VwPgorICAgICAgICA8L0luc3RhbGxGaWxlcz4KKyAgICA8L0l0ZW1Hcm91cD4KKyAgICAKKyAgICA8VGFyZ2V0IE5hbWU9IkJ1aWxkTWluR1dMaWIiCisgICAgICAgICAgICBJbnB1dHM9IiQoQnVpbGRQYXRoKSQoUHlEbGxOYW1lKS5kbGwiCisgICAgICAgICAgICBPdXRwdXRzPSIkKEJ1aWxkUGF0aClsaWIkKFB5RGxsTmFtZSkuYSIKKyAgICAgICAgICAgIEFmdGVyVGFyZ2V0cz0iUHJlcGFyZUZvckJ1aWxkIgorICAgICAgICAgICAgQ29uZGl0aW9uPSIkKEJ1aWxkRm9yUmVsZWFzZSkiPgorICAgICAgICA8IS0tIEJ1aWxkIGxpYnB5dGhvbiMjLmEgYXMgcGFydCBvZiB0aGlzIHByb2plY3QuIFRoaXMgcmVxdWlyZXMgZ2VuZGVmIGFuZCBkbGx0b29sIG9uIHRoZSBwYXRoLiAtLT4KKyAgICAgICAgPFByb3BlcnR5R3JvdXA+CisgICAgICAgICAgICA8X0dlbkRlZlBsYXRmb3JtPmkzODY8L19HZW5EZWZQbGF0Zm9ybT4KKyAgICAgICAgICAgIDxfR2VuRGVmUGxhdGZvcm0gQ29uZGl0aW9uPSIkKFBsYXRmb3JtKSA9PSAneDY0JyI+aTM4Njp4ODYtNjQ8L19HZW5EZWZQbGF0Zm9ybT4KKyAgICAgICAgPC9Qcm9wZXJ0eUdyb3VwPgorCisgICAgICAgIDxFeGVjIENvbW1hbmQ9J2dlbmRlZiAtICIkKEJ1aWxkUGF0aCkkKFB5RGxsTmFtZSkuZGxsIiAmZ3Q7ICIkKEludGVybWVkaWF0ZU91dHB1dFBhdGgpbWluZ3dsaWIuZGVmIicgQ29udGludWVPbkVycm9yPSJmYWxzZSIgLz4KKyAgICAgICAgPEV4ZWMgQ29tbWFuZD0nZGxsdG9vbCAtLWRsbG5hbWUgJChQeURsbE5hbWUpLmRsbCAtLWRlZiAiJChJbnRlcm1lZGlhdGVPdXRwdXRQYXRoKW1pbmd3bGliLmRlZiIgLS1vdXRwdXQtbGliICIkKEJ1aWxkUGF0aClsaWIkKFB5RGxsTmFtZSkuYSIgLW0gJChfR2VuRGVmUGxhdGZvcm0pJyAvPgorICAgIDwvVGFyZ2V0PgorCisgICAgPEltcG9ydCBQcm9qZWN0PSIuLlxtc2kudGFyZ2V0cyIgLz4KIDwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9Ub29scy9tc2kvZGV2L2Rldi53eHMgYi9Ub29scy9tc2kvZGV2L2Rldi53eHMKaW5kZXggNDhlYmE2Yi4uZjhhZjlhYSAxMDA2NDQKLS0tIGEvVG9vbHMvbXNpL2Rldi9kZXYud3hzCisrKyBiL1Rvb2xzL21zaS9kZXYvZGV2Lnd4cwpAQCAtNiw3ICs2LDYgQEAKICAgICAgICAgCiAgICAgICAgIDxQcm9wZXJ0eVJlZiBJZD0iVXBncmFkZVRhYmxlIiAvPgogICAgICAgICAKLSAgICAgICAgPD9pZmRlZiBJbmNsdWRlRGVmYXVsdEZlYXR1cmUgPz4KICAgICAgICAgPEZlYXR1cmUgSWQ9IkRlZmF1bHRGZWF0dXJlIiBBbGxvd0FkdmVydGlzZT0ibm8iIFRpdGxlPSIhKGxvYy5UaXRsZSkiIERlc2NyaXB0aW9uPSIhKGxvYy5EZXNjcmlwdGlvbikiPgogICAgICAgICAgICAgPENvbXBvbmVudEdyb3VwUmVmIElkPSJkZXZfaW5jbHVkZSIgLz4KICAgICAgICAgICAgIDxDb21wb25lbnRHcm91cFJlZiBJZD0iZGV2X3B5Y29uZmlnIiAvPgpAQCAtMTUsMTEgKzE0LDUgQEAKICAgICAgICAgICAgIDxDb21wb25lbnRHcm91cFJlZiBJZD0iZGV2X21pbmd3IiAvPgogPD9lbmRpZiA/PgogICAgICAgICA8L0ZlYXR1cmU+Ci0gICAgICAgIDw/ZW5kaWYgPz4KLSAgICAgICAgPD9pZmRlZiBJbmNsdWRlRGVidWdCaW5hcmllcyA/PgotICAgICAgICA8RmVhdHVyZSBJZD0iRGVidWdCaW5hcmllcyIgQWxsb3dBZHZlcnRpc2U9Im5vIiBUaXRsZT0iIShsb2MuVGl0bGVfZCkiIERlc2NyaXB0aW9uPSIhKGxvYy5EZXNjcmlwdGlvbl9kKSI+Ci0gICAgICAgICAgICA8Q29tcG9uZW50R3JvdXBSZWYgSWQ9ImRldl9saWJzX2QiIC8+Ci0gICAgICAgIDwvRmVhdHVyZT4KLSAgICAgICAgPD9lbmRpZiA/PgogICAgIDwvUHJvZHVjdD4KIDwvV2l4PgpkaWZmIC0tZ2l0IGEvVG9vbHMvbXNpL2Rldi9kZXZfZC53aXhwcm9qIGIvVG9vbHMvbXNpL2Rldi9kZXZfZC53aXhwcm9qCmluZGV4IDIzNTRkOTcuLmIzYjA1MzIgMTAwNjQ0Ci0tLSBhL1Rvb2xzL21zaS9kZXYvZGV2X2Qud2l4cHJvagorKysgYi9Ub29scy9tc2kvZGV2L2Rldl9kLndpeHByb2oKQEAgLTUsNyArNSwxNSBAQAogICAgICAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+CiAgICAgICAgIDxPdXRwdXROYW1lPmRldl9kPC9PdXRwdXROYW1lPgogICAgICAgICA8T3V0cHV0VHlwZT5QYWNrYWdlPC9PdXRwdXRUeXBlPgotICAgICAgICA8RGVmaW5lQ29uc3RhbnRzPkluY2x1ZGVEZWJ1Z0JpbmFyaWVzPTE7JChEZWZpbmVDb25zdGFudHMpPC9EZWZpbmVDb25zdGFudHM+CiAgICAgPC9Qcm9wZXJ0eUdyb3VwPgotICAgIDxJbXBvcnQgUHJvamVjdD0iZGV2LnByb3BzIiAvPgorICAgIDxJbXBvcnQgUHJvamVjdD0iLi5cbXNpLnByb3BzIiAvPgorICAgIDxJdGVtR3JvdXA+CisgICAgICAgIDxDb21waWxlIEluY2x1ZGU9ImRldl9kLnd4cyIgLz4KKyAgICAgICAgPENvbXBpbGUgSW5jbHVkZT0iZGV2X2ZpbGVzLnd4cyIgLz4KKyAgICA8L0l0ZW1Hcm91cD4KKyAgICA8SXRlbUdyb3VwPgorICAgICAgICA8RW1iZWRkZWRSZXNvdXJjZSBJbmNsdWRlPSIqLnd4bCIgLz4KKyAgICA8L0l0ZW1Hcm91cD4KKworICAgIDxJbXBvcnQgUHJvamVjdD0iLi5cbXNpLnRhcmdldHMiIC8+CiA8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVG9vbHMvbXNpL2Rldi9kZXZfZC53eHMgYi9Ub29scy9tc2kvZGV2L2Rldl9kLnd4cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2NiMmVhCi0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvbXNpL2Rldi9kZXZfZC53eHMKQEAgLTAsMCArMSwxMyBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxXaXggeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd2l4LzIwMDYvd2kiPgorICAgIDxQcm9kdWN0IElkPSIqIiBMYW5ndWFnZT0iIShsb2MuTENJRCkiIE5hbWU9IiEobG9jLlRpdGxlKSIgVmVyc2lvbj0iJCh2YXIuVmVyc2lvbikiIE1hbnVmYWN0dXJlcj0iIShsb2MuTWFudWZhY3R1cmVyKSIgVXBncmFkZUNvZGU9IiQodmFyLlVwZ3JhZGVDb2RlKSI+CisgICAgICAgIDxQYWNrYWdlIEluc3RhbGxlclZlcnNpb249IjMwMCIgQ29tcHJlc3NlZD0ieWVzIiBJbnN0YWxsU2NvcGU9InBlclVzZXIiIFBsYXRmb3JtPSIkKHZhci5QbGF0Zm9ybSkiIC8+CisgICAgICAgIDxNZWRpYVRlbXBsYXRlIEVtYmVkQ2FiPSJ5ZXMiIENvbXByZXNzaW9uTGV2ZWw9ImhpZ2giIC8+CisgICAgICAgIAorICAgICAgICA8UHJvcGVydHlSZWYgSWQ9IlVwZ3JhZGVUYWJsZSIgLz4KKyAgICAgICAgCisgICAgICAgIDxGZWF0dXJlIElkPSJEZWJ1Z0JpbmFyaWVzIiBBbGxvd0FkdmVydGlzZT0ibm8iIFRpdGxlPSIhKGxvYy5UaXRsZV9kKSIgRGVzY3JpcHRpb249IiEobG9jLkRlc2NyaXB0aW9uX2QpIj4KKyAgICAgICAgICAgIDxDb21wb25lbnRHcm91cFJlZiBJZD0iZGV2X2xpYnNfZCIgLz4KKyAgICAgICAgPC9GZWF0dXJlPgorICAgIDwvUHJvZHVjdD4KKzwvV2l4PgpkaWZmIC0tZ2l0IGEvVG9vbHMvbXNpL2RvYy9kb2Mud3hzIGIvVG9vbHMvbXNpL2RvYy9kb2Mud3hzCmluZGV4IDZiZWNhZjYuLmRkYWI4M2IgMTAwNjQ0Ci0tLSBhL1Rvb2xzL21zaS9kb2MvZG9jLnd4cworKysgYi9Ub29scy9tc2kvZG9jL2RvYy53eHMKQEAgLTEwLDYgKzEwLDcgQEAKICAgICAgICAgPEZlYXR1cmUgSWQ9IkRlZmF1bHRGZWF0dXJlIiBBbGxvd0FkdmVydGlzZT0ibm8iIFRpdGxlPSIhKGxvYy5UaXRsZSkiIERlc2NyaXB0aW9uPSIhKGxvYy5EZXNjcmlwdGlvbikiPgogICAgICAgICAgICAgPENvbXBvbmVudEdyb3VwUmVmIElkPSJkb2MiIC8+CiAgICAgICAgICAgICAKKyAgICAgICAgICAgIDw/aWZkZWYgRG9jRmlsZW5hbWUgPz4KICAgICAgICAgICAgIDxDb21wb25lbnQgSWQ9ImRvY19zaG9ydGN1dCIgRGlyZWN0b3J5PSJNZW51RGlyIiBHdWlkPSIqIj4KICAgICAgICAgICAgICAgICA8UmVnaXN0cnlLZXkgUm9vdD0iSEtNVSIgS2V5PSJbUkVHSVNUUllLRVldIj4KICAgICAgICAgICAgICAgICAgICAgPFJlZ2lzdHJ5VmFsdWUgS2V5PSJIZWxwXE1haW4gUHl0aG9uIERvY3VtZW50YXRpb24iIFR5cGU9InN0cmluZyIgVmFsdWU9IlsjcHl0aG9uLmNobV0iIEtleVBhdGg9InllcyIgLz4KQEAgLTIwLDYgKzIxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249IiEobG9jLlNob3J0Y3V0RGVzY3JpcHRpb24pIiAvPgogICAgICAgICAgICAgICAgIDxSZW1vdmVGb2xkZXIgSWQ9IlJlbW92ZV9NZW51RGlyIiBPbj0idW5pbnN0YWxsIiAvPgogICAgICAgICAgICAgPC9Db21wb25lbnQ+CisgICAgICAgICAgICA8P2VuZGlmID8+CiAKICAgICAgICAgPC9GZWF0dXJlPgogICAgIDwvUHJvZHVjdD4KZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9leGUvZXhlLnByb3BzIGIvVG9vbHMvbXNpL2V4ZS9leGUucHJvcHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiOWI3ZDMuLjAwMDAwMDAKLS0tIGEvVG9vbHMvbXNpL2V4ZS9leGUucHJvcHMKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+Ci0gICAgPFByb3BlcnR5R3JvdXA+Ci0gICAgICAgIDwhLS0gU2hvcnRjdXQgdmFsaWRhdGlvbiBpcyBub3QgbmVjZXNzYXJ5IC0tPgotICAgICAgICA8U3VwcHJlc3NJQ0VzPklDRTQzPC9TdXBwcmVzc0lDRXM+Ci0gICAgPC9Qcm9wZXJ0eUdyb3VwPgotICAgIDxJbXBvcnQgUHJvamVjdD0iLi5cbXNpLnByb3BzIiAvPgotICAgIDxJdGVtR3JvdXA+Ci0gICAgICAgIDxDb21waWxlIEluY2x1ZGU9Iioud3hzIiAvPgotICAgIDwvSXRlbUdyb3VwPgotICAgIDxJdGVtR3JvdXA+Ci0gICAgICAgIDxFbWJlZGRlZFJlc291cmNlIEluY2x1ZGU9Iioud3hsIiAvPgotICAgICAgICA8V3hsVGVtcGxhdGUgSW5jbHVkZT0iKi53eGxfdGVtcGxhdGUiIC8+Ci0gICAgPC9JdGVtR3JvdXA+Ci0gICAgCi0gICAgPFRhcmdldCBOYW1lPSJfR2VuZXJhdGVMaWNlbnNlIiBBZnRlclRhcmdldHM9IlByZXBhcmVGb3JCdWlsZCI+Ci0gICAgICAgIDxJdGVtR3JvdXA+Ci0gICAgICAgICAgICA8TGljZW5zZUZpbGVzIEluY2x1ZGU9IiQoUHlTb3VyY2VQYXRoKUxJQ0VOU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNydGxpY2Vuc2UudHh0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGJ6MkRpcilMSUNFTlNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKG9wZW5zc2xEaXIpTElDRU5TRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0Y2xEaXIpbGljZW5zZS50ZXJtczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0a0RpcilsaWNlbnNlLnRlcm1zOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRpeERpcilsaWNlbnNlLnRlcm1zIiAvPgotICAgICAgICAgICAgPF9MaWNlbnNlRmlsZXMgSW5jbHVkZT0iQChMaWNlbnNlRmlsZXMpIj4KLSAgICAgICAgICAgICAgICA8Q29udGVudD4kKFtTeXN0ZW0uSU8uRmlsZV06OlJlYWRBbGxUZXh0KCUoRnVsbFBhdGgpKSk8L0NvbnRlbnQ+Ci0gICAgICAgICAgICA8L19MaWNlbnNlRmlsZXM+Ci0gICAgICAgIDwvSXRlbUdyb3VwPgotICAgICAgICAKLSAgICAgICAgPFdyaXRlTGluZXNUb0ZpbGUgRmlsZT0iJChCdWlsZFBhdGgpTElDRU5TRSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcndyaXRlPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5lcz0iQChfTGljZW5zZUZpbGVzLT4nJShDb250ZW50KScpIiAvPgotICAgIDwvVGFyZ2V0PgotICAgICAgICAKLSAgICA8SW1wb3J0IFByb2plY3Q9Ii4uXG1zaS50YXJnZXRzIiAvPgotPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9leGUvZXhlLndpeHByb2ogYi9Ub29scy9tc2kvZXhlL2V4ZS53aXhwcm9qCmluZGV4IGQzZWQ2NWEuLmQyNmE2MDMgMTAwNjQ0Ci0tLSBhL1Rvb2xzL21zaS9leGUvZXhlLndpeHByb2oKKysrIGIvVG9vbHMvbXNpL2V4ZS9leGUud2l4cHJvagpAQCAtNSw3ICs1LDM5IEBACiAgICAgICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4KICAgICAgICAgPE91dHB1dE5hbWU+ZXhlPC9PdXRwdXROYW1lPgogICAgICAgICA8T3V0cHV0VHlwZT5QYWNrYWdlPC9PdXRwdXRUeXBlPgotICAgICAgICA8RGVmaW5lQ29uc3RhbnRzPkluY2x1ZGVEZWZhdWx0RmVhdHVyZT0xOyQoRGVmaW5lQ29uc3RhbnRzKTwvRGVmaW5lQ29uc3RhbnRzPgogICAgIDwvUHJvcGVydHlHcm91cD4KLSAgICA8SW1wb3J0IFByb2plY3Q9ImV4ZS5wcm9wcyIgLz4KKyAgICA8UHJvcGVydHlHcm91cD4KKyAgICAgICAgPCEtLSBTaG9ydGN1dCB2YWxpZGF0aW9uIGlzIG5vdCBuZWNlc3NhcnkgLS0+CisgICAgICAgIDxTdXBwcmVzc0lDRXM+SUNFNDM8L1N1cHByZXNzSUNFcz4KKyAgICA8L1Byb3BlcnR5R3JvdXA+CisgICAgPEltcG9ydCBQcm9qZWN0PSIuLlxtc2kucHJvcHMiIC8+CisgICAgPEl0ZW1Hcm91cD4KKyAgICAgICAgPENvbXBpbGUgSW5jbHVkZT0iZXhlLnd4cyIgLz4KKyAgICAgICAgPENvbXBpbGUgSW5jbHVkZT0iZXhlX2ZpbGVzLnd4cyIgLz4KKyAgICA8L0l0ZW1Hcm91cD4KKyAgICA8SXRlbUdyb3VwPgorICAgICAgICA8RW1iZWRkZWRSZXNvdXJjZSBJbmNsdWRlPSIqLnd4bCIgLz4KKyAgICAgICAgPFd4bFRlbXBsYXRlIEluY2x1ZGU9Iioud3hsX3RlbXBsYXRlIiAvPgorICAgIDwvSXRlbUdyb3VwPgorICAgIAorICAgIDxUYXJnZXQgTmFtZT0iX0dlbmVyYXRlTGljZW5zZSIgQWZ0ZXJUYXJnZXRzPSJQcmVwYXJlRm9yQnVpbGQiPgorICAgICAgICA8SXRlbUdyb3VwPgorICAgICAgICAgICAgPExpY2Vuc2VGaWxlcyBJbmNsdWRlPSIkKFB5U291cmNlUGF0aClMSUNFTlNFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnRsaWNlbnNlLnR4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChiejJEaXIpTElDRU5TRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChvcGVuc3NsRGlyKUxJQ0VOU0U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGNsRGlyKWxpY2Vuc2UudGVybXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGtEaXIpbGljZW5zZS50ZXJtczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aXhEaXIpbGljZW5zZS50ZXJtcyIgLz4KKyAgICAgICAgICAgIDxfTGljZW5zZUZpbGVzIEluY2x1ZGU9IkAoTGljZW5zZUZpbGVzKSI+CisgICAgICAgICAgICAgICAgPENvbnRlbnQ+JChbU3lzdGVtLklPLkZpbGVdOjpSZWFkQWxsVGV4dCglKEZ1bGxQYXRoKSkpPC9Db250ZW50PgorICAgICAgICAgICAgPC9fTGljZW5zZUZpbGVzPgorICAgICAgICA8L0l0ZW1Hcm91cD4KKyAgICAgICAgCisgICAgICAgIDxXcml0ZUxpbmVzVG9GaWxlIEZpbGU9IiQoQnVpbGRQYXRoKUxJQ0VOU0UiCisgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJ3cml0ZT0idHJ1ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTGluZXM9IkAoX0xpY2Vuc2VGaWxlcy0+JyUoQ29udGVudCknKSIgLz4KKyAgICA8L1RhcmdldD4KKyAgICAgICAgCisgICAgPEltcG9ydCBQcm9qZWN0PSIuLlxtc2kudGFyZ2V0cyIgLz4KIDwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9Ub29scy9tc2kvZXhlL2V4ZS53eHMgYi9Ub29scy9tc2kvZXhlL2V4ZS53eHMKaW5kZXggN2IzNTgzNi4uOTY5NmM4OSAxMDA2NDQKLS0tIGEvVG9vbHMvbXNpL2V4ZS9leGUud3hzCisrKyBiL1Rvb2xzL21zaS9leGUvZXhlLnd4cwpAQCAtNyw3ICs3LDYgQEAKICAgICAgICAgPFByb3BlcnR5UmVmIElkPSJVcGdyYWRlVGFibGUiIC8+CiAgICAgICAgIDxQcm9wZXJ0eVJlZiBJZD0iUkVHSVNUUllLRVkiIC8+CiAgICAgICAgIAotICAgICAgICA8P2lmZGVmIEluY2x1ZGVEZWZhdWx0RmVhdHVyZSA/PgogICAgICAgICA8RmVhdHVyZSBJZD0iRGVmYXVsdEZlYXR1cmUiIEFsbG93QWR2ZXJ0aXNlPSJubyIgVGl0bGU9IiEobG9jLlRpdGxlKSIgRGVzY3JpcHRpb249IiEobG9jLkRlc2NyaXB0aW9uKSI+CiAgICAgICAgICAgICA8Q29tcG9uZW50R3JvdXBSZWYgSWQ9ImV4ZV9weXRob24iIC8+CiAgICAgICAgICAgICA8Q29tcG9uZW50R3JvdXBSZWYgSWQ9ImV4ZV90eHQiIC8+CkBAIC0yNSwxNiArMjQsNSBAQAogICAgICAgICAgICAgICAgIDwvUmVnaXN0cnlLZXk+CiAgICAgICAgICAgICA8L0NvbXBvbmVudD4KICAgICAgICAgPC9GZWF0dXJlPgotICAgICAgICA8P2VuZGlmID8+Ci0gICAgICAgIDw/aWZkZWYgSW5jbHVkZVN5bWJvbHMgPz4KLSAgICAgICAgPEZlYXR1cmUgSWQ9IlN5bWJvbHMiIEFsbG93QWR2ZXJ0aXNlPSJubyIgVGl0bGU9IiEobG9jLlRpdGxlUGRiKSIgRGVzY3JpcHRpb249IiEobG9jLkRlc2NyaXB0aW9uUGRiKSI+Ci0gICAgICAgICAgICA8Q29tcG9uZW50R3JvdXBSZWYgSWQ9ImV4ZV9weXRob25fc3ltYm9scyIgLz4KLSAgICAgICAgPC9GZWF0dXJlPgotICAgICAgICA8P2VuZGlmID8+Ci0gICAgICAgIDw/aWZkZWYgSW5jbHVkZURlYnVnQmluYXJpZXMgPz4KLSAgICAgICAgPEZlYXR1cmUgSWQ9IkRlYnVnQmluYXJpZXMiIEFsbG93QWR2ZXJ0aXNlPSJubyIgVGl0bGU9IiEobG9jLlRpdGxlX2QpIiBEZXNjcmlwdGlvbj0iIShsb2MuRGVzY3JpcHRpb25fZCkiPgotICAgICAgICAgICAgPENvbXBvbmVudEdyb3VwUmVmIElkPSJleGVfcHl0aG9uX2QiIC8+Ci0gICAgICAgIDwvRmVhdHVyZT4KLSAgICAgICAgPD9lbmRpZiA/PgogICAgIDwvUHJvZHVjdD4KIDwvV2l4PgpkaWZmIC0tZ2l0IGEvVG9vbHMvbXNpL2V4ZS9leGVfZC53aXhwcm9qIGIvVG9vbHMvbXNpL2V4ZS9leGVfZC53aXhwcm9qCmluZGV4IDliNTdkYjguLjI3NTQ1Y2EgMTAwNjQ0Ci0tLSBhL1Rvb2xzL21zaS9leGUvZXhlX2Qud2l4cHJvagorKysgYi9Ub29scy9tc2kvZXhlL2V4ZV9kLndpeHByb2oKQEAgLTUsNyArNSwxNiBAQAogICAgICAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+CiAgICAgICAgIDxPdXRwdXROYW1lPmV4ZV9kPC9PdXRwdXROYW1lPgogICAgICAgICA8T3V0cHV0VHlwZT5QYWNrYWdlPC9PdXRwdXRUeXBlPgotICAgICAgICA8RGVmaW5lQ29uc3RhbnRzPkluY2x1ZGVEZWJ1Z0JpbmFyaWVzPTE7JChEZWZpbmVDb25zdGFudHMpPC9EZWZpbmVDb25zdGFudHM+CiAgICAgPC9Qcm9wZXJ0eUdyb3VwPgotICAgIDxJbXBvcnQgUHJvamVjdD0iZXhlLnByb3BzIiAvPgorICAgIDxJbXBvcnQgUHJvamVjdD0iLi5cbXNpLnByb3BzIiAvPgorICAgIDxJdGVtR3JvdXA+CisgICAgICAgIDxDb21waWxlIEluY2x1ZGU9ImV4ZV9kLnd4cyIgLz4KKyAgICAgICAgPENvbXBpbGUgSW5jbHVkZT0iZXhlX2ZpbGVzLnd4cyIgLz4KKyAgICA8L0l0ZW1Hcm91cD4KKyAgICA8SXRlbUdyb3VwPgorICAgICAgICA8RW1iZWRkZWRSZXNvdXJjZSBJbmNsdWRlPSIqLnd4bCIgLz4KKyAgICAgICAgPFd4bFRlbXBsYXRlIEluY2x1ZGU9Iioud3hsX3RlbXBsYXRlIiAvPgorICAgIDwvSXRlbUdyb3VwPgorCisgICAgPEltcG9ydCBQcm9qZWN0PSIuLlxtc2kudGFyZ2V0cyIgLz4KIDwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9Ub29scy9tc2kvZXhlL2V4ZV9kLnd4cyBiL1Rvb2xzL21zaS9leGUvZXhlX2Qud3hzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiY2IwMTIKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9tc2kvZXhlL2V4ZV9kLnd4cwpAQCAtMCwwICsxLDEzIEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPFdpeCB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS93aXgvMjAwNi93aSI+CisgICAgPFByb2R1Y3QgSWQ9IioiIExhbmd1YWdlPSIhKGxvYy5MQ0lEKSIgTmFtZT0iIShsb2MuVGl0bGUpIiBWZXJzaW9uPSIkKHZhci5WZXJzaW9uKSIgTWFudWZhY3R1cmVyPSIhKGxvYy5NYW51ZmFjdHVyZXIpIiBVcGdyYWRlQ29kZT0iJCh2YXIuVXBncmFkZUNvZGUpIj4KKyAgICAgICAgPFBhY2thZ2UgSW5zdGFsbGVyVmVyc2lvbj0iMzAwIiBDb21wcmVzc2VkPSJ5ZXMiIEluc3RhbGxTY29wZT0icGVyVXNlciIgUGxhdGZvcm09IiQodmFyLlBsYXRmb3JtKSIgLz4KKyAgICAgICAgPE1lZGlhVGVtcGxhdGUgRW1iZWRDYWI9InllcyIgQ29tcHJlc3Npb25MZXZlbD0iaGlnaCIgLz4KKyAgICAgICAgCisgICAgICAgIDxQcm9wZXJ0eVJlZiBJZD0iVXBncmFkZVRhYmxlIiAvPgorICAgICAgICAKKyAgICAgICAgPEZlYXR1cmUgSWQ9IkRlYnVnQmluYXJpZXMiIEFsbG93QWR2ZXJ0aXNlPSJubyIgVGl0bGU9IiEobG9jLlRpdGxlX2QpIiBEZXNjcmlwdGlvbj0iIShsb2MuRGVzY3JpcHRpb25fZCkiPgorICAgICAgICAgICAgPENvbXBvbmVudEdyb3VwUmVmIElkPSJleGVfcHl0aG9uX2QiIC8+CisgICAgICAgIDwvRmVhdHVyZT4KKyAgICA8L1Byb2R1Y3Q+Cis8L1dpeD4KZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9leGUvZXhlX2VuLVVTLnd4bF90ZW1wbGF0ZSBiL1Rvb2xzL21zaS9leGUvZXhlX2VuLVVTLnd4bF90ZW1wbGF0ZQppbmRleCBjYzYwZWY2Li41NzdmYmU1IDEwMDY0NAotLS0gYS9Ub29scy9tc2kvZXhlL2V4ZV9lbi1VUy53eGxfdGVtcGxhdGUKKysrIGIvVG9vbHMvbXNpL2V4ZS9leGVfZW4tVVMud3hsX3RlbXBsYXRlCkBAIC00LDYgKzQsNCBAQAogICAgIDxTdHJpbmcgSWQ9IlNob3J0RGVzY3JpcHRvciI+ZXhlY3V0YWJsZTwvU3RyaW5nPgogICAgIDxTdHJpbmcgSWQ9IlNob3J0Y3V0TmFtZSI+UHl0aG9uIHt7U2hvcnRWZXJzaW9ufX0gKHt7Qml0bmVzc319KTwvU3RyaW5nPgogICAgIDxTdHJpbmcgSWQ9IlNob3J0Y3V0RGVzY3JpcHRpb24iPkxhdW5jaGVzIHRoZSAhKGxvYy5Qcm9kdWN0TmFtZSkgaW50ZXJwcmV0ZXIuPC9TdHJpbmc+Ci0gICAgPFN0cmluZyBJZD0iUGF0aFRpdGxlIj5BZGQgdG8gUEFUSDwvU3RyaW5nPgotICAgIDxTdHJpbmcgSWQ9IlBhdGhEZXNjcmlwdGlvbiI+QWRkcyB0aGUgaW5zdGFsbCBkaXJlY3RvcnkgdG8gUEFUSCBhbmQgLnB5IHRvIFBBVEhFWFQuPC9TdHJpbmc+CiA8L1dpeExvY2FsaXphdGlvbj4KZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9leGUvZXhlX3BkYi53aXhwcm9qIGIvVG9vbHMvbXNpL2V4ZS9leGVfcGRiLndpeHByb2oKaW5kZXggZGFlM2QwYy4uNGY0Yzg2OSAxMDA2NDQKLS0tIGEvVG9vbHMvbXNpL2V4ZS9leGVfcGRiLndpeHByb2oKKysrIGIvVG9vbHMvbXNpL2V4ZS9leGVfcGRiLndpeHByb2oKQEAgLTUsNyArNSwxNiBAQAogICAgICAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+CiAgICAgICAgIDxPdXRwdXROYW1lPmV4ZV9wZGI8L091dHB1dE5hbWU+CiAgICAgICAgIDxPdXRwdXRUeXBlPlBhY2thZ2U8L091dHB1dFR5cGU+Ci0gICAgICAgIDxEZWZpbmVDb25zdGFudHM+SW5jbHVkZVN5bWJvbHM9MTskKERlZmluZUNvbnN0YW50cyk8L0RlZmluZUNvbnN0YW50cz4KICAgICA8L1Byb3BlcnR5R3JvdXA+Ci0gICAgPEltcG9ydCBQcm9qZWN0PSJleGUucHJvcHMiIC8+CisgICAgPEltcG9ydCBQcm9qZWN0PSIuLlxtc2kucHJvcHMiIC8+CisgICAgPEl0ZW1Hcm91cD4KKyAgICAgICAgPENvbXBpbGUgSW5jbHVkZT0iZXhlX3BkYi53eHMiIC8+CisgICAgICAgIDxDb21waWxlIEluY2x1ZGU9ImV4ZV9maWxlcy53eHMiIC8+CisgICAgPC9JdGVtR3JvdXA+CisgICAgPEl0ZW1Hcm91cD4KKyAgICAgICAgPEVtYmVkZGVkUmVzb3VyY2UgSW5jbHVkZT0iKi53eGwiIC8+CisgICAgICAgIDxXeGxUZW1wbGF0ZSBJbmNsdWRlPSIqLnd4bF90ZW1wbGF0ZSIgLz4KKyAgICA8L0l0ZW1Hcm91cD4KKworICAgIDxJbXBvcnQgUHJvamVjdD0iLi5cbXNpLnRhcmdldHMiIC8+CiA8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVG9vbHMvbXNpL2V4ZS9leGVfcGRiLnd4cyBiL1Rvb2xzL21zaS9leGUvZXhlX3BkYi53eHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEyOWVjMAotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL21zaS9leGUvZXhlX3BkYi53eHMKQEAgLTAsMCArMSwxMyBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxXaXggeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd2l4LzIwMDYvd2kiPgorICAgIDxQcm9kdWN0IElkPSIqIiBMYW5ndWFnZT0iIShsb2MuTENJRCkiIE5hbWU9IiEobG9jLlRpdGxlKSIgVmVyc2lvbj0iJCh2YXIuVmVyc2lvbikiIE1hbnVmYWN0dXJlcj0iIShsb2MuTWFudWZhY3R1cmVyKSIgVXBncmFkZUNvZGU9IiQodmFyLlVwZ3JhZGVDb2RlKSI+CisgICAgICAgIDxQYWNrYWdlIEluc3RhbGxlclZlcnNpb249IjMwMCIgQ29tcHJlc3NlZD0ieWVzIiBJbnN0YWxsU2NvcGU9InBlclVzZXIiIFBsYXRmb3JtPSIkKHZhci5QbGF0Zm9ybSkiIC8+CisgICAgICAgIDxNZWRpYVRlbXBsYXRlIEVtYmVkQ2FiPSJ5ZXMiIENvbXByZXNzaW9uTGV2ZWw9ImhpZ2giIC8+CisgICAgICAgIAorICAgICAgICA8UHJvcGVydHlSZWYgSWQ9IlVwZ3JhZGVUYWJsZSIgLz4KKyAgICAgICAgCisgICAgICAgIDxGZWF0dXJlIElkPSJTeW1ib2xzIiBBbGxvd0FkdmVydGlzZT0ibm8iIFRpdGxlPSIhKGxvYy5UaXRsZVBkYikiIERlc2NyaXB0aW9uPSIhKGxvYy5EZXNjcmlwdGlvblBkYikiPgorICAgICAgICAgICAgPENvbXBvbmVudEdyb3VwUmVmIElkPSJleGVfcHl0aG9uX3N5bWJvbHMiIC8+CisgICAgICAgIDwvRmVhdHVyZT4KKyAgICA8L1Byb2R1Y3Q+Cis8L1dpeD4KZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9sYXVuY2hlci9sYXVuY2hlci5wcm9wcyBiL1Rvb2xzL21zaS9sYXVuY2hlci9sYXVuY2hlci5wcm9wcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE0NWVmZS4uMDAwMDAwMAotLS0gYS9Ub29scy9tc2kvbGF1bmNoZXIvbGF1bmNoZXIucHJvcHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+Ci0gICAgPEltcG9ydCBQcm9qZWN0PSIuLlxtc2kucHJvcHMiIC8+Ci0gICAgPEl0ZW1Hcm91cD4KLSAgICAgICAgPENvbXBpbGUgSW5jbHVkZT0iKi53eHMiIC8+Ci0gICAgPC9JdGVtR3JvdXA+Ci0gICAgPEl0ZW1Hcm91cD4KLSAgICAgICAgPEVtYmVkZGVkUmVzb3VyY2UgSW5jbHVkZT0iKi53eGwiIC8+Ci0gICAgPC9JdGVtR3JvdXA+Ci0gICAgCi0gICAgPEltcG9ydCBQcm9qZWN0PSIuLlxtc2kudGFyZ2V0cyIgLz4KLTwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9Ub29scy9tc2kvbGF1bmNoZXIvbGF1bmNoZXIud2l4cHJvaiBiL1Rvb2xzL21zaS9sYXVuY2hlci9sYXVuY2hlci53aXhwcm9qCmluZGV4IDJkMDZkZjAuLjczZjI2YTggMTAwNjQ0Ci0tLSBhL1Rvb2xzL21zaS9sYXVuY2hlci9sYXVuY2hlci53aXhwcm9qCisrKyBiL1Rvb2xzL21zaS9sYXVuY2hlci9sYXVuY2hlci53aXhwcm9qCkBAIC01LDcgKzUsMTYgQEAKICAgICAgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgogICAgICAgICA8T3V0cHV0TmFtZT5sYXVuY2hlcjwvT3V0cHV0TmFtZT4KICAgICAgICAgPE91dHB1dFR5cGU+UGFja2FnZTwvT3V0cHV0VHlwZT4KLSAgICAgICAgPERlZmluZUNvbnN0YW50cz5JbmNsdWRlRGVmYXVsdEZlYXR1cmU9MTskKERlZmluZUNvbnN0YW50cyk8L0RlZmluZUNvbnN0YW50cz4KICAgICA8L1Byb3BlcnR5R3JvdXA+Ci0gICAgPEltcG9ydCBQcm9qZWN0PSJsYXVuY2hlci5wcm9wcyIgLz4KKyAgICA8SW1wb3J0IFByb2plY3Q9Ii4uXG1zaS5wcm9wcyIgLz4KKyAgICA8SXRlbUdyb3VwPgorICAgICAgICA8Q29tcGlsZSBJbmNsdWRlPSJsYXVuY2hlci53eHMiIC8+CisgICAgICAgIDxDb21waWxlIEluY2x1ZGU9ImxhdW5jaGVyX2ZpbGVzLnd4cyIgLz4KKyAgICAgICAgPENvbXBpbGUgSW5jbHVkZT0ibGF1bmNoZXJfcmVnLnd4cyIgLz4KKyAgICA8L0l0ZW1Hcm91cD4KKyAgICA8SXRlbUdyb3VwPgorICAgICAgICA8RW1iZWRkZWRSZXNvdXJjZSBJbmNsdWRlPSIqLnd4bCIgLz4KKyAgICA8L0l0ZW1Hcm91cD4KKyAgICAKKyAgICA8SW1wb3J0IFByb2plY3Q9Ii4uXG1zaS50YXJnZXRzIiAvPgogPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9sYXVuY2hlci9sYXVuY2hlci53eHMgYi9Ub29scy9tc2kvbGF1bmNoZXIvbGF1bmNoZXIud3hzCmluZGV4IGZlODhiYTUuLmIyMGNmZjggMTAwNjQ0Ci0tLSBhL1Rvb2xzL21zaS9sYXVuY2hlci9sYXVuY2hlci53eHMKKysrIGIvVG9vbHMvbXNpL2xhdW5jaGVyL2xhdW5jaGVyLnd4cwpAQCAtOCw3ICs4LDYgQEAKICAgICAgICAgPFByb3BlcnR5UmVmIElkPSJVcGdyYWRlVGFibGUiIC8+CiAgICAgICAgIDxQcm9wZXJ0eVJlZiBJZD0iQVJQUFJPRFVDVElDT04iIC8+CiAKLSAgICAgICAgPD9pZmRlZiBJbmNsdWRlRGVmYXVsdEZlYXR1cmUgPz4KICAgICAgICAgPEZlYXR1cmUgSWQ9IkRlZmF1bHRGZWF0dXJlIiBBbGxvd0FkdmVydGlzZT0ibm8iIFRpdGxlPSIhKGxvYy5UaXRsZSkiIERlc2NyaXB0aW9uPSIhKGxvYy5EZXNjcmlwdGlvbikiPgogICAgICAgICAgICAgPENvbXBvbmVudEdyb3VwUmVmIElkPSJsYXVuY2hlcl9leGUiIFByaW1hcnk9InllcyIgLz4KICAgICAgICAgPC9GZWF0dXJlPgpAQCAtMTYsMTIgKzE1LDYgQEAKICAgICAgICAgICAgIDxDb21wb25lbnRHcm91cFJlZiBJZD0ibGF1bmNoZXJfZXhlIiAvPgogICAgICAgICAgICAgPENvbXBvbmVudEdyb3VwUmVmIElkPSJsYXVuY2hlcl9yZWciIC8+CiAgICAgICAgIDwvRmVhdHVyZT4KLSAgICAgICAgPD9lbmRpZiA/PgotICAgICAgICA8P2lmZGVmIEluY2x1ZGVTeW1ib2xzID8+Ci0gICAgICAgIDxGZWF0dXJlIElkPSJTeW1ib2xzIiBBbGxvd0FkdmVydGlzZT0ibm8iIFRpdGxlPSIhKGxvYy5UaXRsZVBkYikiIERlc2NyaXB0aW9uPSIhKGxvYy5EZXNjcmlwdGlvblBkYikiPgotICAgICAgICAgICAgPENvbXBvbmVudEdyb3VwUmVmIElkPSJsYXVuY2hlcl9wZGIiIC8+Ci0gICAgICAgIDwvRmVhdHVyZT4KLSAgICAgICAgPD9lbmRpZiA/PgogICAgICAgICAKICAgICAgICAgPERpcmVjdG9yeSBJZD0iVEFSR0VURElSIiBOYW1lPSJTb3VyY2VEaXIiPgogICAgICAgICAgICAgPERpcmVjdG9yeSBJZD0iTGF1bmNoZXJJbnN0YWxsRGlyZWN0b3J5IiAvPgpkaWZmIC0tZ2l0IGEvVG9vbHMvbXNpL2xhdW5jaGVyL2xhdW5jaGVyX2ZpbGVzLnd4cyBiL1Rvb2xzL21zaS9sYXVuY2hlci9sYXVuY2hlcl9maWxlcy53eHMKaW5kZXggNjVmMTE5My4uOTYwNmRjNiAxMDA2NDQKLS0tIGEvVG9vbHMvbXNpL2xhdW5jaGVyL2xhdW5jaGVyX2ZpbGVzLnd4cworKysgYi9Ub29scy9tc2kvbGF1bmNoZXIvbGF1bmNoZXJfZmlsZXMud3hzCkBAIC0yMSwxNSArMjEsNCBAQAogICAgICAgICAgICAgPC9Db21wb25lbnQ+CiAgICAgICAgIDwvQ29tcG9uZW50R3JvdXA+CiAgICAgPC9GcmFnbWVudD4KLSAgICAKLSAgICA8RnJhZ21lbnQ+Ci0gICAgICAgIDxDb21wb25lbnRHcm91cCBJZD0ibGF1bmNoZXJfcGRiIj4KLSAgICAgICAgICAgIDxDb21wb25lbnQgSWQ9InB5LnBkYiIgRGlyZWN0b3J5PSJMYXVuY2hlckluc3RhbGxEaXJlY3RvcnkiIEd1aWQ9IioiPgotICAgICAgICAgICAgICAgIDxGaWxlIElkPSJweS5wZGIiIE5hbWU9InB5LnBkYiIgU291cmNlPSJweS5wZGIiIC8+Ci0gICAgICAgICAgICA8L0NvbXBvbmVudD4KLSAgICAgICAgICAgIDxDb21wb25lbnQgSWQ9InB5dy5wZGIiIERpcmVjdG9yeT0iTGF1bmNoZXJJbnN0YWxsRGlyZWN0b3J5IiBHdWlkPSIqIj4KLSAgICAgICAgICAgICAgICA8RmlsZSBJZD0icHl3LnBkYiIgTmFtZT0icHl3LnBkYiIgU291cmNlPSJweXcucGRiIiAvPgotICAgICAgICAgICAgPC9Db21wb25lbnQ+Ci0gICAgICAgIDwvQ29tcG9uZW50R3JvdXA+Ci0gICAgPC9GcmFnbWVudD4KIDwvV2l4PgpkaWZmIC0tZ2l0IGEvVG9vbHMvbXNpL2xhdW5jaGVyL2xhdW5jaGVyX3BkYi53aXhwcm9qIGIvVG9vbHMvbXNpL2xhdW5jaGVyL2xhdW5jaGVyX3BkYi53aXhwcm9qCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWZkZDdmLi4wMDAwMDAwCi0tLSBhL1Rvb2xzL21zaS9sYXVuY2hlci9sYXVuY2hlcl9wZGIud2l4cHJvagorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KLSAgICA8UHJvcGVydHlHcm91cD4KLSAgICAgICAgPFByb2plY3RHdWlkPntBMjFENEEyMy00ODNGLTQ4MjItQTBCMS1GQ0IxNEQ4Q0VCQTd9PC9Qcm9qZWN0R3VpZD4KLSAgICAgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgotICAgICAgICA8T3V0cHV0TmFtZT5sYXVuY2hlcl9wZGI8L091dHB1dE5hbWU+Ci0gICAgICAgIDxPdXRwdXRUeXBlPlBhY2thZ2U8L091dHB1dFR5cGU+Ci0gICAgICAgIDxEZWZpbmVDb25zdGFudHM+SW5jbHVkZVN5bWJvbHM9MTskKERlZmluZUNvbnN0YW50cyk8L0RlZmluZUNvbnN0YW50cz4KLSAgICA8L1Byb3BlcnR5R3JvdXA+Ci0gICAgPEltcG9ydCBQcm9qZWN0PSJsYXVuY2hlci5wcm9wcyIgLz4KLTwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9Ub29scy9tc2kvbGliL2xpYi5wcm9wcyBiL1Rvb2xzL21zaS9saWIvbGliLnByb3BzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTNiYTBjLi4wMDAwMDAwCi0tLSBhL1Rvb2xzL21zaS9saWIvbGliLnByb3BzCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgotICAgIDxJbXBvcnQgUHJvamVjdD0iLi5cbXNpLnByb3BzIiAvPgotICAgIDxJdGVtR3JvdXA+Ci0gICAgICAgIDxDb21waWxlIEluY2x1ZGU9Iioud3hzIiAvPgotICAgIDwvSXRlbUdyb3VwPgotICAgIDxJdGVtR3JvdXA+Ci0gICAgICAgIDxFbWJlZGRlZFJlc291cmNlIEluY2x1ZGU9Iioud3hsIiAvPgotICAgIDwvSXRlbUdyb3VwPgotICAgIDxJdGVtR3JvdXA+Ci0gICAgICAgIDxFeGNsdWRlRm9sZGVycyBJbmNsdWRlPSJMaWJcdGVzdDtMaWJcdGVzdHM7TGliXHRraW50ZXI7TGliXGlkbGVsaWI7TGliXHR1cnRsZWRlbW8iIC8+Ci0gICAgICAgIDxJbnN0YWxsRmlsZXMgSW5jbHVkZT0iJChQeVNvdXJjZVBhdGgpTGliXCoqXCoiCi0gICAgICAgICAgICAgICAgICAgICAgRXhjbHVkZT0iJChQeVNvdXJjZVBhdGgpTGliXCoqXCoucHljOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoUHlTb3VyY2VQYXRoKUxpYlwqKlwqLnB5bzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKFB5U291cmNlUGF0aClMaWJcc2l0ZS1wYWNrYWdlc1xSRUFETUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQChFeGNsdWRlRm9sZGVycy0+JyQoUHlTb3VyY2VQYXRoKSUoSWRlbnRpdHkpXConKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAKEV4Y2x1ZGVGb2xkZXJzLT4nJChQeVNvdXJjZVBhdGgpJShJZGVudGl0eSlcKipcKicpIj4KLSAgICAgICAgICAgIDxTb3VyY2VCYXNlPiQoUHlTb3VyY2VQYXRoKUxpYjwvU291cmNlQmFzZT4KLSAgICAgICAgICAgIDxTb3VyY2U+IShiaW5kcGF0aC5zcmMpTGliXDwvU291cmNlPgotICAgICAgICAgICAgPFRhcmdldEJhc2U+JChQeVNvdXJjZVBhdGgpTGliPC9UYXJnZXRCYXNlPgotICAgICAgICAgICAgPFRhcmdldF8+TGliXDwvVGFyZ2V0Xz4KLSAgICAgICAgICAgIDxHcm91cD5saWJfcHk8L0dyb3VwPgotICAgICAgICA8L0luc3RhbGxGaWxlcz4KLSAgICA8L0l0ZW1Hcm91cD4KLSAgICAKLSAgICA8SW1wb3J0IFByb2plY3Q9Ii4uXG1zaS50YXJnZXRzIiAvPgotPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9saWIvbGliLndpeHByb2ogYi9Ub29scy9tc2kvbGliL2xpYi53aXhwcm9qCmluZGV4IGU5MjgxZGEuLjY0ZTU4NzggMTAwNjQ0Ci0tLSBhL1Rvb2xzL21zaS9saWIvbGliLndpeHByb2oKKysrIGIvVG9vbHMvbXNpL2xpYi9saWIud2l4cHJvagpAQCAtNSw3ICs1LDMwIEBACiAgICAgICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4KICAgICAgICAgPE91dHB1dE5hbWU+bGliPC9PdXRwdXROYW1lPgogICAgICAgICA8T3V0cHV0VHlwZT5QYWNrYWdlPC9PdXRwdXRUeXBlPgotICAgICAgICA8RGVmaW5lQ29uc3RhbnRzPkluY2x1ZGVEZWZhdWx0RmVhdHVyZT0xOyQoRGVmaW5lQ29uc3RhbnRzKTwvRGVmaW5lQ29uc3RhbnRzPgogICAgIDwvUHJvcGVydHlHcm91cD4KLSAgICA8SW1wb3J0IFByb2plY3Q9ImxpYi5wcm9wcyIgLz4KKyAgICA8SW1wb3J0IFByb2plY3Q9Ii4uXG1zaS5wcm9wcyIgLz4KKyAgICA8SXRlbUdyb3VwPgorICAgICAgICA8Q29tcGlsZSBJbmNsdWRlPSJsaWIud3hzIiAvPgorICAgICAgICA8Q29tcGlsZSBJbmNsdWRlPSJsaWJfZmlsZXMud3hzIiAvPgorICAgIDwvSXRlbUdyb3VwPgorICAgIDxJdGVtR3JvdXA+CisgICAgICAgIDxFbWJlZGRlZFJlc291cmNlIEluY2x1ZGU9Iioud3hsIiAvPgorICAgIDwvSXRlbUdyb3VwPgorICAgIDxJdGVtR3JvdXA+CisgICAgICAgIDxFeGNsdWRlRm9sZGVycyBJbmNsdWRlPSJMaWJcdGVzdDtMaWJcdGVzdHM7TGliXHRraW50ZXI7TGliXGlkbGVsaWI7TGliXHR1cnRsZWRlbW8iIC8+CisgICAgICAgIDxJbnN0YWxsRmlsZXMgSW5jbHVkZT0iJChQeVNvdXJjZVBhdGgpTGliXCoqXCoiCisgICAgICAgICAgICAgICAgICAgICAgRXhjbHVkZT0iJChQeVNvdXJjZVBhdGgpTGliXCoqXCoucHljOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoUHlTb3VyY2VQYXRoKUxpYlwqKlwqLnB5bzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKFB5U291cmNlUGF0aClMaWJcc2l0ZS1wYWNrYWdlc1xSRUFETUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQChFeGNsdWRlRm9sZGVycy0+JyQoUHlTb3VyY2VQYXRoKSUoSWRlbnRpdHkpXConKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAKEV4Y2x1ZGVGb2xkZXJzLT4nJChQeVNvdXJjZVBhdGgpJShJZGVudGl0eSlcKipcKicpIj4KKyAgICAgICAgICAgIDxTb3VyY2VCYXNlPiQoUHlTb3VyY2VQYXRoKUxpYjwvU291cmNlQmFzZT4KKyAgICAgICAgICAgIDxTb3VyY2U+IShiaW5kcGF0aC5zcmMpTGliXDwvU291cmNlPgorICAgICAgICAgICAgPFRhcmdldEJhc2U+JChQeVNvdXJjZVBhdGgpTGliPC9UYXJnZXRCYXNlPgorICAgICAgICAgICAgPFRhcmdldF8+TGliXDwvVGFyZ2V0Xz4KKyAgICAgICAgICAgIDxHcm91cD5saWJfcHk8L0dyb3VwPgorICAgICAgICA8L0luc3RhbGxGaWxlcz4KKyAgICA8L0l0ZW1Hcm91cD4KKyAgICAKKyAgICA8SW1wb3J0IFByb2plY3Q9Ii4uXG1zaS50YXJnZXRzIiAvPgogPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9saWIvbGliLnd4cyBiL1Rvb2xzL21zaS9saWIvbGliLnd4cwppbmRleCA4OWJlYTYyLi5iMWFlYzc1IDEwMDY0NAotLS0gYS9Ub29scy9tc2kvbGliL2xpYi53eHMKKysrIGIvVG9vbHMvbXNpL2xpYi9saWIud3hzCkBAIC03LDIyICs3LDEwIEBACiAgICAgICAgIDxQcm9wZXJ0eVJlZiBJZD0iVXBncmFkZVRhYmxlIiAvPgogICAgICAgICA8UHJvcGVydHlSZWYgSWQ9IlJFR0lTVFJZS0VZIiAvPgogICAgICAgICAKLSAgICAgICAgPD9pZmRlZiBJbmNsdWRlRGVmYXVsdEZlYXR1cmUgPz4KICAgICAgICAgPEZlYXR1cmUgSWQ9IkRlZmF1bHRGZWF0dXJlIiBBbGxvd0FkdmVydGlzZT0ibm8iIFRpdGxlPSIhKGxvYy5UaXRsZSkiIERlc2NyaXB0aW9uPSIhKGxvYy5EZXNjcmlwdGlvbikiPgogICAgICAgICAgICAgPENvbXBvbmVudEdyb3VwUmVmIElkPSJsaWJfcHkiIC8+CiAgICAgICAgICAgICA8Q29tcG9uZW50R3JvdXBSZWYgSWQ9ImxpYl9maWxlcyIgLz4KICAgICAgICAgICAgIDxDb21wb25lbnRHcm91cFJlZiBJZD0ibGliX2V4dGVuc2lvbnMiIC8+CiAgICAgICAgIDwvRmVhdHVyZT4KLSAgICAgICAgPD9lbmRpZiA/PgotICAgICAgICA8P2lmZGVmIEluY2x1ZGVTeW1ib2xzID8+Ci0gICAgICAgIDxGZWF0dXJlIElkPSJTeW1ib2xzIiBBbGxvd0FkdmVydGlzZT0ibm8iIFRpdGxlPSIhKGxvYy5UaXRsZVBkYikiIERlc2NyaXB0aW9uPSIhKGxvYy5EZXNjcmlwdGlvblBkYikiPgotICAgICAgICAgICAgPENvbXBvbmVudEdyb3VwUmVmIElkPSJsaWJfZXh0ZW5zaW9uc19zeW1ib2xzIiAvPgotICAgICAgICA8L0ZlYXR1cmU+Ci0gICAgICAgIDw/ZW5kaWYgPz4KLSAgICAgICAgPD9pZmRlZiBJbmNsdWRlRGVidWdCaW5hcmllcyA/PgotICAgICAgICA8RmVhdHVyZSBJZD0iRGVidWdCaW5hcmllcyIgQWxsb3dBZHZlcnRpc2U9Im5vIiBUaXRsZT0iIShsb2MuVGl0bGVfZCkiIERlc2NyaXB0aW9uPSIhKGxvYy5EZXNjcmlwdGlvbl9kKSI+Ci0gICAgICAgICAgICA8Q29tcG9uZW50R3JvdXBSZWYgSWQ9ImxpYl9leHRlbnNpb25zX2QiIC8+Ci0gICAgICAgIDwvRmVhdHVyZT4KLSAgICAgICAgPD9lbmRpZiA/PgogICAgIDwvUHJvZHVjdD4KIDwvV2l4PgpkaWZmIC0tZ2l0IGEvVG9vbHMvbXNpL2xpYi9saWJfZC53aXhwcm9qIGIvVG9vbHMvbXNpL2xpYi9saWJfZC53aXhwcm9qCmluZGV4IGU2MzIzMTkuLjU4N2E4MmMgMTAwNjQ0Ci0tLSBhL1Rvb2xzL21zaS9saWIvbGliX2Qud2l4cHJvagorKysgYi9Ub29scy9tc2kvbGliL2xpYl9kLndpeHByb2oKQEAgLTUsNyArNSwxNSBAQAogICAgICAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+CiAgICAgICAgIDxPdXRwdXROYW1lPmxpYl9kPC9PdXRwdXROYW1lPgogICAgICAgICA8T3V0cHV0VHlwZT5QYWNrYWdlPC9PdXRwdXRUeXBlPgotICAgICAgICA8RGVmaW5lQ29uc3RhbnRzPkluY2x1ZGVEZWJ1Z0JpbmFyaWVzPTE7JChEZWZpbmVDb25zdGFudHMpPC9EZWZpbmVDb25zdGFudHM+CiAgICAgPC9Qcm9wZXJ0eUdyb3VwPgotICAgIDxJbXBvcnQgUHJvamVjdD0ibGliLnByb3BzIiAvPgorICAgIDxJbXBvcnQgUHJvamVjdD0iLi5cbXNpLnByb3BzIiAvPgorICAgIDxJdGVtR3JvdXA+CisgICAgICAgIDxDb21waWxlIEluY2x1ZGU9ImxpYl9kLnd4cyIgLz4KKyAgICAgICAgPENvbXBpbGUgSW5jbHVkZT0ibGliX2ZpbGVzLnd4cyIgLz4KKyAgICA8L0l0ZW1Hcm91cD4KKyAgICA8SXRlbUdyb3VwPgorICAgICAgICA8RW1iZWRkZWRSZXNvdXJjZSBJbmNsdWRlPSIqLnd4bCIgLz4KKyAgICA8L0l0ZW1Hcm91cD4KKyAgICAKKyAgICA8SW1wb3J0IFByb2plY3Q9Ii4uXG1zaS50YXJnZXRzIiAvPgogPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9saWIvbGliX2Qud3hzIGIvVG9vbHMvbXNpL2xpYi9saWJfZC53eHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE1Y2Y3MAotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL21zaS9saWIvbGliX2Qud3hzCkBAIC0wLDAgKzEsMTMgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8V2l4IHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dpeC8yMDA2L3dpIj4KKyAgICA8UHJvZHVjdCBJZD0iKiIgTGFuZ3VhZ2U9IiEobG9jLkxDSUQpIiBOYW1lPSIhKGxvYy5UaXRsZSkiIFZlcnNpb249IiQodmFyLlZlcnNpb24pIiBNYW51ZmFjdHVyZXI9IiEobG9jLk1hbnVmYWN0dXJlcikiIFVwZ3JhZGVDb2RlPSIkKHZhci5VcGdyYWRlQ29kZSkiPgorICAgICAgICA8UGFja2FnZSBJbnN0YWxsZXJWZXJzaW9uPSIzMDAiIENvbXByZXNzZWQ9InllcyIgSW5zdGFsbFNjb3BlPSJwZXJVc2VyIiBQbGF0Zm9ybT0iJCh2YXIuUGxhdGZvcm0pIiAvPgorICAgICAgICA8TWVkaWFUZW1wbGF0ZSBFbWJlZENhYj0ieWVzIiBDb21wcmVzc2lvbkxldmVsPSJoaWdoIiAvPgorICAgICAgICAKKyAgICAgICAgPFByb3BlcnR5UmVmIElkPSJVcGdyYWRlVGFibGUiIC8+CisgICAgICAgIAorICAgICAgICA8RmVhdHVyZSBJZD0iRGVidWdCaW5hcmllcyIgQWxsb3dBZHZlcnRpc2U9Im5vIiBUaXRsZT0iIShsb2MuVGl0bGVfZCkiIERlc2NyaXB0aW9uPSIhKGxvYy5EZXNjcmlwdGlvbl9kKSI+CisgICAgICAgICAgICA8Q29tcG9uZW50R3JvdXBSZWYgSWQ9ImxpYl9leHRlbnNpb25zX2QiIC8+CisgICAgICAgIDwvRmVhdHVyZT4KKyAgICA8L1Byb2R1Y3Q+Cis8L1dpeD4KZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9saWIvbGliX2ZpbGVzLnd4cyBiL1Rvb2xzL21zaS9saWIvbGliX2ZpbGVzLnd4cwppbmRleCAwYzkwMWQzLi5mYTc5YThkIDEwMDY0NAotLS0gYS9Ub29scy9tc2kvbGliL2xpYl9maWxlcy53eHMKKysrIGIvVG9vbHMvbXNpL2xpYi9saWJfZmlsZXMud3hzCkBAIC00Niw2ICs0NiwxMyBAQAogICAgICAgICAgICAgPC9Db21wb25lbnQ+CiAgICAgICAgICAgICAKICAgICAgICAgICAgIDw/ZW5kZm9yZWFjaCA/PgorICAgICAgICAgICAgCisgICAgICAgICAgICA8Q29tcG9uZW50IElkPSJzcWxpdGUzX2QuZGxsIiBEaXJlY3Rvcnk9IkRMTHMiIEd1aWQ9IioiPgorICAgICAgICAgICAgICAgIDxGaWxlIE5hbWU9InNxbGl0ZTNfZC5kbGwiIEtleVBhdGg9InllcyIgLz4KKyAgICAgICAgICAgIDwvQ29tcG9uZW50PgorICAgICAgICAgICAgPENvbXBvbmVudCBJZD0ic3FsaXRlM19kLnBkYiIgRGlyZWN0b3J5PSJETExzIiBHdWlkPSIqIj4KKyAgICAgICAgICAgICAgICA8RmlsZSBOYW1lPSJzcWxpdGUzX2QucGRiIiBLZXlQYXRoPSJ5ZXMiIC8+CisgICAgICAgICAgICA8L0NvbXBvbmVudD4KICAgICAgICAgPC9Db21wb25lbnRHcm91cD4KICAgICA8L0ZyYWdtZW50PgogICAgIDxGcmFnbWVudD4KZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9saWIvbGliX3BkYi53aXhwcm9qIGIvVG9vbHMvbXNpL2xpYi9saWJfcGRiLndpeHByb2oKaW5kZXggMjFiNTkxMi4uZGIxYjViYiAxMDA2NDQKLS0tIGEvVG9vbHMvbXNpL2xpYi9saWJfcGRiLndpeHByb2oKKysrIGIvVG9vbHMvbXNpL2xpYi9saWJfcGRiLndpeHByb2oKQEAgLTUsNyArNSwxNSBAQAogICAgICAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+CiAgICAgICAgIDxPdXRwdXROYW1lPmxpYl9wZGI8L091dHB1dE5hbWU+CiAgICAgICAgIDxPdXRwdXRUeXBlPlBhY2thZ2U8L091dHB1dFR5cGU+Ci0gICAgICAgIDxEZWZpbmVDb25zdGFudHM+SW5jbHVkZVN5bWJvbHM9MTskKERlZmluZUNvbnN0YW50cyk8L0RlZmluZUNvbnN0YW50cz4KICAgICA8L1Byb3BlcnR5R3JvdXA+Ci0gICAgPEltcG9ydCBQcm9qZWN0PSJsaWIucHJvcHMiIC8+CisgICAgPEltcG9ydCBQcm9qZWN0PSIuLlxtc2kucHJvcHMiIC8+CisgICAgPEl0ZW1Hcm91cD4KKyAgICAgICAgPENvbXBpbGUgSW5jbHVkZT0ibGliX3BkYi53eHMiIC8+CisgICAgICAgIDxDb21waWxlIEluY2x1ZGU9ImxpYl9maWxlcy53eHMiIC8+CisgICAgPC9JdGVtR3JvdXA+CisgICAgPEl0ZW1Hcm91cD4KKyAgICAgICAgPEVtYmVkZGVkUmVzb3VyY2UgSW5jbHVkZT0iKi53eGwiIC8+CisgICAgPC9JdGVtR3JvdXA+CisgICAgCisgICAgPEltcG9ydCBQcm9qZWN0PSIuLlxtc2kudGFyZ2V0cyIgLz4KIDwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9Ub29scy9tc2kvbGliL2xpYl9wZGIud3hzIGIvVG9vbHMvbXNpL2xpYi9saWJfcGRiLnd4cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmJlMGM5Ci0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvbXNpL2xpYi9saWJfcGRiLnd4cwpAQCAtMCwwICsxLDEzIEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPFdpeCB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS93aXgvMjAwNi93aSI+CisgICAgPFByb2R1Y3QgSWQ9IioiIExhbmd1YWdlPSIhKGxvYy5MQ0lEKSIgTmFtZT0iIShsb2MuVGl0bGUpIiBWZXJzaW9uPSIkKHZhci5WZXJzaW9uKSIgTWFudWZhY3R1cmVyPSIhKGxvYy5NYW51ZmFjdHVyZXIpIiBVcGdyYWRlQ29kZT0iJCh2YXIuVXBncmFkZUNvZGUpIj4KKyAgICAgICAgPFBhY2thZ2UgSW5zdGFsbGVyVmVyc2lvbj0iMzAwIiBDb21wcmVzc2VkPSJ5ZXMiIEluc3RhbGxTY29wZT0icGVyVXNlciIgUGxhdGZvcm09IiQodmFyLlBsYXRmb3JtKSIgLz4KKyAgICAgICAgPE1lZGlhVGVtcGxhdGUgRW1iZWRDYWI9InllcyIgQ29tcHJlc3Npb25MZXZlbD0iaGlnaCIgLz4KKyAgICAgICAgCisgICAgICAgIDxQcm9wZXJ0eVJlZiBJZD0iVXBncmFkZVRhYmxlIiAvPgorICAgICAgICAKKyAgICAgICAgPEZlYXR1cmUgSWQ9IlN5bWJvbHMiIEFsbG93QWR2ZXJ0aXNlPSJubyIgVGl0bGU9IiEobG9jLlRpdGxlUGRiKSIgRGVzY3JpcHRpb249IiEobG9jLkRlc2NyaXB0aW9uUGRiKSI+CisgICAgICAgICAgICA8Q29tcG9uZW50R3JvdXBSZWYgSWQ9ImxpYl9leHRlbnNpb25zX3N5bWJvbHMiIC8+CisgICAgICAgIDwvRmVhdHVyZT4KKyAgICA8L1Byb2R1Y3Q+Cis8L1dpeD4KZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9tc2kucHJvcHMgYi9Ub29scy9tc2kvbXNpLnByb3BzCmluZGV4IDVjMDJmZDQuLmNiYWE2YjEgMTAwNjQ0Ci0tLSBhL1Rvb2xzL21zaS9tc2kucHJvcHMKKysrIGIvVG9vbHMvbXNpL21zaS5wcm9wcwpAQCAtMSw2ICsxLDcgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+CiA8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyIgVHJlYXRBc0xvY2FsUHJvcGVydHk9IlJlbGVhc2VVcmkiPgogICAgIDxQcm9wZXJ0eUdyb3VwPgorICAgICAgICA8VGFyZ2V0TmFtZT4kKE91dHB1dE5hbWUpPC9UYXJnZXROYW1lPgogICAgICAgICA8RGVmaW5lU29sdXRpb25Qcm9wZXJ0aWVzPmZhbHNlPC9EZWZpbmVTb2x1dGlvblByb3BlcnRpZXM+CiAgICAgICAgIDxUcmVhdFdhcm5pbmdzQXNFcnJvcnM+ZmFsc2U8L1RyZWF0V2FybmluZ3NBc0Vycm9ycz4KICAgICAgICAgPFN1cHByZXNzSWNlcz4kKFN1cHByZXNzSWNlcyk7SUNFMDM7SUNFNTc7SUNFNjE8L1N1cHByZXNzSWNlcz4KQEAgLTQ4LDEwICs0OSw4IEBACiAgICAgICAgIDxPdXRwdXRQYXRoIENvbmRpdGlvbj0iIUhhc1RyYWlsaW5nU2xhc2goJChPdXRwdXRQYXRoKSkiPiQoT3V0cHV0UGF0aClcPC9PdXRwdXRQYXRoPgogICAgICAgICA8T3V0RGlyPiQoT3V0cHV0UGF0aCk8L091dERpcj4KICAgICAgICAgPFJldXNlQ2FiaW5ldENhY2hlPnRydWU8L1JldXNlQ2FiaW5ldENhY2hlPgotICAgICAgICA8Q1JUTW9kdWxlIENvbmRpdGlvbj0iJyQoVmlzdWFsU3R1ZGlvVmVyc2lvbiknID09ICcxMi4wJyI+JChDb21tb25Qcm9ncmFtRmlsZXMpXE1lcmdlIE1vZHVsZXNcTWljcm9zb2Z0X1ZDMTIwX0NSVF8kKFBsYXRmb3JtKS5tc208L0NSVE1vZHVsZT4KLSAgICAgICAgPENSVE1vZHVsZSBDb25kaXRpb249IickKFZpc3VhbFN0dWRpb1ZlcnNpb24pJyA9PSAnMTQuMCciPiQoQ29tbW9uUHJvZ3JhbUZpbGVzKVxNZXJnZSBNb2R1bGVzXE1pY3Jvc29mdF9WQzE0MF9DUlRfJChQbGF0Zm9ybSkubXNtPC9DUlRNb2R1bGU+Ci0gICAgICAgIDxDUlRSZWRpc3QgQ29uZGl0aW9uPSInJChWaXN1YWxTdHVkaW9WZXJzaW9uKScgPT0gJzEyLjAnIj4kKFtTeXN0ZW0uSU8uUGF0aF06OkdldEZ1bGxQYXRoKGAkKFZTMTIwQ09NTlRPT0xTKVwuLlwuLlxWQ1xyZWRpc3RcJChQbGF0Zm9ybSlcTWljcm9zb2Z0LlZDMTIwLkNSVGApKTwvQ1JUUmVkaXN0PgotICAgICAgICA8Q1JUUmVkaXN0IENvbmRpdGlvbj0iJyQoVmlzdWFsU3R1ZGlvVmVyc2lvbiknID09ICcxNC4wJyI+JChbU3lzdGVtLklPLlBhdGhdOjpHZXRGdWxsUGF0aChgJChWUzE0MENPTU5UT09MUylcLi5cLi5cVkNccmVkaXN0XCQoUGxhdGZvcm0pXE1pY3Jvc29mdC5WQzE0MC5DUlRgKSk8L0NSVFJlZGlzdD4KKyAgICAgICAgPENSVFJlZGlzdCBDb25kaXRpb249IiI+JChbU3lzdGVtLklPLlBhdGhdOjpHZXRGdWxsUGF0aChgJChWUzE0MENPTU5UT09MUylcLi5cLi5cVkNccmVkaXN0XCQoUGxhdGZvcm0pXE1pY3Jvc29mdC5WQzE0MC5DUlRgKSk8L0NSVFJlZGlzdD4KKyAgICAgICAgPENSVFJlZGlzdCBDb25kaXRpb249IickKENSVFJlZGlzdCknICE9ICcnIGFuZCAhRXhpc3RzKCQoQ1JUUmVkaXN0KSkiPiQoTVNCdWlsZFRoaXNGaWxlRGlyZWN0b3J5KVxyZWRpc3RcJChQbGF0Zm9ybSk8L0NSVFJlZGlzdD4KICAgICAgICAgPENSVFJlZGlzdCBDb25kaXRpb249IickKENSVFJlZGlzdCknICE9ICcnIGFuZCAhRXhpc3RzKCQoQ1JUUmVkaXN0KSkiPjwvQ1JUUmVkaXN0PgogCiAgICAgICAgIDxSZXZpc2lvbk51bWJlcj4kKFJlbGVhc2VMZXZlbE51bWJlcik8L1JldmlzaW9uTnVtYmVyPgpAQCAtNjksMTMgKzY4LDkgQEAKICAgICAgICAgICAgIE1ham9yVmVyc2lvbk51bWJlcj0kKE1ham9yVmVyc2lvbk51bWJlcik7CiAgICAgICAgICAgICBNaW5vclZlcnNpb25OdW1iZXI9JChNaW5vclZlcnNpb25OdW1iZXIpOwogICAgICAgICAgICAgVXBncmFkZU1pbmltdW1WZXJzaW9uPSQoTWFqb3JWZXJzaW9uTnVtYmVyKS4kKE1pbm9yVmVyc2lvbk51bWJlcikuMC4wOwotICAgICAgICAgICAgVXBncmFkZU1heGltdW1WZXJzaW9uPSQoTWFqb3JWZXJzaW9uTnVtYmVyKS4kKE1pbm9yVmVyc2lvbk51bWJlcikuMTUwLjA7CiAgICAgICAgICAgICBOZXh0TWFqb3JWZXJzaW9uTnVtYmVyPSQoTWFqb3JWZXJzaW9uTnVtYmVyKS4kKFttc2J1aWxkXTo6QWRkKCQoTWlub3JWZXJzaW9uTnVtYmVyKSwgMSkpLjAuMDsKICAgICAgICAgICAgIFB5RGVidWdFeHQ9JChQeURlYnVnRXh0KTsKICAgICAgICAgPC9EZWZpbmVDb25zdGFudHM+Ci0gICAgICAgIDxEZWZpbmVDb25zdGFudHMgQ29uZGl0aW9uPSInJChDUlRNb2R1bGUpJyAhPSAnJyBhbmQgRXhpc3RzKCQoQ1JUTW9kdWxlKSkiPgotICAgICAgICAgICAgJChEZWZpbmVDb25zdGFudHMpO0NSVE1vZHVsZT0kKENSVE1vZHVsZSk7Ci0gICAgICAgIDwvRGVmaW5lQ29uc3RhbnRzPgogICAgICAgICA8RGVmaW5lQ29uc3RhbnRzIENvbmRpdGlvbj0iJyQoQ1JUUmVkaXN0KScgIT0gJyciPgogICAgICAgICAgICAgJChEZWZpbmVDb25zdGFudHMpO0NSVFJlZGlzdD0kKENSVFJlZGlzdCk7CiAgICAgICAgIDwvRGVmaW5lQ29uc3RhbnRzPgpAQCAtMTE2LDYgKzExMSw5IEBACiAgICAgICAgIDxMaW5rZXJCaW5kSW5wdXRQYXRocyBJbmNsdWRlPSIkKENSVFJlZGlzdCkiIENvbmRpdGlvbj0iJyQoQ1JUUmVkaXN0KScgIT0gJyciPgogICAgICAgICAgICAgPEJpbmROYW1lPmNydDwvQmluZE5hbWU+CiAgICAgICAgIDwvTGlua2VyQmluZElucHV0UGF0aHM+CisgICAgICAgIDxMaW5rZXJCaW5kSW5wdXRQYXRocyBJbmNsdWRlPSIkKE1TQnVpbGRUaGlzRmlsZURpcmVjdG9yeSlccmVkaXN0Ij4KKyAgICAgICAgICAgIDxCaW5kTmFtZT5yZWRpc3Q8L0JpbmROYW1lPgorICAgICAgICA8L0xpbmtlckJpbmRJbnB1dFBhdGhzPgogICAgIDwvSXRlbUdyb3VwPgogCiAgICAgPFRhcmdldCBOYW1lPSJfVmFsaWRhdGVNc2lQcm9wcyIgQmVmb3JlVGFyZ2V0cz0iUHJlcGFyZUZvckJ1aWxkIj4KZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9yZWRpc3QvUkVBRE1FLnR4dCBiL1Rvb2xzL21zaS9yZWRpc3QvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGQyNmUxCi0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvbXNpL3JlZGlzdC9SRUFETUUudHh0CkBAIC0wLDAgKzEsMTUgQEAKK1RoaXMgZm9sZGVyIGlzIGludGVudGlhbmFsbHkgbGVmdCBlbXB0eSBpbiB0aGUgcmVwb3NpdG9yeS4KKworVGhlIGZvbGxvd2luZyBkZXBlbmRlbmNpZXMgbWF5IGJlIGNvcGllZCBoZXJlIGlmIHRoZXkgY2Fubm90IGJlIGRldGVjdGVkCithdXRvbWF0aWNhbGx5IGJ5IHRoZSBidWlsZCBzY3JpcHRzOgorCityZWRpc3RcV2luZG93czYuMC1LQjI5OTkyMjYteDY0Lm1zdQorcmVkaXN0XFdpbmRvd3M2LjAtS0IyOTk5MjI2LXg4Ni5tc3UKK3JlZGlzdFxXaW5kb3dzNi4xLUtCMjk5OTIyNi14NjQubXN1CityZWRpc3RcV2luZG93czYuMS1LQjI5OTkyMjYteDg2Lm1zdQorcmVkaXN0XFdpbmRvd3M4LjEtS0IyOTk5MjI2LXg2NC5tc3UKK3JlZGlzdFxXaW5kb3dzOC4xLUtCMjk5OTIyNi14ODYubXN1CityZWRpc3RcV2luZG93czgtUlQtS0IyOTk5MjI2LXg2NC5tc3UKK3JlZGlzdFxXaW5kb3dzOC1SVC1LQjI5OTkyMjYteDg2Lm1zdQorcmVkaXN0XHg2NFx2Y3J1bnRpbWUxNDAuZGxsCityZWRpc3RceDg2XHZjcnVudGltZTE0MC5kbGwKZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS90Y2x0ay90Y2x0ay5wcm9wcyBiL1Rvb2xzL21zaS90Y2x0ay90Y2x0ay5wcm9wcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFkNjdjNS4uMDAwMDAwMAotLS0gYS9Ub29scy9tc2kvdGNsdGsvdGNsdGsucHJvcHMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+Ci0gICAgPFByb3BlcnR5R3JvdXA+Ci0gICAgICAgIDwhLS0gU2hvcnRjdXQgdmFsaWRhdGlvbiBpcyBub3QgbmVjZXNzYXJ5IC0tPgotICAgICAgICA8U3VwcHJlc3NJQ0VzPklDRTQzPC9TdXBwcmVzc0lDRXM+Ci0gICAgPC9Qcm9wZXJ0eUdyb3VwPgotICAgIDxJbXBvcnQgUHJvamVjdD0iLi5cbXNpLnByb3BzIiAvPgotICAgIDxJdGVtR3JvdXA+Ci0gICAgICAgIDxDb21waWxlIEluY2x1ZGU9Iioud3hzIiAvPgotICAgIDwvSXRlbUdyb3VwPgotICAgIDxJdGVtR3JvdXA+Ci0gICAgICAgIDxXeGxUZW1wbGF0ZSBJbmNsdWRlPSIqLnd4bF90ZW1wbGF0ZSIgLz4KLSAgICA8L0l0ZW1Hcm91cD4KLSAgICA8SXRlbUdyb3VwPgotICAgICAgICA8SW5zdGFsbEZpbGVzIEluY2x1ZGU9IiQodGNsdGtEaXIpYmluXCouZGxsIiBFeGNsdWRlPSIkKHRjbHRrRGlyKWJpblwqZy5kbGwiPgotICAgICAgICAgICAgPFNvdXJjZUJhc2U+JCh0Y2x0a0Rpcik8L1NvdXJjZUJhc2U+Ci0gICAgICAgICAgICA8U291cmNlPiEoYmluZHBhdGgudGNsdGspPC9Tb3VyY2U+Ci0gICAgICAgICAgICA8VGFyZ2V0QmFzZT4kKHRjbHRrRGlyKWJpbjwvVGFyZ2V0QmFzZT4KLSAgICAgICAgICAgIDxUYXJnZXRfPkRMTHNcPC9UYXJnZXRfPgotICAgICAgICAgICAgPEdyb3VwPnRjbHRrX2RsbHM8L0dyb3VwPgotICAgICAgICA8L0luc3RhbGxGaWxlcz4KLSAgICAgICAgPEluc3RhbGxGaWxlcyBJbmNsdWRlPSIkKHRjbHRrRGlyKWJpblwqZy5kbGwiPgotICAgICAgICAgICAgPFNvdXJjZUJhc2U+JCh0Y2x0a0Rpcik8L1NvdXJjZUJhc2U+Ci0gICAgICAgICAgICA8U291cmNlPiEoYmluZHBhdGgudGNsdGspPC9Tb3VyY2U+Ci0gICAgICAgICAgICA8VGFyZ2V0QmFzZT4kKHRjbHRrRGlyKWJpbjwvVGFyZ2V0QmFzZT4KLSAgICAgICAgICAgIDxUYXJnZXRfPkRMTHNcPC9UYXJnZXRfPgotICAgICAgICAgICAgPEdyb3VwPnRjbHRrX2RsbHNfZDwvR3JvdXA+Ci0gICAgICAgIDwvSW5zdGFsbEZpbGVzPgotCi0gICAgICAgIDxJbnN0YWxsRmlsZXMgSW5jbHVkZT0iJCh0Y2x0a0RpcilsaWJcKipcKiI+Ci0gICAgICAgICAgICA8U291cmNlQmFzZT4kKHRjbHRrRGlyKTwvU291cmNlQmFzZT4KLSAgICAgICAgICAgIDxTb3VyY2U+IShiaW5kcGF0aC50Y2x0ayk8L1NvdXJjZT4KLSAgICAgICAgICAgIDxUYXJnZXRCYXNlPiQodGNsdGtEaXIpbGliPC9UYXJnZXRCYXNlPgotICAgICAgICAgICAgPFRhcmdldF8+dGNsXDwvVGFyZ2V0Xz4KLSAgICAgICAgICAgIDxHcm91cD50Y2x0a19saWI8L0dyb3VwPgotICAgICAgICA8L0luc3RhbGxGaWxlcz4KLQotICAgICAgICA8SW5zdGFsbEZpbGVzIEluY2x1ZGU9IiQoUHlTb3VyY2VQYXRoKUxpYlx0a2ludGVyXCoqXCo7JChQeVNvdXJjZVBhdGgpTGliXGlkbGVsaWJcKipcKjskKFB5U291cmNlUGF0aClMaWJcdHVydGxlZGVtb1wqKlwqIgotICAgICAgICAgICAgICAgICAgICAgIEV4Y2x1ZGU9IiQoUHlTb3VyY2VQYXRoKUxpYlwqKlwqLnB5YzskKFB5U291cmNlUGF0aClMaWJcKipcKi5weW8iPgotICAgICAgICAgICAgPFNvdXJjZUJhc2U+JChQeVNvdXJjZVBhdGgpPC9Tb3VyY2VCYXNlPgotICAgICAgICAgICAgPFNvdXJjZT4hKGJpbmRwYXRoLnNyYyk8L1NvdXJjZT4KLSAgICAgICAgICAgIDxUYXJnZXRCYXNlPiQoUHlTb3VyY2VQYXRoKTwvVGFyZ2V0QmFzZT4KLSAgICAgICAgICAgIDxUYXJnZXRfPjwvVGFyZ2V0Xz4KLSAgICAgICAgICAgIDxHcm91cD50a2ludGVyX2xpYjwvR3JvdXA+Ci0gICAgICAgIDwvSW5zdGFsbEZpbGVzPgotICAgIDwvSXRlbUdyb3VwPgotICAgIAotICAgIDxJbXBvcnQgUHJvamVjdD0iLi5cbXNpLnRhcmdldHMiIC8+Ci08L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVG9vbHMvbXNpL3RjbHRrL3RjbHRrLndpeHByb2ogYi9Ub29scy9tc2kvdGNsdGsvdGNsdGsud2l4cHJvagppbmRleCAxZGNkZmFkLi40ZDFkNzRjIDEwMDY0NAotLS0gYS9Ub29scy9tc2kvdGNsdGsvdGNsdGsud2l4cHJvagorKysgYi9Ub29scy9tc2kvdGNsdGsvdGNsdGsud2l4cHJvagpAQCAtNSw3ICs1LDQ1IEBACiAgICAgICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4KICAgICAgICAgPE91dHB1dE5hbWU+dGNsdGs8L091dHB1dE5hbWU+CiAgICAgICAgIDxPdXRwdXRUeXBlPlBhY2thZ2U8L091dHB1dFR5cGU+Ci0gICAgICAgIDxEZWZpbmVDb25zdGFudHM+SW5jbHVkZURlZmF1bHRGZWF0dXJlPTE7JChEZWZpbmVDb25zdGFudHMpPC9EZWZpbmVDb25zdGFudHM+CiAgICAgPC9Qcm9wZXJ0eUdyb3VwPgotICAgIDxJbXBvcnQgUHJvamVjdD0idGNsdGsucHJvcHMiIC8+CisgICAgPFByb3BlcnR5R3JvdXA+CisgICAgICAgIDwhLS0gU2hvcnRjdXQgdmFsaWRhdGlvbiBpcyBub3QgbmVjZXNzYXJ5IC0tPgorICAgICAgICA8U3VwcHJlc3NJQ0VzPklDRTQzPC9TdXBwcmVzc0lDRXM+CisgICAgPC9Qcm9wZXJ0eUdyb3VwPgorICAgIDxJbXBvcnQgUHJvamVjdD0iLi5cbXNpLnByb3BzIiAvPgorICAgIDxJdGVtR3JvdXA+CisgICAgICAgIDxDb21waWxlIEluY2x1ZGU9InRjbHRrLnd4cyIgLz4KKyAgICAgICAgPENvbXBpbGUgSW5jbHVkZT0idGNsdGtfZmlsZXMud3hzIiAvPgorICAgIDwvSXRlbUdyb3VwPgorICAgIDxJdGVtR3JvdXA+CisgICAgICAgIDxXeGxUZW1wbGF0ZSBJbmNsdWRlPSIqLnd4bF90ZW1wbGF0ZSIgLz4KKyAgICA8L0l0ZW1Hcm91cD4KKyAgICA8SXRlbUdyb3VwPgorICAgICAgICA8SW5zdGFsbEZpbGVzIEluY2x1ZGU9IiQodGNsdGtEaXIpYmluXCouZGxsIiBFeGNsdWRlPSIkKHRjbHRrRGlyKWJpblwqZy5kbGwiPgorICAgICAgICAgICAgPFNvdXJjZUJhc2U+JCh0Y2x0a0Rpcik8L1NvdXJjZUJhc2U+CisgICAgICAgICAgICA8U291cmNlPiEoYmluZHBhdGgudGNsdGspPC9Tb3VyY2U+CisgICAgICAgICAgICA8VGFyZ2V0QmFzZT4kKHRjbHRrRGlyKWJpbjwvVGFyZ2V0QmFzZT4KKyAgICAgICAgICAgIDxUYXJnZXRfPkRMTHNcPC9UYXJnZXRfPgorICAgICAgICAgICAgPEdyb3VwPnRjbHRrX2RsbHM8L0dyb3VwPgorICAgICAgICA8L0luc3RhbGxGaWxlcz4KKworICAgICAgICA8SW5zdGFsbEZpbGVzIEluY2x1ZGU9IiQodGNsdGtEaXIpbGliXCoqXCoiPgorICAgICAgICAgICAgPFNvdXJjZUJhc2U+JCh0Y2x0a0Rpcik8L1NvdXJjZUJhc2U+CisgICAgICAgICAgICA8U291cmNlPiEoYmluZHBhdGgudGNsdGspPC9Tb3VyY2U+CisgICAgICAgICAgICA8VGFyZ2V0QmFzZT4kKHRjbHRrRGlyKWxpYjwvVGFyZ2V0QmFzZT4KKyAgICAgICAgICAgIDxUYXJnZXRfPnRjbFw8L1RhcmdldF8+CisgICAgICAgICAgICA8R3JvdXA+dGNsdGtfbGliPC9Hcm91cD4KKyAgICAgICAgPC9JbnN0YWxsRmlsZXM+CisKKyAgICAgICAgPEluc3RhbGxGaWxlcyBJbmNsdWRlPSIkKFB5U291cmNlUGF0aClMaWJcdGtpbnRlclwqKlwqOyQoUHlTb3VyY2VQYXRoKUxpYlxpZGxlbGliXCoqXCo7JChQeVNvdXJjZVBhdGgpTGliXHR1cnRsZWRlbW9cKipcKiIKKyAgICAgICAgICAgICAgICAgICAgICBFeGNsdWRlPSIkKFB5U291cmNlUGF0aClMaWJcKipcKi5weWM7JChQeVNvdXJjZVBhdGgpTGliXCoqXCoucHlvIj4KKyAgICAgICAgICAgIDxTb3VyY2VCYXNlPiQoUHlTb3VyY2VQYXRoKTwvU291cmNlQmFzZT4KKyAgICAgICAgICAgIDxTb3VyY2U+IShiaW5kcGF0aC5zcmMpPC9Tb3VyY2U+CisgICAgICAgICAgICA8VGFyZ2V0QmFzZT4kKFB5U291cmNlUGF0aCk8L1RhcmdldEJhc2U+CisgICAgICAgICAgICA8VGFyZ2V0Xz48L1RhcmdldF8+CisgICAgICAgICAgICA8R3JvdXA+dGtpbnRlcl9saWI8L0dyb3VwPgorICAgICAgICA8L0luc3RhbGxGaWxlcz4KKyAgICA8L0l0ZW1Hcm91cD4KKyAgICAKKyAgICA8SW1wb3J0IFByb2plY3Q9Ii4uXG1zaS50YXJnZXRzIiAvPgogPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS90Y2x0ay90Y2x0ay53eHMgYi9Ub29scy9tc2kvdGNsdGsvdGNsdGsud3hzCmluZGV4IDRkNzIyMDAuLjgxOWZjY2IgMTAwNjQ0Ci0tLSBhL1Rvb2xzL21zaS90Y2x0ay90Y2x0ay53eHMKKysrIGIvVG9vbHMvbXNpL3RjbHRrL3RjbHRrLnd4cwpAQCAtMTUsNyArMTUsNiBAQAogICAgICAgICAKICAgICAgICAgPENvbmRpdGlvbiBNZXNzYWdlPSIhKGxvYy5Ob1B5dGhvbikiPlBZVEhPTl9FWEU8L0NvbmRpdGlvbj4KIAotICAgICAgICA8P2lmZGVmIEluY2x1ZGVEZWZhdWx0RmVhdHVyZSA/PgogICAgICAgICA8RmVhdHVyZSBJZD0iRGVmYXVsdEZlYXR1cmUiIEFsbG93QWR2ZXJ0aXNlPSJubyIgVGl0bGU9IiEobG9jLlRpdGxlKSIgRGVzY3JpcHRpb249IiEobG9jLkRlc2NyaXB0aW9uKSI+CiAgICAgICAgICAgICA8Q29tcG9uZW50R3JvdXBSZWYgSWQ9InRraW50ZXJfZXh0ZW5zaW9uIiAvPgogICAgICAgICAgICAgPENvbXBvbmVudEdyb3VwUmVmIElkPSJ0Y2x0a19kbGxzIiAvPgpAQCAtMzcsMTcgKzM2LDUgQEAKICAgICAgICAgICAgICAgICA8L1Nob3J0Y3V0PgogICAgICAgICAgICAgPC9Db21wb25lbnQ+CiAgICAgICAgIDwvRmVhdHVyZT4KLSAgICAgICAgPD9lbmRpZiA/PgotICAgICAgICA8P2lmZGVmIEluY2x1ZGVTeW1ib2xzID8+Ci0gICAgICAgIDxGZWF0dXJlIElkPSJTeW1ib2xzIiBBbGxvd0FkdmVydGlzZT0ibm8iIFRpdGxlPSIhKGxvYy5UaXRsZVBkYikiIERlc2NyaXB0aW9uPSIhKGxvYy5EZXNjcmlwdGlvblBkYikiPgotICAgICAgICAgICAgPENvbXBvbmVudEdyb3VwUmVmIElkPSJ0a2ludGVyX2V4dGVuc2lvbl9zeW1ib2xzIiAvPgotICAgICAgICA8L0ZlYXR1cmU+Ci0gICAgICAgIDw/ZW5kaWYgPz4KLSAgICAgICAgPD9pZmRlZiBJbmNsdWRlRGVidWdCaW5hcmllcyA/PgotICAgICAgICA8RmVhdHVyZSBJZD0iRGVidWdCaW5hcmllcyIgQWxsb3dBZHZlcnRpc2U9Im5vIiBUaXRsZT0iIShsb2MuVGl0bGVfZCkiIERlc2NyaXB0aW9uPSIhKGxvYy5EZXNjcmlwdGlvbl9kKSI+Ci0gICAgICAgICAgICA8Q29tcG9uZW50R3JvdXBSZWYgSWQ9InRraW50ZXJfZXh0ZW5zaW9uX2QiIC8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50R3JvdXBSZWYgSWQ9InRjbHRrX2RsbHNfZCIgLz4KLSAgICAgICAgPC9GZWF0dXJlPgotICAgICAgICA8P2VuZGlmID8+CiAgICAgPC9Qcm9kdWN0PgogPC9XaXg+CmRpZmYgLS1naXQgYS9Ub29scy9tc2kvdGNsdGsvdGNsdGtfZC53aXhwcm9qIGIvVG9vbHMvbXNpL3RjbHRrL3RjbHRrX2Qud2l4cHJvagppbmRleCBlZTlhZjMzLi4zMjY2MTkwIDEwMDY0NAotLS0gYS9Ub29scy9tc2kvdGNsdGsvdGNsdGtfZC53aXhwcm9qCisrKyBiL1Rvb2xzL21zaS90Y2x0ay90Y2x0a19kLndpeHByb2oKQEAgLTUsNyArNSwyNCBAQAogICAgICAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+CiAgICAgICAgIDxPdXRwdXROYW1lPnRjbHRrX2Q8L091dHB1dE5hbWU+CiAgICAgICAgIDxPdXRwdXRUeXBlPlBhY2thZ2U8L091dHB1dFR5cGU+Ci0gICAgICAgIDxEZWZpbmVDb25zdGFudHM+SW5jbHVkZURlYnVnQmluYXJpZXM9MTskKERlZmluZUNvbnN0YW50cyk8L0RlZmluZUNvbnN0YW50cz4KICAgICA8L1Byb3BlcnR5R3JvdXA+Ci0gICAgPEltcG9ydCBQcm9qZWN0PSJ0Y2x0ay5wcm9wcyIgLz4KKyAgICA8SW1wb3J0IFByb2plY3Q9Ii4uXG1zaS5wcm9wcyIgLz4KKyAgICA8SXRlbUdyb3VwPgorICAgICAgICA8Q29tcGlsZSBJbmNsdWRlPSJ0Y2x0a19kLnd4cyIgLz4KKyAgICAgICAgPENvbXBpbGUgSW5jbHVkZT0idGNsdGtfZmlsZXMud3hzIiAvPgorICAgIDwvSXRlbUdyb3VwPgorICAgIDxJdGVtR3JvdXA+CisgICAgICAgIDxXeGxUZW1wbGF0ZSBJbmNsdWRlPSIqLnd4bF90ZW1wbGF0ZSIgLz4KKyAgICA8L0l0ZW1Hcm91cD4KKyAgICA8SXRlbUdyb3VwPgorICAgICAgICA8SW5zdGFsbEZpbGVzIEluY2x1ZGU9IiQodGNsdGtEaXIpYmluXCpnLmRsbCI+CisgICAgICAgICAgICA8U291cmNlQmFzZT4kKHRjbHRrRGlyKTwvU291cmNlQmFzZT4KKyAgICAgICAgICAgIDxTb3VyY2U+IShiaW5kcGF0aC50Y2x0ayk8L1NvdXJjZT4KKyAgICAgICAgICAgIDxUYXJnZXRCYXNlPiQodGNsdGtEaXIpYmluPC9UYXJnZXRCYXNlPgorICAgICAgICAgICAgPFRhcmdldF8+RExMc1w8L1RhcmdldF8+CisgICAgICAgICAgICA8R3JvdXA+dGNsdGtfZGxsc19kPC9Hcm91cD4KKyAgICAgICAgPC9JbnN0YWxsRmlsZXM+CisgICAgPC9JdGVtR3JvdXA+CisgICAgCisgICAgPEltcG9ydCBQcm9qZWN0PSIuLlxtc2kudGFyZ2V0cyIgLz4KIDwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9Ub29scy9tc2kvdGNsdGsvdGNsdGtfZC53eHMgYi9Ub29scy9tc2kvdGNsdGsvdGNsdGtfZC53eHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y1MDQ4ZgotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL21zaS90Y2x0ay90Y2x0a19kLnd4cwpAQCAtMCwwICsxLDE0IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPFdpeCB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS93aXgvMjAwNi93aSI+CisgICAgPFByb2R1Y3QgSWQ9IioiIExhbmd1YWdlPSIhKGxvYy5MQ0lEKSIgTmFtZT0iIShsb2MuVGl0bGUpIiBWZXJzaW9uPSIkKHZhci5WZXJzaW9uKSIgTWFudWZhY3R1cmVyPSIhKGxvYy5NYW51ZmFjdHVyZXIpIiBVcGdyYWRlQ29kZT0iJCh2YXIuVXBncmFkZUNvZGUpIj4KKyAgICAgICAgPFBhY2thZ2UgSW5zdGFsbGVyVmVyc2lvbj0iMzAwIiBDb21wcmVzc2VkPSJ5ZXMiIEluc3RhbGxTY29wZT0icGVyVXNlciIgUGxhdGZvcm09IiQodmFyLlBsYXRmb3JtKSIgLz4KKyAgICAgICAgPE1lZGlhVGVtcGxhdGUgRW1iZWRDYWI9InllcyIgQ29tcHJlc3Npb25MZXZlbD0iaGlnaCIgLz4KKyAgICAgICAgCisgICAgICAgIDxQcm9wZXJ0eVJlZiBJZD0iVXBncmFkZVRhYmxlIiAvPgorICAgICAgICAKKyAgICAgICAgPEZlYXR1cmUgSWQ9IkRlYnVnQmluYXJpZXMiIEFsbG93QWR2ZXJ0aXNlPSJubyIgVGl0bGU9IiEobG9jLlRpdGxlX2QpIiBEZXNjcmlwdGlvbj0iIShsb2MuRGVzY3JpcHRpb25fZCkiPgorICAgICAgICAgICAgPENvbXBvbmVudEdyb3VwUmVmIElkPSJ0a2ludGVyX2V4dGVuc2lvbl9kIiAvPgorICAgICAgICAgICAgPENvbXBvbmVudEdyb3VwUmVmIElkPSJ0Y2x0a19kbGxzX2QiIC8+CisgICAgICAgIDwvRmVhdHVyZT4KKyAgICA8L1Byb2R1Y3Q+Cis8L1dpeD4KZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS90Y2x0ay90Y2x0a19wZGIud2l4cHJvaiBiL1Rvb2xzL21zaS90Y2x0ay90Y2x0a19wZGIud2l4cHJvagppbmRleCBhYzE5OGQ0Li4zMzcwNzk4IDEwMDY0NAotLS0gYS9Ub29scy9tc2kvdGNsdGsvdGNsdGtfcGRiLndpeHByb2oKKysrIGIvVG9vbHMvbXNpL3RjbHRrL3RjbHRrX3BkYi53aXhwcm9qCkBAIC01LDcgKzUsMTUgQEAKICAgICAgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgogICAgICAgICA8T3V0cHV0TmFtZT50Y2x0a19wZGI8L091dHB1dE5hbWU+CiAgICAgICAgIDxPdXRwdXRUeXBlPlBhY2thZ2U8L091dHB1dFR5cGU+Ci0gICAgICAgIDxEZWZpbmVDb25zdGFudHM+SW5jbHVkZVN5bWJvbHM9MTskKERlZmluZUNvbnN0YW50cyk8L0RlZmluZUNvbnN0YW50cz4KICAgICA8L1Byb3BlcnR5R3JvdXA+Ci0gICAgPEltcG9ydCBQcm9qZWN0PSJ0Y2x0ay5wcm9wcyIgLz4KKyAgICA8SW1wb3J0IFByb2plY3Q9Ii4uXG1zaS5wcm9wcyIgLz4KKyAgICA8SXRlbUdyb3VwPgorICAgICAgICA8Q29tcGlsZSBJbmNsdWRlPSJ0Y2x0a19wZGIud3hzIiAvPgorICAgICAgICA8Q29tcGlsZSBJbmNsdWRlPSJ0Y2x0a19maWxlcy53eHMiIC8+CisgICAgPC9JdGVtR3JvdXA+CisgICAgPEl0ZW1Hcm91cD4KKyAgICAgICAgPFd4bFRlbXBsYXRlIEluY2x1ZGU9Iioud3hsX3RlbXBsYXRlIiAvPgorICAgIDwvSXRlbUdyb3VwPgorICAgIAorICAgIDxJbXBvcnQgUHJvamVjdD0iLi5cbXNpLnRhcmdldHMiIC8+CiA8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVG9vbHMvbXNpL3RjbHRrL3RjbHRrX3BkYi53eHMgYi9Ub29scy9tc2kvdGNsdGsvdGNsdGtfcGRiLnd4cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWM2MmJiCi0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvbXNpL3RjbHRrL3RjbHRrX3BkYi53eHMKQEAgLTAsMCArMSwxMyBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxXaXggeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd2l4LzIwMDYvd2kiPgorICAgIDxQcm9kdWN0IElkPSIqIiBMYW5ndWFnZT0iIShsb2MuTENJRCkiIE5hbWU9IiEobG9jLlRpdGxlKSIgVmVyc2lvbj0iJCh2YXIuVmVyc2lvbikiIE1hbnVmYWN0dXJlcj0iIShsb2MuTWFudWZhY3R1cmVyKSIgVXBncmFkZUNvZGU9IiQodmFyLlVwZ3JhZGVDb2RlKSI+CisgICAgICAgIDxQYWNrYWdlIEluc3RhbGxlclZlcnNpb249IjMwMCIgQ29tcHJlc3NlZD0ieWVzIiBJbnN0YWxsU2NvcGU9InBlclVzZXIiIFBsYXRmb3JtPSIkKHZhci5QbGF0Zm9ybSkiIC8+CisgICAgICAgIDxNZWRpYVRlbXBsYXRlIEVtYmVkQ2FiPSJ5ZXMiIENvbXByZXNzaW9uTGV2ZWw9ImhpZ2giIC8+CisgICAgICAgIAorICAgICAgICA8UHJvcGVydHlSZWYgSWQ9IlVwZ3JhZGVUYWJsZSIgLz4KKyAgICAgICAgCisgICAgICAgIDxGZWF0dXJlIElkPSJTeW1ib2xzIiBBbGxvd0FkdmVydGlzZT0ibm8iIFRpdGxlPSIhKGxvYy5UaXRsZVBkYikiIERlc2NyaXB0aW9uPSIhKGxvYy5EZXNjcmlwdGlvblBkYikiPgorICAgICAgICAgICAgPENvbXBvbmVudEdyb3VwUmVmIElkPSJ0a2ludGVyX2V4dGVuc2lvbl9zeW1ib2xzIiAvPgorICAgICAgICA8L0ZlYXR1cmU+CisgICAgPC9Qcm9kdWN0PgorPC9XaXg+CmRpZmYgLS1naXQgYS9Ub29scy9tc2kvdGVzdC90ZXN0LnByb3BzIGIvVG9vbHMvbXNpL3Rlc3QvdGVzdC5wcm9wcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI2OTEwNy4uMDAwMDAwMAotLS0gYS9Ub29scy9tc2kvdGVzdC90ZXN0LnByb3BzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgotICAgIDxJbXBvcnQgUHJvamVjdD0iLi5cbXNpLnByb3BzIiAvPgotICAgIDxJdGVtR3JvdXA+Ci0gICAgICAgIDxDb21waWxlIEluY2x1ZGU9Iioud3hzIiAvPgotICAgIDwvSXRlbUdyb3VwPgotICAgIDxJdGVtR3JvdXA+Ci0gICAgICAgIDxFbWJlZGRlZFJlc291cmNlIEluY2x1ZGU9Iioud3hsIiAvPgotICAgIDwvSXRlbUdyb3VwPgotICAgIDxJdGVtR3JvdXA+Ci0gICAgICAgIDxJbnN0YWxsRmlsZXMgSW5jbHVkZT0iJChQeVNvdXJjZVBhdGgpTGliXHRlc3RcKipcKiIKLSAgICAgICAgICAgICAgICAgICAgICBFeGNsdWRlPSIkKFB5U291cmNlUGF0aClMaWJcKipcKi5weWM7JChQeVNvdXJjZVBhdGgpTGliXCoqXCoucHlvIj4KLSAgICAgICAgICAgIDxTb3VyY2VCYXNlPiQoUHlTb3VyY2VQYXRoKTwvU291cmNlQmFzZT4KLSAgICAgICAgICAgIDxTb3VyY2U+IShiaW5kcGF0aC5zcmMpPC9Tb3VyY2U+Ci0gICAgICAgICAgICA8VGFyZ2V0QmFzZT4kKFB5U291cmNlUGF0aCk8L1RhcmdldEJhc2U+Ci0gICAgICAgICAgICA8VGFyZ2V0Xz48L1RhcmdldF8+Ci0gICAgICAgICAgICA8R3JvdXA+dGVzdF9weTwvR3JvdXA+Ci0gICAgICAgIDwvSW5zdGFsbEZpbGVzPgotICAgIDwvSXRlbUdyb3VwPgotICAgIAotICAgIDxJbXBvcnQgUHJvamVjdD0iLi5cbXNpLnRhcmdldHMiIC8+Ci08L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvVG9vbHMvbXNpL3Rlc3QvdGVzdC53aXhwcm9qIGIvVG9vbHMvbXNpL3Rlc3QvdGVzdC53aXhwcm9qCmluZGV4IGQ3NDdjYzAuLjgzNDdlM2YgMTAwNjQ0Ci0tLSBhL1Rvb2xzL21zaS90ZXN0L3Rlc3Qud2l4cHJvagorKysgYi9Ub29scy9tc2kvdGVzdC90ZXN0LndpeHByb2oKQEAgLTUsNyArNSwyNSBAQAogICAgICAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+CiAgICAgICAgIDxPdXRwdXROYW1lPnRlc3Q8L091dHB1dE5hbWU+CiAgICAgICAgIDxPdXRwdXRUeXBlPlBhY2thZ2U8L091dHB1dFR5cGU+Ci0gICAgICAgIDxEZWZpbmVDb25zdGFudHM+SW5jbHVkZURlZmF1bHRGZWF0dXJlPTE7JChEZWZpbmVDb25zdGFudHMpPC9EZWZpbmVDb25zdGFudHM+CiAgICAgPC9Qcm9wZXJ0eUdyb3VwPgotICAgIDxJbXBvcnQgUHJvamVjdD0idGVzdC5wcm9wcyIgLz4KKyAgICA8SW1wb3J0IFByb2plY3Q9Ii4uXG1zaS5wcm9wcyIgLz4KKyAgICA8SXRlbUdyb3VwPgorICAgICAgICA8Q29tcGlsZSBJbmNsdWRlPSJ0ZXN0Lnd4cyIgLz4KKyAgICAgICAgPENvbXBpbGUgSW5jbHVkZT0idGVzdF9maWxlcy53eHMiIC8+CisgICAgPC9JdGVtR3JvdXA+CisgICAgPEl0ZW1Hcm91cD4KKyAgICAgICAgPEVtYmVkZGVkUmVzb3VyY2UgSW5jbHVkZT0iKi53eGwiIC8+CisgICAgPC9JdGVtR3JvdXA+CisgICAgPEl0ZW1Hcm91cD4KKyAgICAgICAgPEluc3RhbGxGaWxlcyBJbmNsdWRlPSIkKFB5U291cmNlUGF0aClMaWJcdGVzdFwqKlwqIgorICAgICAgICAgICAgICAgICAgICAgIEV4Y2x1ZGU9IiQoUHlTb3VyY2VQYXRoKUxpYlwqKlwqLnB5YzskKFB5U291cmNlUGF0aClMaWJcKipcKi5weW8iPgorICAgICAgICAgICAgPFNvdXJjZUJhc2U+JChQeVNvdXJjZVBhdGgpPC9Tb3VyY2VCYXNlPgorICAgICAgICAgICAgPFNvdXJjZT4hKGJpbmRwYXRoLnNyYyk8L1NvdXJjZT4KKyAgICAgICAgICAgIDxUYXJnZXRCYXNlPiQoUHlTb3VyY2VQYXRoKTwvVGFyZ2V0QmFzZT4KKyAgICAgICAgICAgIDxUYXJnZXRfPjwvVGFyZ2V0Xz4KKyAgICAgICAgICAgIDxHcm91cD50ZXN0X3B5PC9Hcm91cD4KKyAgICAgICAgPC9JbnN0YWxsRmlsZXM+CisgICAgPC9JdGVtR3JvdXA+CisgICAgCisgICAgPEltcG9ydCBQcm9qZWN0PSIuLlxtc2kudGFyZ2V0cyIgLz4KIDwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9Ub29scy9tc2kvdGVzdC90ZXN0Lnd4cyBiL1Rvb2xzL21zaS90ZXN0L3Rlc3Qud3hzCmluZGV4IGQ0YWMzM2YuLmRlNDc3ODUgMTAwNjQ0Ci0tLSBhL1Rvb2xzL21zaS90ZXN0L3Rlc3Qud3hzCisrKyBiL1Rvb2xzL21zaS90ZXN0L3Rlc3Qud3hzCkBAIC03LDIxICs3LDkgQEAKICAgICAgICAgPFByb3BlcnR5UmVmIElkPSJVcGdyYWRlVGFibGUiIC8+CiAgICAgICAgIDxQcm9wZXJ0eVJlZiBJZD0iUkVHSVNUUllLRVkiIC8+CiAgICAgICAgIAotICAgICAgICA8P2lmZGVmIEluY2x1ZGVEZWZhdWx0RmVhdHVyZSA/PgogICAgICAgICA8RmVhdHVyZSBJZD0iRGVmYXVsdEZlYXR1cmUiIEFsbG93QWR2ZXJ0aXNlPSJubyIgVGl0bGU9IiEobG9jLlRpdGxlKSIgRGVzY3JpcHRpb249IiEobG9jLkRlc2NyaXB0aW9uKSI+CiAgICAgICAgICAgICA8Q29tcG9uZW50R3JvdXBSZWYgSWQ9InRlc3RfcHkiIC8+CiAgICAgICAgICAgICA8Q29tcG9uZW50R3JvdXBSZWYgSWQ9InRlc3RfZXh0ZW5zaW9ucyIgLz4KICAgICAgICAgPC9GZWF0dXJlPgotICAgICAgICA8P2VuZGlmID8+Ci0gICAgICAgIDw/aWZkZWYgSW5jbHVkZVN5bWJvbHMgPz4KLSAgICAgICAgPEZlYXR1cmUgSWQ9IlN5bWJvbHMiIEFsbG93QWR2ZXJ0aXNlPSJubyIgVGl0bGU9IiEobG9jLlRpdGxlUGRiKSIgRGVzY3JpcHRpb249IiEobG9jLkRlc2NyaXB0aW9uUGRiKSI+Ci0gICAgICAgICAgICA8Q29tcG9uZW50R3JvdXBSZWYgSWQ9InRlc3RfZXh0ZW5zaW9uc19zeW1ib2xzIiAvPgotICAgICAgICA8L0ZlYXR1cmU+Ci0gICAgICAgIDw/ZW5kaWYgPz4KLSAgICAgICAgPD9pZmRlZiBJbmNsdWRlRGVidWdCaW5hcmllcyA/PgotICAgICAgICA8RmVhdHVyZSBJZD0iRGVidWdCaW5hcmllcyIgQWxsb3dBZHZlcnRpc2U9Im5vIiBUaXRsZT0iIShsb2MuVGl0bGVfZCkiIERlc2NyaXB0aW9uPSIhKGxvYy5EZXNjcmlwdGlvbl9kKSI+Ci0gICAgICAgICAgICA8Q29tcG9uZW50R3JvdXBSZWYgSWQ9InRlc3RfZXh0ZW5zaW9uc19kIiAvPgotICAgICAgICA8L0ZlYXR1cmU+Ci0gICAgICAgIDw/ZW5kaWYgPz4KICAgICA8L1Byb2R1Y3Q+CiA8L1dpeD4KZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS90ZXN0L3Rlc3RfZC53aXhwcm9qIGIvVG9vbHMvbXNpL3Rlc3QvdGVzdF9kLndpeHByb2oKaW5kZXggODRkNDMxMy4uMzNiMDRiZSAxMDA2NDQKLS0tIGEvVG9vbHMvbXNpL3Rlc3QvdGVzdF9kLndpeHByb2oKKysrIGIvVG9vbHMvbXNpL3Rlc3QvdGVzdF9kLndpeHByb2oKQEAgLTUsNyArNSwxNSBAQAogICAgICAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+CiAgICAgICAgIDxPdXRwdXROYW1lPnRlc3RfZDwvT3V0cHV0TmFtZT4KICAgICAgICAgPE91dHB1dFR5cGU+UGFja2FnZTwvT3V0cHV0VHlwZT4KLSAgICAgICAgPERlZmluZUNvbnN0YW50cz5JbmNsdWRlRGVidWdCaW5hcmllcz0xOyQoRGVmaW5lQ29uc3RhbnRzKTwvRGVmaW5lQ29uc3RhbnRzPgogICAgIDwvUHJvcGVydHlHcm91cD4KLSAgICA8SW1wb3J0IFByb2plY3Q9InRlc3QucHJvcHMiIC8+CisgICAgPEltcG9ydCBQcm9qZWN0PSIuLlxtc2kucHJvcHMiIC8+CisgICAgPEl0ZW1Hcm91cD4KKyAgICAgICAgPENvbXBpbGUgSW5jbHVkZT0idGVzdF9kLnd4cyIgLz4KKyAgICAgICAgPENvbXBpbGUgSW5jbHVkZT0idGVzdF9maWxlcy53eHMiIC8+CisgICAgPC9JdGVtR3JvdXA+CisgICAgPEl0ZW1Hcm91cD4KKyAgICAgICAgPEVtYmVkZGVkUmVzb3VyY2UgSW5jbHVkZT0iKi53eGwiIC8+CisgICAgPC9JdGVtR3JvdXA+CisgICAgCisgICAgPEltcG9ydCBQcm9qZWN0PSIuLlxtc2kudGFyZ2V0cyIgLz4KIDwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9Ub29scy9tc2kvdGVzdC90ZXN0X2Qud3hzIGIvVG9vbHMvbXNpL3Rlc3QvdGVzdF9kLnd4cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjVhZmRkCi0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvbXNpL3Rlc3QvdGVzdF9kLnd4cwpAQCAtMCwwICsxLDEzIEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPFdpeCB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS93aXgvMjAwNi93aSI+CisgICAgPFByb2R1Y3QgSWQ9IioiIExhbmd1YWdlPSIhKGxvYy5MQ0lEKSIgTmFtZT0iIShsb2MuVGl0bGUpIiBWZXJzaW9uPSIkKHZhci5WZXJzaW9uKSIgTWFudWZhY3R1cmVyPSIhKGxvYy5NYW51ZmFjdHVyZXIpIiBVcGdyYWRlQ29kZT0iJCh2YXIuVXBncmFkZUNvZGUpIj4KKyAgICAgICAgPFBhY2thZ2UgSW5zdGFsbGVyVmVyc2lvbj0iMzAwIiBDb21wcmVzc2VkPSJ5ZXMiIEluc3RhbGxTY29wZT0icGVyVXNlciIgUGxhdGZvcm09IiQodmFyLlBsYXRmb3JtKSIgLz4KKyAgICAgICAgPE1lZGlhVGVtcGxhdGUgRW1iZWRDYWI9InllcyIgQ29tcHJlc3Npb25MZXZlbD0iaGlnaCIgLz4KKyAgICAgICAgCisgICAgICAgIDxQcm9wZXJ0eVJlZiBJZD0iVXBncmFkZVRhYmxlIiAvPgorICAgICAgICAKKyAgICAgICAgPEZlYXR1cmUgSWQ9IkRlYnVnQmluYXJpZXMiIEFsbG93QWR2ZXJ0aXNlPSJubyIgVGl0bGU9IiEobG9jLlRpdGxlX2QpIiBEZXNjcmlwdGlvbj0iIShsb2MuRGVzY3JpcHRpb25fZCkiPgorICAgICAgICAgICAgPENvbXBvbmVudEdyb3VwUmVmIElkPSJ0ZXN0X2V4dGVuc2lvbnNfZCIgLz4KKyAgICAgICAgPC9GZWF0dXJlPgorICAgIDwvUHJvZHVjdD4KKzwvV2l4PgpkaWZmIC0tZ2l0IGEvVG9vbHMvbXNpL3Rlc3QvdGVzdF9wZGIud2l4cHJvaiBiL1Rvb2xzL21zaS90ZXN0L3Rlc3RfcGRiLndpeHByb2oKaW5kZXggZDYwN2E0Ny4uOTY1ZjBlZCAxMDA2NDQKLS0tIGEvVG9vbHMvbXNpL3Rlc3QvdGVzdF9wZGIud2l4cHJvagorKysgYi9Ub29scy9tc2kvdGVzdC90ZXN0X3BkYi53aXhwcm9qCkBAIC01LDcgKzUsMTUgQEAKICAgICAgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgogICAgICAgICA8T3V0cHV0TmFtZT50ZXN0X3BkYjwvT3V0cHV0TmFtZT4KICAgICAgICAgPE91dHB1dFR5cGU+UGFja2FnZTwvT3V0cHV0VHlwZT4KLSAgICAgICAgPERlZmluZUNvbnN0YW50cz5JbmNsdWRlU3ltYm9scz0xOyQoRGVmaW5lQ29uc3RhbnRzKTwvRGVmaW5lQ29uc3RhbnRzPgogICAgIDwvUHJvcGVydHlHcm91cD4KLSAgICA8SW1wb3J0IFByb2plY3Q9InRlc3QucHJvcHMiIC8+CisgICAgPEltcG9ydCBQcm9qZWN0PSIuLlxtc2kucHJvcHMiIC8+CisgICAgPEl0ZW1Hcm91cD4KKyAgICAgICAgPENvbXBpbGUgSW5jbHVkZT0idGVzdF9wZGIud3hzIiAvPgorICAgICAgICA8Q29tcGlsZSBJbmNsdWRlPSJ0ZXN0X2ZpbGVzLnd4cyIgLz4KKyAgICA8L0l0ZW1Hcm91cD4KKyAgICA8SXRlbUdyb3VwPgorICAgICAgICA8RW1iZWRkZWRSZXNvdXJjZSBJbmNsdWRlPSIqLnd4bCIgLz4KKyAgICA8L0l0ZW1Hcm91cD4KKyAgICAKKyAgICA8SW1wb3J0IFByb2plY3Q9Ii4uXG1zaS50YXJnZXRzIiAvPgogPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS90ZXN0L3Rlc3RfcGRiLnd4cyBiL1Rvb2xzL21zaS90ZXN0L3Rlc3RfcGRiLnd4cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTEwYTZmCi0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvbXNpL3Rlc3QvdGVzdF9wZGIud3hzCkBAIC0wLDAgKzEsMTMgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8V2l4IHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dpeC8yMDA2L3dpIj4KKyAgICA8UHJvZHVjdCBJZD0iKiIgTGFuZ3VhZ2U9IiEobG9jLkxDSUQpIiBOYW1lPSIhKGxvYy5UaXRsZSkiIFZlcnNpb249IiQodmFyLlZlcnNpb24pIiBNYW51ZmFjdHVyZXI9IiEobG9jLk1hbnVmYWN0dXJlcikiIFVwZ3JhZGVDb2RlPSIkKHZhci5VcGdyYWRlQ29kZSkiPgorICAgICAgICA8UGFja2FnZSBJbnN0YWxsZXJWZXJzaW9uPSIzMDAiIENvbXByZXNzZWQ9InllcyIgSW5zdGFsbFNjb3BlPSJwZXJVc2VyIiBQbGF0Zm9ybT0iJCh2YXIuUGxhdGZvcm0pIiAvPgorICAgICAgICA8TWVkaWFUZW1wbGF0ZSBFbWJlZENhYj0ieWVzIiBDb21wcmVzc2lvbkxldmVsPSJoaWdoIiAvPgorICAgICAgICAKKyAgICAgICAgPFByb3BlcnR5UmVmIElkPSJVcGdyYWRlVGFibGUiIC8+CisgICAgICAgIAorICAgICAgICA8RmVhdHVyZSBJZD0iU3ltYm9scyIgQWxsb3dBZHZlcnRpc2U9Im5vIiBUaXRsZT0iIShsb2MuVGl0bGVQZGIpIiBEZXNjcmlwdGlvbj0iIShsb2MuRGVzY3JpcHRpb25QZGIpIj4KKyAgICAgICAgICAgIDxDb21wb25lbnRHcm91cFJlZiBJZD0idGVzdF9leHRlbnNpb25zX3N5bWJvbHMiIC8+CisgICAgICAgIDwvRmVhdHVyZT4KKyAgICA8L1Byb2R1Y3Q+Cis8L1dpeD4KZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS90ZXN0cmVsZWFzZS5iYXQgYi9Ub29scy9tc2kvdGVzdHJlbGVhc2UuYmF0CmluZGV4IGJmMWNlZmYuLjVjOWUwMTUgMTAwNjQ0Ci0tLSBhL1Rvb2xzL21zaS90ZXN0cmVsZWFzZS5iYXQKKysrIGIvVG9vbHMvbXNpL3Rlc3RyZWxlYXNlLmJhdApAQCAtMTEsMTEgKzExLDE1IEBACiBzZXQgVEVTVFBFUlVTRVI9CiAKIDpDaGVja09wdHMKLWlmICclMScgRVFVICcteDg2JyAoc2V0IFRFU1RYODY9MSkgJiYgc2hpZnQgJiYgZ290byBDaGVja09wdHMKLWlmICclMScgRVFVICcteDY0JyAoc2V0IFRFU1RYNjQ9MSkgJiYgc2hpZnQgJiYgZ290byBDaGVja09wdHMKLWlmICclMScgRVFVICctdCcgKHNldCBUQVJHRVRESVI9JX4yKSAmJiBzaGlmdCAmJiBzaGlmdCAmJiBnb3RvIENoZWNrT3B0cwotaWYgJyUxJyBFUVUgJy1hJyAoc2V0IFRFU1RBTExVU0VSPTEpICYmIHNoaWZ0ICYmIGdvdG8gQ2hlY2tPcHRzCi1pZiAnJTEnIEVRVSAnLXAnIChzZXQgVEVTVFBFUlVTRVI9MSkgJiYgc2hpZnQgJiYgZ290byBDaGVja09wdHMKK2lmICIlMSIgRVFVICItaCIgZ290byBIZWxwCitpZiAiJTEiIEVRVSAiLXg4NiIgKHNldCBURVNUWDg2PTEpICYmIHNoaWZ0ICYmIGdvdG8gQ2hlY2tPcHRzCitpZiAiJTEiIEVRVSAiLXg2NCIgKHNldCBURVNUWDY0PTEpICYmIHNoaWZ0ICYmIGdvdG8gQ2hlY2tPcHRzCitpZiAiJTEiIEVRVSAiLXQiIChzZXQgVEFSR0VURElSPSV+MikgJiYgc2hpZnQgJiYgc2hpZnQgJiYgZ290byBDaGVja09wdHMKK2lmICIlMSIgRVFVICItLXRhcmdldCIgKHNldCBUQVJHRVRESVI9JX4yKSAmJiBzaGlmdCAmJiBzaGlmdCAmJiBnb3RvIENoZWNrT3B0cworaWYgIiUxIiBFUVUgIi1hIiAoc2V0IFRFU1RBTExVU0VSPTEpICYmIHNoaWZ0ICYmIGdvdG8gQ2hlY2tPcHRzCitpZiAiJTEiIEVRVSAiLS1hbGx1c2VyIiAoc2V0IFRFU1RBTExVU0VSPTEpICYmIHNoaWZ0ICYmIGdvdG8gQ2hlY2tPcHRzCitpZiAiJTEiIEVRVSAiLXAiIChzZXQgVEVTVFBFUlVTRVI9MSkgJiYgc2hpZnQgJiYgZ290byBDaGVja09wdHMKK2lmICIlMSIgRVFVICItLXBlcnVzZXIiIChzZXQgVEVTVFBFUlVTRVI9MSkgJiYgc2hpZnQgJiYgZ290byBDaGVja09wdHMKIAogaWYgbm90IGRlZmluZWQgVEVTVFg4NiBpZiBub3QgZGVmaW5lZCBURVNUWDY0IChzZXQgVEVTVFg4Nj0xKSAmJiAoc2V0IFRFU1RYNjQ9MSkKIGlmIG5vdCBkZWZpbmVkIFRFU1RBTExVU0VSIGlmIG5vdCBkZWZpbmVkIFRFU1RQRVJVU0VSIChzZXQgVEVTVEFMTFVTRVI9MSkgJiYgKHNldCBURVNUUEVSVVNFUj0xKQpAQCAtMjMsMTYgKzI3LDE4IEBACiAKIGlmIGRlZmluZWQgVEVTVFg4NiAoCiAgICAgZm9yICUlZiBpbiAoIiVQQ0JVSUxEJXdpbjMyXGVuLXVzXCouZXhlIikgZG8gKAotICAgICAgICBpZiBkZWZpbmVkIFRFU1RBTExVU0VSIGNhbGwgOnRlc3QgIiUlfmZmIiAiJVRBUkdFVERJUiVcJSV+bmYtYWxsdXNlciIgSW5zdGFsbEFsbFVzZXJzPTEKLSAgICAgICAgaWYgZGVmaW5lZCBURVNUUEVSVVNFUiBjYWxsIDp0ZXN0ICIlJX5mZiIgIiVUQVJHRVRESVIlXCUlfm5mLXBlcnVzZXIiIEluc3RhbGxBbGxVc2Vycz0wCisgICAgICAgIGlmIGRlZmluZWQgVEVTVEFMTFVTRVIgY2FsbCA6dGVzdCAiJSV+ZmYiICIlVEFSR0VURElSJVwlJX5uZi1hbGx1c2VyIiAiSW5zdGFsbEFsbFVzZXJzPTEgQ29tcGlsZUFsbD0xIgorICAgICAgICBpZiBlcnJvcmxldmVsIDEgZXhpdCAvQgorICAgICAgICBpZiBkZWZpbmVkIFRFU1RQRVJVU0VSIGNhbGwgOnRlc3QgIiUlfmZmIiAiJVRBUkdFVERJUiVcJSV+bmYtcGVydXNlciIgIkluc3RhbGxBbGxVc2Vycz0wIENvbXBpbGVBbGw9MCIKICAgICAgICAgaWYgZXJyb3JsZXZlbCAxIGV4aXQgL0IKICAgICApCiApCiAKIGlmIGRlZmluZWQgVEVTVFg2NCAoCiAgICAgZm9yICUlZiBpbiAoIiVQQ0JVSUxEJWFtZDY0XGVuLXVzXCouZXhlIikgZG8gKAotICAgICAgICBpZiBkZWZpbmVkIFRFU1RBTExVU0VSIGNhbGwgOnRlc3QgIiUlfmZmIiAiJVRBUkdFVERJUiVcJSV+bmYtYWxsdXNlciIgSW5zdGFsbEFsbFVzZXJzPTEKLSAgICAgICAgaWYgZGVmaW5lZCBURVNUUEVSVVNFUiBjYWxsIDp0ZXN0ICIlJX5mZiIgIiVUQVJHRVRESVIlXCUlfm5mLXBlcnVzZXIiIEluc3RhbGxBbGxVc2Vycz0wCisgICAgICAgIGlmIGRlZmluZWQgVEVTVEFMTFVTRVIgY2FsbCA6dGVzdCAiJSV+ZmYiICIlVEFSR0VURElSJVwlJX5uZi1hbGx1c2VyIiAiSW5zdGFsbEFsbFVzZXJzPTEgQ29tcGlsZUFsbD0xIgorICAgICAgICBpZiBlcnJvcmxldmVsIDEgZXhpdCAvQgorICAgICAgICBpZiBkZWZpbmVkIFRFU1RQRVJVU0VSIGNhbGwgOnRlc3QgIiUlfmZmIiAiJVRBUkdFVERJUiVcJSV+bmYtcGVydXNlciIgIkluc3RhbGxBbGxVc2Vycz0wIENvbXBpbGVBbGw9MCIKICAgICAgICAgaWYgZXJyb3JsZXZlbCAxIGV4aXQgL0IKICAgICApCiApCkBAIC00Nyw3ICs1Myw3IEBACiAKIEBzZXQgRVhJVENPREU9MAogQGVjaG8gSW5zdGFsbGluZyAlMSBpbnRvICUyCi0iJX4xIiAvcGFzc2l2ZSAvbG9nICIlfjJcaW5zdGFsbFxsb2cudHh0IiAlfjMgVGFyZ2V0RGlyPSIlfjJcUHl0aG9uIiBJbmNsdWRlX2RlYnVnPTEgSW5jbHVkZV9zeW1ib2xzPTEgQ29tcGlsZUFsbD0xCisiJX4xIiAvcGFzc2l2ZSAvbG9nICIlfjJcaW5zdGFsbFxsb2cudHh0IiBUYXJnZXREaXI9IiV+MlxQeXRob24iIEluY2x1ZGVfZGVidWc9MSBJbmNsdWRlX3N5bWJvbHM9MSAlfjMKIAogQGlmIG5vdCBlcnJvcmxldmVsIDEgKAogICAgIEBlY2hvIFByaW50aW5nIHZlcnNpb24KQEAgLTU3LDcgKzYzLDcgQEAKICAgICBAZWNobyBJbnN0YWxsaW5nIHBhY2thZ2UKICAgICAiJX4yXFB5dGhvblxweXRob24uZXhlIiAtbSBwaXAgaW5zdGFsbCBhenVyZSA+ICIlfjJccGlwLnR4dCIgMj4mMQogICAgIEBpZiBub3QgZXJyb3JsZXZlbCAxICgKLSAgICAgICAgIiV+MlxQeXRob25ccHl0aG9uLmV4ZSIgLW0gcGlwIHVuaW5zdGFsbCAteSBhenVyZSBweXRob24tZGF0ZXV0aWwgc2l4ID4gIiV+MlxwaXAudHh0IiAyPiYxCisgICAgICAgICIlfjJcUHl0aG9uXHB5dGhvbi5leGUiIC1tIHBpcCB1bmluc3RhbGwgLXkgYXp1cmUgcHl0aG9uLWRhdGV1dGlsIHNpeCA+PiAiJX4yXHBpcC50eHQiIDI+JjEKICAgICApCiApCiBAaWYgbm90IGVycm9ybGV2ZWwgMSAoCkBAIC03OCwzICs4NCwxNyBAQAogCiBAZWNobyBvZmYKIGV4aXQgL0IgJUVYSVRDT0RFJQorCis6SGVscAorZWNobyB0ZXN0cmVsZWFzZS5iYXQgWy0tdGFyZ2V0IFRBUkdFVF0gWy14ODZdIFsteDY0XSBbLS1hbGx1c2VyXSBbLS1wZXJ1c2VyXSBbLWhdCitlY2hvLgorZWNobyAgICAtLXRhcmdldCAoLXQpICAgU3BlY2lmeSB0aGUgdGFyZ2V0IGRpcmVjdG9yeSBmb3IgaW5zdGFsbHMgYW5kIGxvZ3MKK2VjaG8gICAgLXg4NiAgICAgICAgICAgIFJ1biB0ZXN0cyBmb3IgeDg2IGluc3RhbGxlcnMKK2VjaG8gICAgLXg2NCAgICAgICAgICAgIFJ1biB0ZXN0cyBmb3IgeDY0IGluc3RhbGxlcnMKK2VjaG8gICAgLS1hbGx1c2VyICgtYSkgIFJ1biB0ZXN0cyBmb3IgYWxsLXVzZXIgaW5zdGFsbHMgKHJlcXVpcmVzIEFkbWluaXN0cmF0b3IpCitlY2hvICAgIC0tcGVydXNlciAoLXApICBSdW4gdGVzdHMgZm9yIHBlci11c2VyIGluc3RhbGxzCitlY2hvICAgIC1oICAgICAgICAgICAgICBEaXNwbGF5IHRoaXMgaGVscCBpbmZvcm1hdGlvbgorZWNoby4KK2VjaG8gSWYgbm8gdGVzdCBhcmNoaXRlY3R1cmUgaXMgc3BlY2lmaWVkLCBhbGwgYXJjaGl0ZWN0dXJlcyB3aWxsIGJlIHRlc3RlZC4KK2VjaG8gSWYgbm8gaW5zdGFsbCB0eXBlIGlzIHNlbGVjdGVkLCBhbGwgaW5zdGFsbCB0eXBlcyB3aWxsIGJlIHRlc3RlZC4KK2VjaG8uCmRpZmYgLS1naXQgYS9Ub29scy9tc2kvdG9vbHMvdG9vbHMud2l4cHJvaiBiL1Rvb2xzL21zaS90b29scy90b29scy53aXhwcm9qCmluZGV4IDE4ZTZiYWIuLmY0M2NmMzMgMTAwNjQ0Ci0tLSBhL1Rvb2xzL21zaS90b29scy90b29scy53aXhwcm9qCisrKyBiL1Rvb2xzL21zaS90b29scy90b29scy53aXhwcm9qCkBAIC04LDcgKzgsOCBAQAogICAgIDwvUHJvcGVydHlHcm91cD4KICAgICA8SW1wb3J0IFByb2plY3Q9Ii4uXG1zaS5wcm9wcyIgLz4KICAgICA8SXRlbUdyb3VwPgotICAgICAgICA8Q29tcGlsZSBJbmNsdWRlPSIqLnd4cyIgLz4KKyAgICAgICAgPENvbXBpbGUgSW5jbHVkZT0idG9vbHMud3hzIiAvPgorICAgICAgICA8Q29tcGlsZSBJbmNsdWRlPSJ0b29sc19maWxlcy53eHMiIC8+CiAgICAgPC9JdGVtR3JvdXA+CiAgICAgPEl0ZW1Hcm91cD4KICAgICAgICAgPEVtYmVkZGVkUmVzb3VyY2UgSW5jbHVkZT0iKi53eGwiIC8+CmRpZmYgLS1naXQgYS9Ub29scy9tc2kvdXBsb2FkcmVsZWFzZS5iYXQgYi9Ub29scy9tc2kvdXBsb2FkcmVsZWFzZS5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA2NGE2NwotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL21zaS91cGxvYWRyZWxlYXNlLmJhdApAQCAtMCwwICsxLDQ2IEBACitAc2V0bG9jYWwKK0BlY2hvIG9mZgorCitzZXQgRD0lfmRwMAorc2V0IFBDQlVJTEQ9JUQlLi5cLi5cUENCdWlsZFwKKworc2V0IEhPU1Q9CitzZXQgVVNFUj0KK3NldCBUQVJHRVQ9CitzZXQgRFJZUlVOPWZhbHNlCisKKzpDaGVja09wdHMKK2lmICIlMSIgRVFVICItaCIgZ290byBIZWxwCitpZiAiJTEiIEVRVSAiLW8iIChzZXQgSE9TVD0lfjIpICYmIHNoaWZ0ICYmIHNoaWZ0ICYmIGdvdG8gQ2hlY2tPcHRzCitpZiAiJTEiIEVRVSAiLS1ob3N0IiAoc2V0IEhPU1Q9JX4yKSAmJiBzaGlmdCAmJiBzaGlmdCAmJiBnb3RvIENoZWNrT3B0cworaWYgIiUxIiBFUVUgIi11IiAoc2V0IFVTRVI9JX4yKSAmJiBzaGlmdCAmJiBzaGlmdCAmJiBnb3RvIENoZWNrT3B0cworaWYgIiUxIiBFUVUgIi0tdXNlciIgKHNldCBVU0VSPSV+MikgJiYgc2hpZnQgJiYgc2hpZnQgJiYgZ290byBDaGVja09wdHMKK2lmICIlMSIgRVFVICItdCIgKHNldCBUQVJHRVQ9JX4yKSAmJiBzaGlmdCAmJiBzaGlmdCAmJiBnb3RvIENoZWNrT3B0cworaWYgIiUxIiBFUVUgIi0tdGFyZ2V0IiAoc2V0IFRBUkdFVD0lfjIpICYmIHNoaWZ0ICYmIHNoaWZ0ICYmIGdvdG8gQ2hlY2tPcHRzCitpZiAiJTEiIEVRVSAiLS1kcnktcnVuIiAoc2V0IERSWVJVTj10cnVlKSAmJiBzaGlmdCAmJiBnb3RvIENoZWNrT3B0cworCitpZiBub3QgZGVmaW5lZCBQTElOSyB3aGVyZSBwbGluayA+ICIlVEVNUCVccGxpbmsubG9jIiAyPiBudWwgJiYgc2V0IC9QIFBMSU5LPSA8ICIlVEVNUCVccGxpbmsubG9jIiAmIGRlbCAiJVRFTVAlXHBsaW5rLmxvYyIKK2lmIG5vdCBkZWZpbmVkIFBMSU5LIHdoZXJlIC9SICIlUHJvZ3JhbUZpbGVzKHg4NiklIiBwbGluayA+ICIlVEVNUCVccGxpbmsubG9jIiAyPiBudWwgJiYgc2V0IC9QIFBMSU5LPSA8ICIlVEVNUCVccGxpbmsubG9jIiAmIGRlbCAiJVRFTVAlXHBsaW5rLmxvYyIKK2lmIG5vdCBkZWZpbmVkIFBMSU5LIGVjaG8gQ2Fubm90IGxvY2F0ZSBwbGluay5leGUgJiBleGl0IC9CIDEKK2VjaG8gRm91bmQgcGxpbmsuZXhlIGF0ICVQTElOSyUKKworaWYgbm90IGRlZmluZWQgUFNDUCB3aGVyZSBwc2NwID4gIiVURU1QJVxwc2NwLmxvYyIgMj4gbnVsICYmIHNldCAvUCBwc2NwPSA8ICIlVEVNUCVccHNjcC5sb2MiICYgZGVsICIlVEVNUCVccHNjcC5sb2MiCitpZiBub3QgZGVmaW5lZCBQU0NQIHdoZXJlIC9SICIlUHJvZ3JhbUZpbGVzKHg4NiklIiBwc2NwID4gIiVURU1QJVxwc2NwLmxvYyIgMj4gbnVsICYmIHNldCAvUCBwc2NwPSA8ICIlVEVNUCVccHNjcC5sb2MiICYgZGVsICIlVEVNUCVccHNjcC5sb2MiCitpZiBub3QgZGVmaW5lZCBQU0NQIGVjaG8gQ2Fubm90IGxvY2F0ZSBwc2NwLmV4ZSAmIGV4aXQgL0IgMQorZWNobyBGb3VuZCBwc2NwLmV4ZSBhdCAlUFNDUCUKKworY2FsbCAiJVBDQlVJTEQlZW52LmJhdCIgPiBudWwgMj4gbnVsCittc2J1aWxkIC92Om0gL25vbG9nbyB1cGxvYWRyZWxlYXNlLnByb2ogL3Q6VXBsb2FkIC9wOlBsYXRmb3JtPXg4NgorbXNidWlsZCAvdjptIC9ub2xvZ28gdXBsb2FkcmVsZWFzZS5wcm9qIC90OlVwbG9hZCAvcDpQbGF0Zm9ybT14NjQgL3A6SW5jbHVkZURvYz1mYWxzZQorCitleGl0IC9CIDAKKworOkhlbHAKK2VjaG8gdXBsb2FkcmVsZWFzZS5iYXQgLS1ob3N0IEhPU1QgLS11c2VyIFVTRVJOQU1FIFstLXRhcmdldCBUQVJHRVRdIFstLWRyeS1ydW5dIFstaF0KK2VjaG8uCitlY2hvICAgIC0taG9zdCAoLW8pICAgICBTcGVjaWZ5IHRoZSB1cGxvYWQgaG9zdCAocmVxdWlyZWQpCitlY2hvICAgIC0tdXNlciAoLXUpICAgICBTcGVjaWZ5IHRoZSB1c2VyIG9uIHRoZSBob3N0IChyZXF1aXJlZCkKK2VjaG8gICAgLS10YXJnZXQgKC10KSAgIFNwZWNpZnkgdGhlIHRhcmdldCBkaXJlY3Rvcnkgb24gdGhlIGhvc3QKK2VjaG8gICAgLS1kcnktcnVuICAgICAgIERpc3BsYXkgY29tbWFuZHMgYW5kIGZpbGVuYW1lcyB3aXRob3V0IGV4ZWN1dGluZyB0aGVtCitlY2hvICAgIC1oICAgICAgICAgICAgICBEaXNwbGF5IHRoaXMgaGVscCBpbmZvcm1hdGlvbgorZWNoby4KZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS91cGxvYWRyZWxlYXNlLnByb2ogYi9Ub29scy9tc2kvdXBsb2FkcmVsZWFzZS5wcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZWJlNTcKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9tc2kvdXBsb2FkcmVsZWFzZS5wcm9qCkBAIC0wLDAgKzEsNjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgICA8UHJvcGVydHlHcm91cD4KKyAgICAgICAgPFByb2plY3RHdWlkPnsyRDY5RjJBQi1ENUQwLTQzNDQtODRCNS1FRjZEQjM0QTlCQzl9PC9Qcm9qZWN0R3VpZD4KKyAgICAgICAgPE91dHB1dE5hbWU+cHl0aG9uPC9PdXRwdXROYW1lPgorICAgICAgICA8T3V0cHV0U3VmZml4PjwvT3V0cHV0U3VmZml4PgorICAgICAgICAKKyAgICAgICAgPERvd25sb2FkVXJsQmFzZSBDb25kaXRpb249IickKERvd25sb2FkVXJsQmFzZSknID09ICcnIj4kKFRBUkdFVCk8L0Rvd25sb2FkVXJsQmFzZT4KKyAgICAgICAgPERvd25sb2FkVXJsQmFzZSBDb25kaXRpb249IickKERvd25sb2FkVXJsQmFzZSknID09ICcnIj4vc3J2L3d3dy5weXRob24ub3JnL2Z0cC9weXRob248L0Rvd25sb2FkVXJsQmFzZT4KKyAgICAgICAgPEluY2x1ZGVEb2MgQ29uZGl0aW9uPSInJChJbmNsdWRlRG9jKScgPT0gJyciPnRydWU8L0luY2x1ZGVEb2M+CisgICAgICAgIDxEcnlSdW4gQ29uZGl0aW9uPSInJChEcnlSdW4pJyA9PSAnJyI+ZmFsc2U8L0RyeVJ1bj4KKyAgICA8L1Byb3BlcnR5R3JvdXA+CisKKyAgICA8SW1wb3J0IFByb2plY3Q9Im1zaS5wcm9wcyIgLz4KKyAgICA8SW1wb3J0IFByb2plY3Q9ImJ1bmRsZVxidW5kbGUudGFyZ2V0cyIgLz4KKyAgICAKKyAgICA8UHJvcGVydHlHcm91cD4KKyAgICAgICAgPEVYRVRhcmdldD4kKERvd25sb2FkVXJsQmFzZS5UcmltRW5kKGAvYCkpLyQoTWFqb3JWZXJzaW9uTnVtYmVyKS4kKE1pbm9yVmVyc2lvbk51bWJlcikuJChNaWNyb1ZlcnNpb25OdW1iZXIpPC9FWEVUYXJnZXQ+CisgICAgICAgIDxNU0lUYXJnZXQ+JChEb3dubG9hZFVybC5UcmltRW5kKGAvYCkpPC9NU0lUYXJnZXQ+CisgICAgPC9Qcm9wZXJ0eUdyb3VwPgorICAgIAorICAgIDxJdGVtR3JvdXA+CisgICAgICAgIDxGaWxlIEluY2x1ZGU9IiQoT3V0cHV0UGF0aClcKi5tc2k7JChPdXRwdXRQYXRoKVwqLm1zdSI+CisgICAgICAgICAgICA8Q29weVRvPiQoTVNJVGFyZ2V0KTwvQ29weVRvPgorICAgICAgICA8L0ZpbGU+CisgICAgICAgIDxGaWxlIEluY2x1ZGU9IiQoT3V0cHV0UGF0aClcKi5leGUiPgorICAgICAgICAgICAgPENvcHlUbz4kKEVYRVRhcmdldCk8L0NvcHlUbz4KKyAgICAgICAgPC9GaWxlPgorICAgICAgICA8RmlsZSBJbmNsdWRlPSIkKFB5U291cmNlUGF0aClEb2NcYnVpbGRcaHRtbGhlbHBccHl0aG9uJChNYWpvclZlcnNpb25OdW1iZXIpJChNaW5vclZlcnNpb25OdW1iZXIpJChNaWNyb1ZlcnNpb25OdW1iZXIpJChSZWxlYXNlTGV2ZWxOYW1lKS5jaG0iIENvbmRpdGlvbj0iJChJbmNsdWRlRG9jKSI+CisgICAgICAgICAgICA8Q29weVRvPiQoRVhFVGFyZ2V0KTwvQ29weVRvPgorICAgICAgICA8L0ZpbGU+CisgICAgPC9JdGVtR3JvdXA+CisgICAgCisgICAgPFRhcmdldCBOYW1lPSJfVmFsaWRhdGVQcm9wZXJ0aWVzIj4KKyAgICAgICAgPEVycm9yIFRleHQ9Ik5vIHZhbHVlIGZvciBIb3N0IHByb3ZpZGVkIiBDb25kaXRpb249IickKEhvc3QpJyA9PSAnJyIgLz4KKyAgICAgICAgPEVycm9yIFRleHQ9Ik5vIHZhbHVlIGZvciBVc2VyIHByb3ZpZGVkIiBDb25kaXRpb249IickKFVzZXIpJyA9PSAnJyIgLz4KKyAgICAgICAgPEVycm9yIFRleHQ9Ik5vIHBhdGggZm9yIFBTQ1AgcHJvdmlkZWQiIENvbmRpdGlvbj0iJyQoUFNDUCknID09ICcnIiAvPgorICAgICAgICA8RXJyb3IgVGV4dD0iTm8gcGF0aCBmb3IgUExJTksgcHJvdmlkZWQiIENvbmRpdGlvbj0iJyQoUExJTkspJyA9PSAnJyIgLz4KKyAgICA8L1RhcmdldD4KKyAgICAKKyAgICA8VGFyZ2V0IE5hbWU9Il9VcGxvYWQiIENvbmRpdGlvbj0iISQoRHJ5UnVuKSI+CisgICAgICAgIDxFeGVjIENvbW1hbmQ9IiZxdW90OyQoUExJTkspJnF1b3Q7ICQoVXNlcilAJChIb3N0KSBta2RpciAlKEZpbGUuQ29weVRvKSBeJmFtcDteJmFtcDsgY2hncnAgZG93bmxvYWRzICUoRmlsZS5Db3B5VG8pIF4mYW1wO14mYW1wOyBjaG1vZCBnLXcsbytyeCAlKEZpbGUuQ29weVRvKQorJnF1b3Q7JChQU0NQKSZxdW90OyBAKEZpbGUsJyAnKSAkKFVzZXIpQCQoSG9zdCk6JShGaWxlLkNvcHlUbykKKyZxdW90OyQoUExJTkspJnF1b3Q7ICQoVXNlcilAJChIb3N0KSBjaGdycCBkb3dubG9hZHMgJShGaWxlLkNvcHlUbykvKiBeJmFtcDteJmFtcDsgY2htb2QgZy13LG8rciAlKEZpbGUuQ29weVRvKS8qCisiIC8+CisgICAgPC9UYXJnZXQ+CisgICAgCisgICAgPFRhcmdldCBOYW1lPSJfUHJpbnROYW1lcyIgQ29uZGl0aW9uPSIkKERyeVJ1bikiPgorICAgICAgICA8RXhlYyBDb21tYW5kPSJlY2hvICZxdW90OyQoUExJTkspJnF1b3Q7ICQoVXNlcilAJChIb3N0KSBta2RpciAlKEZpbGUuQ29weVRvKSBeJmFtcDteJmFtcDsgY2hncnAgZG93bmxvYWRzICUoRmlsZS5Db3B5VG8pIF4mYW1wO14mYW1wOyBjaG1vZCBnLXcsbytyeCAlKEZpbGUuQ29weVRvKQorZWNobyAmcXVvdDskKFBTQ1ApJnF1b3Q7IEAoRmlsZSwnICcpICQoVXNlcilAJChIb3N0KTolKEZpbGUuQ29weVRvKQorZWNobyAmcXVvdDskKFBMSU5LKSZxdW90OyAkKFVzZXIpQCQoSG9zdCkgY2hncnAgZG93bmxvYWRzICUoRmlsZS5Db3B5VG8pLyogXiZhbXA7XiZhbXA7IGNobW9kIGctdyxvK3IgJShGaWxlLkNvcHlUbykvKgorZWNoby4KK2VjaG8uIiAvPgorICAgIDwvVGFyZ2V0PgorICAgIAorICAgIDxUYXJnZXQgTmFtZT0iVXBsb2FkIiBEZXBlbmRzT25UYXJnZXRzPSJfVmFsaWRhdGVQcm9wZXJ0aWVzO19QcmludE5hbWVzO19VcGxvYWQiIC8+CisgICAgCisgICAgPFRhcmdldCBOYW1lPSJCdWlsZCI+CisgICAgICAgIDxFcnJvciBUZXh0PSJUaGlzIHNjcmlwdCBzaG91bGQgYmUgaW52b2tlZCB1c2luZyB1cGxvYWRyZWxlYXNlLmJhdC4iIC8+CisgICAgPC9UYXJnZXQ+Cis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9Ub29scy9zY3JpcHRzL3dpbl9hZGQycGF0aC5weSBiL1Rvb2xzL3NjcmlwdHMvd2luX2FkZDJwYXRoLnB5CmluZGV4IGM4NWJlYTUuLjFjOWFlZGMgMTAwNjQ0Ci0tLSBhL1Rvb2xzL3NjcmlwdHMvd2luX2FkZDJwYXRoLnB5CisrKyBiL1Rvb2xzL3NjcmlwdHMvd2luX2FkZDJwYXRoLnB5CkBAIC0yMiw3ICsyMiw4IEBACiAgICAgc2NyaXB0cyA9IG9zLnBhdGguam9pbihweXRob25wYXRoLCAiU2NyaXB0cyIpCiAgICAgYXBwZGF0YSA9IG9zLmVudmlyb25bIkFQUERBVEEiXQogICAgIGlmIGhhc2F0dHIoc2l0ZSwgIlVTRVJfU0lURSIpOgotICAgICAgICB1c2VycGF0aCA9IHNpdGUuVVNFUl9TSVRFLnJlcGxhY2UoYXBwZGF0YSwgIiVBUFBEQVRBJSIpCisgICAgICAgIHVzZXJzaXRlID0gc2l0ZS5VU0VSX1NJVEUucmVwbGFjZShhcHBkYXRhLCAiJUFQUERBVEElIikKKyAgICAgICAgdXNlcnBhdGggPSBvcy5wYXRoLmRpcm5hbWUodXNlcnNpdGUpCiAgICAgICAgIHVzZXJzY3JpcHRzID0gb3MucGF0aC5qb2luKHVzZXJwYXRoLCAiU2NyaXB0cyIpCiAgICAgZWxzZToKICAgICAgICAgdXNlcnNjcmlwdHMgPSBOb25lCmRpZmYgLS1naXQgYS9jb25maWd1cmUgYi9jb25maWd1cmUKaW5kZXggZWNlZmRlNC4uNzk5YzZjNCAxMDA3NTUKLS0tIGEvY29uZmlndXJlCisrKyBiL2NvbmZpZ3VyZQpAQCAtNjMzOCw3ICs2MzM4LDExIEBACiAJICAgIGlmIHRlc3QgIiRQeV9ERUJVRyIgPSAndHJ1ZScgOyB0aGVuCiAJCSMgT3B0aW1pemF0aW9uIG1lc3NlcyB1cCBkZWJ1Z2dlcnMsIHNvIHR1cm4gaXQgb2ZmIGZvcgogCQkjIGRlYnVnIGJ1aWxkcy4KLQkJT1BUPSItZyAtTzAgLVdhbGwgJFNUUklDVF9QUk9UTyIKKyAgICAgICAgICAgICAgICBpZiAiJENDIiAtdiAtLWhlbHAgMj4vZGV2L251bGwgfGdyZXAgLS0gLU9nID4gL2Rldi9udWxsOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIE9QVD0iLWcgLU9nIC1XYWxsICRTVFJJQ1RfUFJPVE8iCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBPUFQ9Ii1nIC1PMCAtV2FsbCAkU1RSSUNUX1BST1RPIgorICAgICAgICAgICAgICAgIGZpCiAJICAgIGVsc2UKIAkJT1BUPSItZyAkV1JBUCAtTzMgLVdhbGwgJFNUUklDVF9QUk9UTyIKIAkgICAgZmkKQEAgLTE1Nzk0LDYgKzE1Nzk4LDM4IEBACiAkYXNfZWNobyAiJEVOU1VSRVBJUCIgPiY2OyB9CiAKIAorIyBjaGVjayBpZiB0aGUgZGlyZW50IHN0cnVjdHVyZSBvZiBhIGRfdHlwZSBmaWVsZCBhbmQgRFRfVU5LTk9XTiBpcyBkZWZpbmVkCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHRoZSBkaXJlbnQgc3RydWN0dXJlIG9mIGEgZF90eXBlIGZpZWxkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmIHRoZSBkaXJlbnQgc3RydWN0dXJlIG9mIGEgZF90eXBlIGZpZWxkLi4uICIgPiY2OyB9CitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKworICAgICNpbmNsdWRlIDxkaXJlbnQuaD4KKworICAgIGludCBtYWluKCkgeworICAgICAgc3RydWN0IGRpcmVudCBlbnRyeTsKKyAgICAgIHJldHVybiBlbnRyeS5kX3R5cGUgPT0gRFRfVU5LTk9XTjsKKyAgICB9CisKKworX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGhhdmVfZGlyZW50X2RfdHlwZT15ZXMKK2Vsc2UKKyAgaGF2ZV9kaXJlbnRfZF90eXBlPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkaGF2ZV9kaXJlbnRfZF90eXBlIiA+JjUKKyRhc19lY2hvICIkaGF2ZV9kaXJlbnRfZF90eXBlIiA+JjY7IH0KKworaWYgdGVzdCAiJGhhdmVfZGlyZW50X2RfdHlwZSIgPSB5ZXM7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9ESVJFTlRfRF9UWVBFIDEiID4+Y29uZmRlZnMuaAorCitmaQorCiAjIGdlbmVyYXRlIG91dHB1dCBmaWxlcwogYWNfY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzIE1ha2VmaWxlLnByZSBNb2R1bGVzL1NldHVwLmNvbmZpZyBNaXNjL3B5dGhvbi5wYyBNaXNjL3B5dGhvbi1jb25maWcuc2giCiAKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZS5hYyBiL2NvbmZpZ3VyZS5hYwppbmRleCBjNzUxNjIyLi4yNjNhZTE1IDEwMDY0NAotLS0gYS9jb25maWd1cmUuYWMKKysrIGIvY29uZmlndXJlLmFjCkBAIC0xMTI4LDcgKzExMjgsMTEgQEAKIAkgICAgaWYgdGVzdCAiJFB5X0RFQlVHIiA9ICd0cnVlJyA7IHRoZW4KIAkJIyBPcHRpbWl6YXRpb24gbWVzc2VzIHVwIGRlYnVnZ2Vycywgc28gdHVybiBpdCBvZmYgZm9yCiAJCSMgZGVidWcgYnVpbGRzLgotCQlPUFQ9Ii1nIC1PMCAtV2FsbCAkU1RSSUNUX1BST1RPIgorICAgICAgICAgICAgICAgIGlmICIkQ0MiIC12IC0taGVscCAyPi9kZXYvbnVsbCB8Z3JlcCAtLSAtT2cgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgT1BUPSItZyAtT2cgLVdhbGwgJFNUUklDVF9QUk9UTyIKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIE9QVD0iLWcgLU8wIC1XYWxsICRTVFJJQ1RfUFJPVE8iCisgICAgICAgICAgICAgICAgZmkKIAkgICAgZWxzZQogCQlPUFQ9Ii1nICRXUkFQIC1PMyAtV2FsbCAkU1RSSUNUX1BST1RPIgogCSAgICBmaQpAQCAtNDk0MCw2ICs0OTQ0LDI2IEBACiBBQ19NU0dfUkVTVUxUKCRFTlNVUkVQSVApCiBBQ19TVUJTVChFTlNVUkVQSVApCiAKKyMgY2hlY2sgaWYgdGhlIGRpcmVudCBzdHJ1Y3R1cmUgb2YgYSBkX3R5cGUgZmllbGQgYW5kIERUX1VOS05PV04gaXMgZGVmaW5lZAorQUNfTVNHX0NIRUNLSU5HKGlmIHRoZSBkaXJlbnQgc3RydWN0dXJlIG9mIGEgZF90eXBlIGZpZWxkKQorQUNfTElOS19JRkVMU0UoCitbCisgIEFDX0xBTkdfU09VUkNFKFtbCisgICAgI2luY2x1ZGUgPGRpcmVudC5oPgorCisgICAgaW50IG1haW4oKSB7CisgICAgICBzdHJ1Y3QgZGlyZW50IGVudHJ5OworICAgICAgcmV0dXJuIGVudHJ5LmRfdHlwZSA9PSBEVF9VTktOT1dOOworICAgIH0KKyAgXV0pCitdLFtoYXZlX2RpcmVudF9kX3R5cGU9eWVzXSxbaGF2ZV9kaXJlbnRfZF90eXBlPW5vXSkKK0FDX01TR19SRVNVTFQoJGhhdmVfZGlyZW50X2RfdHlwZSkKKworaWYgdGVzdCAiJGhhdmVfZGlyZW50X2RfdHlwZSIgPSB5ZXM7IHRoZW4KKyAgICBBQ19ERUZJTkUoSEFWRV9ESVJFTlRfRF9UWVBFLCAxLAorICAgICAgICAgICAgICBbRGVmaW5lIHRvIDEgaWYgdGhlIGRpcmVudCBzdHJ1Y3R1cmUgaGFzIGEgZF90eXBlIGZpZWxkXSkKK2ZpCisKICMgZ2VuZXJhdGUgb3V0cHV0IGZpbGVzCiBBQ19DT05GSUdfRklMRVMoTWFrZWZpbGUucHJlIE1vZHVsZXMvU2V0dXAuY29uZmlnIE1pc2MvcHl0aG9uLnBjIE1pc2MvcHl0aG9uLWNvbmZpZy5zaCkKIEFDX0NPTkZJR19GSUxFUyhbTW9kdWxlcy9sZF9zb19haXhdLCBbY2htb2QgK3ggTW9kdWxlcy9sZF9zb19haXhdKQpkaWZmIC0tZ2l0IGEvcHljb25maWcuaC5pbiBiL3B5Y29uZmlnLmguaW4KaW5kZXggNTA3YTdhYi4uMTA0MjZjNyAxMDA2NDQKLS0tIGEvcHljb25maWcuaC5pbgorKysgYi9weWNvbmZpZy5oLmluCkBAIC0xODMsNiArMTgzLDkgQEAKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZGlyZWN0Lmg+IGhlYWRlciBmaWxlLiAqLwogI3VuZGVmIEhBVkVfRElSRUNUX0gKIAorLyogRGVmaW5lIHRvIDEgaWYgdGhlIGRpcmVudCBzdHJ1Y3R1cmUgaGFzIGEgZF90eXBlIGZpZWxkICovCisjdW5kZWYgSEFWRV9ESVJFTlRfRF9UWVBFCisKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZGlyZW50Lmg+IGhlYWRlciBmaWxlLCBhbmQgaXQgZGVmaW5lcyBgRElSJy4KICAgICovCiAjdW5kZWYgSEFWRV9ESVJFTlRfSAo=