ZGlmZiAtLWdpdCBhL2RvY3VtZW50YXRpb24vYWFjRGVjb2Rlci5wZGYgYi9kb2N1bWVudGF0aW9uL2FhY0RlY29kZXIucGRmCmluZGV4IGQzODg1NzYuLjQ1OGZkYTEgMTAwNjQ0Ci0tLSBhL2RvY3VtZW50YXRpb24vYWFjRGVjb2Rlci5wZGYKKysrIGIvZG9jdW1lbnRhdGlvbi9hYWNEZWNvZGVyLnBkZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJBQUNkZWMvaW5jbHVkZS9hYWNkZWNvZGVyX2xpYi5oIGIvbGliQUFDZGVjL2luY2x1ZGUvYWFjZGVjb2Rlcl9saWIuaAppbmRleCBhMGMwODU0Li43YWI2MGYxIDEwMDY0NAotLS0gYS9saWJBQUNkZWMvaW5jbHVkZS9hYWNkZWNvZGVyX2xpYi5oCisrKyBiL2xpYkFBQ2RlYy9pbmNsdWRlL2FhY2RlY29kZXJfbGliLmgKQEAgLTIsNyArMiw3IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KQEAgLTM3OCw2ICszNzgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGV4aXN0LiAqLwogICBBQUNfREVDX05FRURfVE9fUkVTVEFSVCAgICAgICAgICAgICAgICA9IDB4MjAwQiwgIC8qITwgVGhlIGRlY29kZXIgbmVlZHMgdG8gYmUgcmVzdGFydGVkLCBzaW5jZSB0aGUgcmVxdWllcmVkIGNvbmZpZ3VyYXRpb24gY2hhbmdlIGNhbm5vdCBiZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWVkLiAqLworICBBQUNfREVDX09VVFBVVF9CVUZGRVJfVE9PX1NNQUxMICAgICAgICA9IDB4MjAwQywgIC8qITwgVGhlIHByb3ZpZGVkIG91dHB1dCBidWZmZXIgaXMgdG9vIHNtYWxsLiAqLwogICBhYWNfZGVjX2luaXRfZXJyb3JfZW5kICAgICAgICAgICAgICAgICA9IDB4MkZGRiwKIAogICAvKiBEZWNvZGUgZXJyb3JzLiBPdXRwdXQgYnVmZmVyIGlzIHZhbGlkIGJ1dCBjb25jZWFsZWQuICovCmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL2FhY19yb20uY3BwIGIvbGliQUFDZGVjL3NyYy9hYWNfcm9tLmNwcAppbmRleCA2MDdjYjNiLi5mM2M5YjVhIDEwMDY0NAotLS0gYS9saWJBQUNkZWMvc3JjL2FhY19yb20uY3BwCisrKyBiL2xpYkFBQ2RlYy9zcmMvYWFjX3JvbS5jcHAKQEAgLTIsNyArMiw3IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KQEAgLTE2Nyw2ICsxNjcsMzYgQEAKIH0gOwogCiAKKy8qIDQxIHNjZmJhbmRzICovCitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzk2XzEwMjRbNDJdID0KK3sKKyAgICAgMCwgICAgNCwgICAgOCwgICAxMiwgICAxNiwgICAyMCwgICAyNCwgICAyOCwgICAzMiwgICAzNiwgICA0MCwgICA0NCwKKyAgICA0OCwgICA1MiwgICA1NiwgICA2NCwgICA3MiwgICA4MCwgICA4OCwgICA5NiwgIDEwOCwgIDEyMCwgIDEzMiwgIDE0NCwKKyAgIDE1NiwgIDE3MiwgIDE4OCwgIDIxMiwgIDI0MCwgIDI3NiwgIDMyMCwgIDM4NCwgIDQ0OCwgIDUxMiwgIDU3NiwgIDY0MCwKKyAgIDcwNCwgIDc2OCwgIDgzMiwgIDg5NiwgIDk2MCwgMTAyNAorfTsKKy8qIDEyIHNjZmJhbmRzICovCitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzk2XzEyOFsxM10gPQoreworICAgICAwLCAgICA0LCAgICA4LCAgIDEyLCAgIDE2LCAgIDIwLCAgIDI0LCAgIDMyLCAgIDQwLCAgIDQ4LCAgICA2NCwgIDkyLAorICAgMTI4Cit9OworCisvKiA0NyBzY2ZiYW5kcyovCitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzY0XzEwMjRbNDhdID0KK3sKKyAgICAgMCwgICA0LCAgIDgsICAxMiwgIDE2LCAgMjAsICAyNCwgICAyOCwgIDMyLCAgMzYsICA0MCwgIDQ0LCAgNDgsICA1MiwKKyAgICA1NiwgIDY0LCAgNzIsICA4MCwgIDg4LCAxMDAsIDExMiwgIDEyNCwgMTQwLCAxNTYsIDE3MiwgMTkyLCAyMTYsIDI0MCwKKyAgIDI2OCwgMzA0LCAzNDQsIDM4NCwgNDI0LCA0NjQsIDUwNCwgIDU0NCwgNTg0LCA2MjQsIDY2NCwgNzA0LCA3NDQsIDc4NCwKKyAgIDgyNCwgODY0LCA5MDQsIDk0NCwgOTg0LDEwMjQKK307CisKKy8qIDEyIHNjZmJhbmRzICovCitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzY0XzEyOFsxM10gPQoreworICAgICAwLCAgIDQsICAgOCwgIDEyLCAgMTYsICAyMCwgIDI0LAorICAgIDMyLCAgNDAsICA0OCwgIDY0LCAgOTIsIDEyOAorfTsKIAogLyogNDkgc2NmYmFuZHMgKi8KIHN0YXRpYyBjb25zdCBTSE9SVCBzZmJfNDhfMTAyNFs1MF0gPSB7CkBAIC0yMzksNiArMjY5LDM1IEBACiB9OwogCiAKK3N0YXRpYyBjb25zdCBTSE9SVCBzZmJfOTZfOTYwWzQyXSA9Cit7CisgIDAsICAgICAgNCwgICAgICA4LCAgICAgIDEyLCAgICAgMTYsICAgICAyMCwgICAgIDI0LCAgICAgMjgsICAgICAzMiwgICAgIDM2LAorICA0MCwgICAgIDQ0LCAgICAgNDgsICAgICA1MiwgICAgIDU2LCAgICAgNjQsICAgICA3MiwgICAgIDgwLCAgICAgODgsICAgICA5NiwKKyAgMTA4LCAgICAxMjAsICAgIDEzMiwgICAgMTQ0LCAgICAxNTYsICAgIDE3MiwgICAgMTg4LCAgICAyMTIsICAgIDI0MCwgICAgMjc2LAorICAzMjAsICAgIDM4NCwgICAgNDQ4LCAgICA1MTIsICAgIDU3NiwgICAgNjQwLCAgICA3MDQsICAgIDc2OCwgICAgODMyLCAgICA4OTYsCisgIDk2MAorfTsgICAvKiA0MCBzY2ZiYW5kcyAqLworCitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzk2XzEyMFsxM10gPQoreworICAwLCAgICAgIDQsICAgICAgOCwgICAgICAxMiwgICAgIDE2LCAgICAgMjAsICAgICAyNCwgICAgIDMyLCAgICAgNDAsICAgICA0OCwKKyAgNjQsICAgICA5MiwgICAgIDEyMAorfTsgICAvKiAxMiBzY2ZiYW5kcyAqLworCitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzY0Xzk2MFs0N10gPQoreworICAwLCAgICAgIDQsICAgICAgOCwgICAgICAxMiwgICAgIDE2LCAgICAgMjAsICAgICAyNCwgICAgIDI4LCAgICAgMzIsICAgICAzNiwKKyAgNDAsICAgICA0NCwgICAgIDQ4LCAgICAgNTIsICAgICA1NiwgICAgIDY0LCAgICAgNzIsICAgICA4MCwgICAgIDg4LCAgICAgMTAwLAorICAxMTIsICAgIDEyNCwgICAgMTQwLCAgICAxNTYsICAgIDE3MiwgICAgMTkyLCAgICAyMTYsICAgIDI0MCwgICAgMjY4LCAgICAzMDQsCisgIDM0NCwgICAgMzg0LCAgICA0MjQsICAgIDQ2NCwgICAgNTA0LCAgICA1NDQsICAgIDU4NCwgICAgNjI0LCAgICA2NjQsICAgIDcwNCwKKyAgNzQ0LCAgICA3ODQsICAgIDgyNCwgICAgODY0LCAgICA5MDQsICAgIDk0NCwgICAgOTYwCit9OyAgIC8qIDQ2IHNjZmJhbmRzICovCisKK3N0YXRpYyBjb25zdCBTSE9SVCBzZmJfNjRfMTIwWzEzXSA9Cit7CisgIDAsICAgICAgNCwgICAgICA4LCAgICAgIDEyLCAgICAgMTYsICAgICAyMCwgICAgIDI0LCAgICAgMzIsICAgICA0MCwgICAgIDQ4LAorICA2NCwgICAgIDkyLCAgICAgMTIwCit9OyAgIC8qIDEyIHNjZmJhbmRzICovCiAKIHN0YXRpYyBjb25zdCBTSE9SVCBzZmJfNDhfOTYwWzUwXSA9CiB7CkBAIC0zNTgsOSArNDE3LDkgQEAKIGNvbnN0IFNGQl9JTkZPIHNmYk9mZnNldFRhYmxlc1s1XVsxNl0gPQogewogICB7Ci0gICAgeyBOVUxMLCBOVUxMLCAwLCAwIH0sCi0gICAgeyBOVUxMLCBOVUxMLCAwLCAwIH0sCi0gICAgeyBOVUxMLCBOVUxMLCAwLCAwIH0sCisgICAgeyBzZmJfOTZfMTAyNCwgc2ZiXzk2XzEyOCwgNDEsIDEyIH0sCisgICAgeyBzZmJfOTZfMTAyNCwgc2ZiXzk2XzEyOCwgNDEsIDEyIH0sCisgICAgeyBzZmJfNjRfMTAyNCwgc2ZiXzY0XzEyOCwgNDcsIDEyIH0sCiAgICAgeyBzZmJfNDhfMTAyNCwgc2ZiXzQ4XzEyOCwgNDksIDE0IH0sCiAgICAgeyBzZmJfNDhfMTAyNCwgc2ZiXzQ4XzEyOCwgNDksIDE0IH0sCiAgICAgeyBzZmJfMzJfMTAyNCwgc2ZiXzQ4XzEyOCwgNTEsIDE0IH0sCkBAIC0zNzIsOSArNDMxLDkgQEAKICAgICB7IHNmYl84XzEwMjQsIHNmYl84XzEyOCwgNDAsIDE1IH0sCiAgICAgeyBzZmJfOF8xMDI0LCBzZmJfOF8xMjgsIDQwLCAxNSB9LAogICB9LCB7Ci0gICAgeyBOVUxMLCBOVUxMLCAwLCAwIH0sCi0gICAgeyBOVUxMLCBOVUxMLCAwLCAwIH0sCi0gICAgeyBOVUxMLCBOVUxMLCAwLCAwIH0sCisgICAgeyBzZmJfOTZfOTYwLCBzZmJfOTZfMTIwLCA0MCwgMTIgfSwKKyAgICB7IHNmYl85Nl85NjAsIHNmYl85Nl8xMjAsIDQwLCAxMiB9LAorICAgIHsgc2ZiXzY0Xzk2MCwgc2ZiXzY0XzEyMCwgNDYsIDEyIH0sCiAgICAgeyBzZmJfNDhfOTYwLCBzZmJfNDhfMTIwLCA0OSwgMTQgfSwKICAgICB7IHNmYl80OF85NjAsIHNmYl80OF8xMjAsIDQ5LCAxNCB9LAogICAgIHsgc2ZiXzMyXzk2MCwgc2ZiXzQ4XzEyMCwgNDksIDE0IH0sCkBAIC0zODgsOSArNDQ3LDkgQEAKICAgfSwgewogICAgIHsgTlVMTCwgTlVMTCwgMCwgMCB9LAogICB9LCB7Ci0gICAgeyBOVUxMLCBOVUxMLCAwLCAwIH0sCi0gICAgeyBOVUxMLCBOVUxMLCAwLCAwIH0sCi0gICAgeyBOVUxMLCBOVUxMLCAwLCAwIH0sCisgICAgeyBzZmJfNDhfNTEyLCAgTlVMTCwgMzYsIDAgfSwKKyAgICB7IHNmYl80OF81MTIsICBOVUxMLCAzNiwgMCB9LAorICAgIHsgc2ZiXzQ4XzUxMiwgIE5VTEwsIDM2LCAwIH0sCiAgICAgeyBzZmJfNDhfNTEyLCAgTlVMTCwgMzYsIDAgfSwKICAgICB7IHNmYl80OF81MTIsIE5VTEwsIDM2LCAwfSwKICAgICB7IHNmYl8zMl81MTIsIE5VTEwsIDM3LCAwIH0sCkBAIC00MDIsOSArNDYxLDkgQEAKICAgICB7IHNmYl8yNF81MTIsIE5VTEwsIDMxLCAwIH0sCiAgICAgeyBzZmJfMjRfNTEyLCBOVUxMLCAzMSwgMCB9LAogICB9LCB7Ci0gICAgeyBOVUxMLCBOVUxMLCAwLCAwIH0sCi0gICAgeyBOVUxMLCBOVUxMLCAwLCAwIH0sCi0gICAgeyBOVUxMLCBOVUxMLCAwLCAwIH0sCisgICAgeyBzZmJfNDhfNDgwLCBOVUxMLCAzNSwgMCB9LAorICAgIHsgc2ZiXzQ4XzQ4MCwgTlVMTCwgMzUsIDAgfSwKKyAgICB7IHNmYl80OF80ODAsIE5VTEwsIDM1LCAwIH0sCiAgICAgeyBzZmJfNDhfNDgwLCBOVUxMLCAzNSwgMCB9LAogICAgIHsgc2ZiXzQ4XzQ4MCwgTlVMTCwgMzUsIDAgfSwKICAgICB7IHNmYl8zMl80ODAsIE5VTEwsIDM3LCAwIH0sCmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL2FhY2RlY29kZXIuY3BwIGIvbGliQUFDZGVjL3NyYy9hYWNkZWNvZGVyLmNwcAppbmRleCA4MjcwZjY5Li41NzllNDcwIDEwMDY0NAotLS0gYS9saWJBQUNkZWMvc3JjL2FhY2RlY29kZXIuY3BwCisrKyBiL2xpYkFBQ2RlYy9zcmMvYWFjZGVjb2Rlci5jcHAKQEAgLTE1Nyw2ICsxNTcsNyBAQAogCiAjaW5jbHVkZSAiY29uY2VhbC5oIgogCisgICNpbmNsdWRlICJGREtfY3JjLmgiCiAKIAogdm9pZCBDQWFjRGVjb2Rlcl9TeW5jUW1mTW9kZShIQU5ETEVfQUFDREVDT0RFUiBzZWxmKQpAQCAtNTM3LDggKzUzOCw5IEBACiAgICAgICAgICAgICAgICAgcHJldmlvdXNfZWxlbWVudCwKICAgICAgICAgICAgICAgICBlbEluZGV4LAogICAgICAgICAgICAgICAgIHNlbGYtPmZsYWdzICYgQUNfSU5ERVAgKTsKLSAgICAgICAgLyogRW5hYmxlIFNCUiBmb3IgaW1wbGljaXQgU0JSIHNpZ25hbGxpbmcuICovCi0gICAgICAgIGlmIChzYnJFcnJvciA9PSBTQlJERUNfT0spIHsKKyAgICAgICAgLyogRW5hYmxlIFNCUiBmb3IgaW1wbGljaXQgU0JSIHNpZ25hbGxpbmcgYnV0IG9ubHkgaWYgbm8gc2V2ZXJlIGVycm9yIGhhcHBlbmQuICovCisgICAgICAgIGlmICggKHNickVycm9yID09IFNCUkRFQ19PSykKKyAgICAgICAgICB8fCAoc2JyRXJyb3IgPT0gU0JSREVDX1BBUlNFX0VSUk9SKSApIHsKICAgICAgICAgICBzZWxmLT5zYnJFbmFibGVkID0gMTsKICAgICAgICAgfQogICAgICAgfSBlbHNlIHsKQEAgLTU1Myw3ICs1NTUsNyBAQAogICAgICAgICBGREtwdXNoQmlEaXJlY3Rpb25hbChoQnMsICpjb3VudCk7CiAgICAgICAgICpjb3VudCA9IDA7CiAgICAgICB9IGVsc2UgewotICAgICAgICAvKiBJZiB0aGlzIGlzIG5vdCBhIGZpbGwgZWxlbWVudCB3aXRoIGEga25vd24gbGVuZ3RoLCB3ZSBhcmUgc2NyZXdlZCBhbiBubyBmdXJ0aGVyIHBhcnNpbmcgbWFrZXMgc2Vuc2UuICovCisgICAgICAgIC8qIElmIHRoaXMgaXMgbm90IGEgZmlsbCBlbGVtZW50IHdpdGggYSBrbm93biBsZW5ndGgsIHdlIGFyZSBzY3Jld2VkIGFuZCBmdXJ0aGVyIHBhcnNpbmcgbWFrZXMgbm8gc2Vuc2UuICovCiAgICAgICAgIGlmIChzYnJFcnJvciAhPSBTQlJERUNfT0spIHsKICAgICAgICAgICBzZWxmLT5mcmFtZU9LID0gMDsKICAgICAgICAgfQpAQCAtODMyLDEyICs4MzQsMTggQEAKICAgc3dpdGNoIChhc2MtPm1fYW90KSB7CiAgIGNhc2UgQU9UX0FBQ19MQzoKICAgICBzZWxmLT5zdHJlYW1JbmZvLnByb2ZpbGUgPSAxOwotICAgIGJyZWFrOworCisgIGNhc2UgQU9UX0VSX0FBQ19TQ0FMOgorICAgIGlmIChhc2MtPm1fc2MubV9nYVNwZWNpZmljQ29uZmlnLm1fbGF5ZXIgPiAwKSB7CisgICAgICAvKiBhYWNfc2NhbGFibGVfZXh0ZW5zaW9uX2VsZW1lbnQoKSBjdXJyZW50bHkgbm90IHN1cHBvcnRlZC4gKi8KKyAgICAgIHJldHVybiBBQUNfREVDX1VOU1VQUE9SVEVEX0ZPUk1BVDsKKyAgICB9CiAKICAgY2FzZSBBT1RfU0JSOgogICBjYXNlIEFPVF9QUzoKICAgY2FzZSBBT1RfRVJfQUFDX0xEOgogICBjYXNlIEFPVF9FUl9BQUNfRUxEOgorICBjYXNlIEFPVF9EUk1fQUFDOgogICAgIGJyZWFrOwogCiAgIGRlZmF1bHQ6CkBAIC05NTcsMTEgKzk2NSwyMCBAQAogCiAgIGlmIChhc2MtPm1fYW90ID09IEFPVF9FUl9BQUNfRUxEKSB7CiAgICAgc2VsZi0+ZmxhZ3MgfD0gIEFDX0VMRDsKKyAgICBzZWxmLT5mbGFncyB8PSAoYXNjLT5tX3NiclByZXNlbnRGbGFnKSA/IEFDX1NCUl9QUkVTRU5UIDogMDsgIC8qIE5lZWQgdG8gc2V0IHRoZSBTQlIgZmxhZyBmb3IgYmFja3dhcmQtY29tcGF0aWJpbGl0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29ucy4gRXZlbiBpZiBTQlIgaXMgbm90IHN1cHBvcnRlZC4gKi8KICAgICBzZWxmLT5mbGFncyB8PSAoYXNjLT5tX3NjLm1fZWxkU3BlY2lmaWNDb25maWcubV9zYnJDcmNGbGFnKSA/IEFDX1NCUkNSQyA6IDA7CiAgICAgc2VsZi0+ZmxhZ3MgfD0gKGFzYy0+bV9zYy5tX2VsZFNwZWNpZmljQ29uZmlnLm1fdXNlTGRRbWZUaW1lQWxpZ24pID8gQUNfTERfTVBTIDogMDsKICAgfQogICBzZWxmLT5mbGFncyB8PSAoYXNjLT5tX2FvdCA9PSBBT1RfRVJfQUFDX0xEKSA/IEFDX0xEIDogMDsKICAgc2VsZi0+ZmxhZ3MgfD0gKGFzYy0+bV9lcENvbmZpZyA+PSAwKSA/IEFDX0VSIDogMDsKKyAgaWYgKCBhc2MtPm1fYW90ID09IEFPVF9EUk1fQUFDICkgeworICAgIHNlbGYtPmZsYWdzIHw9IEFDX0RSTXxBQ19TQlJDUkN8QUNfU0NBTEFCTEU7CisgIH0KKyAgaWYgKCAoYXNjLT5tX2FvdCA9PSBBT1RfQUFDX1NDQUwpCisgICAgfHwgKGFzYy0+bV9hb3QgPT0gQU9UX0VSX0FBQ19TQ0FMKSApIHsKKyAgICBzZWxmLT5mbGFncyB8PSBBQ19TQ0FMQUJMRTsKKyAgfQogCiAKICAgaWYgKGFzYy0+bV9zYnJQcmVzZW50RmxhZykgewpAQCAtMTE0Nyw2ICsxMTY0LDkgQEAKIAogICAvKiBDaGVjayBzYW1wbGluZyBmcmVxdWVuY3kgICovCiAgIHN3aXRjaCAoIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlUmF0ZSApIHsKKyAgICBjYXNlIDk2MDAwOgorICAgIGNhc2UgODgyMDA6CisgICAgY2FzZSA2NDAwMDoKICAgICBjYXNlIDE2MDAwOgogICAgIGNhc2UgMTIwMDA6CiAgICBjYXNlIDExMDI1OgpAQCAtMTQ3NSw3ICsxNDk1LDcgQEAKICAgICAgICAgICAvKiBnZXQgdGhlIHJlbWFpbmluZyBiaXRzIG9mIHRoaXMgZnJhbWUgKi8KICAgICAgICAgICBiaXRDbnQgPSB0cmFuc3BvcnREZWNfR2V0QXVCaXRzUmVtYWluaW5nKHNlbGYtPmhJbnB1dCwgMCk7CiAKLSAgICAgICAgICBpZiAoIChiaXRDbnQgPiAwKSAmJiAoc2VsZi0+ZmxhZ3MgJiBBQ19TQlJfUFJFU0VOVCkgJiYgKHNlbGYtPmZsYWdzICYgKEFDX1VTQUN8QUNfUlNWRDUwfEFDX0VMRCkpICkKKyAgICAgICAgICBpZiAoIChiaXRDbnQgPiAwKSAmJiAoc2VsZi0+ZmxhZ3MgJiBBQ19TQlJfUFJFU0VOVCkgJiYgKHNlbGYtPmZsYWdzICYgKEFDX1VTQUN8QUNfUlNWRDUwfEFDX0VMRHxBQ19EUk0pKSApCiAgICAgICAgICAgewogICAgICAgICAgICAgU0JSX0VSUk9SIGVyciA9IFNCUkRFQ19PSzsKICAgICAgICAgICAgIGludCAgZWxJZHgsIG51bUNoRWxlbWVudHMgPSBlbF9jbnRbSURfU0NFXSArIGVsX2NudFtJRF9DUEVdOwpAQCAtMTUxMyw2ICsxNTMzLDEzIEBACiAgICAgICAgICAgfQogCiAKKyAgICAgICAgICBpZiAoc2VsZi0+ZmxhZ3MgJiBBQ19EUk0pCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKChiaXRDbnQgPSAoSU5UKUZES2dldFZhbGlkQml0cyhicykpICE9IDApIHsKKyAgICAgICAgICAgICAgRkRLcHVzaEJpRGlyZWN0aW9uYWwoYnMsIGJpdENudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCiAgICAgICAgICAgaWYgKCAhIChzZWxmLT5mbGFncyAmIChBQ19VU0FDfEFDX1JTVkQ1MHxBQ19EUk0pKSApCiAgICAgICAgICAgewogICAgICAgICAgICAgd2hpbGUgKCBiaXRDbnQgPiA3ICkgewpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy9hYWNkZWNvZGVyLmggYi9saWJBQUNkZWMvc3JjL2FhY2RlY29kZXIuaAppbmRleCAzNTQxNzczLi4yNWJjMzVkIDEwMDY0NAotLS0gYS9saWJBQUNkZWMvc3JjL2FhY2RlY29kZXIuaAorKysgYi9saWJBQUNkZWMvc3JjL2FhY2RlY29kZXIuaApAQCAtMiw3ICsyLDcgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgpAQCAtMjI2LDYgKzIyNiw4IEBACiAgIEZJWFBfREJMICAgICBleHRHYWluWzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgR2FpbiB0aGF0IG11c3QgYmUgYXBwbGllZCB0byB0aGUgb3V0cHV0IHNpZ25hbC4gKi8KICAgVUlOVCAgICAgICAgIGV4dEdhaW5EZWxheTsgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBEZWxheSB0aGF0IG11c3QgYmUgYWNjb3VudGVkIGZvciBleHRHYWluLiAqLwogCisgIElOVF9QQ00gICAgICBwY21PdXRwdXRCdWZmZXJbKDgpKigyMDQ4KV07CisKIH07CiAKIApkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy9hYWNkZWNvZGVyX2xpYi5jcHAgYi9saWJBQUNkZWMvc3JjL2FhY2RlY29kZXJfbGliLmNwcAppbmRleCBiNTAxZWI5Li44ODYzZGE1IDEwMDY0NAotLS0gYS9saWJBQUNkZWMvc3JjL2FhY2RlY29kZXJfbGliLmNwcAorKysgYi9saWJBQUNkZWMvc3JjL2FhY2RlY29kZXJfbGliLmNwcApAQCAtMTEwLDcgKzExMCw3IEBACiAvKiBEZWNvZGVyIGxpYnJhcnkgaW5mbyAqLwogI2RlZmluZSBBQUNERUNPREVSX0xJQl9WTDAgMgogI2RlZmluZSBBQUNERUNPREVSX0xJQl9WTDEgNQotI2RlZmluZSBBQUNERUNPREVSX0xJQl9WTDIgMTEKKyNkZWZpbmUgQUFDREVDT0RFUl9MSUJfVkwyIDE3CiAjZGVmaW5lIEFBQ0RFQ09ERVJfTElCX1RJVExFICJBQUMgRGVjb2RlciBMaWIiCiAjaWZkZWYgX19BTkRST0lEX18KICNkZWZpbmUgQUFDREVDT0RFUl9MSUJfQlVJTERfREFURSAiIgpAQCAtMTgxLDggKzE4MSw5IEBACiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgLyogaWYgYmFzZWxheWVyIGlzIE9LIHdlIGNvbnRpbnVlIGRlY29kaW5nICovCi0gICAgICAgIGlmKGxheWVyICA+PSAxKXsKKyAgICAgICAgaWYobGF5ZXIgPj0gMSl7CiAgICAgICAgICAgc2VsZi0+bnJPZkxheWVycyA9IGxheWVyOworICAgICAgICAgIGVyciA9IEFBQ19ERUNfT0s7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgICB9CkBAIC03ODUsOCArNzg2LDggQEAKIAogTElOS1NQRUNfQ1BQIEFBQ19ERUNPREVSX0VSUk9SIGFhY0RlY29kZXJfRGVjb2RlRnJhbWUoCiAgICAgICAgIEhBTkRMRV9BQUNERUNPREVSICBzZWxmLAotICAgICAgICBJTlRfUENNICAgICAgICAgICAqcFRpbWVEYXRhLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgdGltZURhdGFTaXplLAorICAgICAgICBJTlRfUENNICAgICAgICAgICAqcFRpbWVEYXRhX2V4dGVybiwKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgIHRpbWVEYXRhU2l6ZV9leHRlcm4sCiAgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICBmbGFncykKIHsKICAgICBBQUNfREVDT0RFUl9FUlJPUiBFcnJvclN0YXR1czsKQEAgLTc5NiwxMiArNzk3LDE3IEBACiAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzOwogICAgIGludCBmVHBJbnRlcnJ1cHRpb24gPSAwOyAgLyogVHJhbnNwb3J0IG9yaWdpbmF0ZWQgaW50ZXJydXB0aW9uIGRldGVjdGlvbi4gKi8KICAgICBpbnQgZlRwQ29uY2VhbCA9IDA7ICAgICAgIC8qIFRyYW5zcG9ydCBvcmlnaW5hdGVkIGNvbmNlYWxtZW50LiAqLworICAgIElOVF9QQ00gKnBUaW1lRGF0YSA9IE5VTEw7CisgICAgSU5UIHRpbWVEYXRhU2l6ZSA9IDA7CiAKIAogICAgIGlmIChzZWxmID09IE5VTEwpIHsKICAgICAgIHJldHVybiBBQUNfREVDX0lOVkFMSURfSEFORExFOwogICAgIH0KIAorICAgIHBUaW1lRGF0YSA9IHNlbGYtPnBjbU91dHB1dEJ1ZmZlcjsKKyAgICB0aW1lRGF0YVNpemUgPSBzaXplb2Yoc2VsZi0+cGNtT3V0cHV0QnVmZmVyKS9zaXplb2YoKnNlbGYtPnBjbU91dHB1dEJ1ZmZlcik7CisKICAgICBpZiAoZmxhZ3MgJiBBQUNERUNfSU5UUikgewogICAgICAgc2VsZi0+c3RyZWFtSW5mby5udW1Mb3N0QWNjZXNzVW5pdHMgPSAwOwogICAgIH0KQEAgLTkxOCw3ICs5MjQsOCBAQAogICAgIGlmIChzZWxmLT5zYnJFbmFibGVkKQogICAgIHsKICAgICAgIFNCUl9FUlJPUiBzYnJFcnJvciA9IFNCUkRFQ19PSzsKLSAgICAgIGludCBjaE91dE1hcElkeCA9ICgoc2VsZi0+Y2hNYXBJbmRleD09MCkgJiYgKHNlbGYtPnN0cmVhbUluZm8ubnVtQ2hhbm5lbHM8NykpID8gc2VsZi0+c3RyZWFtSW5mby5udW1DaGFubmVscyA6IHNlbGYtPmNoTWFwSW5kZXg7CisgICAgICBpbnQgY2hJZHgsIG51bUNvcmVDaGFubmVsID0gc2VsZi0+c3RyZWFtSW5mby5udW1DaGFubmVsczsKKyAgICAgIGludCBjaE91dE1hcElkeCA9ICgoc2VsZi0+Y2hNYXBJbmRleD09MCkgJiYgKG51bUNvcmVDaGFubmVsPDcpKSA/IG51bUNvcmVDaGFubmVsIDogc2VsZi0+Y2hNYXBJbmRleDsKIAogICAgICAgLyogc2V0IHBhcmFtcyAqLwogICAgICAgc2JyRGVjb2Rlcl9TZXRQYXJhbSAoIHNlbGYtPmhTYnJEZWNvZGVyLApAQCAtOTc4LDEwICs5ODUsMTAgQEAKIAogICAgICAgIGlmIChzZWxmLT5wc1Bvc3NpYmxlKSB7CiAgICAgICAgICBzZWxmLT5mbGFncyB8PSBBQ19QU19QUkVTRU5UOwotICAgICAgICAgc2VsZi0+Y2hhbm5lbFR5cGVbMF0gPSBBQ1RfRlJPTlQ7Ci0gICAgICAgICBzZWxmLT5jaGFubmVsVHlwZVsxXSA9IEFDVF9GUk9OVDsKLSAgICAgICAgIHNlbGYtPmNoYW5uZWxJbmRpY2VzWzBdID0gMDsKLSAgICAgICAgIHNlbGYtPmNoYW5uZWxJbmRpY2VzWzFdID0gMTsKKyAgICAgICB9CisgICAgICAgZm9yIChjaElkeCA9IG51bUNvcmVDaGFubmVsOyBjaElkeCA8IHNlbGYtPnN0cmVhbUluZm8ubnVtQ2hhbm5lbHM7IGNoSWR4Kz0xKSB7CisgICAgICAgICBzZWxmLT5jaGFubmVsVHlwZVtjaElkeF0gPSBBQ1RfRlJPTlQ7CisgICAgICAgICBzZWxmLT5jaGFubmVsSW5kaWNlc1tjaElkeF0gPSBjaElkeDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KQEAgLTEwMDYsNyArMTAxMyw4IEBACiAgICAgICAgICAgICBzZWxmLT5jaGFubmVsT3V0cHV0TWFwcGluZywKICAgICAgICAgICAgIChzZWxmLT5saW1pdGVyRW5hYmxlQ3VycikgPyAmcGNtTGltaXRlclNjYWxlIDogTlVMTAogICAgICAgKTsKLSAgICBpZiAoZG14RXJyID09IFBDTURNWF9JTlZBTElEX01PREUpIHsKKyAgICBpZiAoIChFcnJvclN0YXR1cyA9PSBBQUNfREVDX09LKQorICAgICAgJiYgKGRteEVyciA9PSBQQ01ETVhfSU5WQUxJRF9NT0RFKSApIHsKICAgICAgIC8qIEFubm91bmNlIHRoZSBmcmFtZXdvcmsgdGhhdCB0aGUgY3VycmVudCBjb21iaW5hdGlvbiBvZiBjaGFubmVsIGNvbmZpZ3VyYXRpb24gYW5kIGRvd25taXgKICAgICAgICAqIHNldHRpbmdzIGFyZSBub3Qga25vdyB0byBwcm9kdWNlIGEgcHJlZGljdGFibGUgYmVoYXZpb3IgYW5kIHRodXMgbWF5YmUgcHJvZHVjZSBzdHJhbmdlIG91dHB1dC4gKi8KICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19ERUNPREVfRlJBTUVfRVJST1I7CkBAIC0xMDUxLDYgKzEwNTksMTkgQEAKICAgICAvKiBVcGRhdGUgU3RhdGlzdGljcyAqLwogICAgIGFhY0RlY29kZXJfVXBkYXRlQml0U3RyZWFtQ291bnRlcnMoJnNlbGYtPnN0cmVhbUluZm8sIGhCcywgbkJpdHMsIEVycm9yU3RhdHVzKTsKIAorICAgIC8qIENoZWNrIHdoZXRoZXIgZXh0ZXJuYWwgb3V0cHV0IGJ1ZmZlciBpcyBsYXJnZSBlbm91Z2guICovCisgICAgaWYgKHRpbWVEYXRhU2l6ZV9leHRlcm4gPCBzZWxmLT5zdHJlYW1JbmZvLm51bUNoYW5uZWxzKnNlbGYtPnN0cmVhbUluZm8uZnJhbWVTaXplKSB7CisgICAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfT1VUUFVUX0JVRkZFUl9UT09fU01BTEw7CisgICAgfQorCisgICAgLyogVXBkYXRlIGV4dGVybmFsIG91dHB1dCBidWZmZXIuICovCisgICAgaWYgKCBJU19PVVRQVVRfVkFMSUQoRXJyb3JTdGF0dXMpICkgeworICAgICAgRkRLbWVtY3B5KHBUaW1lRGF0YV9leHRlcm4sIHBUaW1lRGF0YSwgc2VsZi0+c3RyZWFtSW5mby5udW1DaGFubmVscypzZWxmLT5zdHJlYW1JbmZvLmZyYW1lU2l6ZSpzaXplb2YoKnBUaW1lRGF0YSkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIEZES21lbWNsZWFyKHBUaW1lRGF0YV9leHRlcm4sIHRpbWVEYXRhU2l6ZV9leHRlcm4qc2l6ZW9mKCpwVGltZURhdGFfZXh0ZXJuKSk7CisgICAgfQorCiAgICAgcmV0dXJuIEVycm9yU3RhdHVzOwogfQogCkBAIC0xMTIwLDYgKzExNDEsNyBAQAogICAvKiBTZXQgZmxhZ3MgKi8KICAgaW5mby0+ZmxhZ3MgPSAwCiAgICAgICB8IENBUEZfQUFDX0xDCisgICAgICB8IENBUEZfRVJfQUFDX1NDQUwKICAgICAgIHwgQ0FQRl9BQUNfVkNCMTEKICAgICAgIHwgQ0FQRl9BQUNfSENSCiAgICAgICB8IENBUEZfQUFDX1JWTEMKQEAgLTExMzAsNiArMTE1Miw3IEBACiAKICAgICAgIHwgQ0FQRl9BQUNfTVBFRzQKIAorICAgICAgfCBDQVBGX0FBQ19EUk1fQlNGT1JNQVQKIAogICAgICAgfCBDQVBGX0FBQ18xMDI0CiAgICAgICB8IENBUEZfQUFDXzk2MApkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy9ibG9jay5jcHAgYi9saWJBQUNkZWMvc3JjL2Jsb2NrLmNwcAppbmRleCA5ZDcwM2NjLi4yOTY1ZmE2IDEwMDY0NAotLS0gYS9saWJBQUNkZWMvc3JjL2Jsb2NrLmNwcAorKysgYi9saWJBQUNkZWMvc3JjL2Jsb2NrLmNwcApAQCAtMiw3ICsyLDcgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgpAQCAtMzI0LDExICszMjQsMTEgQEAKIAogICAgICAgaWYgKGZsYWdzICYgQUNfRVJfSENSKSB7CiAgICAgICAgIC8qIEhDUiBpbnB1dCAobG9uZykgLS0gY29sbGVjdGluZyBzaWRlaW5mbyAoZm9yIEhDUi1fbG9uZ18gb25seSkgKi8KLSAgICAgICAgcE51bUxpbmVzSW5TZWNbbnVtTGluZXNJblNlY0lkeF0gPSBCYW5kT2Zmc2V0c1t0b3BdIC0gQmFuZE9mZnNldHNbYmFuZF07Ci0gICAgICAgIG51bUxpbmVzSW5TZWNJZHgrKzsKICAgICAgICAgaWYgKG51bUxpbmVzSW5TZWNJZHggPj0gTUFYX1NGQl9IQ1IpIHsKICAgICAgICAgICByZXR1cm4gQUFDX0RFQ19QQVJTRV9FUlJPUjsKICAgICAgICAgfQorICAgICAgICBwTnVtTGluZXNJblNlY1tudW1MaW5lc0luU2VjSWR4XSA9IEJhbmRPZmZzZXRzW3RvcF0gLSBCYW5kT2Zmc2V0c1tiYW5kXTsKKyAgICAgICAgbnVtTGluZXNJblNlY0lkeCsrOwogICAgICAgICBpZiAoCiAgICAgICAgICAgICAgKHNlY3RfY2IgPT0gQk9PS1NDTCkgKQogICAgICAgICB7CmRpZmYgLS1naXQgYS9saWJGREsvc3JjL0ZES19jb3JlLmNwcCBiL2xpYkZESy9zcmMvRkRLX2NvcmUuY3BwCmluZGV4IGY0YjUxMGQuLjFkOGFjN2IgMTAwNjQ0Ci0tLSBhL2xpYkZESy9zcmMvRkRLX2NvcmUuY3BwCisrKyBiL2xpYkZESy9zcmMvRkRLX2NvcmUuY3BwCkBAIC05Myw3ICs5Myw3IEBACiAvKiBGREsgdG9vbHMgbGlicmFyeSBpbmZvICovCiAjZGVmaW5lIEZES19UT09MU19MSUJfVkwwIDIKICNkZWZpbmUgRkRLX1RPT0xTX0xJQl9WTDEgMwotI2RlZmluZSBGREtfVE9PTFNfTElCX1ZMMiA1CisjZGVmaW5lIEZES19UT09MU19MSUJfVkwyIDYKICNkZWZpbmUgRkRLX1RPT0xTX0xJQl9USVRMRSAiRkRLIFRvb2xzIgogI2lmZGVmIF9fQU5EUk9JRF9fCiAjZGVmaW5lIEZES19UT09MU19MSUJfQlVJTERfREFURSAiIgpkaWZmIC0tZ2l0IGEvbGliRkRLL3NyYy9GREtfdG9vbHNfcm9tLmNwcCBiL2xpYkZESy9zcmMvRkRLX3Rvb2xzX3JvbS5jcHAKaW5kZXggNDlmMGVlMS4uMjllMzdmMiAxMDA2NDQKLS0tIGEvbGliRkRLL3NyYy9GREtfdG9vbHNfcm9tLmNwcAorKysgYi9saWJGREsvc3JjL0ZES190b29sc19yb20uY3BwCkBAIC0yMjM2LDcgKzIyMzYsNyBAQAogICBpY3NfaW5mbywKICAgbXMsCiAgIGx0cF9kYXRhX3ByZXNlbnQsCi0gIGx0cF9kYXRhLAorICAvKiBsdHBfZGF0YSwgKi8KICAgZ2xvYmFsX2dhaW4sCiAgIHNlY3Rpb25fZGF0YSwKICAgc2NhbGVfZmFjdG9yX2RhdGEsCkBAIC0yMjQ3LDcgKzIyNDcsNyBAQAogICBuZXh0X2NoYW5uZWwsCiAKICAgbHRwX2RhdGFfcHJlc2VudCwKLSAgbHRwX2RhdGEsCisgIC8qIGx0cF9kYXRhLCAqLwogICBnbG9iYWxfZ2FpbiwKICAgc2VjdGlvbl9kYXRhLAogICBzY2FsZV9mYWN0b3JfZGF0YSwKQEAgLTIyOTAsNyArMjI5MCwxNzggQEAKICAgeyAmbm9kZV9hYWNfY3BlMF9lcGMxLCAmbm9kZV9hYWNfY3BlMV9lcGMxIH0KIH07CiAKKy8qCisgKiBBT1QgPSAyMAorICogZXBDb25maWcgPSAwCisgKi8KK3N0YXRpYyBjb25zdCByYmRfaWRfdCBlbF9zY2FsX3NjZV9lcGMwW10gPSB7CisgIGljc19pbmZvLCAgICAgICAgICAgIC8qIEVTQyAxICovCisgIHRuc19kYXRhX3ByZXNlbnQsCisgIGx0cF9kYXRhX3ByZXNlbnQsCisgIC8qIGx0cF9kYXRhLCAqLworICBnbG9iYWxfZ2FpbiwKKyAgc2VjdGlvbl9kYXRhLAorICBzY2FsZV9mYWN0b3JfZGF0YSwKKyAgZXNjMV9oY3IsCisgIGVzYzJfcnZsYywgICAgICAgICAgIC8qIEVTQyAyICovCisgIHRuc19kYXRhLCAgICAgICAgICAgIC8qIEVTQyAzICovCisgIHNwZWN0cmFsX2RhdGEsICAgICAgIC8qIEVTQyA0ICovCisgIGVuZF9vZl9zZXF1ZW5jZQorfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV9zY2FsX3NjZV9lcGMwID0geworICBlbF9zY2FsX3NjZV9lcGMwLAorICB7IE5VTEwsIE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IHJiZF9pZF90IGVsX3NjYWxfY3BlX2VwYzBbXSA9IHsKKyAgaWNzX2luZm8sICAgICAgICAgICAgLyogRVNDIDAgKi8KKyAgbXMsCisgIHRuc19kYXRhX3ByZXNlbnQsICAgIC8qIEVTQyAxIChjaCAwKSAqLworICBsdHBfZGF0YV9wcmVzZW50LAorICAvKiBsdHBfZGF0YSwgKi8KKyAgZ2xvYmFsX2dhaW4sCisgIHNlY3Rpb25fZGF0YSwKKyAgc2NhbGVfZmFjdG9yX2RhdGEsCisgIGVzYzFfaGNyLAorICBlc2MyX3J2bGMsICAgICAgICAgICAvKiBFU0MgMiAoY2ggMCkgKi8KKyAgdG5zX2RhdGEsICAgICAgICAgICAgLyogRVNDIDMgKGNoIDApICovCisgIHNwZWN0cmFsX2RhdGEsICAgICAgIC8qIEVTQyA0IChjaCAwKSAqLworICBuZXh0X2NoYW5uZWwsCisgIHRuc19kYXRhX3ByZXNlbnQsICAgIC8qIEVTQyAxIChjaCAxKSAqLworICBsdHBfZGF0YV9wcmVzZW50LAorICBnbG9iYWxfZ2FpbiwKKyAgc2VjdGlvbl9kYXRhLAorICBzY2FsZV9mYWN0b3JfZGF0YSwKKyAgZXNjMV9oY3IsCisgIGVzYzJfcnZsYywgICAgICAgICAgIC8qIEVTQyAyIChjaCAxKSAqLworICB0bnNfZGF0YSwgICAgICAgICAgICAvKiBFU0MgMyAoY2ggMSkgKi8KKyAgc3BlY3RyYWxfZGF0YSwgICAgICAgLyogRVNDIDQgKGNoIDEpICovCisgIGVuZF9vZl9zZXF1ZW5jZQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV9zY2FsX2NwZV9lcGMwID0geworICBlbF9zY2FsX2NwZV9lcGMwLAorICB7IE5VTEwsIE5VTEwgfQorfTsKKworLyoKKyAqIEFPVCA9IDIwCisgKiBlcENvbmZpZyA9IDEKKyAqLworc3RhdGljIGNvbnN0IHJiZF9pZF90IGVsX3NjYWxfc2NlX2VwYzFbXSA9IHsKKyAgaWNzX2luZm8sCisgIHRuc19kYXRhX3ByZXNlbnQsCisgIGx0cF9kYXRhX3ByZXNlbnQsCisgIC8qIGx0cF9kYXRhLCAqLworICBnbG9iYWxfZ2FpbiwKKyAgc2VjdGlvbl9kYXRhLAorICBzY2FsZV9mYWN0b3JfZGF0YSwKKyAgZXNjMV9oY3IsCisgIHRuc19kYXRhLAorICBzcGVjdHJhbF9kYXRhLAorICBlbmRfb2Zfc2VxdWVuY2UKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfc2NhbF9zY2VfZXBjMSA9IHsKKyAgZWxfc2NhbF9zY2VfZXBjMSwKKyAgeyBOVUxMLCBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCByYmRfaWRfdCBlbF9zY2FsX2NwZV9lcGMxW10gPSB7CisgIGljc19pbmZvLAorICBtcywKKyAgdG5zX2RhdGFfcHJlc2VudCwKKyAgbHRwX2RhdGFfcHJlc2VudCwKKyAgLyogbHRwX2RhdGEsICovCisgIGdsb2JhbF9nYWluLAorICBzZWN0aW9uX2RhdGEsCisgIHNjYWxlX2ZhY3Rvcl9kYXRhLAorICBlc2MxX2hjciwKKyAgbmV4dF9jaGFubmVsLAorICB0bnNfZGF0YV9wcmVzZW50LAorICBsdHBfZGF0YV9wcmVzZW50LAorICAvKiBsdHBfZGF0YSwgKi8KKyAgZ2xvYmFsX2dhaW4sCisgIHNlY3Rpb25fZGF0YSwKKyAgc2NhbGVfZmFjdG9yX2RhdGEsCisgIGVzYzFfaGNyLAorICBuZXh0X2NoYW5uZWwsCisgIHRuc19kYXRhLAorICBuZXh0X2NoYW5uZWwsCisgIHRuc19kYXRhLAorICBuZXh0X2NoYW5uZWwsCisgIHNwZWN0cmFsX2RhdGEsCisgIG5leHRfY2hhbm5lbCwKKyAgc3BlY3RyYWxfZGF0YSwKKyAgZW5kX29mX3NlcXVlbmNlCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGVsZW1lbnRfbGlzdCBub2RlX3NjYWxfY3BlX2VwYzEgPSB7CisgIGVsX3NjYWxfY3BlX2VwYzEsCisgIHsgTlVMTCwgTlVMTCB9Cit9OworCisvKgorICogUHNldWRvIEFPVCBmb3IgRFJNL0RSTSsgKHNpbWlsYXIgdG8gQU9UIDIwKQorICogRGVyaXZlZCBmcm9tIGVwQ29uZmlnID0gMQorICovCitzdGF0aWMgY29uc3QgcmJkX2lkX3QgZWxfZHJtX3NjZVtdID0geworICBkcm1jcmNfc3RhcnRfcmVnLAorICBpY3NfaW5mbywKKyAgdG5zX2RhdGFfcHJlc2VudCwKKyAgbHRwX2RhdGFfcHJlc2VudCwKKyAgLyogbHRwX2RhdGEsICovCisgIGdsb2JhbF9nYWluLAorICBzZWN0aW9uX2RhdGEsCisgIHNjYWxlX2ZhY3Rvcl9kYXRhLAorICBlc2MxX2hjciwKKyAgdG5zX2RhdGEsCisgIGRybWNyY19lbmRfcmVnLAorICBzcGVjdHJhbF9kYXRhLAorICBlbmRfb2Zfc2VxdWVuY2UKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfZHJtX3NjZSA9IHsKKyAgZWxfZHJtX3NjZSwKKyAgeyBOVUxMLCBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCByYmRfaWRfdCBlbF9kcm1fY3BlW10gPSB7CisgIGRybWNyY19zdGFydF9yZWcsCisgIGljc19pbmZvLAorICBtcywKKyAgdG5zX2RhdGFfcHJlc2VudCwKKyAgbHRwX2RhdGFfcHJlc2VudCwKKyAgLyogbHRwX2RhdGEsICovCisgIGdsb2JhbF9nYWluLAorICBzZWN0aW9uX2RhdGEsCisgIHNjYWxlX2ZhY3Rvcl9kYXRhLAorICBlc2MxX2hjciwKKyAgbmV4dF9jaGFubmVsLAorICB0bnNfZGF0YV9wcmVzZW50LAorICBsdHBfZGF0YV9wcmVzZW50LAorICAvKiBsdHBfZGF0YSwgKi8KKyAgZ2xvYmFsX2dhaW4sCisgIHNlY3Rpb25fZGF0YSwKKyAgc2NhbGVfZmFjdG9yX2RhdGEsCisgIGVzYzFfaGNyLAorICBuZXh0X2NoYW5uZWwsCisgIHRuc19kYXRhLAorICBuZXh0X2NoYW5uZWwsCisgIHRuc19kYXRhLAorICBkcm1jcmNfZW5kX3JlZywKKyAgbmV4dF9jaGFubmVsLAorICBzcGVjdHJhbF9kYXRhLAorICBuZXh0X2NoYW5uZWwsCisgIHNwZWN0cmFsX2RhdGEsCisgIGVuZF9vZl9zZXF1ZW5jZQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV9kcm1fY3BlID0geworICBlbF9kcm1fY3BlLAorICB7IE5VTEwsIE5VTEwgfQorfTsKIAogLyoKICAqIEFPVCA9IDM5CkBAIC0yNDA1LDYgKzI1NzYsMTkgQEAKICAgICAgICAgICByZXR1cm4gJm5vZGVfYWFjX2NwZV9lcGMxOwogICAgICAgfQogICAgICAgYnJlYWs7CisgICAgY2FzZSBBT1RfRVJfQUFDX1NDQUw6CisgICAgICBpZiAobkNoYW5uZWxzID09IDEpIHsKKyAgICAgICAgaWYgKGVwQ29uZmlnIDw9IDApCisgICAgICAgICAgcmV0dXJuICZub2RlX3NjYWxfc2NlX2VwYzA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4gJm5vZGVfc2NhbF9zY2VfZXBjMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChlcENvbmZpZyA8PSAwKQorICAgICAgICAgIHJldHVybiAmbm9kZV9zY2FsX2NwZV9lcGMwOworICAgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuICZub2RlX3NjYWxfY3BlX2VwYzE7CisgICAgICB9CisgICAgICBicmVhazsKICAgICBjYXNlIEFPVF9FUl9BQUNfRUxEOgogICAgICAgaWYgKG5DaGFubmVscyA9PSAxKSB7CiAgICAgICAgIGlmIChlcENvbmZpZyA8PSAwKQpAQCAtMjQxNyw2ICsyNjAxLDE2IEBACiAgICAgICAgIGVsc2UKICAgICAgICAgICByZXR1cm4gJm5vZGVfZWxkX2NwZV9lcGMxOwogICAgICAgfQorICAgIGNhc2UgQU9UX0RSTV9BQUM6CisgICAgY2FzZSBBT1RfRFJNX1NCUjoKKyAgICBjYXNlIEFPVF9EUk1fTVBFR19QUzoKKyAgICAgIEZES19BU1NFUlQoZXBDb25maWcgPT0gMSk7CisgICAgICBpZiAobkNoYW5uZWxzID09IDEpIHsKKyAgICAgICAgcmV0dXJuICZub2RlX2RybV9zY2U7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gJm5vZGVfZHJtX2NwZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICBicmVhazsKICAgfQpkaWZmIC0tZ2l0IGEvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19hc2MuY3BwIGIvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19hc2MuY3BwCmluZGV4IGJhZTI3MWUuLjk2YTFiMzUgMTAwNjQ0Ci0tLSBhL2xpYk1wZWdUUERlYy9zcmMvdHBkZWNfYXNjLmNwcAorKysgYi9saWJNcGVnVFBEZWMvc3JjL3RwZGVjX2FzYy5jcHAKQEAgLTIsNyArMiw3IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KQEAgLTExMjYsNiArMTEyNiw4IEBACiAgICAgICBpZiAoIDAgIT0gbGRfc2JyX2hlYWRlcihhc2MsIGhCcywgY2IpICkgewogICAgICAgICByZXR1cm4gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOwogICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gVFJBTlNQT1JUREVDX1VOU1VQUE9SVEVEX0ZPUk1BVDsKICAgICB9CiAgIH0KICAgZXNjLT5tX3VzZUxkUW1mVGltZUFsaWduID0gMDsKQEAgLTExNDYsNyArMTE0OCw3IEBACiAKICAgICBzd2l0Y2ggKGVsZEV4dFR5cGUpIHsKICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGZvcihjbnQ9MDsgY250PGxlbjsgY250KyspIHsKKyAgICAgICAgZm9yKGNudD0wOyBjbnQ8ZWxkRXh0TGVuOyBjbnQrKykgewogICAgICAgICAgIEZES3JlYWRCaXRzKGhCcywgOCApOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwpAQCAtMTM3Miw0ICsxMzc0LDEzMyBAQAogICByZXR1cm4gKEVycm9yU3RhdHVzKTsKIH0KIAorVFJBTlNQT1JUREVDX0VSUk9SIERybVJhd1NkY0F1ZGlvQ29uZmlnX1BhcnNlKAorICAgICAgICBDU0F1ZGlvU3BlY2lmaWNDb25maWcgKnNlbGYsCisgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgYnMKKyAgICAgICAgKQoreworICBUUkFOU1BPUlRERUNfRVJST1IgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfT0s7CisKKyAgQXVkaW9TcGVjaWZpY0NvbmZpZ19Jbml0KHNlbGYpOworCisgIGlmICgoSU5UKUZES2dldFZhbGlkQml0cyhicykgPCAyMCkgeworICAgIEVycm9yU3RhdHVzID0gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOworICAgIGdvdG8gYmFpbDsKKyAgfQorICBlbHNlIHsKKyAgICAvKiBEUk0gLSBBdWRpbyBpbmZvcm1hdGlvbiBkYXRhIGVudGl0eSAtIHR5cGUgOQorICAgICAgIC0gU2hvcnQgSWQgICAgICAgICAgICAyIGJpdHMKKyAgICAgICAtIFN0cmVhbSBJZCAgICAgICAgICAgMiBiaXRzCisgICAgICAgLSBhdWRpbyBjb2RpbmcgICAgICAgIDIgYml0cworICAgICAgIC0gU0JSIGZsYWcgICAgICAgICAgICAxIGJpdAorICAgICAgIC0gYXVkaW8gbW9kZSAgICAgICAgICAyIGJpdHMKKyAgICAgICAtIGF1ZGlvIHNhbXBsaW5nIHJhdGUgMyBiaXRzCisgICAgICAgLSB0ZXh0IGZsYWcgICAgICAgICAgIDEgYml0CisgICAgICAgLSBlbmhhbmNlbWVudCBmbGFnICAgIDEgYml0CisgICAgICAgLSBjb2RlciBmaWVsZCAgICAgICAgIDUgYml0cworICAgICAgIC0gcmZhICAgICAgICAgICAgICAgICAxIGJpdCAgKi8KKworICAgIGludCBhdWRpb0NvZGluZywgYXVkaW9Nb2RlLCBjU2FtcGxpbmdGcmVxLCBjb2RlckZpZWxkLCBzZklkeCwgc2JyRmxhZzsKKworICAgIC8qIFJlYWQgdGhlIFNEQyBmaWVsZCAqLworICAgIEZES3JlYWRCaXRzKGJzLDQpOyAgIC8qIFNob3J0IGFuZCBTdHJlYW0gSWQgKi8KKworICAgIGF1ZGlvQ29kaW5nICAgPSBGREtyZWFkQml0cyhicywgMik7CisgICAgc2JyRmxhZyAgICAgICA9IEZES3JlYWRCaXRzKGJzLCAxKTsKKyAgICBhdWRpb01vZGUgICAgID0gRkRLcmVhZEJpdHMoYnMsIDIpOworICAgIGNTYW1wbGluZ0ZyZXEgPSBGREtyZWFkQml0cyhicywgMyk7ICAgIC8qIGF1ZGlvIHNhbXBsaW5nIHJhdGUgKi8KKworICAgIEZES3JlYWRCaXRzKGJzLCAyKTsgIC8qIFRleHQgYW5kIGVuaGFuY2VtZW50IGZsYWcgKi8KKyAgICBjb2RlckZpZWxkICAgPSBGREtyZWFkQml0cyhicywgNSk7CisgICAgRkRLcmVhZEJpdHMoYnMsIDEpOyAgLyogcmZhICovCisKKyAgICAvKiBFdmFsdWF0ZSBjb25maWd1cmF0aW9uIGFuZCBmaWxsIHRoZSBBU0MgKi8KKyAgICBzd2l0Y2ggKGNTYW1wbGluZ0ZyZXEpIHsKKyAgICBjYXNlIDA6IC8qICA4IGtIeiAqLworICAgICAgc2ZJZHggPSAxMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTogLyogMTIga0h6ICovCisgICAgICBzZklkeCA9IDk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6IC8qIDE2IGtIeiAqLworICAgICAgc2ZJZHggPSA4OworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOiAvKiAyNCBrSHogKi8KKyAgICAgIHNmSWR4ID0gNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNTogLyogNDgga0h6ICovCisgICAgICBzZklkeCA9IDM7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ6IC8qIHJlc2VydmVkICovCisgICAgY2FzZSA2OiAvKiByZXNlcnZlZCAqLworICAgIGNhc2UgNzogLyogcmVzZXJ2ZWQgKi8KKyAgICBkZWZhdWx0OgorICAgICAgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgc2VsZi0+bV9zYW1wbGluZ0ZyZXF1ZW5jeUluZGV4ID0gc2ZJZHg7CisgICAgc2VsZi0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA9IFNhbXBsaW5nUmF0ZVRhYmxlW3NmSWR4XTsKKworICAgIGlmICggc2JyRmxhZyApIHsKKyAgICAgIFVJTlQgaTsKKyAgICAgIGludCB0bXAgPSAtMTsKKyAgICAgIHNlbGYtPm1fc2JyUHJlc2VudEZsYWcgPSAxOworICAgICAgc2VsZi0+bV9leHRlbnNpb25BdWRpb09iamVjdFR5cGUgPSBBT1RfU0JSOworICAgICAgc2VsZi0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeSA9IHNlbGYtPm1fc2FtcGxpbmdGcmVxdWVuY3kgPDwgMTsKKyAgICAgIGZvciAoaT0wOyBpPChzaXplb2YoU2FtcGxpbmdSYXRlVGFibGUpL3NpemVvZihTYW1wbGluZ1JhdGVUYWJsZVswXSkpOyBpKyspeworICAgICAgICBpZiAoU2FtcGxpbmdSYXRlVGFibGVbaV0gPT0gc2VsZi0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeSl7CisgICAgICAgICAgdG1wID0gaTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgc2VsZi0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeUluZGV4ID0gdG1wOworICAgIH0KKworICAgIHN3aXRjaCAoYXVkaW9Db2RpbmcpIHsKKyAgICAgIGNhc2UgMDogLyogQUFDICovCisgICAgICAgICAgc2VsZi0+bV9hb3QgPSBBT1RfRFJNX0FBQyAgICAgOyAgLyogU2V0IHBzZXVkbyBBT1QgZm9yIERybSBBQUMgKi8KKworICAgICAgICBzd2l0Y2ggKGF1ZGlvTW9kZSkgeworICAgICAgICBjYXNlIDE6IC8qIHBhcmFtZXRyaWMgc3RlcmVvICovCisgICAgICAgICAgc2VsZi0+bV9wc1ByZXNlbnRGbGFnID0gMTsKKyAgICAgICAgY2FzZSAwOiAvKiBtb25vICovCisgICAgICAgICAgc2VsZi0+bV9jaGFubmVsQ29uZmlndXJhdGlvbiA9IDE7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjogLyogc3RlcmVvICovCisgICAgICAgICAgc2VsZi0+bV9jaGFubmVsQ29uZmlndXJhdGlvbiA9IDI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgICAgICAgICAgZ290byBiYWlsOworICAgICAgICB9CisgICAgICAgIHNlbGYtPm1fdmNiMTFGbGFnID0gMTsKKyAgICAgICAgc2VsZi0+bV9oY3JGbGFnID0gMTsKKyAgICAgICAgc2VsZi0+bV9zYW1wbGVzUGVyRnJhbWUgPSA5NjA7CisgICAgICAgIHNlbGYtPm1fZXBDb25maWcgPSAxOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTogLyogQ0VMUCAqLworICAgICAgICBzZWxmLT5tX2FvdCA9IEFPVF9FUl9DRUxQOworICAgICAgICBzZWxmLT5tX2NoYW5uZWxDb25maWd1cmF0aW9uID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6IC8qIEhWWEMgKi8KKyAgICAgICAgc2VsZi0+bV9hb3QgPSBBT1RfRVJfSFZYQzsKKyAgICAgICAgc2VsZi0+bV9jaGFubmVsQ29uZmlndXJhdGlvbiA9IDE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzOiAvKiByZXNlcnZlZCAqLworICAgICAgZGVmYXVsdDoKKyAgICAgICAgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgICAgICAgIHNlbGYtPm1fYW90ID0gQU9UX05PTkU7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChzZWxmLT5tX3BzUHJlc2VudEZsYWcgJiYgIXNlbGYtPm1fc2JyUHJlc2VudEZsYWcpIHsKKyAgICAgIEVycm9yU3RhdHVzID0gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOworICAgICAgZ290byBiYWlsOworICAgIH0KKyAgfQorCitiYWlsOgorICByZXR1cm4gKEVycm9yU3RhdHVzKTsKK30KIApkaWZmIC0tZ2l0IGEvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19kcm0uY3BwIGIvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19kcm0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMzE5ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJNcGVnVFBEZWMvc3JjL3RwZGVjX2RybS5jcHAKQEAgLTAsMCArMSwxNDYgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIENocmlzdGlhbiBHcmllYmVsCisgICBEZXNjcmlwdGlvbjogRFJNIHRyYW5zcG9ydCBzdHVmZgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ0cGRlY19kcm0uaCIKKworCisjaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgorCisKKwordm9pZCBkcm1SZWFkX0NyY0luaXQoSEFORExFX0RSTSBwRHJtKSAgICAgIC8qITwgcG9pbnRlciB0byBkcm0gY3JjIGluZm8gc3R1Y3R1cmUgKi8KK3sKKyAgRkRLX0FTU0VSVChwRHJtICE9IE5VTEwpOworCisgIEZES2NyY0luaXQoJnBEcm0tPmNyY0luZm8sIDB4MDAxZCwgMHhGRkZGLCA4KTsKK30KKworaW50IGRybVJlYWRfQ3JjU3RhcnRSZWcoCisgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRFJNIHBEcm0sICAgICAgICAgICAgLyohPCBwb2ludGVyIHRvIGRybSBzdHVjdHVyZSAqLworICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCAgIC8qITwgaGFuZGxlIHRvIGN1cnJlbnQgYml0IGJ1ZmZlciBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgICAgICAgICAgICAgIGludCBtQml0cyAgICAgICAgICAgICAgICAgICAvKiE8IG51bWJlciBvZiBiaXRzIGluIGNyYyByZWdpb24gKi8KKyAgICAgICAgICAgICAgICAgICApCit7CisgIEZES19BU1NFUlQocERybSAhPSBOVUxMKTsKKworICBGREtjcmNSZXNldCgmcERybS0+Y3JjSW5mbyk7CisKKyAgcERybS0+Y3JjUmVhZFZhbHVlID0gRkRLcmVhZEJpdHMoaEJzLCA4KTsKKworICByZXR1cm4gKCBGREtjcmNTdGFydFJlZygmcERybS0+Y3JjSW5mbywgaEJzLCBtQml0cykgKTsKKworfQorCit2b2lkIGRybVJlYWRfQ3JjRW5kUmVnKAorICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRFJNIHBEcm0sICAgICAgICAgICAgIC8qITwgcG9pbnRlciB0byBkcm0gY3JjIGluZm8gc3R1Y3R1cmUgKi8KKyAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCAgICAvKiE8IGhhbmRsZSB0byBjdXJyZW50IGJpdCBidWZmZXIgc3RydWN0dXJlICovCisgICAgICAgICAgICAgICAgICAgIGludCByZWcgICAgICAgICAgICAgICAgICAgICAgLyohPCBjcmMgcmVnaW9uICovCisgICAgICAgICAgICAgICAgICApCit7CisgIEZES19BU1NFUlQocERybSAhPSBOVUxMKTsKKworICBGREtjcmNFbmRSZWcoJnBEcm0tPmNyY0luZm8sIGhCcywgcmVnKTsKK30KKworVFJBTlNQT1JUREVDX0VSUk9SIGRybVJlYWRfQ3JjQ2hlY2soIEhBTkRMRV9EUk0gcERybSApCit7CisgIFRSQU5TUE9SVERFQ19FUlJPUiBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVERFQ19PSzsKKyAgVVNIT1JUIGNyYzsKKworICBjcmMgPSBGREtjcmNHZXRDUkMoJnBEcm0tPmNyY0luZm8pIF4gMHhGRjsKKyAgaWYgKGNyYyAhPSBwRHJtLT5jcmNSZWFkVmFsdWUpCisgIHsKKyAgICByZXR1cm4gKFRSQU5TUE9SVERFQ19DUkNfRVJST1IpOworICB9CisKKyAgcmV0dXJuIChFcnJvclN0YXR1cyk7Cit9CisKKwpkaWZmIC0tZ2l0IGEvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19kcm0uaCBiL2xpYk1wZWdUUERlYy9zcmMvdHBkZWNfZHJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE2MWI0YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYk1wZWdUUERlYy9zcmMvdHBkZWNfZHJtLmgKQEAgLTAsMCArMSwxOTQgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIEpvc2VmIEhvZXBmbAorICAgRGVzY3JpcHRpb246IERSTSBpbnRlcmZhY2UKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFRQREVDX0RSTV9ICisjZGVmaW5lIFRQREVDX0RSTV9ICisKKyNpbmNsdWRlICJ0cGRlY19saWIuaCIKKworCisjaW5jbHVkZSAiRkRLX2NyYy5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisKKyAgRkRLX0NSQ0lORk8gY3JjSW5mbzsgICAgICAgICAgICAgLyogQ1JDIHN0YXRlIGluZm8gKi8KKyAgVVNIT1JUICAgICAgY3JjUmVhZFZhbHVlOyAgICAgICAgLyogQ1JDIHZhbHVlIHJlYWQgZnJvbSBiaXRzdHJlYW0gZGF0YSAqLworCit9IFNUUlVDVF9EUk07CisKK3R5cGVkZWYgU1RSVUNUX0RSTSAqSEFORExFX0RSTTsKKworLyohCisgIFxicmllZiBJbml0aWFsaXplIERSTSBDUkMKKworICBUaGUgZnVuY3Rpb24gaW5pdGlhbHplcyB0aGUgY3JjIGJ1ZmZlciBhbmQgdGhlIGNyYyBsb29rdXAgdGFibGUuCisKKyAgXHJldHVybiAgbm9uZQorKi8KK3ZvaWQgZHJtUmVhZF9DcmNJbml0KCBIQU5ETEVfRFJNIHBEcm0gKTsKKworLyoqCisgKiBcYnJpZWYgU3RhcnRzIENSQyByZWdpb24gd2l0aCBhIG1heGltdW0gbnVtYmVyIG9mIGJpdHMKKyAqICAgICAgICBJZiBtQml0cyBpcyBwb3NpdGl2ZSB6ZXJvIHBhZGRpbmcgd2lsbCBiZSB1c2VkIGZvciBDUkMgY2FsY3VsYXRpb24sIGlmIHRoZXJlCisgKiAgICAgICAgYXJlIGxlc3MgdGhhbiBtQml0cyBiaXRzIGF2YWlsYWJsZS4KKyAqICAgICAgICBJZiBtQml0cyBpcyBuZWdhdGl2ZSBubyB6ZXJvIHBhZGRpbmcgaXMgZG9uZS4KKyAqICAgICAgICBJZiBtQml0cyBpcyB6ZXJvIHRoZSBtZW1vcnkgZm9yIHRoZSBidWZmZXIgaXMgYWxsb2NhdGVkIGR5bmFtaWNhbGx5LCB0aGUKKyAqICAgICAgICBudW1iZXIgb2YgYml0cyBpcyBub3QgbGltaXRlZC4KKyAqCisgKiBccGFyYW0gcERybSBEUk0gZGF0YSBoYW5kbGUKKyAqIFxwYXJhbSBoQnMgYml0c3RyZWFtIGhhbmRsZSwgb24gd2hpY2ggdGhlIENSQyByZWdpb24gcmVmZXJlcyB0bworICogXHBhcmFtIG1CaXRzIG1heCBudW1iZXIgb2YgYml0cyBpbiBjcmMgcmVnaW9uIHRvIGJlIGNvbnNpZGVyZWQKKyAqCisgKiBccmV0dXJuICBJRCBmb3IgdGhlIGNyZWF0ZWQgcmVnaW9uLCAtMSBpbiBjYXNlIG9mIGFuIGVycm9yCisgKi8KK2ludCBkcm1SZWFkX0NyY1N0YXJ0UmVnKAorICAgICAgICBIQU5ETEVfRFJNIHBEcm0sCisgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgaW50IG1CaXRzCisgICAgICAgICk7CisKKy8qKgorICogXGJyaWVmIEVuZHMgQ1JDIHJlZ2lvbiBpZGVudGlmaWVkIGJ5IHJlZworICoKKyAqIFxwYXJhbSBwRHJtIERSTSBkYXRhIGhhbmRsZQorICogXHBhcmFtIGhCcyBiaXRzdHJlYW0gaGFuZGxlLCBvbiB3aGljaCB0aGUgQ1JDIHJlZ2lvbiByZWZlcmVzIHRvCisgKiBccGFyYW0gcmVnIENSQyByZWdpb25zIElEIHJldHVybmVkIGJ5IGRybVJlYWRfQ3JjU3RhcnRSZWcoKQorICoKKyAqIFxyZXR1cm4gIG5vbmUKKyAqLwordm9pZCBkcm1SZWFkX0NyY0VuZFJlZygKKyAgICAgICAgSEFORExFX0RSTSBwRHJtLAorICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgIGludCByZWcKKyAgICAgICAgKTsKKworLyoqCisgKiBcYnJpZWYgQ2hlY2sgQ1JDCisgKgorICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50bHkgY2FsY3VsYXRlZCBDUkMgbWF0Y2hlcyB0aGUgQ1JDIGZpZWxkIHJlYWQgZnJvbSB0aGUgYml0c3RyZWFtCisgKiBEZWxldGVzIGFsbCBDUkMgcmVnaW9ucy4KKyAqCisgKiBccGFyYW0gcERybSBEUk0gZGF0YSBoYW5kbGUKKyAqCisgKiBccmV0dXJuIFJldHVybnMgMCBpZiB0aGV5IGFyZSBpZGVudGljYWwgb3RoZXJ3aXNlIDEKKyAqLworVFJBTlNQT1JUREVDX0VSUk9SIGRybVJlYWRfQ3JjQ2hlY2soIEhBTkRMRV9EUk0gcERybSApOworCisvKioKKyAqIFxicmllZiBDaGVjayBpZiB3ZSBoYXZlIGEgdmFsaWQgRFJNIGZyYW1lIGF0IHRoZSBjdXJyZW50IGJpdGJ1ZmZlciBwb3NpdGlvbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyBlbm91Z2ggYml0cyBpbiBidWZmZXIgZm9yIHRoZSBjdXJyZW50IGZyYW1lLgorICogSXQgcmVhZHMgb3V0IHRoZSBoZWFkZXIgYml0cyB0byBwcmVwYXJlIHRoZSBiaXRidWZmZXIgZm9yIHRoZSBkZWNvZGUgbG9vcC4KKyAqIEluIGNhc2UgdGhlIGhlYWRlciBiaXRzIHNob3cgYW4gaW52YWxpZCBiaXRzdHJlYW0vZnJhbWUsIHRoZSB3aG9sZSBmcmFtZSBpcyBza2lwcGVkLgorICoKKyAqIFxwYXJhbSBwRHJtIERSTSBkYXRhIGhhbmRsZSB3aGljaCBpcyBmaWxsZWQgd2l0aCBwYXJzZWQgRFJNIGhlYWRlciBkYXRhCisgKiBccGFyYW0gYnMgaGFuZGxlIG9mIGJpdHN0cmVhbSBmcm9tIHdob20gdGhlIERSTSBoZWFkZXIgaXMgcmVhZAorICoKKyAqIFxyZXR1cm4gIGVycm9yIHN0YXR1cworICovCitUUkFOU1BPUlRERUNfRVJST1IgZHJtUmVhZF9EZWNvZGVIZWFkZXIoCisgICAgICAgIEhBTkRMRV9EUk0gICAgICAgICAgICBwRHJtLAorICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgYnMKKyAgICAgICAgKTsKKworLyoqCisgKiBcYnJpZWYgICBQYXJzZSBhIERybSBzcGVjaWZpYyBTREMgYXVkaW8gY29uZmlnIGZyb20gYSBnaXZlbiBiaXRzdHJlYW0gaGFuZGxlLgorICoKKyAqIFxwYXJhbSBwQXNjICAgICAgICAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byBhbiBhbGxvY2F0ZWQgQ1NBdWRpb1NwZWNpZmljQ29uZmlnIHN0cnVjdC4KKyAqIFxwYXJhbSBoQnMgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdHN0cmVhbSBoYW5kbGUuCisgKgorICogXHJldHVybiAgVG90YWwgZWxlbWVudCBjb3VudCBpbmNsdWRpbmcgYWxsIFNDRSwgQ1BFIGFuZCBMRkUuCisgKi8KK1RSQU5TUE9SVERFQ19FUlJPUiBEcm1SYXdTZGNBdWRpb0NvbmZpZ19QYXJzZSggQ1NBdWRpb1NwZWNpZmljQ29uZmlnICpwQXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMgKTsKKworCisKKyNlbmRpZiAvKiBUUERFQ19EUk1fSCAqLwpkaWZmIC0tZ2l0IGEvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19saWIuY3BwIGIvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19saWIuY3BwCmluZGV4IDk1MGFmNjQuLjI0Zjc1NWIgMTAwNjQ0Ci0tLSBhL2xpYk1wZWdUUERlYy9zcmMvdHBkZWNfbGliLmNwcAorKysgYi9saWJNcGVnVFBEZWMvc3JjL3RwZGVjX2xpYi5jcHAKQEAgLTEwMiw2ICsxMDIsNyBAQAogCiAjaW5jbHVkZSAidHBkZWNfbGF0bS5oIgogCisjaW5jbHVkZSAidHBkZWNfZHJtLmgiCiAKIAogI2RlZmluZSBNT0RVTEVfTkFNRSAidHJhbnNwb3J0RGVjIgpAQCAtMTEzLDYgKzExNCw3IEBACiAKICAgQ0xhdG1EZW11eCBsYXRtOwogCisgIFNUUlVDVF9EUk0gZHJtOwogCiB9IHRyYW5zcG9ydGRlY19wYXJzZXJfdDsKIApAQCAtMTgyLDYgKzE4NCw5IEBACiAgICAgaElucHV0LT5udW1iZXJPZlJhd0RhdGFCbG9ja3MgPSAwOwogICAgIGJyZWFrOwogCisgIGNhc2UgVFRfRFJNOgorICAgIGRybVJlYWRfQ3JjSW5pdCgmaElucHV0LT5wYXJzZXIuZHJtKTsKKyAgICBicmVhazsKIAogICBjYXNlIFRUX01QNF9MQVRNX01DUDA6CiAgIGNhc2UgVFRfTVA0X0xBVE1fTUNQMToKQEAgLTI1Myw2ICsyNTgsMTggQEAKICAgICAgICAgfQogICAgICAgfQogICAgICAgYnJlYWs7CisgICAgY2FzZSBUVF9EUk06CisgICAgICBmQ29uZmlnRm91bmQgPSAxOworICAgICAgZXJyID0gRHJtUmF3U2RjQXVkaW9Db25maWdfUGFyc2UoJmhUcC0+YXNjW2xheWVyXSwgaEJzKTsKKyAgICAgIGlmIChlcnIgPT0gVFJBTlNQT1JUREVDX09LKSB7CisgICAgICAgIGludCBlcnJDOworCisgICAgICAgIGVyckMgPSBoVHAtPmNhbGxiYWNrcy5jYlVwZGF0ZUNvbmZpZyhoVHAtPmNhbGxiYWNrcy5jYlVwZGF0ZUNvbmZpZ0RhdGEsICZoVHAtPmFzY1tsYXllcl0pOworICAgICAgICBpZiAoZXJyQyAhPSAwKSB7CisgICAgICAgICAgZXJyID0gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKICAgfQogCiAgIGlmIChlcnIgPT0gVFJBTlNQT1JUREVDX09LICYmIGZDb25maWdGb3VuZCkgewpAQCAtMTA4Myw2ICsxMTAwLDcgQEAKICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBUVF9NUDRfUkFXOgorICAgIGNhc2UgVFRfRFJNOgogICAgICAgLyogT25lIEFjY2VzcyBVbml0IHdhcyBmaWxsZWQgaW50byBidWZmZXIuCiAgICAgICAgICBTbyBnZXQgdGhlIGxlbmd0aCBvdXQgb2YgdGhlIGJ1ZmZlci4gKi8KICAgICAgIGhUcC0+YXVMZW5ndGhbbGF5ZXJdID0gRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CkBAIC0xMjgzLDYgKzEzMDEsNyBAQAogICAgIHwgQ0FQRl9MQVRNCiAgICAgfCBDQVBGX0xPQVMKICAgICB8IENBUEZfUkFXUEFDS0VUUworICAgIHwgQ0FQRl9EUk0KICAgICA7CiAKICAgcmV0dXJuIFRSQU5TUE9SVERFQ19PSzsgLyogRkRLRVJSX05PRVJST1I7ICovCkBAIC0xMjk0LDYgKzEzMTMsOCBAQAogICBzd2l0Y2ggKHBUcC0+dHJhbnNwb3J0Rm10KSB7CiAgIGNhc2UgVFRfTVA0X0FEVFM6CiAgICAgcmV0dXJuIGFkdHNSZWFkX0NyY1N0YXJ0UmVnKCZwVHAtPnBhcnNlci5hZHRzLCAmcFRwLT5iaXRTdHJlYW1bMF0sIG1CaXRzKTsKKyAgY2FzZSBUVF9EUk06CisgICAgcmV0dXJuIGRybVJlYWRfQ3JjU3RhcnRSZWcoJnBUcC0+cGFyc2VyLmRybSwgJnBUcC0+Yml0U3RyZWFtWzBdLCBtQml0cyk7CiAgIGRlZmF1bHQ6CiAgICAgcmV0dXJuIDA7CiAgIH0KQEAgLTEzMDUsNiArMTMyNiw5IEBACiAgIGNhc2UgVFRfTVA0X0FEVFM6CiAgICAgYWR0c1JlYWRfQ3JjRW5kUmVnKCZwVHAtPnBhcnNlci5hZHRzLCAmcFRwLT5iaXRTdHJlYW1bMF0sIHJlZyk7CiAgICAgYnJlYWs7CisgIGNhc2UgVFRfRFJNOgorICAgIGRybVJlYWRfQ3JjRW5kUmVnKCZwVHAtPnBhcnNlci5kcm0sICZwVHAtPmJpdFN0cmVhbVswXSwgcmVnKTsKKyAgICBicmVhazsKICAgZGVmYXVsdDoKICAgICBicmVhazsKICAgfQpAQCAtMTMyMSw2ICsxMzQ1LDkgQEAKICAgICAgIHRyYW5zcG9ydERlY19BZGp1c3RFbmRPZkFjY2Vzc1VuaXQocFRwKTsKICAgICB9CiAgICAgcmV0dXJuIGFkdHNSZWFkX0NyY0NoZWNrKCZwVHAtPnBhcnNlci5hZHRzKTsKKyAgY2FzZSBUVF9EUk06CisgICAgcmV0dXJuIGRybVJlYWRfQ3JjQ2hlY2soJnBUcC0+cGFyc2VyLmRybSk7CisgICAgYnJlYWs7CiAgIGRlZmF1bHQ6CiAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19PSzsKICAgfQpkaWZmIC0tZ2l0IGEvbGliTXBlZ1RQRGVjL3NyYy92ZXJzaW9uIGIvbGliTXBlZ1RQRGVjL3NyYy92ZXJzaW9uCmluZGV4IDE4ZmM5YmEuLjc1ZTIyYzkgMTAwNjQ0Ci0tLSBhL2xpYk1wZWdUUERlYy9zcmMvdmVyc2lvbgorKysgYi9saWJNcGVnVFBEZWMvc3JjL3ZlcnNpb24KQEAgLTIsNyArMiw3IEBACiAvKiBsaWJyYXJ5IGluZm8gKi8KICNkZWZpbmUgVFBfTElCX1ZMMCAyCiAjZGVmaW5lIFRQX0xJQl9WTDEgMwotI2RlZmluZSBUUF9MSUJfVkwyIDUKKyNkZWZpbmUgVFBfTElCX1ZMMiA3CiAjZGVmaW5lIFRQX0xJQl9USVRMRSAiTVBFRyBUcmFuc3BvcnQiCiAjaWZkZWYgX19BTkRST0lEX18KICNkZWZpbmUgVFBfTElCX0JVSUxEX0RBVEUgIiIKZGlmZiAtLWdpdCBhL2xpYlNCUmRlYy9pbmNsdWRlL3NicmRlY29kZXIuaCBiL2xpYlNCUmRlYy9pbmNsdWRlL3NicmRlY29kZXIuaAppbmRleCAxNzRmYjVjLi4zYmI5YmEzIDEwMDY0NAotLS0gYS9saWJTQlJkZWMvaW5jbHVkZS9zYnJkZWNvZGVyLmgKKysrIGIvbGliU0JSZGVjL2luY2x1ZGUvc2JyZGVjb2Rlci5oCkBAIC0yLDcgKzIsNyBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgogICBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCkBAIC0yNjIsNiArMjYyLDcgQEAKICAqICAgICAgICAgaW50byAqY291bnQgaWYgYSBwYXlsb2FkIGxlbmd0aCBpcyBnaXZlbiAoYnlQYXlMZW4gPiAwKS4gSWYgbm8gU0JSIHBheWxvYWQgbGVuZ3RoIGlzCiAgKiAgICAgICAgIGdpdmVuIChic1BheUxlbiA8IDApIHRoZW4gdGhlIGJpdCBzdHJlYW0gcG9zaXRpb24gb24gcmV0dXJuIHdpbGwgYmUgcmFuZG9tIGFmdGVyIHRoaXMKICAqICAgICAgICAgZnVuY3Rpb24gY2FsbCBpbiBjYXNlIG9mIGVycm9ycywgYW5kIGFueSBmdXJ0aGVyIGRlY29kaW5nIHdpbGwgYmUgY29tcGxldGVseSBwb2ludGxlc3MuCisgKiAgICAgICAgIFRoaXMgZnVuY3Rpb24gYWNjZXB0cyBlaXRoZXIgbm9ybWFsIG9yZGVyZWQgU0JSIGRhdGEgb3IgcmV2ZXJzZSBvcmRlcmVkIERSTSBTQlIgZGF0YS4KICAqCiAgKiBccGFyYW0gc2VsZiAgICAgICAgICAgU0JSIGRlY29kZXIgaGFuZGxlLgogICogXHBhcmFtIGhCcyAgICAgICAgICAgIEJpdCBzdHJlYW0gaGFuZGxlIGFzIGRhdGEgc291cmNlLgpkaWZmIC0tZ2l0IGEvbGliU0JSZGVjL3NyYy9lbnZfY2FsYy5jcHAgYi9saWJTQlJkZWMvc3JjL2Vudl9jYWxjLmNwcAppbmRleCBhZGU1N2ZjLi5mYTUzMzBhIDEwMDY0NAotLS0gYS9saWJTQlJkZWMvc3JjL2Vudl9jYWxjLmNwcAorKysgYi9saWJTQlJkZWMvc3JjL2Vudl9jYWxjLmNwcApAQCAtMiw3ICsyLDcgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgpAQCAtMTUxLDEzICsxNTEsMTMgQEAKIH0KIEVOVl9DQUxDX05SR1M7CiAKLS8qc3RhdGljKi8gdm9pZCBlcXVhbGl6ZUZpbHRCdWZmZXJFeHAoRklYUF9EQkwgKmZpbHRCdWZmZXIsCitzdGF0aWMgdm9pZCBlcXVhbGl6ZUZpbHRCdWZmZXJFeHAoRklYUF9EQkwgKmZpbHRCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAqZmlsdEJ1ZmZlcl9lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpOcmdHYWluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgKk5yZ0dhaW5fZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgc3ViYmFuZHMpOwogCi0vKnN0YXRpYyovIHZvaWQgY2FsY05yZ1BlclN1YmJhbmQoRklYUF9EQkwgICoqYW5hbHlzQnVmZmVyUmVhbCwKK3N0YXRpYyB2b2lkIGNhbGNOcmdQZXJTdWJiYW5kKEZJWFBfREJMICAqKmFuYWx5c0J1ZmZlclJlYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKiphbmFseXNCdWZmZXJJbWFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIGxvd1N1YmJhbmQsIGludCBoaWdoU3ViYmFuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBzdGFydF9wb3MsICBpbnQgbmV4dF9wb3MsCkBAIC0xNjUsNyArMTY1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpucmdFc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAqbnJnRXN0X2UgKTsKIAotLypzdGF0aWMqLyB2b2lkIGNhbGNOcmdQZXJTZmIoRklYUF9EQkwgICoqYW5hbHlzQnVmZmVyUmVhbCwKK3N0YXRpYyB2b2lkIGNhbGNOcmdQZXJTZmIoRklYUF9EQkwgICoqYW5hbHlzQnVmZmVyUmVhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICoqYW5hbHlzQnVmZmVySW1hZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIG5TZmIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICpmcmVxQmFuZFRhYmxlLApAQCAtMTc0LDEzICsxNzQsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKm5yZ19lc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICpucmdfZXN0X2UgKTsKIAotLypzdGF0aWMqLyB2b2lkIGNhbGNTdWJiYW5kR2FpbihGSVhQX0RCTCAgbnJnUmVmLCBTQ0hBUiBucmdSZWZfZSwgRU5WX0NBTENfTlJHUyogbnJncywgaW50IGMsCitzdGF0aWMgdm9pZCBjYWxjU3ViYmFuZEdhaW4oRklYUF9EQkwgIG5yZ1JlZiwgU0NIQVIgbnJnUmVmX2UsIEVOVl9DQUxDX05SR1MqIG5yZ3MsIGludCBjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICB0bXBOb2lzZSwgU0NIQVIgdG1wTm9pc2VfZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgc2luZVByZXNlbnRGbGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICBzaW5lTWFwcGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBub05vaXNlRmxhZyk7CiAKLS8qc3RhdGljKi8gdm9pZCBjYWxjQXZnR2FpbihFTlZfQ0FMQ19OUkdTKiBucmdzLAorc3RhdGljIHZvaWQgY2FsY0F2Z0dhaW4oRU5WX0NBTENfTlJHUyogbnJncywKICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgbG93U3ViYmFuZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgaGlnaFN1YmJhbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKnN1bVJlZl9tLApAQCAtMTg4LDcgKzE4OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKnB0ckF2Z0dhaW5fbSwKICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICAqcHRyQXZnR2Fpbl9lKTsKIAotLypzdGF0aWMqLyB2b2lkIGFkanVzdFRpbWVTbG90TEMoRklYUF9EQkwgICpwdHJSZWFsLAorc3RhdGljIHZvaWQgYWRqdXN0VGltZVNsb3RfRWxkR3JpZChGSVhQX0RCTCAgKnB0clJlYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTlZfQ0FMQ19OUkdTKiBucmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnB0ckhhcm1JbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICBsb3dTdWJiYW5kcywKQEAgLTE5Niw4ICsxOTYsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICBzY2FsZV9jaGFuZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgbm9Ob2lzZUZsYWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAqcHRyUGhhc2VJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICBmQ2xkZmIpOwotLypzdGF0aWMqLyB2b2lkIGFkanVzdFRpbWVTbG90SFEoRklYUF9EQkwgICpwdHJSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgIHNjYWxlX2RpZmZfbG93KTsKKworc3RhdGljIHZvaWQgYWRqdXN0VGltZVNsb3RMQyhGSVhQX0RCTCAgKnB0clJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTlZfQ0FMQ19OUkdTKiBucmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnB0ckhhcm1JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICBsb3dTdWJiYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICBub1N1YmJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgIHNjYWxlX2NoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICBub05vaXNlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICpwdHJQaGFzZUluZGV4KTsKK3N0YXRpYyB2b2lkIGFkanVzdFRpbWVTbG90SFEoRklYUF9EQkwgICpwdHJSZWFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICpwdHJJbWFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9DQUxDVUxBVEVfRU5WRUxPUEUgaF9zYnJfY2FsX2VudiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVOVl9DQUxDX05SR1MqIG5yZ3MsCkBAIC0yMjQsNyArMjMzLDcgQEAKICAgQWRkaXRpb25hbGx5LCB0aGUgZmxhZ3MgaW4gaGFybUZsYWdzUHJldiBhcmUgYmVpbmcgdXBkYXRlZCBieSB0aGlzIGZ1bmN0aW9uCiAgIGZvciB0aGUgbmV4dCBmcmFtZS4KICovCi0vKnN0YXRpYyovIHZvaWQgbWFwU2luZUZsYWdzKFVDSEFSICpmcmVxQmFuZFRhYmxlLCAvKiE8IEJhbmQgYm9yZGVycyAodGhlcmUncyBvbmx5IDEgZmxhZyBwZXIgYmFuZCkgKi8KK3N0YXRpYyB2b2lkIG1hcFNpbmVGbGFncyhVQ0hBUiAqZnJlcUJhbmRUYWJsZSwgICAgICAgICAvKiE8IEJhbmQgYm9yZGVycyAodGhlcmUncyBvbmx5IDEgZmxhZyBwZXIgYmFuZCkgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblNmYiwgICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBiYW5kcyBpbiB0aGUgdGFibGUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqYWRkSGFybW9uaWNzLCAgICAgICAgICAgLyohPCB2ZWN0b3Igd2l0aCAxIGZsYWcgcGVyIHNmYiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaGFybUZsYWdzUHJldiwgICAgICAgICAgIC8qITwgUGFja2VkICdhZGRIYXJtb25pY3MnICovCkBAIC05OTAsNyArOTk5LDYgQEAKICAgICAgICAgICAvKiBQcmV2ZW50IHRoZSBzbW9vdGhpbmcgZmlsdGVyIGZyb20gcnVubmluZyBvbiBjb25zdGFudCBsZXZlbHMgKi8KICAgICAgICAgICBpZiAoai1zdGFydF9wb3MgPCBzbW9vdGhfbGVuZ3RoKQogICAgICAgICAgICAgc21vb3RoX3JhdGlvID0gRkRLX3NickRlY29kZXJfc2JyX3Ntb290aEZpbHRlcltqLXN0YXJ0X3Bvc107Ci0KICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICBzbW9vdGhfcmF0aW8gPSBGTDJGWENPTlNUX1NHTCgwLjBmKTsKIApAQCAtMTAwNyw3ICsxMDE1LDggQEAKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKLSAgICAgICAgICBhZGp1c3RUaW1lU2xvdExDKCZhbmFseXNCdWZmZXJSZWFsW2pdW2xvd1N1YmJhbmRdLAorICAgICAgICAgIGlmIChmbGFncyAmIFNCUkRFQ19FTERfR1JJRCkgeworICAgICAgICAgICAgYWRqdXN0VGltZVNsb3RfRWxkR3JpZCgmYW5hbHlzQnVmZmVyUmVhbFtqXVtsb3dTdWJiYW5kXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOcmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAmaF9zYnJfY2FsX2Vudi0+aGFybUluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93U3ViYmFuZCwKQEAgLTEwMTUsNyArMTAyNCwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVfY2hhbmdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9Ob2lzZUZsYWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICZoX3Nicl9jYWxfZW52LT5waGFzZUluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsYWdzICYgU0JSREVDX0VMRF9HUklEKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFAyU0NBTEUoYWRqX2UpIC0gc2JyU2NhbGVGYWN0b3ItPmxiX3NjYWxlKTsKKyAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBhZGp1c3RUaW1lU2xvdExDKCZhbmFseXNCdWZmZXJSZWFsW2pdW2xvd1N1YmJhbmRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5yZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoX3Nicl9jYWxfZW52LT5oYXJtSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dTdWJiYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9TdWJiYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX2NoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vTm9pc2VGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaF9zYnJfY2FsX2Vudi0+cGhhc2VJbmRleCk7CisgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9IC8vIGZvcgogCkBAIC0xMTc2LDcgKzExOTYsNyBAQAogICBjYW4gYmUgcGVyZm9ybWVkLgogICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGZvciBlYWNoIGVudmVsb3BlIGJlZm9yZSBhZGp1c3RpbmcuCiAqLwotLypzdGF0aWMqLyB2b2lkIGVxdWFsaXplRmlsdEJ1ZmZlckV4cChGSVhQX0RCTCAqZmlsdEJ1ZmZlciwgICAgIC8qITwgYnVmZmVyZCBnYWlucyAqLworc3RhdGljIHZvaWQgZXF1YWxpemVGaWx0QnVmZmVyRXhwKEZJWFBfREJMICpmaWx0QnVmZmVyLCAgICAgLyohPCBidWZmZXJkIGdhaW5zICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgKmZpbHRCdWZmZXJfZSwgICAvKiE8IGV4cG9uZW50cyBvZiBidWZmZXJkIGdhaW5zICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKm5yZ0dhaW4sICAgICAgICAvKiE8IGdhaW5zIGZvciBjdXJyZW50IGVudmVsb3BlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgKm5yZ0dhaW5fZSwgICAgICAvKiE8IGV4cG9uZW50cyBvZiBnYWlucyBmb3IgY3VycmVudCBlbnZlbG9wZSAqLwpAQCAtMTMzMSw3ICsxMzUxLDcgQEAKIAogICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2hlbiBpbnRlcnBvbEZyZXEgaXMgdHJ1ZS4KICovCi0vKnN0YXRpYyovIHZvaWQgY2FsY05yZ1BlclN1YmJhbmQoRklYUF9EQkwgICoqYW5hbHlzQnVmZmVyUmVhbCwgLyohPCBSZWFsIHBhcnQgb2Ygc3ViYmFuZCBzYW1wbGVzICovCitzdGF0aWMgdm9pZCBjYWxjTnJnUGVyU3ViYmFuZChGSVhQX0RCTCAgKiphbmFseXNCdWZmZXJSZWFsLCAvKiE8IFJlYWwgcGFydCBvZiBzdWJiYW5kIHNhbXBsZXMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqKmFuYWx5c0J1ZmZlckltYWcsIC8qITwgSW1hZ2luYXJ5IHBhcnQgb2Ygc3ViYmFuZCBzYW1wbGVzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbG93U3ViYmFuZCwgICAgICAgICAgIC8qITwgQmVnaW4gb2YgdGhlIFNCUiBmcmVxdWVuY3kgcmFuZ2UgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBoaWdoU3ViYmFuZCwgICAgICAgICAgLyohPCBIaWdoIGVuZCBvZiB0aGUgU0JSIGZyZXF1ZW5jeSByYW5nZSAqLwpAQCAtMTQ1Miw3ICsxNDcyLDcgQEAKIAogICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2hlbiBpbnRlcnBvbEZyZXEgaXMgZmFsc2UuCiAqLwotLypzdGF0aWMqLyB2b2lkIGNhbGNOcmdQZXJTZmIoRklYUF9EQkwgICoqYW5hbHlzQnVmZmVyUmVhbCwgIC8qITwgUmVhbCBwYXJ0IG9mIHN1YmJhbmQgc2FtcGxlcyAqLworc3RhdGljIHZvaWQgY2FsY05yZ1BlclNmYihGSVhQX0RCTCAgKiphbmFseXNCdWZmZXJSZWFsLCAgLyohPCBSZWFsIHBhcnQgb2Ygc3ViYmFuZCBzYW1wbGVzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqKmFuYWx5c0J1ZmZlckltYWcsICAvKiE8IEltYWdpbmFyeSBwYXJ0IG9mIHN1YmJhbmQgc2FtcGxlcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgblNmYiwgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2Ygc2NhbGUgZmFjdG9yIGJhbmRzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICpmcmVxQmFuZFRhYmxlLCAgICAgICAvKiE8IEZpcnN0IFN1YmJhbmQgZm9yIGVhY2ggU2ZiICovCkBAIC0xNTg1LDcgKzE2MDUsNyBAQAogCiAgIFRoZSByZXN1bHRpbmcgZW5lcmd5IGdhaW4gaXMgZ2l2ZW4gYnkgbWFudGlzc2EgYW5kIGV4cG9uZW50LgogKi8KLS8qc3RhdGljKi8gdm9pZCBjYWxjU3ViYmFuZEdhaW4oRklYUF9EQkwgIG5yZ1JlZiwgICAgICAgICAgICAvKiE8IFJlZmVyZW5jZSBFbmVyZ3kgYWNjb3JkaW5nIHRvIGVudmVsb3BlIGRhdGEgKi8KK3N0YXRpYyB2b2lkIGNhbGNTdWJiYW5kR2FpbihGSVhQX0RCTCAgbnJnUmVmLCAgICAgICAgICAgIC8qITwgUmVmZXJlbmNlIEVuZXJneSBhY2NvcmRpbmcgdG8gZW52ZWxvcGUgZGF0YSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICBucmdSZWZfZSwgICAgICAgICAgLyohPCBSZWZlcmVuY2UgRW5lcmd5IGFjY29yZGluZyB0byBlbnZlbG9wZSBkYXRhIChleHBvbmVudCkgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTlZfQ0FMQ19OUkdTKiBucmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBpLApAQCAtMTY4OSw3ICsxNzA5LDcgQEAKICAgVGhlIHJlc3VsdCBpcyB1c2VkIGFzIGEgcmVsYXRpdmUgbGltaXQgZm9yIGFsbCBnYWlucyB3aXRoaW4gdGhlCiAgIGN1cnJlbnQgImxpbWl0ZXIgYmFuZCIgKGEgY2VydGFpbiBmcmVxdWVuY3kgcmFuZ2UpLgogKi8KLS8qc3RhdGljKi8gdm9pZCBjYWxjQXZnR2FpbihFTlZfQ0FMQ19OUkdTKiBucmdzLAorc3RhdGljIHZvaWQgY2FsY0F2Z0dhaW4oRU5WX0NBTENfTlJHUyogbnJncywKICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgbG93U3ViYmFuZCwgICAgLyohPCBCZWdpbiBvZiB0aGUgbGltaXRlciBiYW5kICovCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgIGhpZ2hTdWJiYW5kLCAgIC8qITwgSGlnaCBlbmQgb2YgdGhlIGxpbWl0ZXIgYmFuZCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICpwdHJTdW1SZWYsCkBAIC0xNzI4LDIxICsxNzQ4LDEwMSBAQAogICAqcHRyU3VtUmVmX2UgPSBzdW1SZWZfZTsKIH0KIAorc3RhdGljIHZvaWQgYWRqdXN0VGltZVNsb3RfRWxkR3JpZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwdHJSZWFsLCAgICAgICAgLyohPCBTdWJiYW5kIHNhbXBsZXMgdG8gYmUgYWRqdXN0ZWQsIHJlYWwgcGFydCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5WX0NBTENfTlJHUyogbnJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICpwdHJIYXJtSW5kZXgsICAgLyohPCBIYXJtb25pYyBpbmRleCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIGxvd1N1YmJhbmQsICAgICAvKiE8IExvd2VzdCBRTUYtY2hhbm5lbCBpbiB0aGUgY3VycmVudGx5IHVzZWQgU0JSIHJhbmdlLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIG5vU3ViYmFuZHMsICAgICAvKiE8IE51bWJlciBvZiBRTUYgc3ViYmFuZHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBzY2FsZV9jaGFuZ2UsICAgLyohPCBOdW1iZXIgb2YgYml0cyB0byBzaGlmdCBhZGp1c3RlZCBzYW1wbGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbm9Ob2lzZUZsYWcsICAgIC8qITwgRmxhZyB0byBzdXBwcmVzcyBub2lzZSBhZGRpdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgKnB0clBoYXNlSW5kZXgsICAvKiE8IFN0YXJ0IGluZGV4IHRvIHJhbmRvbSBudW1iZXIgYXJyYXkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBzY2FsZV9kaWZmX2xvdykgLyohPCAgKi8KK3sKKyAgaW50IGs7CisgIEZJWFBfREJMICBzaWduYWxSZWFsLCBzYk5vaXNlOworICBpbnQgdG9uZV9jb3VudCA9IDA7CisKKyAgRklYUF9EQkwgKnBHYWluICAgICAgID0gbnJncy0+bnJnR2FpbjsgICAgIC8qITwgR2FpbnMgb2YgY3VycmVudCBlbnZlbG9wZSAqLworICBGSVhQX0RCTCAqcE5vaXNlTGV2ZWwgPSBucmdzLT5ub2lzZUxldmVsOyAgLyohPCBOb2lzZSBsZXZlbHMgb2YgY3VycmVudCBlbnZlbG9wZSAqLworICBGSVhQX0RCTCAqcFNpbmVMZXZlbCAgPSBucmdzLT5ucmdTaW5lOyAgICAgLyohPCBTaW5lIGxldmVscyAqLworCisgIGludCAgICBwaGFzZUluZGV4ID0gKnB0clBoYXNlSW5kZXg7CisgIFVDSEFSICBoYXJtSW5kZXggID0gKnB0ckhhcm1JbmRleDsKKworICBzdGF0aWMgY29uc3QgSU5UIGhhcm1vbmljUGhhc2UgWzJdWzRdID0geworICAgIHsgMSwgMCwgLTEsICAwfSwKKyAgICB7IDAsIDEsICAwLCAtMX0KKyAgfTsKKworICBzdGF0aWMgY29uc3QgRklYUF9EQkwgaGFybW9uaWNQaGFzZVggWzJdWzRdID0geworICAgIHsgRkwyRlhDT05TVF9EQkwoMi4wKjEuMjQ1MTgzMTU0NTM5MTM5ZS0wMDEpLCAgRkwyRlhDT05TVF9EQkwoMi4wKi0xLjEyMzc2Nzg1OTMyNTAyOGUtMDAxKSwgIEZMMkZYQ09OU1RfREJMKDIuMCotMS4yNDUxODMxNTQ1MzkxMzllLTAwMSksIEZMMkZYQ09OU1RfREJMKDIuMCogMS4xMjM3Njc4NTkzMjUwMjhlLTAwMSkgfSwKKyAgICB7IEZMMkZYQ09OU1RfREJMKDIuMCoxLjI0NTE4MzE1NDUzOTEzOWUtMDAxKSwgIEZMMkZYQ09OU1RfREJMKDIuMCogMS4xMjM3Njc4NTkzMjUwMjhlLTAwMSksICBGTDJGWENPTlNUX0RCTCgyLjAqLTEuMjQ1MTgzMTU0NTM5MTM5ZS0wMDEpLCBGTDJGWENPTlNUX0RCTCgyLjAqLTEuMTIzNzY3ODU5MzI1MDI4ZS0wMDEpIH0KKyAgfTsKKworICBmb3IgKGs9MDsgayA8IG5vU3ViYmFuZHM7IGsrKykgeworCisgICAgcGhhc2VJbmRleCA9IChwaGFzZUluZGV4ICsgMSkgJiAoU0JSX05GX05PX1JBTkRPTV9WQUwgLSAxKTsKKworICAgIGlmKCAocFNpbmVMZXZlbFswXSAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgfHwgKG5vTm9pc2VGbGFnID09IDEpICl7CisgICAgICBzYk5vaXNlID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgfSBlbHNlIHsKKyAgICAgIHNiTm9pc2UgPSBwTm9pc2VMZXZlbFswXTsKKyAgICB9CisKKyAgICBzaWduYWxSZWFsID0gZk11bHREaXYyKCpwdHJSZWFsLCpwR2FpbikgPDwgKChpbnQpc2NhbGVfY2hhbmdlKTsKKworICAgIHNpZ25hbFJlYWwgKz0gKGZNdWx0RGl2MihGREtfc2JyRGVjb2Rlcl9zYnJfcmFuZG9tUGhhc2VbcGhhc2VJbmRleF1bMF0sIHNiTm9pc2UpPDw0KTsKKworICAgIHNpZ25hbFJlYWwgKz0gcFNpbmVMZXZlbFswXSAqIGhhcm1vbmljUGhhc2VbMF1baGFybUluZGV4XTsKKworICAgICpwdHJSZWFsID0gc2lnbmFsUmVhbDsKKworICAgIGlmIChrID09IDApIHsKKyAgICAgICoocHRyUmVhbC0xKSArPSBzY2FsZVZhbHVlKGZNdWx0RGl2MihoYXJtb25pY1BoYXNlWFtsb3dTdWJiYW5kJjFdW2hhcm1JbmRleF0sIHBTaW5lTGV2ZWxbMF0pLCAtc2NhbGVfZGlmZl9sb3cpICA7CisgICAgICBpZiAoayA8IG5vU3ViYmFuZHMgLSAxKSB7CisgICAgICAgICoocHRyUmVhbCkgICArPSBmTXVsdERpdjIocFNpbmVMZXZlbFsxXSwgaGFybW9uaWNQaGFzZVhbKGxvd1N1YmJhbmQrMSkmMV1baGFybUluZGV4XSk7CisgICAgICB9CisgICAgfQorICAgIGlmIChrID4gMCAmJiBrIDwgbm9TdWJiYW5kcyAtIDEgJiYgdG9uZV9jb3VudCA8IDE2KSB7CisgICAgICAqKHB0clJlYWwpICAgKz0gZk11bHREaXYyKHBTaW5lTGV2ZWxbLSAxXSwgaGFybW9uaWNQaGFzZVggWyhsb3dTdWJiYW5kK2spJjFdICBbaGFybUluZGV4XSk7CisgICAgICAqKHB0clJlYWwpICAgKz0gZk11bHREaXYyKHBTaW5lTGV2ZWxbKyAxXSwgaGFybW9uaWNQaGFzZVggWyhsb3dTdWJiYW5kK2srMSkmMV1baGFybUluZGV4XSk7CisgICAgfQorICAgIGlmIChrID09IG5vU3ViYmFuZHMgLSAxICYmIHRvbmVfY291bnQgPCAxNikgeworICAgICAgaWYgKGsgPiAwKSB7CisgICAgICAgICoocHRyUmVhbCkgICArPSBmTXVsdERpdjIocFNpbmVMZXZlbFstIDFdLCBoYXJtb25pY1BoYXNlWCBbKGxvd1N1YmJhbmQraykmMV1baGFybUluZGV4XSk7CisgICAgICB9CisgICAgICBpZiAoayArIGxvd1N1YmJhbmQgKyAxPCA2MykgeworICAgICAgICAqKHB0clJlYWwrMSkgKz0gZk11bHREaXYyKHBTaW5lTGV2ZWxbMF0sIGhhcm1vbmljUGhhc2VYWyhsb3dTdWJiYW5kK2srMSkmMV1baGFybUluZGV4XSk7CisgICAgICB9CisgICAgfQorCisgICAgaWYocFNpbmVMZXZlbFswXSAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSl7CisgICAgICB0b25lX2NvdW50Kys7CisgICAgfQorICAgIHB0clJlYWwrKzsKKyAgICBwTm9pc2VMZXZlbCsrOworICAgIHBHYWluKys7CisgICAgcFNpbmVMZXZlbCsrOworICB9CisKKyAgKnB0ckhhcm1JbmRleCA9IChoYXJtSW5kZXggKyAxKSAmIDM7CisgICpwdHJQaGFzZUluZGV4ID0gcGhhc2VJbmRleCAmIChTQlJfTkZfTk9fUkFORE9NX1ZBTCAtIDEpOworfQogCiAvKiEKICAgXGJyaWVmICAgQW1wbGlmeSBvbmUgdGltZXNsb3Qgb2YgdGhlIHNpZ25hbCB3aXRoIHRoZSBjYWxjdWxhdGVkIGdhaW5zCiAgICAgICAgICAgIGFuZCBhZGQgdGhlIG5vaXNlZmxvb3IuCiAqLwogCi0vKnN0YXRpYyovIHZvaWQgYWRqdXN0VGltZVNsb3RMQyhGSVhQX0RCTCAqcHRyUmVhbCwgICAgICAgLyohPCBTdWJiYW5kIHNhbXBsZXMgdG8gYmUgYWRqdXN0ZWQsIHJlYWwgcGFydCAqLworc3RhdGljIHZvaWQgYWRqdXN0VGltZVNsb3RMQyhGSVhQX0RCTCAqcHRyUmVhbCwgICAgICAgLyohPCBTdWJiYW5kIHNhbXBsZXMgdG8gYmUgYWRqdXN0ZWQsIHJlYWwgcGFydCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTlZfQ0FMQ19OUkdTKiBucmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAqcHRySGFybUluZGV4LCAgLyohPCBIYXJtb25pYyBpbmRleCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbG93U3ViYmFuZCwgICAgLyohPCBMb3dlc3QgUU1GLWNoYW5uZWwgaW4gdGhlIGN1cnJlbnRseSB1c2VkIFNCUiByYW5nZS4gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIG5vU3ViYmFuZHMsICAgIC8qITwgTnVtYmVyIG9mIFFNRiBzdWJiYW5kcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgc2NhbGVfY2hhbmdlLCAgLyohPCBOdW1iZXIgb2YgYml0cyB0byBzaGlmdCBhZGp1c3RlZCBzYW1wbGVzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBub05vaXNlRmxhZywgICAvKiE8IEZsYWcgdG8gc3VwcHJlc3Mgbm9pc2UgYWRkaXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgKnB0clBoYXNlSW5kZXgsIC8qITwgU3RhcnQgaW5kZXggdG8gcmFuZG9tIG51bWJlciBhcnJheSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgZkNsZGZiKSAgICAgICAgLyohPCBDTERGQiA4MCBmbGFnICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICpwdHJQaGFzZUluZGV4KSAvKiE8IFN0YXJ0IGluZGV4IHRvIHJhbmRvbSBudW1iZXIgYXJyYXkgKi8KIHsKICAgRklYUF9EQkwgKnBHYWluICAgICAgID0gbnJncy0+bnJnR2FpbjsgICAgIC8qITwgR2FpbnMgb2YgY3VycmVudCBlbnZlbG9wZSAqLwogICBGSVhQX0RCTCAqcE5vaXNlTGV2ZWwgPSBucmdzLT5ub2lzZUxldmVsOyAgLyohPCBOb2lzZSBsZXZlbHMgb2YgY3VycmVudCBlbnZlbG9wZSAqLwpAQCAtMTc3NSw0MSArMTg3NSwxMCBAQAogICBzaW5lTGV2ZWxOZXh0ID0gKG5vU3ViYmFuZHMgPiAxKSA/IHBTaW5lTGV2ZWxbMF0gOiBGTDJGWENPTlNUX0RCTCgwLjBmKTsKIAogICBpZiAoc2luZUxldmVsIT1GTDJGWENPTlNUX0RCTCgwLjBmKSkgdG9uZV9jb3VudCsrOwotCiAgIGVsc2UgaWYgKCFub05vaXNlRmxhZykKICAgICAgICAgLyogQWRkIG5vaXNlZmxvb3IgdG8gdGhlIGFtcGxpZmllZCBzaWduYWwgKi8KICAgICAgICAgc2lnbmFsUmVhbCArPSAoZk11bHREaXYyKEZES19zYnJEZWNvZGVyX3Nicl9yYW5kb21QaGFzZVtpbmRleF1bMF0sIHBOb2lzZUxldmVsWzBdKTw8NCk7CiAKLSAgaWYgKGZDbGRmYikgewotCi0gICAgaWYgKCEoaGFybUluZGV4JjB4MSkpIHsKLSAgICAgIC8qIGhhcm1JbmRleCAwLDIgKi8KLSAgICAgIHNpZ25hbFJlYWwgKz0gKGhhcm1JbmRleCYweDIpID8gLXNpbmVMZXZlbCA6IHNpbmVMZXZlbDsKLSAgICAgICpwdHJSZWFsKysgPSBzaWduYWxSZWFsOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIC8qIGhhcm1JbmRleCAxLDMgaW4gY29tYmluYXRpb24gd2l0aCBmcmVxSW52RmxhZyAqLwotICAgICAgaW50IHNoaWZ0ID0gKGludCkgKHNjYWxlX2NoYW5nZSsxKTsKLSAgICAgIHNoaWZ0ID0gKHNoaWZ0Pj0wKSA/IGZpeE1pbihERlJBQ1RfQklUUy0xLHNoaWZ0KSA6IGZpeE1heCgtKERGUkFDVF9CSVRTLTEpLHNoaWZ0KTsKLQotICAgICAgRklYUF9EQkwgdG1wMSA9IHNjYWxlVmFsdWUoIGZNdWx0RGl2MihDMV9DTERGQiwgc2luZUxldmVsKSwgLXNoaWZ0ICk7Ci0KLSAgICAgIEZJWFBfREJMIHRtcDIgPSBmTXVsdERpdjIoQzFfQ0xERkIsIHNpbmVMZXZlbE5leHQpOwotCi0KLSAgICAgIC8qIHNhdmUgc3dpdGNoIGFuZCBjb21wYXJlIG9wZXJhdGlvbnMgYW5kIHJlZHVjZSB0byBYT1Igc3RhdGVtZW50ICovCi0gICAgICBpZiAoICgoaGFybUluZGV4Pj4xKSYweDEpXmZyZXFJbnZGbGFnKSB7Ci0gICAgICAgICAgKihwdHJSZWFsLTEpICs9IHRtcDE7Ci0gICAgICAgICAgc2lnbmFsUmVhbCAgIC09IHRtcDI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAgICoocHRyUmVhbC0xKSAtPSB0bXAxOwotICAgICAgICAgIHNpZ25hbFJlYWwgICArPSB0bXAyOwotICAgICAgfQotICAgICAgKnB0clJlYWwrKyA9IHNpZ25hbFJlYWw7Ci0gICAgICBmcmVxSW52RmxhZyA9ICFmcmVxSW52RmxhZzsKLSAgICB9Ci0KLSAgfSBlbHNlCiAgIHsKICAgICBpZiAoIShoYXJtSW5kZXgmMHgxKSkgewogICAgICAgLyogaGFybUluZGV4IDAsMiAqLwpAQCAtMTkzMyw4ICsyMDAyLDkgQEAKICAgKnB0ckhhcm1JbmRleCA9IChoYXJtSW5kZXggKyAxKSAmIDM7CiAgICpwdHJQaGFzZUluZGV4ID0gaW5kZXggJiAoU0JSX05GX05PX1JBTkRPTV9WQUwgLSAxKTsKIH0KLXZvaWQgYWRqdXN0VGltZVNsb3RIUShGSVhQX0RCTCAqUkVTVFJJQ1QgcHRyUmVhbCwgICAgICAgICAgIC8qITwgU3ViYmFuZCBzYW1wbGVzIHRvIGJlIGFkanVzdGVkLCByZWFsIHBhcnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcHRySW1hZywgICAgICAgICAgICAgICAvKiE8IFN1YmJhbmQgc2FtcGxlcyB0byBiZSBhZGp1c3RlZCwgaW1hZyBwYXJ0ICovCitzdGF0aWMgdm9pZCBhZGp1c3RUaW1lU2xvdEhRKAorICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBwdHJSZWFsLCAgICAgIC8qITwgU3ViYmFuZCBzYW1wbGVzIHRvIGJlIGFkanVzdGVkLCByZWFsIHBhcnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcHRySW1hZywgICAgICAvKiE8IFN1YmJhbmQgc2FtcGxlcyB0byBiZSBhZGp1c3RlZCwgaW1hZyBwYXJ0ICovCiAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9DQUxDVUxBVEVfRU5WRUxPUEUgaF9zYnJfY2FsX2VudiwKICAgICAgICAgICAgICAgICAgICAgICBFTlZfQ0FMQ19OUkdTKiBucmdzLAogICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBsb3dTdWJiYW5kLCAgICAgICAgICAgIC8qITwgTG93ZXN0IFFNRi1jaGFubmVsIGluIHRoZSBjdXJyZW50bHkgdXNlZCBTQlIgcmFuZ2UuICovCkBAIC0yMTM3LDcgKzIyMDcsNiBAQAogICBVQ0hBUiB3b3JrTGltaXRlckJhbmRUYWJsZVtNQVhfRlJFUV9DT0VGRlMgLyAyICsgTUFYX05VTV9QQVRDSEVTICsgMV07CiAgIGludCBwYXRjaEJvcmRlcnNbTUFYX05VTV9QQVRDSEVTICsgMV07CiAgIGludCBreCwgazI7Ci0gIEZJWFBfREJMIHRlbXA7CiAKICAgaW50IGxvd1N1YmJhbmQgPSBmcmVxQmFuZFRhYmxlWzBdOwogICBpbnQgaGlnaFN1YmJhbmQgPSBmcmVxQmFuZFRhYmxlW25vRnJlcUJhbmRzXTsKQEAgLTIxNjksMTMgKzIyMzgsMzIgQEAKIAogCiAgICAgd2hpbGUgKGhpTGltSW5kZXggPD0gdGVtcE5vTGltKSB7CisgICAgICBGSVhQX0RCTCBkaXZfbSwgb2N0X20sIHRlbXA7CisgICAgICBJTlQgZGl2X2UgID0gMCwgb2N0X2UgID0gMCwgdGVtcF9lID0gMDsKKwogICAgICAgazIgPSB3b3JrTGltaXRlckJhbmRUYWJsZVtoaUxpbUluZGV4XSArIGxvd1N1YmJhbmQ7CiAgICAgICBreCA9IHdvcmtMaW1pdGVyQmFuZFRhYmxlW2xvTGltSW5kZXhdICsgbG93U3ViYmFuZDsKIAotICAgICAgdGVtcCA9IEZYX1NHTDJGWF9EQkwoRkRLX2dldE51bU9jdGF2ZXNEaXY4KGt4LGsyKSk7IC8qIE51bWJlciBvZiBvY3RhdmVzICovCi0gICAgICB0ZW1wID0gZk11bHQodGVtcCwgRkRLX3NickRlY29kZXJfc2JyX2xpbWl0ZXJCYW5kc1Blck9jdGF2ZURpdjRbbGltaXRlckJhbmRzXSk7CisgICAgICBkaXZfbSAgPSBmRGl2Tm9ybShrMiwga3gsICZkaXZfZSk7CiAKLSAgICAgIGlmICh0ZW1wIDwgRkwyRlhDT05TVF9EQkwgKDAuNDlmKT4+NSkgeworICAgICAgLyogY2FsY3VsYXRlIG51bWJlciBvZiBvY3RhdmVzICovCisgICAgICBvY3RfbSAgPSBmTG9nMihkaXZfbSwgZGl2X2UsICZvY3RfZSk7CisKKyAgICAgIC8qIG11bHRpcGx5IHdpdGggbGltaXRlcmJhbmRzIHBlciBvY3RhdmUgICAgKi8KKyAgICAgIC8qIHZhbHVlcyAxLCAxLjIsIDIsIDMgLT4gc2NhbGUgZmFjdG9yIG9mIDIgKi8KKyAgICAgIHRlbXAgPSBmTXVsdE5vcm0ob2N0X20sIEZES19zYnJEZWNvZGVyX3Nicl9saW1pdGVyQmFuZHNQZXJPY3RhdmVEaXY0X0RCTFtsaW1pdGVyQmFuZHNdLCAmdGVtcF9lKTsKKworICAgICAgLyogb3ZlcmFsbCBzY2FsZSBmYWN0b3Igb2YgdGVtcCBpc3QgYWRkaXRpb24gb2Ygc2NhbGVmYWN0b3JzIGZyb20gbG9nMiBjYWxjdWxhdGlvbiwKKyAgICAgICAgIGxpbWl0ZXIgYmFuZHMgc2NhbGVmYWN0b3IgKDIpIGFuZCBsaW1pdGVyIGJhbmRzIG11bHRpcGxpY2F0aW9uICovCisgICAgICB0ZW1wX2UgKz0gb2N0X2UgKyAyOworCisgICAgICAvKiAgICBkaXYgY2FuIGJlIGEgbWF4aW11bSBvZiA2NCAoazIgPSA2NCBhbmQga3ggPSAxKQorICAgICAgICAgLT4gb2N0IGNhbiBiZSBhIG1heGltdW0gb2YgNgorICAgICAgICAgLT4gdGVtcCBjYW4gYmUgYSBtYXhpbXVtIG9mIDE4IChhcyBsaW1pdGVyQmFuZHNQZXJPY3RvYXZlIGlzIGEgbWF4aW11bSBmYWN0b3Igb2YgMykKKyAgICAgICAgIC0+IHdlIG5lZWQgYSBzY2FsZSBmYWN0b3Igb2YgNSBmb3IgY29tcGFyaXNzb24KKyAgICAgICovCisgICAgICBpZiAodGVtcCA+PiAoNSAtIHRlbXBfZSkgPCBGTDJGWENPTlNUX0RCTCAoMC40OWYpID4+IDUpIHsKKwogICAgICAgICBpZiAod29ya0xpbWl0ZXJCYW5kVGFibGVbaGlMaW1JbmRleF0gPT0gd29ya0xpbWl0ZXJCYW5kVGFibGVbbG9MaW1JbmRleF0pIHsKICAgICAgICAgICB3b3JrTGltaXRlckJhbmRUYWJsZVtoaUxpbUluZGV4XSA9IGhpZ2hTdWJiYW5kOwogICAgICAgICAgIG5CYW5kcy0tOwpkaWZmIC0tZ2l0IGEvbGliU0JSZGVjL3NyYy9lbnZfZGVjLmNwcCBiL2xpYlNCUmRlYy9zcmMvZW52X2RlYy5jcHAKaW5kZXggMjRiMmQzYi4uYzY1YzE2OSAxMDA2NDQKLS0tIGEvbGliU0JSZGVjL3NyYy9lbnZfZGVjLmNwcAorKysgYi9saWJTQlJkZWMvc3JjL2Vudl9kZWMuY3BwCkBAIC0yLDcgKzIsNyBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgogICBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCkBAIC0zNjksNyArMzY5LDcgQEAKICAgRklYUF9TR0wgc3RlcDsgICAgLyogc3BlZWQgb2YgZmFkZSAqLwogICBpbnQgaTsKIAotICBpbnQgY3VycmVudFN0YXJ0UG9zID0gaF9wcmV2X2RhdGEtPnN0b3BQb3MgLSBoSGVhZGVyRGF0YS0+bnVtYmVyVGltZVNsb3RzOworICBpbnQgY3VycmVudFN0YXJ0UG9zID0gRkRLbWF4KDAsIGhfcHJldl9kYXRhLT5zdG9wUG9zIC0gaEhlYWRlckRhdGEtPm51bWJlclRpbWVTbG90cyk7CiAgIGludCBjdXJyZW50U3RvcFBvcyA9IGhIZWFkZXJEYXRhLT5udW1iZXJUaW1lU2xvdHM7CiAKIApkaWZmIC0tZ2l0IGEvbGliU0JSZGVjL3NyYy9lbnZfZXh0ci5jcHAgYi9saWJTQlJkZWMvc3JjL2Vudl9leHRyLmNwcAppbmRleCA2Y2IwYjk5Li5kYWNkOTUxIDEwMDY0NAotLS0gYS9saWJTQlJkZWMvc3JjL2Vudl9leHRyLmNwcAorKysgYi9saWJTQlJkZWMvc3JjL2Vudl9leHRyLmNwcApAQCAtMiw3ICsyLDcgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgpAQCAtMzI3LDcgKzMyNyw3IEBACiAgIH0KIAogICAvKiBMb29rIGZvciBuZXcgc2V0dGluZ3MuIElFQyAxNDQ5Ni0zLCA0LjYuMTguMy4xICovCi0gIGlmKGhIZWFkZXJEYXRhLT5zeW5jU3RhdGUgIT0gU0JSX0FDVElWRSB8fAorICBpZihoSGVhZGVyRGF0YS0+c3luY1N0YXRlIDwgU0JSX0hFQURFUiB8fAogICAgICBsYXN0SGVhZGVyLnN0YXJ0RnJlcSAgICE9IHBCc0RhdGEtPnN0YXJ0RnJlcSAgIHx8CiAgICAgIGxhc3RIZWFkZXIuc3RvcEZyZXEgICAgIT0gcEJzRGF0YS0+c3RvcEZyZXEgICAgfHwKICAgICAgbGFzdEhlYWRlci5mcmVxU2NhbGUgICAhPSBwQnNEYXRhLT5mcmVxU2NhbGUgICB8fApkaWZmIC0tZ2l0IGEvbGliU0JSZGVjL3NyYy9lbnZfZXh0ci5oIGIvbGliU0JSZGVjL3NyYy9lbnZfZXh0ci5oCmluZGV4IGFiNmI3MDQuLjA1MThlYTkgMTAwNjQ0Ci0tLSBhL2xpYlNCUmRlYy9zcmMvZW52X2V4dHIuaAorKysgYi9saWJTQlJkZWMvc3JjL2Vudl9leHRyLmgKQEAgLTIsNyArMiw3IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KQEAgLTEyNSw2ICsxMjUsNyBAQAogdHlwZWRlZiBlbnVtCiB7CiAgIEhFQURFUl9OT1RfUFJFU0VOVCwKKyAgSEVBREVSX0VSUk9SLAogICBIRUFERVJfT0ssCiAgIEhFQURFUl9SRVNFVAogfQpAQCAtMTMyLDEwICsxMzMsMTAgQEAKIAogdHlwZWRlZiBlbnVtCiB7Ci0gIFNCUl9OT1RfSU5JVElBTElaRUQsCi0gIFVQU0FNUExJTkcsCi0gIFNCUl9IRUFERVIsCi0gIFNCUl9BQ1RJVkUKKyAgU0JSX05PVF9JTklUSUFMSVpFRCA9IDAsCisgIFVQU0FNUExJTkcgPSAxLAorICBTQlJfSEVBREVSID0gMiwKKyAgU0JSX0FDVElWRSA9IDMKIH0KIFNCUl9TWU5DX1NUQVRFOwogCkBAIC0xNzksNiArMTgwLDcgQEAKICNkZWZpbmUgU0JSREVDX0xPV19QT1dFUiAgICAgIDE2ICAvKiBGbGFnIGluZGljYXRpbmcgdGhhdCBMb3cgUG93ZXIgUU1GIG1vZGUgc2hhbGwgYmUgdXNlZC4gKi8KICNkZWZpbmUgU0JSREVDX1BTX0RFQ09ERUQgICAgIDMyICAvKiBGbGFnIGluZGljYXRpbmcgdGhhdCBQUyB3YXMgZGVjb2RlZCBhbmQgcmVuZGVyZWQuICovCiAjZGVmaW5lIFNCUkRFQ19MRF9NUFNfUU1GICAgIDUxMiAgLyogRmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIExELU1QUyBRTUYgc2hhbGwgYmUgdXNlZC4gKi8KKyNkZWZpbmUgU0JSREVDX1NZTlRBWF9EUk0gICAyMDQ4ICAvKiBGbGFnIGluZGljYXRpbmcgdGhhdCBEUk0zMC9EUk0rIHJldmVyc2Ugc3ludGF4IGlzIGJlaW5nIHVzZWQuICovCiAjZGVmaW5lIFNCUkRFQ19ET1dOU0FNUExFICAgODE5MiAgLyogRmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIGRvd25zYW1wbGluZyBtb2RlIGlzIHVzZWQuICovCiAjZGVmaW5lIFNCUkRFQ19GTFVTSCAgICAgICAxNjM4NCAgLyogRmxhZyBpcyB1c2VkIHRvIGZsdXNoIGFsbCBlbGVtZW50cyBpbiB1c2UuICovCiAjZGVmaW5lIFNCUkRFQ19GT1JDRV9SRVNFVCAzMjc2OCAgLyogRmxhZyBpcyB1c2VkIHRvIGZvcmNlIGEgcmVzZXQgb2YgYWxsIGVsZW1lbnRzIGluIHVzZS4gKi8KZGlmZiAtLWdpdCBhL2xpYlNCUmRlYy9zcmMvc2JyX2RlYy5jcHAgYi9saWJTQlJkZWMvc3JjL3Nicl9kZWMuY3BwCmluZGV4IDEyODIzMzguLjA4NjQzNDggMTAwNjQ0Ci0tLSBhL2xpYlNCUmRlYy9zcmMvc2JyX2RlYy5jcHAKKysrIGIvbGliU0JSZGVjL3NyYy9zYnJfZGVjLmNwcApAQCAtMiw3ICsyLDcgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgpAQCAtMjI1LDcgKzIyNSwxNCBAQAogICB9CiAKICAgaWYgKHJlc2V0QW5hUW1mKSB7Ci0gICAgaW50IHFtZkVyciA9IHFtZkluaXRBbmFseXNpc0ZpbHRlckJhbmsgKAorICAgIFFNRl9GSUxURVJfQkFOSyBwcnZBbmFRbWY7CisgICAgaW50ICBxbWZFcnI7CisKKyAgICAvKiBTdG9yZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gKi8KKyAgICBGREttZW1jcHkoJnBydkFuYVFtZiwgJmhTYnJEZWMtPkFuYWx5c2lzY1FNRiwgc2l6ZW9mKFFNRl9GSUxURVJfQkFOSykpOworCisgICAgLyogUmVzZXQgYW5hbHlzaXMgUU1GICovCisgICAgcW1mRXJyID0gcW1mSW5pdEFuYWx5c2lzRmlsdGVyQmFuayAoCiAgICAgICAgICAgICZoU2JyRGVjLT5BbmFseXNpc2NRTUYsCiAgICAgICAgICAgICBoU2JyRGVjLT5hbmFRbWZTdGF0ZXMsCiAgICAgICAgICAgICBoU2JyRGVjLT5BbmFseXNpc2NRTUYubm9fY29sLApAQCAtMjM0LDEzICsyNDEsMjIgQEAKICAgICAgICAgICAgIGhTYnJEZWMtPkFuYWx5c2lzY1FNRi5ub19jaGFubmVscywKICAgICAgICAgICAgIGFuYVFtZkZsYWdzIHwgUU1GX0ZMQUdfS0VFUF9TVEFURVMKICAgICAgICAgICAgICk7CisKICAgICBpZiAocW1mRXJyICE9IDApIHsKLSAgICAgIEZES19BU1NFUlQoMCk7CisgICAgICAvKiBSZXN0b3JlIG9sZCBjb25maWd1cmF0aW9uIG9mIGFuYWx5c2lzIFFNRiAqLworICAgICAgRkRLbWVtY3B5KCZoU2JyRGVjLT5BbmFseXNpc2NRTUYsICZwcnZBbmFRbWYsIHNpemVvZihRTUZfRklMVEVSX0JBTkspKTsKICAgICB9CiAgIH0KIAogICBpZiAocmVzZXRTeW5RbWYpIHsKLSAgICBpbnQgcW1mRXJyID0gcW1mSW5pdFN5bnRoZXNpc0ZpbHRlckJhbmsgKAorICAgIFFNRl9GSUxURVJfQkFOSyBwcnZTeW5RbWY7CisgICAgaW50ICBxbWZFcnI7CisKKyAgICAvKiBTdG9yZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gKi8KKyAgICBGREttZW1jcHkoJnBydlN5blFtZiwgJmhTYnJEZWMtPlN5bnRoZXNpc1FNRiwgc2l6ZW9mKFFNRl9GSUxURVJfQkFOSykpOworCisgICAgLyogUmVzZXQgc3ludGhlc2lzIFFNRiAqLworICAgIHFtZkVyciA9IHFtZkluaXRTeW50aGVzaXNGaWx0ZXJCYW5rICgKICAgICAgICAgICAgJmhTYnJEZWMtPlN5bnRoZXNpc1FNRiwKICAgICAgICAgICAgIGhTYnJEZWMtPnBTeW5RbWZTdGF0ZXMsCiAgICAgICAgICAgICBoU2JyRGVjLT5TeW50aGVzaXNRTUYubm9fY29sLApAQCAtMjUxLDcgKzI2Nyw4IEBACiAgICAgICAgICAgICApOwogCiAgICAgaWYgKHFtZkVyciAhPSAwKSB7Ci0gICAgICBGREtfQVNTRVJUKDApOworICAgICAgLyogUmVzdG9yZSBvbGQgY29uZmlndXJhdGlvbiBvZiBzeW50aGVzaXMgUU1GICovCisgICAgICBGREttZW1jcHkoJmhTYnJEZWMtPlN5bnRoZXNpc1FNRiwgJnBydlN5blFtZiwgc2l6ZW9mKFFNRl9GSUxURVJfQkFOSykpOwogICAgIH0KICAgfQogfQpAQCAtMzIxLDcgKzMzOCw4IEBACiAgICAgICAgICAgSEFORExFX1NCUl9QUkVWX0ZSQU1FX0RBVEEgaFByZXZGcmFtZURhdGEsICAvKiE8IFNvbWUgY29udHJvbCBkYXRhIG9mIGxhc3QgZnJhbWUgKi8KICAgICAgICAgICBjb25zdCBpbnQgYXBwbHlQcm9jZXNzaW5nLCAgICAgICAgIC8qITwgRmxhZyBmb3IgU0JSIG9wZXJhdGlvbiAqLwogICAgICAgICAgIEhBTkRMRV9QU19ERUMgaF9wc19kLAotICAgICAgICAgIGNvbnN0IFVJTlQgZmxhZ3MKKyAgICAgICAgICBjb25zdCBVSU5UIGZsYWdzLAorICAgICAgICAgIGNvbnN0IGludCBjb2RlY0ZyYW1lU2l6ZQogICAgICAgICAgKQogewogICBpbnQgaSwgc2xvdCwgcmVzZXJ2ZTsKQEAgLTM0OCw2ICszNjYsMzMgQEAKICAgaWYgKGZsYWdzICYgU0JSREVDX0VMRF9HUklEKSB7CiAgICAgLyogQ2hvb3NlIHRoZSByaWdodCBsb3cgZGVsYXkgZmlsdGVyIGJhbmsgKi8KICAgICBjaGFuZ2VRbWZUeXBlKCBoU2JyRGVjLCAoZmxhZ3MgJiBTQlJERUNfTERfTVBTX1FNRikgPyAxIDogMCApOworCisgICAgLyogSWYgdGhlIExELU1QUyBRTUYgaXMgbm90IGF2YWlsYWJsZSBkZWxheSB0aGUgc2lnbmFsIGJ5ICg5Ni00OCpsZFNiclNhbXBsaW5nUmF0ZSkKKyAgICAgKiBzYW1wbGVzIGFjY29yZGluZyB0byBJU08vSUVDIDE0NDk2LTM6MjAwOS9GREFNIDI6MjAxMChFKSBjaGFwdGVyIDQuNS4yLjEzLiAqLworICAgIGlmICggKGZsYWdzICYgU0JSREVDX0xEX01QU19RTUYpCisgICAgICAmJiAoaFNickRlYy0+QW5hbHlzaXNjUU1GLmZsYWdzICYgUU1GX0ZMQUdfQ0xERkIpICkKKyAgICB7CisgICAgICBJTlRfUENNICpwRGx5QnVmID0gaFNickRlYy0+Y29yZURlbGF5QnVmOyAgLyogRExZQlVGICovCisgICAgICBpbnQgc21wbCwgZGVsYXkgPSA5NiA+PiAoIShmbGFncyAmIFNCUkRFQ19ET1dOU0FNUExFKSA/IDEgOiAwKTsKKyAgICAgIC8qIENyZWF0ZSBUTVBCVUYgKi8KKyAgICAgIENfQUFMTE9DX1NDUkFUQ0hfU1RBUlQocGNtVGVtcCwgSU5UX1BDTSwgKDk2KSk7CisgICAgICAvKiBDb3B5IGRlbGF5IHNhbXBsZXMgZnJvbSBJTkJVRiB0byBUTVBCVUYgKi8KKyAgICAgIGZvciAoc21wbCA9IDA7IHNtcGwgPCBkZWxheTsgc21wbCArPSAxKSB7CisgICAgICAgIHBjbVRlbXBbc21wbF0gPSB0aW1lSW5bKGNvZGVjRnJhbWVTaXplLWRlbGF5K3NtcGwpKnN0cmlkZUluXTsKKyAgICAgIH0KKyAgICAgIC8qIE1vdmUgaW5wdXQgc2lnbmFsIHJlbWFpbmRlciB0byB0aGUgdmVyeSBlbmQgb2YgSU5CVUYgKi8KKyAgICAgIGZvciAoc21wbCA9IChjb2RlY0ZyYW1lU2l6ZS1kZWxheS0xKSpzdHJpZGVJbjsgc21wbCA+PSAwOyBzbXBsIC09IHN0cmlkZUluKSB7CisgICAgICAgIHRpbWVJbltzbXBsK2RlbGF5XSA9IHRpbWVJbltzbXBsXTsKKyAgICAgIH0KKyAgICAgIC8qIENvcHkgZGVsYXllZCBzYW1wbGVzIGZyb20gbGFzdCBmcmFtZSBmcm9tIERMWUJVRiB0byB0aGUgdmVyeSBiZWdpbm5pbmcgb2YgSU5CVUYgKi8KKyAgICAgIGZvciAoc21wbCA9IDA7IHNtcGwgPCBkZWxheTsgc21wbCArPSAxKSB7CisgICAgICAgIHRpbWVJbltzbXBsKnN0cmlkZUluXSA9IHBEbHlCdWZbc21wbF07CisgICAgICB9CisgICAgICAvKiBDb3B5IFRNUEJVRiB0byBETFlCVUYgKi8KKyAgICAgIEZES21lbWNweShwRGx5QnVmLCBwY21UZW1wLCBkZWxheSpzaXplb2YoSU5UX1BDTSkpOworICAgICAgLyogRGVzdG9yeSBUTVBCVUYgKi8KKyAgICAgIENfQUFMTE9DX1NDUkFUQ0hfRU5EKHBjbVRlbXAsIElOVF9QQ00sICg5NikpOworICAgIH0KICAgfQogCiAgIC8qCkBAIC03NjEsNyArODA2LDcgQEAKICAgewogICAgIGludCBxbWZFcnI7CiAgICAgLyogQWRhcHRlZCBRTUYgYW5hbHlzaXMgcG9zdC10d2lkZGxlcyBmb3IgZG93bi1zYW1wbGVkIEhRIFNCUiAqLwotICAgIGNvbnN0IFVJTlQgZG93blNhbXBsZWRGbGFnID0gKGRvd25zYW1wbGVGYWM9PTIpID8gUU1GX0ZMQUdfRE9XTlNBTVBMRUQgOiAwOworICAgIGNvbnN0IFVJTlQgZG93blNhbXBsZWRGbGFnID0gKGZsYWdzICYgU0JSREVDX0RPV05TQU1QTEUpID8gUU1GX0ZMQUdfRE9XTlNBTVBMRUQgOiAwOwogCiAgICAgcW1mRXJyID0gcW1mSW5pdEFuYWx5c2lzRmlsdGVyQmFuayAoCiAgICAgICAgICAgICAgICAgICAgICZocy0+QW5hbHlzaXNjUU1GLApAQCAtODM2LDYgKzg4MSw5IEBACiAgICAgfQogICB9CiAKKyAgLyogQ2xlYXIgaW5wdXQgZGVsYXkgbGluZSAqLworICBGREttZW1jbGVhcihocy0+Y29yZURlbGF5QnVmLCAoOTYpKnNpemVvZihJTlRfUENNKSk7CisKICAgLyogYXNzaWduIHFtZiB0aW1lIHNsb3RzICovCiAgIGFzc2lnblRpbWVTbG90cyggJmhTYnJDaGFubmVsLT5TYnJEZWMsIGhIZWFkZXJEYXRhLT5udW1iZXJUaW1lU2xvdHMgKiBoSGVhZGVyRGF0YS0+dGltZVN0ZXAsIHFtZkZsYWdzICYgUU1GX0ZMQUdfTFApOwogCmRpZmYgLS1naXQgYS9saWJTQlJkZWMvc3JjL3Nicl9kZWMuaCBiL2xpYlNCUmRlYy9zcmMvc2JyX2RlYy5oCmluZGV4IDE3NWU3YjIuLmVkZGU2MzcgMTAwNjQ0Ci0tLSBhL2xpYlNCUmRlYy9zcmMvc2JyX2RlYy5oCisrKyBiL2xpYlNCUmRlYy9zcmMvc2JyX2RlYy5oCkBAIC0yLDcgKzIsNyBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgogICBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCkBAIC0xMTgsNiArMTE4LDkgQEAKICAgRklYUF9EQkwgKiBXb3JrQnVmZmVyMTsKICAgRklYUF9EQkwgKiBXb3JrQnVmZmVyMjsKIAorICAvKiBEZWxheWVkIHRpbWUgaW5wdXQgc2lnbmFsIG5lZWRlZCB0byBhbGlnbiBDTERGRCB3aXRoIExELU1QUyBRTUYuICovCisgIElOVF9QQ00gICAgY29yZURlbGF5QnVmWyg5NildOworCiAgIC8qIFFNRiBmaWx0ZXIgc3RhdGVzICovCiAgIEZJWFBfUUFTICAgYW5hUW1mU3RhdGVzWygzMjApXTsKICAgRklYUF9RU1MgKiBwU3luUW1mU3RhdGVzOwpAQCAtMTgyLDcgKzE4NSw4IEBACiAgICAgICAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoUHJldkZyYW1lRGF0YSwgIC8qITwgU29tZSBjb250cm9sIGRhdGEgb2YgbGFzdCBmcmFtZSAqLwogICAgICAgICAgY29uc3QgaW50IGFwcGx5UHJvY2Vzc2luZywgICAgICAgICAvKiE8IEZsYWcgZm9yIFNCUiBvcGVyYXRpb24gKi8KICAgICAgICAgIEhBTkRMRV9QU19ERUMgaF9wc19kLAotICAgICAgICAgY29uc3QgVUlOVCBmbGFncworICAgICAgICAgY29uc3QgVUlOVCBmbGFncywKKyAgICAgICAgIGNvbnN0IGludCBjb2RlY0ZyYW1lU2l6ZQogICAgICAgICApOwogCiAKZGlmZiAtLWdpdCBhL2xpYlNCUmRlYy9zcmMvc2JyX3JhbS5oIGIvbGliU0JSZGVjL3NyYy9zYnJfcmFtLmgKaW5kZXggZjEyNjMxZC4uN2FiNTA0NCAxMDA2NDQKLS0tIGEvbGliU0JSZGVjL3NyYy9zYnJfcmFtLmgKKysrIGIvbGliU0JSZGVjL3NyYy9zYnJfcmFtLmgKQEAgLTIsNyArMiw3IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KQEAgLTEzNSw2ICsxMzUsNyBAQAogICBVU0hPUlQgY29kZWNGcmFtZVNpemU7CiAgIFVDSEFSIHN5bkRvd25zYW1wbGVGYWM7CiAgIFVDSEFSIG51bURlbGF5RnJhbWVzOyAgICAgICAgLyogVGhlIGN1cnJlbnQgbnVtYmVyIG9mIGFkZGl0aW9uYWwgZGVsYXkgZnJhbWVzIHVzZWQgZm9yIHByb2Nlc3NpbmcuICovCisgIFVDSEFSIG51bUZsdXNoZWRGcmFtZXM7ICAgICAgLyogVGhlIHZhcmlhYmxlIGNvdW50cyB0aGUgbnVtYmVyIG9mIGZyYW1lcyB3aGljaCBhcmUgZmx1c2hlZCBjb25zZWN1dGl2ZWx5LiAqLwogCiAgIFVJTlQgZmxhZ3M7CiAKZGlmZiAtLWdpdCBhL2xpYlNCUmRlYy9zcmMvc2JyX3JvbS5jcHAgYi9saWJTQlJkZWMvc3JjL3Nicl9yb20uY3BwCmluZGV4IGU4NGMzY2QuLmM0OGNlMzUgMTAwNjQ0Ci0tLSBhL2xpYlNCUmRlYy9zcmMvc2JyX3JvbS5jcHAKKysrIGIvbGliU0JSZGVjL3NyYy9zYnJfcm9tLmNwcApAQCAtMiw3ICsyLDcgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgpAQCAtMTg5LDYgKzE4OSwxNSBAQAogICBGTDJGWENPTlNUX1NHTCgzLjBmIC8gNC4wZikKIH07CiAKKy8qISBDb25zdGFudHMgZm9yIGNhbGN1bGF0aW5nIHRoZSBudW1iZXIgb2YgbGltaXRlciBiYW5kcyAqLworY29uc3QgRklYUF9EQkwgRkRLX3NickRlY29kZXJfc2JyX2xpbWl0ZXJCYW5kc1Blck9jdGF2ZURpdjRfREJMWzRdID0KK3sKKyAgRkwyRlhDT05TVF9EQkwoMS4wZiAvIDQuMGYpLAorICBGTDJGWENPTlNUX0RCTCgxLjJmIC8gNC4wZiksCisgIEZMMkZYQ09OU1RfREJMKDIuMGYgLyA0LjBmKSwKKyAgRkwyRlhDT05TVF9EQkwoMy4wZiAvIDQuMGYpCit9OworCiAvKiEgUmF0aW8gb2Ygb2xkIGdhaW5zIGFuZCBub2lzZSBsZXZlbHMgZm9yIHRoZSBmaXJzdCA0IHRpbWVzbG90cyBvZiBhbiBlbnZlbG9wZSAqLwogY29uc3QgRklYUF9TR0wgRkRLX3NickRlY29kZXJfc2JyX3Ntb290aEZpbHRlcls0XSA9IHsKICAgRkwyRlhDT05TVF9TR0woMC42NjY2NjY2NjY2NjY2NmYpLApkaWZmIC0tZ2l0IGEvbGliU0JSZGVjL3NyYy9zYnJfcm9tLmggYi9saWJTQlJkZWMvc3JjL3Nicl9yb20uaAppbmRleCBjMzE4ODcwLi4xZjgwMGJjIDEwMDY0NAotLS0gYS9saWJTQlJkZWMvc3JjL3Nicl9yb20uaAorKysgYi9saWJTQlJkZWMvc3JjL3Nicl9yb20uaApAQCAtMiw3ICsyLDcgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgpAQCAtMTI0LDYgKzEyNCw3IEBACiBleHRlcm4gY29uc3QgRklYUF9TR0wgRkRLX3NickRlY29kZXJfc2JyX2xpbUdhaW5zX21bNF07CiBleHRlcm4gY29uc3QgVUNIQVIgICAgRkRLX3NickRlY29kZXJfc2JyX2xpbUdhaW5zX2VbNF07CiBleHRlcm4gY29uc3QgRklYUF9TR0wgRkRLX3NickRlY29kZXJfc2JyX2xpbWl0ZXJCYW5kc1Blck9jdGF2ZURpdjRbNF07CitleHRlcm4gY29uc3QgRklYUF9EQkwgRkRLX3NickRlY29kZXJfc2JyX2xpbWl0ZXJCYW5kc1Blck9jdGF2ZURpdjRfREJMWzRdOwogZXh0ZXJuIGNvbnN0IEZJWFBfU0dMIEZES19zYnJEZWNvZGVyX3Nicl9zbW9vdGhGaWx0ZXJbNF07CiBleHRlcm4gY29uc3QgRklYUF9TR0wgRkRLX3NickRlY29kZXJfc2JyX3JhbmRvbVBoYXNlW1NCUl9ORl9OT19SQU5ET01fVkFMXVsyXTsKIGV4dGVybiBjb25zdCBGSVhQX1NHTCBoYXJtb25pY1BoYXNlWCBbMl1bNF07CmRpZmYgLS1naXQgYS9saWJTQlJkZWMvc3JjL3NicmRlY29kZXIuY3BwIGIvbGliU0JSZGVjL3NyYy9zYnJkZWNvZGVyLmNwcAppbmRleCBlMTUxNDVhLi5mOWRlZDU0IDEwMDY0NAotLS0gYS9saWJTQlJkZWMvc3JjL3NicmRlY29kZXIuY3BwCisrKyBiL2xpYlNCUmRlYy9zcmMvc2JyZGVjb2Rlci5jcHAKQEAgLTEyOCw2ICsxMjgsNyBAQAogI2luY2x1ZGUgImxwcF90cmFuLmgiCiAjaW5jbHVkZSAidHJhbnNjZW5kZW50LmgiCiAKKyNpbmNsdWRlICJGREtfY3JjLmgiCiAKICNpbmNsdWRlICJzYnJkZWNfZHJjLmgiCiAKQEAgLTEzNyw3ICsxMzgsNyBAQAogLyogRGVjb2RlciBsaWJyYXJ5IGluZm8gKi8KICNkZWZpbmUgU0JSREVDT0RFUl9MSUJfVkwwIDIKICNkZWZpbmUgU0JSREVDT0RFUl9MSUJfVkwxIDIKLSNkZWZpbmUgU0JSREVDT0RFUl9MSUJfVkwyIDcKKyNkZWZpbmUgU0JSREVDT0RFUl9MSUJfVkwyIDEyCiAjZGVmaW5lIFNCUkRFQ09ERVJfTElCX1RJVExFICJTQlIgRGVjb2RlciIKICNpZmRlZiBfX0FORFJPSURfXwogI2RlZmluZSBTQlJERUNPREVSX0xJQl9CVUlMRF9EQVRFICIiCkBAIC0xOTQsNiArMTk1LDMzIEBACiAgIGhEc3QtPmZyZXFCYW5kRGF0YS5mcmVxQmFuZFRhYmxlWzFdID0gaERzdC0+ZnJlcUJhbmREYXRhLmZyZXFCYW5kVGFibGVIaTsKIH0KIAorc3RhdGljIGludCBjb21wYXJlU2JySGVhZGVyKCBjb25zdCBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZHIxLCBjb25zdCBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZHIyICkKK3sKKyAgaW50IHJlc3VsdCA9IDA7CisKKyAgLyogY29tcGFyZSBiYXNpYyBkYXRhICovCisgIHJlc3VsdCB8PSAoaEhkcjEtPnN5bmNTdGF0ZSAhPSBoSGRyMi0+c3luY1N0YXRlKSA/IDEgOiAwOworICByZXN1bHQgfD0gKGhIZHIxLT5zdGF0dXMgIT0gaEhkcjItPnN0YXR1cykgPyAxIDogMDsKKyAgcmVzdWx0IHw9IChoSGRyMS0+ZnJhbWVFcnJvckZsYWcgIT0gaEhkcjItPmZyYW1lRXJyb3JGbGFnKSA/IDEgOiAwOworICByZXN1bHQgfD0gKGhIZHIxLT5udW1iZXJUaW1lU2xvdHMgIT0gaEhkcjItPm51bWJlclRpbWVTbG90cykgPyAxIDogMDsKKyAgcmVzdWx0IHw9IChoSGRyMS0+bnVtYmVyT2ZBbmFseXNpc0JhbmRzICE9IGhIZHIyLT5udW1iZXJPZkFuYWx5c2lzQmFuZHMpID8gMSA6IDA7CisgIHJlc3VsdCB8PSAoaEhkcjEtPnRpbWVTdGVwICE9IGhIZHIyLT50aW1lU3RlcCkgPyAxIDogMDsKKyAgcmVzdWx0IHw9IChoSGRyMS0+c2JyUHJvY1NtcGxSYXRlICE9IGhIZHIyLT5zYnJQcm9jU21wbFJhdGUpID8gMSA6IDA7CisKKyAgLyogY29tcGFyZSBiaXRzdHJlYW0gZGF0YSAqLworICByZXN1bHQgfD0gRkRLbWVtY21wKCAmaEhkcjEtPmJzX2RhdGEsICZoSGRyMi0+YnNfZGF0YSwgc2l6ZW9mKFNCUl9IRUFERVJfREFUQV9CUykgKTsKKyAgcmVzdWx0IHw9IEZES21lbWNtcCggJmhIZHIxLT5ic19pbmZvLCAmaEhkcjItPmJzX2luZm8sIHNpemVvZihTQlJfSEVBREVSX0RBVEFfQlNfSU5GTykgKTsKKworICAvKiBjb21wYXJlIGZyZXF1ZW5jeSBiYW5kIGRhdGEgKi8KKyAgcmVzdWx0IHw9IEZES21lbWNtcCggJmhIZHIxLT5mcmVxQmFuZERhdGEsICZoSGRyMi0+ZnJlcUJhbmREYXRhLCAoOCtNQVhfTlVNX0xJTUlURVJTKzEpKnNpemVvZihVQ0hBUikgKTsKKyAgcmVzdWx0IHw9IEZES21lbWNtcCggaEhkcjEtPmZyZXFCYW5kRGF0YS5mcmVxQmFuZFRhYmxlTG8sIGhIZHIyLT5mcmVxQmFuZERhdGEuZnJlcUJhbmRUYWJsZUxvLCAoTUFYX0ZSRVFfQ09FRkZTLzIrMSkqc2l6ZW9mKFVDSEFSKSApOworICByZXN1bHQgfD0gRkRLbWVtY21wKCBoSGRyMS0+ZnJlcUJhbmREYXRhLmZyZXFCYW5kVGFibGVIaSwgaEhkcjItPmZyZXFCYW5kRGF0YS5mcmVxQmFuZFRhYmxlSGksIChNQVhfRlJFUV9DT0VGRlMrMSkqc2l6ZW9mKFVDSEFSKSApOworICByZXN1bHQgfD0gRkRLbWVtY21wKCBoSGRyMS0+ZnJlcUJhbmREYXRhLmZyZXFCYW5kVGFibGVOb2lzZSwgaEhkcjItPmZyZXFCYW5kRGF0YS5mcmVxQmFuZFRhYmxlTm9pc2UsIChNQVhfTk9JU0VfQ09FRkZTKzEpKnNpemVvZihVQ0hBUikgKTsKKyAgcmVzdWx0IHw9IEZES21lbWNtcCggaEhkcjEtPmZyZXFCYW5kRGF0YS52X2tfbWFzdGVyLCBoSGRyMi0+ZnJlcUJhbmREYXRhLnZfa19tYXN0ZXIsIChNQVhfRlJFUV9DT0VGRlMrMSkqc2l6ZW9mKFVDSEFSKSApOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKIAogLyohCiAgIFxicmllZiBSZXNldCBTQlIgZGVjb2Rlci4KQEAgLTM5MSw2ICs0MTksNyBAQAogICAgIGNhc2UgQU9UX1BTOgogICAgIGNhc2UgQU9UX0VSX0FBQ19TQ0FMOgogICAgIGNhc2UgQU9UX0VSX0FBQ19FTEQ6CisgICAgY2FzZSBBT1RfRFJNX0FBQzoKICAgICAgIHJldHVybiAxOwogICAgIGRlZmF1bHQ6CiAgICAgICByZXR1cm4gMDsKQEAgLTQ2Myw2ICs0OTIsOCBAQAogCiAgIHNlbGYtPmZsYWdzID0gMDsKICAgc2VsZi0+ZmxhZ3MgfD0gKGNvcmVDb2RlYyA9PSBBT1RfRVJfQUFDX0VMRCkgPyBTQlJERUNfRUxEX0dSSUQgOiAwOworICBzZWxmLT5mbGFncyB8PSAoY29yZUNvZGVjID09IEFPVF9FUl9BQUNfU0NBTCkgPyBTQlJERUNfU1lOVEFYX1NDQUwgOiAwOworICBzZWxmLT5mbGFncyB8PSAoY29yZUNvZGVjID09IEFPVF9EUk1fQUFDKSAgICAgPyBTQlJERUNfU1lOVEFYX1NDQUx8U0JSREVDX1NZTlRBWF9EUk0gOiAwOwogCiAgIC8qIEluaXQgU0JSIGVsZW1lbnRzICovCiAgIHsKQEAgLTkyOCwyNCArOTU5LDczIEBACiAgICAgICAgICkKIHsKICAgU0JSX0RFQ09ERVJfRUxFTUVOVCAgICpoU2JyRWxlbWVudDsKLSAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoU2JySGVhZGVyOworICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhTYnJIZWFkZXIgPSBOVUxMOwogICBIQU5ETEVfU0JSX0NIQU5ORUwgICAgKnBTYnJDaGFubmVsOwogCiAgIFNCUl9GUkFNRV9EQVRBICpoRnJhbWVEYXRhTGVmdDsKICAgU0JSX0ZSQU1FX0RBVEEgKmhGcmFtZURhdGFSaWdodDsKIAogICBTQlJfRVJST1IgZXJyb3JTdGF0dXMgPSBTQlJERUNfT0s7Ci0gIFNCUl9TWU5DX1NUQVRFIGluaXRpYWxTeW5jU3RhdGU7CiAgIFNCUl9IRUFERVJfU1RBVFVTIGhlYWRlclN0YXR1cyA9IEhFQURFUl9OT1RfUFJFU0VOVDsKIAogICBJTlQgIHN0YXJ0UG9zOwogICBJTlQgIENSQ0xlbiA9IDA7CisgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCc09yaWdpbmFsID0gaEJzOworICBGREtfQ1JDSU5GTyAgY3JjSW5mbzsgICAgICAgICAvKiBzaGFsbCBiZSB1c2VkIGZvciBhbGwgb3RoZXIgQ1JDcyBpbiB0aGUgZnV0dXJlIChUQkQpICovCisgIElOVCAgICAgICAgICBjcmNSZWcgPSAwOworICBVU0hPUlQgICAgICAgZHJtU2JyQ3JjID0gMDsKIAogICBpbnQgIHN0ZXJlbzsKICAgaW50ICBmRG9EZWNvZGVTYnJEYXRhID0gMTsKIAogICBpbnQgbGFzdFNsb3QsIGxhc3RIZHJTbG90ID0gMCwgdGhpc0hkclNsb3Q7CiAKKyAgLyogUmV2ZXJzZSBiaXRzIG9mIERSTSBTQlIgcGF5bG9hZCAqLworICBpZiAoIChzZWxmLT5mbGFncyAmIFNCUkRFQ19TWU5UQVhfRFJNKSAmJiAqY291bnQgPiAwICkKKyAgeworICAgIFVDSEFSICpic0J1ZmZlckRybSA9IChVQ0hBUiopc2VsZi0+d29ya0J1ZmZlcjE7CisgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzQndkID0gKEhBTkRMRV9GREtfQklUU1RSRUFNKSAoYnNCdWZmZXJEcm0gKyAoNTEyKSk7CisgICAgaW50IGRhdGFCeXRlcywgZGF0YUJpdHM7CisKKyAgICBkYXRhQml0cyA9ICpjb3VudDsKKworICAgIGlmIChkYXRhQml0cyA+ICgoNTEyKSo4KSkgeworICAgICAgLyogZG8gbm90IGZsaXAgbW9yZSBkYXRhIHRoYW4gbmVlZGVkICovCisgICAgICBkYXRhQml0cyA9ICg1MTIpKjg7CisgICAgfQorCisgICAgZGF0YUJ5dGVzID0gKGRhdGFCaXRzKzcpPj4zOworCisgICAgaW50IGo7CisKKyAgICBpZiAoKGogPSAoaW50KUZES2dldFZhbGlkQml0cyhoQnMpKSAhPSA4KSB7CisgICAgICBGREtwdXNoQmlEaXJlY3Rpb25hbChoQnMsIChqLTgpKTsKKyAgICB9CisKKyAgICBqID0gMDsKKyAgICBmb3IgKCA7IGRhdGFCeXRlcyA+IDA7IGRhdGFCeXRlcy0tKQorICAgIHsKKyAgICAgIGludCBpOworICAgICAgVUNIQVIgdG1wQnl0ZTsKKyAgICAgIFVDSEFSIGJ1ZmZlciA9IDB4MDA7CisKKyAgICAgIHRtcEJ5dGUgPSAoVUNIQVIpIEZES3JlYWRCaXRzKGhCcywgOCk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIGludCBzaGlmdCA9IDIgKiBpICsgMTsKKyAgICAgICAgYnVmZmVyIHw9ICh0bXBCeXRlICYgKDB4MDg+PmkpKSA8PCBzaGlmdDsKKyAgICAgICAgYnVmZmVyIHw9ICh0bXBCeXRlICYgKDB4MTA8PGkpKSA+PiBzaGlmdDsKKyAgICAgIH0KKyAgICAgIGJzQnVmZmVyRHJtW2orK10gPSBidWZmZXI7CisgICAgICBGREtwdXNoQmFjayhoQnMsIDE2KTsKKyAgICB9CisKKyAgICBGREtpbml0Qml0U3RyZWFtKGhCc0J3ZCwgYnNCdWZmZXJEcm0sICg1MTIpLCBkYXRhQml0cywgQlNfUkVBREVSKTsKKworICAgIC8qIFVzZSByZXZlcnNlZCBkYXRhICovCisgICAgaEJzID0gaEJzQndkOworICAgIGJzUGF5TGVuID0gKmNvdW50OworICB9CisKICAgLyogUmVtZW1iZXIgc3RhcnQgcG9zaXRpb24gb2YgIFNCUiBlbGVtZW50ICovCiAgIHN0YXJ0UG9zID0gRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CiAKQEAgLTk3MCw3ICsxMDUwLDYgQEAKICAgaEZyYW1lRGF0YUxlZnQgID0gJnNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPnBTYnJDaGFubmVsWzBdLT5mcmFtZURhdGFbaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdF07CiAgIGhGcmFtZURhdGFSaWdodCA9ICZzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT5wU2JyQ2hhbm5lbFsxXS0+ZnJhbWVEYXRhW2hTYnJFbGVtZW50LT51c2VGcmFtZVNsb3RdOwogCi0gIGluaXRpYWxTeW5jU3RhdGUgPSBoU2JySGVhZGVyLT5zeW5jU3RhdGU7CiAKICAgLyogcmVzZXQgUFMgZmxhZzsgd2lsbCBiZSBzZXQgYWZ0ZXIgUFMgd2FzIGZvdW5kICovCiAgIHNlbGYtPmZsYWdzICY9IH5TQlJERUNfUFNfREVDT0RFRDsKQEAgLTEwMDYsMTIgKzEwODUsMTkgQEAKICAgKi8KICAgaWYgKGZEb0RlY29kZVNickRhdGEpCiAgIHsKLSAgICBpZiAoY3JjRmxhZyA9PSAxKSB7CisgICAgaWYgKGNyY0ZsYWcpIHsKICAgICAgIHN3aXRjaCAoc2VsZi0+Y29yZUNvZGVjKSB7CiAgICAgICBjYXNlIEFPVF9FUl9BQUNfRUxEOgogICAgICAgICBGREtwdXNoRm9yIChoQnMsIDEwKTsKICAgICAgICAgLyogY2hlY2sgc2JyY3JjIGxhdGVyOiB3ZSBkb24ndCBrbm93IHRoZSBwYXlsb2FkIGxlbmd0aCBub3cgKi8KICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEFPVF9EUk1fQUFDOgorICAgICAgICBkcm1TYnJDcmMgPSAoVVNIT1JUKUZES3JlYWRCaXRzKGhCcywgOCk7CisgICAgICAgIC8qIFNldHVwIENSQyBkZWNvZGVyICovCisgICAgICAgIEZES2NyY0luaXQoJmNyY0luZm8sIDB4MDAxZCwgMHhGRkZGLCA4KTsKKyAgICAgICAgLyogU3RhcnQgQ1JDIHJlZ2lvbiAqLworICAgICAgICBjcmNSZWcgPSBGREtjcmNTdGFydFJlZygmY3JjSW5mbywgaEJzLCAwKTsKKyAgICAgICAgYnJlYWs7CiAgICAgICBkZWZhdWx0OgogICAgICAgICBDUkNMZW4gPSBic1BheUxlbiAtIDEwOyAgICAgICAgICAgICAgICAgICAgIC8qIGNoYW5nZTogMCA9PiBpICovCiAgICAgICAgIGlmIChDUkNMZW4gPCAwKSB7CkBAIC0xMDU2LDYgKzExNDIsNyBAQAogICAgICAgICBoU2JySGVhZGVyLT5zeW5jU3RhdGUgPSBTQlJfSEVBREVSOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgaFNickhlYWRlci0+c3luY1N0YXRlID0gU0JSX05PVF9JTklUSUFMSVpFRDsKKyAgICAgICAgaGVhZGVyU3RhdHVzID0gSEVBREVSX0VSUk9SOwogICAgICAgfQogICAgIH0KIApAQCAtMTEwNSw3ICsxMTkyLDcgQEAKICAgICAgICAgdmFsQml0cyA9IChJTlQpRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CiAgICAgICB9CiAKLSAgICAgIGlmICggY3JjRmxhZyA9PSAxICkgeworICAgICAgaWYgKCBjcmNGbGFnICkgewogICAgICAgICBzd2l0Y2ggKHNlbGYtPmNvcmVDb2RlYykgewogICAgICAgICBjYXNlIEFPVF9FUl9BQUNfRUxEOgogICAgICAgICAgIHsKQEAgLTExMTcsNiArMTIwNCwxNCBAQAogICAgICAgICAgICAgRkRLcHVzaEZvcihoQnMsIGNyY0xlbik7CiAgICAgICAgICAgfQogICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFPVF9EUk1fQUFDOgorICAgICAgICAgIC8qIEVuZCBDUkMgcmVnaW9uICovCisgICAgICAgICAgRkRLY3JjRW5kUmVnKCZjcmNJbmZvLCBoQnMsIGNyY1JlZyk7CisgICAgICAgICAgLyogQ2hlY2sgQ1JDICovCisgICAgICAgICAgaWYgKChGREtjcmNHZXRDUkMoJmNyY0luZm8pXjB4RkYpICE9IGRybVNickNyYykgeworICAgICAgICAgICAgZkRvRGVjb2RlU2JyRGF0YSA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xMTY3LDggKzEyNjIsMjUgQEAKICAgfQogCiBiYWlsOgotICBpZiAoZXJyb3JTdGF0dXMgPT0gU0JSREVDX09LKSB7Ci0gICAgaWYgKGhlYWRlclN0YXR1cyA9PSBIRUFERVJfTk9UX1BSRVNFTlQpIHsKKworICBpZiAoIHNlbGYtPmZsYWdzICYgU0JSREVDX1NZTlRBWF9EUk0gKQorICB7CisgICAgaEJzID0gaEJzT3JpZ2luYWw7CisgIH0KKworICBpZiAoIChlcnJvclN0YXR1cyA9PSBTQlJERUNfT0spCisgICAgfHwgKCAoZXJyb3JTdGF0dXMgPT0gU0JSREVDX1BBUlNFX0VSUk9SKQorICAgICAgJiYgKGhlYWRlclN0YXR1cyAhPSBIRUFERVJfRVJST1IpICkgKQorICB7CisgICAgaW50IHVzZU9sZEhkciA9ICggKGhlYWRlclN0YXR1cyA9PSBIRUFERVJfTk9UX1BSRVNFTlQpCisgICAgICAgICAgICAgICAgICAgfHwgKGhlYWRlclN0YXR1cyA9PSBIRUFERVJfRVJST1IpICkgPyAxIDogMDsKKworICAgIGlmICghdXNlT2xkSGRyICYmICh0aGlzSGRyU2xvdCAhPSBsYXN0SGRyU2xvdCkpIHsKKyAgICAgIHVzZU9sZEhkciB8PSAoIGNvbXBhcmVTYnJIZWFkZXIoIGhTYnJIZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWxmLT5zYnJIZWFkZXJbZWxlbWVudEluZGV4XVtsYXN0SGRyU2xvdF0gKSA9PSAwICkgPyAxIDogMDsKKyAgICB9CisKKyAgICBpZiAodXNlT2xkSGRyICE9IDApIHsKICAgICAgIC8qIFVzZSB0aGUgb2xkIGhlYWRlciBmb3IgdGhpcyBmcmFtZSAqLwogICAgICAgaFNickVsZW1lbnQtPnVzZUhlYWRlclNsb3RbaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdF0gPSBsYXN0SGRyU2xvdDsKICAgICB9IGVsc2UgewpAQCAtMTIyOSwxMiArMTM0MSwyMSBAQAogICBpbnQgIG51bUVsZW1lbnRDaGFubmVscyA9IGhTYnJFbGVtZW50LT5uQ2hhbm5lbHM7IC8qIE51bWJlciBvZiBjaGFubmVscyBvZiB0aGUgY3VycmVudCBTQlIgZWxlbWVudCAqLwogCiAgIGlmIChzZWxmLT5mbGFncyAmIFNCUkRFQ19GTFVTSCkgewotICAgIC8qIE1vdmUgZnJhbWUgcG9pbnRlciB0byB0aGUgbmV4dCBzbG90IHdoaWNoIGlzIHVwIHRvIGJlIGRlY29kZWQvYXBwbGllZCBuZXh0ICovCi0gICAgaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdCA9IChoU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90KzEpICUgKHNlbGYtPm51bURlbGF5RnJhbWVzKzEpOwotICAgIC8qIFVwZGF0ZSBoZWFkZXIgYW5kIGZyYW1lIGRhdGEgcG9pbnRlciBiZWNhdXNlIHRoZXkgaGF2ZSBhbHJlYWR5IGJlZW4gc2V0ICovCi0gICAgaFNickhlYWRlciA9ICZzZWxmLT5zYnJIZWFkZXJbZWxlbWVudEluZGV4XVtoU2JyRWxlbWVudC0+dXNlSGVhZGVyU2xvdFtoU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90XV07Ci0gICAgaEZyYW1lRGF0YUxlZnQgID0gJmhTYnJFbGVtZW50LT5wU2JyQ2hhbm5lbFswXS0+ZnJhbWVEYXRhW2hTYnJFbGVtZW50LT51c2VGcmFtZVNsb3RdOwotICAgIGhGcmFtZURhdGFSaWdodCA9ICZoU2JyRWxlbWVudC0+cFNickNoYW5uZWxbMV0tPmZyYW1lRGF0YVtoU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90XTsKKyAgICBpZiAoIHNlbGYtPm51bUZsdXNoZWRGcmFtZXMgPiBzZWxmLT5udW1EZWxheUZyYW1lcyApIHsKKyAgICAgIGludCBoZHJJZHg7CisgICAgICAvKiBObyB2YWxpZCBTQlIgcGF5bG9hZCBhdmFpbGFibGUsIGhlbmNlIHN3aXRjaCB0byB1cHNhbXBsaW5nIChpbiBhbGwgaGVhZGVycykgKi8KKyAgICAgIGZvciAoaGRySWR4ID0gMDsgaGRySWR4IDwgKCgxKSsxKTsgaGRySWR4ICs9IDEpIHsKKyAgICAgICAgc2VsZi0+c2JySGVhZGVyW2VsZW1lbnRJbmRleF1baGRySWR4XS5zeW5jU3RhdGUgPSBVUFNBTVBMSU5HOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIC8qIE1vdmUgZnJhbWUgcG9pbnRlciB0byB0aGUgbmV4dCBzbG90IHdoaWNoIGlzIHVwIHRvIGJlIGRlY29kZWQvYXBwbGllZCBuZXh0ICovCisgICAgICBoU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90ID0gKGhTYnJFbGVtZW50LT51c2VGcmFtZVNsb3QrMSkgJSAoc2VsZi0+bnVtRGVsYXlGcmFtZXMrMSk7CisgICAgICAvKiBVcGRhdGUgaGVhZGVyIGFuZCBmcmFtZSBkYXRhIHBvaW50ZXIgYmVjYXVzZSB0aGV5IGhhdmUgYWxyZWFkeSBiZWVuIHNldCAqLworICAgICAgaFNickhlYWRlciA9ICZzZWxmLT5zYnJIZWFkZXJbZWxlbWVudEluZGV4XVtoU2JyRWxlbWVudC0+dXNlSGVhZGVyU2xvdFtoU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90XV07CisgICAgICBoRnJhbWVEYXRhTGVmdCAgPSAmaFNickVsZW1lbnQtPnBTYnJDaGFubmVsWzBdLT5mcmFtZURhdGFbaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdF07CisgICAgICBoRnJhbWVEYXRhUmlnaHQgPSAmaFNickVsZW1lbnQtPnBTYnJDaGFubmVsWzFdLT5mcmFtZURhdGFbaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdF07CisgICAgfQogICB9CiAKICAgLyogVXBkYXRlIHRoZSBoZWFkZXIgZXJyb3IgZmxhZyAqLwpAQCAtMTM1NCw3ICsxNDc1LDggQEAKICAgICAgICAgICAgJnBTYnJDaGFubmVsWzBdLT5wcmV2RnJhbWVEYXRhLAogICAgICAgICAgICAgKGhTYnJIZWFkZXItPnN5bmNTdGF0ZSA9PSBTQlJfQUNUSVZFKSwKICAgICAgICAgICAgIGhfcHNfZCwKLSAgICAgICAgICAgIHNlbGYtPmZsYWdzCisgICAgICAgICAgICBzZWxmLT5mbGFncywKKyAgICAgICAgICAgIGNvZGVjRnJhbWVTaXplCiAgICAgICAgICAgKTsKIAogICBpZiAoc3RlcmVvKSB7CkBAIC0xMzcxLDcgKzE0OTMsOCBAQAogICAgICAgICAgICAgICZwU2JyQ2hhbm5lbFsxXS0+cHJldkZyYW1lRGF0YSwKICAgICAgICAgICAgICAgKGhTYnJIZWFkZXItPnN5bmNTdGF0ZSA9PSBTQlJfQUNUSVZFKSwKICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgc2VsZi0+ZmxhZ3MKKyAgICAgICAgICAgICAgc2VsZi0+ZmxhZ3MsCisgICAgICAgICAgICAgIGNvZGVjRnJhbWVTaXplCiAgICAgICAgICAgICApOwogICB9CiAKQEAgLTEzODcsMjAgKzE1MTAsMjEgQEAKICAgICBpZiAoICEoc2VsZi0+ZmxhZ3MgJiBTQlJERUNfUFNfREVDT0RFRCkgKSB7CiAgICAgICAvKiBBIGRlY29kZXIgd2hpY2ggaXMgYWJsZSB0byBkZWNvZGUgUFMgaGFzIHRvIHByb2R1Y2UgYSBzdGVyZW8gb3V0cHV0IGV2ZW4gaWYgbm8gUFMgZGF0YSBpcyBhdmFpbGJsZS4gKi8KICAgICAgIC8qIFNvIGNvcHkgbGVmdCBjaGFubmVsIHRvIHJpZ2h0IGNoYW5uZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgaW50IGNvcHlGcmFtZVNpemUgPSBjb2RlY0ZyYW1lU2l6ZSAqIDIgLyBzZWxmLT5zeW5Eb3duc2FtcGxlRmFjOwogICAgICAgaWYgKGludGVybGVhdmVkKSB7CiAgICAgICAgIElOVF9QQ00gKnB0cjsKICAgICAgICAgSU5UIGk7CiAgICAgICAgIEZES19BU1NFUlQoc3RyaWRlT3V0ID09IDIpOwogCiAgICAgICAgIHB0ciA9IHRpbWVEYXRhOwotICAgICAgICBmb3IgKGkgPSBjb2RlY0ZyYW1lU2l6ZTsgaS0tOyApIAorICAgICAgICBmb3IgKGkgPSBjb3B5RnJhbWVTaXplPj4xOyBpLS07ICkKICAgICAgICAgewogICAgICAgICAgIElOVF9QQ00gdG1wOyAvKiBUaGlzIHRlbXBvcmFsIHZhcmlhYmxlIGlzIHJlcXVpcmVkIGJlY2F1c2Ugc29tZSBjb21waWxlcnMgY2FuJ3QgZG8gKnB0cisrID0gKnB0cisrIGNvcnJlY3RseS4gKi8KICAgICAgICAgICB0bXAgPSAqcHRyKys7ICpwdHIrKyA9IHRtcDsKICAgICAgICAgICB0bXAgPSAqcHRyKys7ICpwdHIrKyA9IHRtcDsKICAgICAgICAgfQogICAgICAgfSBlbHNlIHsKLSAgICAgICAgRkRLbWVtY3B5KCB0aW1lRGF0YSsyKmNvZGVjRnJhbWVTaXplLCB0aW1lRGF0YSwgMipjb2RlY0ZyYW1lU2l6ZSpzaXplb2YoSU5UX1BDTSkgKTsKKyAgICAgICAgRkRLbWVtY3B5KCB0aW1lRGF0YStjb3B5RnJhbWVTaXplLCB0aW1lRGF0YSwgY29weUZyYW1lU2l6ZSpzaXplb2YoSU5UX1BDTSkgKTsKICAgICAgIH0KICAgICB9CiAgICAgKm51bU91dENoYW5uZWxzID0gMjsgIC8qIE91dHB1dCBtaW5pbXVtIHR3byBjaGFubmVscyB3aGVuIFBTIGlzIGVuYWJsZWQuICovCkBAIC0xNDY0LDE0ICsxNTg4LDIzIEBACiAgICAgc2VsZi0+ZmxhZ3MgJj0gflNCUkRFQ19QU19ERUNPREVEOwogICB9CiAKKyAgaWYgKCBzZWxmLT5mbGFncyAmIFNCUkRFQ19GTFVTSCApIHsKKyAgICAvKiBmbHVzaGluZyBpcyBzaWduYWxpemVkLCBoZW5jZSBpbmNyZW1lbnQgdGhlIGZsdXNoIGZyYW1lIGNvdW50ZXIgKi8KKyAgICBzZWxmLT5udW1GbHVzaGVkRnJhbWVzKys7CisgIH0KKyAgZWxzZSB7CisgICAgLyogbm8gZmx1c2hpbmcgaXMgc2lnbmFsaXplZCwgaGVuY2UgcmVzZXQgdGhlIGZsdXNoIGZyYW1lIGNvdW50ZXIgKi8KKyAgICBzZWxmLT5udW1GbHVzaGVkRnJhbWVzID0gMDsKKyAgfQorCiAgIC8qIExvb3Agb3ZlciBTQlIgZWxlbWVudHMgKi8KICAgZm9yIChzYnJFbGVtZW50TnVtID0gMDsgc2JyRWxlbWVudE51bTxzZWxmLT5udW1TYnJFbGVtZW50czsgc2JyRWxlbWVudE51bSsrKQogICB7CiAgICAgaW50IG51bUVsZW1lbnRDaGFuOwogCiAgICAgaWYgKHBzUG9zc2libGUgJiYgc2VsZi0+cFNickVsZW1lbnRbc2JyRWxlbWVudE51bV0tPnBTYnJDaGFubmVsWzFdID09IE5VTEwpIHsKLSAgICAgIGVycm9yU3RhdHVzID0gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKLSAgICAgIGdvdG8gYmFpbDsKKyAgICAgIC8qIERpc2FibGUgUFMgYW5kIHRyeSBkZWNvZGluZyBTQlIgbW9uby4gKi8KKyAgICAgIHBzUG9zc2libGUgPSAwOwogICAgIH0KIAogICAgIG51bUVsZW1lbnRDaGFuID0gKHNlbGYtPnBTYnJFbGVtZW50W3NickVsZW1lbnROdW1dLT5lbGVtZW50SUQgPT0gSURfQ1BFKSA/IDIgOiAxOwpAQCAtMTU3OSw2ICsxNzEyLDcgQEAKICAgICB8IENBUEZfU0JSX0hRCiAgICAgfCBDQVBGX1NCUl9MUAogICAgIHwgQ0FQRl9TQlJfUFNfTVBFRworICAgIHwgQ0FQRl9TQlJfRFJNX0JTCiAgICAgfCBDQVBGX1NCUl9DT05DRUFMTUVOVAogICAgIHwgQ0FQRl9TQlJfRFJDCiAgICAgICA7CkBAIC0xNjA3LDYgKzE3NDEsOSBAQAogICAgICAgICAvKiBMb3cgZGVsYXkgU0JSOiAqLwogICAgICAgICB7CiAgICAgICAgICAgb3V0cHV0RGVsYXkgKz0gKGZsYWdzICYgU0JSREVDX0RPV05TQU1QTEUpID8gMzIgOiA2NDsgICAvKiBRTUYgc3ludGhlc2lzICovCisgICAgICAgICAgaWYgKGZsYWdzICYgU0JSREVDX0xEX01QU19RTUYpIHsKKyAgICAgICAgICAgIG91dHB1dERlbGF5ICs9IDMyOworICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQogICAgICAgZWxzZSBpZiAoIUlTX1VTQUMoc2VsZi0+Y29yZUNvZGVjKSkgewpkaWZmIC0tZ2l0IGEvbGliU1lTL3NyYy9nZW5lcmljU3Rkcy5jcHAgYi9saWJTWVMvc3JjL2dlbmVyaWNTdGRzLmNwcAppbmRleCA1M2FiZTA2Li44OWM0MjJjIDEwMDY0NAotLS0gYS9saWJTWVMvc3JjL2dlbmVyaWNTdGRzLmNwcAorKysgYi9saWJTWVMvc3JjL2dlbmVyaWNTdGRzLmNwcApAQCAtOTIsMTQgKzkyLDE0IEBACiAKICNkZWZpbmUgX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MKIAotI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCi0KICNpbmNsdWRlIDxtYXRoLmg+CiAKKyNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgorCiAvKiBsaWJyYXJ5IGluZm8gKi8KICNkZWZpbmUgU1lTX0xJQl9WTDAgMQogI2RlZmluZSBTWVNfTElCX1ZMMSAzCi0jZGVmaW5lIFNZU19MSUJfVkwyIDcKKyNkZWZpbmUgU1lTX0xJQl9WTDIgOAogI2RlZmluZSBTWVNfTElCX1RJVExFICJTeXN0ZW0gSW50ZWdyYXRpb24gTGlicmFyeSIKICNpZmRlZiBfX0FORFJPSURfXwogI2RlZmluZSBTWVNfTElCX0JVSUxEX0RBVEUgIiIK