LyoKICogZGVmYXVsdF9zdG9yZS5jOiBzdG9yYWdlIHNwYWNlIGZvciBkZWZhdWx0cyAKICovCi8qIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvcHlyaWdodChzKS4gIFNlZQogKiB0aGUgTmV0LVNOTVAncyBDT1BZSU5HIGZpbGUgZm9yIG1vcmUgZGV0YWlscyBhbmQgb3RoZXIgY29weXJpZ2h0cwogKiB0aGF0IG1heSBhcHBseToKICovCi8qCiAqIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgY29weXJpZ2h0ZWQgYnk6CiAqIENvcHlyaWdodCCpIDIwMDMgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiBVc2UgaXMgc3ViamVjdCB0byBsaWNlbnNlIHRlcm1zIHNwZWNpZmllZCBpbiB0aGUgQ09QWUlORyBmaWxlCiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhlIE5ldC1TTk1QIHBhY2thZ2UuCiAqLwovKiogQGRlZmdyb3VwIGRlZmF1bHRfc3RvcmUgc3RvcmFnZSBzcGFjZSBmb3IgZGVmYXVsdHMgCiAqICBAaW5ncm91cCBsaWJyYXJ5CiAqCiAgICAgICBUaGUgcHVycG9zZSBvZiB0aGUgZGVmYXVsdCBzdG9yYWdlIGlzIHRocmVlLWZvbGQ6CgogICAgICAgMSkgICAgIFRvIGNyZWF0ZSBhIGdsb2JhbCBzdG9yYWdlIHNwYWNlIHdpdGhvdXQgY3JlYXRpbmcgYQogICAgICAgICAgICAgIHdob2xlICBidW5jaCAgb2YgZ2xvYmFsbHkgYWNjZXNzaWJsZSB2YXJpYWJsZXMgb3IgYQogICAgICAgICAgICAgIHdob2xlIGJ1bmNoIG9mIGFjY2VzcyBmdW5jdGlvbnMgdG8gd29yayAgd2l0aCAgbW9yZQogICAgICAgICAgICAgIHByaXZhdGVseSByZXN0cmljdGVkIHZhcmlhYmxlcy4KCiAgICAgICAyKSAgICAgVG8gcHJvdmlkZSBhIHNpbmdsZSBsb2NhdGlvbiB3aGVyZSB0aGUgdGhyZWFkIGxvY2stCiAgICAgICAgICAgICAgaW5nIG5lZWRzIHRvIGJlIGltcGxlbWVudGVkLiBBdCB0aGUgIHRpbWUgIG9mICB0aGlzCiAgICAgICAgICAgICAgd3JpdGluZywgIGhvd2V2ZXIsICB0aHJlYWQgIGxvY2tpbmcgIGlzICBub3QgeWV0IGluCiAgICAgICAgICAgICAgcGxhY2UuCgogICAgICAgMykgICAgIFRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGNyb3NzIGRlcGVuZGVuY2llcyAgYmV0d2VlbgogICAgICAgICAgICAgIGNvZGUgIHBpZWNlcyB0aGF0IG1heSBvciBtYXkgbm90IGJlIGxpbmtlZCB0b2dldGhlcgogICAgICAgICAgICAgIGluIHRoZSBsb25nIHJ1bi4gVGhpcyBwcm92aWRlcyBmb3IgYSAgc2luZ2xlICBsb2NhLQogICAgICAgICAgICAgIHRpb24gIGluIHdoaWNoIGNvbmZpZ3VyYXRpb24gZGF0YSwgZm9yIGV4YW1wbGUsIGNhbgogICAgICAgICAgICAgIGJlIHN0b3JlZCBmb3IgYSBzZXBhcmF0ZSBzZWN0aW9uIG9mIGNvZGUgIHRoYXQgIG1heQogICAgICAgICAgICAgIG5vdCBiZSBsaW5rZWQgaW4gdG8gdGhlIGFwcGxpY2F0aW9uIGluIHF1ZXN0aW9uLgoKICAgICAgIFRoZSBmdW5jdGlvbnMgZGVmaW5lZCBoZXJlIGltcGxlbWVudCB0aGVzZSBnb2Fscy4KCiAgICAgICBDdXJyZW50bHksIHRocmVlIGRhdGEgdHlwZXMgYXJlIHN1cHBvcnRlZDogYm9vbGVhbnMsIGludGUtCiAgICAgICBnZXJzLCBhbmQgc3RyaW5ncy4gRWFjaCBvZiB0aGVzZSBkYXRhIHR5cGVzIGhhdmUgIHNlcGFyYXRlCiAgICAgICBzdG9yYWdlICBzcGFjZXMuICBJbiAgYWRkaXRpb24sIHRoZSBzdG9yYWdlIHNwYWNlIGZvciBlYWNoCiAgICAgICBkYXRhIHR5cGUgaXMgZGl2aWRlZCBmdXJ0aGVyICBieSAgdGhlICBhcHBsaWNhdGlvbiAgbGV2ZWwuCiAgICAgICBDdXJyZW50bHksICB0aGVyZSAgYXJlICB0d28gIHN0b3JhZ2UgIHNwYWNlcy4gVGhlIGZpcnN0IGlzCiAgICAgICByZXNlcnZlZCBmb3IgIHRoZSAgU05NUCAgbGlicmFyeSAgaXRzZWxmLiAgVGhlICBzZWNvbmQgIGlzCiAgICAgICBpbnRlbmRlZCAgZm9yICB1c2UgIGluIGFwcGxpY2F0aW9ucyBhbmQgaXMgbm90IG1vZGlmaWVkIG9yCiAgICAgICBjaGVja2VkIGJ5IHRoZSBsaWJyYXJ5LCBhbmQsIHRoZXJlZm9yZSwgdGhpcyBpcyB0aGUgIHNwYWNlCiAgICAgICB1c2FibGUgYnkgeW91LgogICAgICAgICAgIAogICAgICAgVGhlc2UgZGVmaW5pdGlvbnMgY29ycmVzcG9uZCB3aXRoIHRoZSAic3RvcmlkIiBhcmd1bWVudCB0byB0aGUgQVBJCiAgICAgICAtIFwjZGVmaW5lIE5FVFNOTVBfRFNfTElCUkFSWV9JRCAgICAgMAogICAgICAgLSBcI2RlZmluZSBORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lEIDEKICAgICAgIC0gXCNkZWZpbmUgTkVUU05NUF9EU19UT0tFTl9JRCAgICAgICAyCgogICAgICAgVGhlc2UgZGVmaW5pdGlvbnMgY29ycmVzcG9uZCB3aXRoIHRoZSAid2hpY2giIGFyZ3VtZW50IHRvIHRoZSBBUEksCiAgICAgICB3aGVuIHRoZSBzdG9yZWlkIGFyZ3VtZW50IGlzIE5FVFNOTVBfRFNfTElCUkFSWV9JRAoKICAgICAgIGxpYnJhcnkgYm9vbGVhbnMKICAgICAgICAgICAgCiAgICAgICAtIFwjZGVmaW5lIE5FVFNOTVBfRFNfTElCX01JQl9FUlJPUlMgICAgICAgICAgMAogICAgICAgLSBcI2RlZmluZSBORVRTTk1QX0RTX0xJQl9TQVZFX01JQl9ERVNDUlMgICAgIDEKICAgICAgIC0gXCNkZWZpbmUgTkVUU05NUF9EU19MSUJfTUlCX0NPTU1FTlRfVEVSTSAgICAyCiAgICAgICAtIFwjZGVmaW5lIE5FVFNOTVBfRFNfTElCX01JQl9QQVJTRV9MQUJFTCAgICAgMwogICAgICAgLSBcI2RlZmluZSBORVRTTk1QX0RTX0xJQl9EVU1QX1BBQ0tFVCAgICAgICAgIDQKICAgICAgIC0gXCNkZWZpbmUgTkVUU05NUF9EU19MSUJfTE9HX1RJTUVTVEFNUCAgICAgICA1CiAgICAgICAtIFwjZGVmaW5lIE5FVFNOTVBfRFNfTElCX0RPTlRfUkVBRF9DT05GSUdTICAgNgogICAgICAgLSBcI2RlZmluZSBORVRTTk1QX0RTX0xJQl9NSUJfUkVQTEFDRSAgICAgICAgIDcgcmVwbGFjZSBvYmplY3RzIGZyb20gbGF0ZXN0IG1vZHVsZSAKICAgICAgIC0gXCNkZWZpbmUgTkVUU05NUF9EU19MSUJfUFJJTlRfTlVNRVJJQ19FTlVNICA4IHByaW50IG9ubHkgbnVtZXJpYyBlbnVtIHZhbHVlcwogICAgICAgLSBcI2RlZmluZSBORVRTTk1QX0RTX0xJQl9QUklOVF9OVU1FUklDX09JRFMgIDkgcHJpbnQgb25seSBudW1lcmljIGVudW0gdmFsdWVzIAogICAgICAgLSBcI2RlZmluZSBORVRTTk1QX0RTX0xJQl9ET05UX0JSRUFLRE9XTl9PSURTIDEwIGRvbnQgcHJpbnQgb2lkIGluZGV4ZXMgc3BlY2lhbGx5IAogICAgICAgLSBcI2RlZmluZSBORVRTTk1QX0RTX0xJQl9BTEFSTV9ET05UX1VTRV9TSUcgIDExIGRvbid0IHVzZSB0aGUgYWxhcm0oKSBzaWduYWwgCiAgICAgICAtIFwjZGVmaW5lIE5FVFNOTVBfRFNfTElCX1BSSU5UX0ZVTExfT0lEICAgICAgMTIgcHJpbnQgZnVsbHkgcXVhbGlmaWVkIG9pZHMgCiAgICAgICAtIFwjZGVmaW5lIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5UICAgICAgICAgMTMgcHJpbnQgdmVyeSBicmllZiBvdXRwdXQgZm9yIHBhcnNpbmcKICAgICAgIC0gXCNkZWZpbmUgTkVUU05NUF9EU19MSUJfUkFORE9NX0FDQ0VTUyAgICAgICAxNCByYW5kb20gYWNjZXNzIHRvIG9pZCBsYWJlbHMKICAgICAgIC0gXCNkZWZpbmUgTkVUU05NUF9EU19MSUJfUkVHRVhfQUNDRVNTICAgICAgICAxNSByZWdleCBtYXRjaGluZyB0byBvaWQgbGFiZWxzCiAgICAgICAtIFwjZGVmaW5lIE5FVFNOTVBfRFNfTElCX0RPTlRfQ0hFQ0tfUkFOR0UgICAgMTYgZG9uJ3QgY2hlY2sgdmFsdWVzIGZvciByYW5nZXMgb24gc2VuZAogICAgICAgLSBcI2RlZmluZSBORVRTTk1QX0RTX0xJQl9OT19UT0tFTl9XQVJOSU5HUyAgIDE3IG5vIHdhcm4gYWJvdXQgdW5rbm93biBjb25maWcgdG9rZW5zCiAgICAgICAtIFwjZGVmaW5lIE5FVFNOTVBfRFNfTElCX05VTUVSSUNfVElNRVRJQ0tTICAgMTggcHJpbnQgdGltZXRpY2tzIGFzIGEgbnVtYmVyIAogICAgICAgLSBcI2RlZmluZSBORVRTTk1QX0RTX0xJQl9FU0NBUEVfUVVPVEVTICAgICAgIDE5IHNoZWxsIGVzY2FwZSBxdW90ZSBtYXJrcyBpbiBvaWRzCiAgICAgICAtIFwjZGVmaW5lIE5FVFNOTVBfRFNfTElCX1JFVkVSU0VfRU5DT0RFICAgICAgMjAgZW5jb2RlIHBhY2tldHMgZnJvbSBiYWNrIHRvIGZyb250CiAgICAgICAtIFwjZGVmaW5lIE5FVFNOTVBfRFNfTElCX1BSSU5UX0JBUkVfVkFMVUUgICAgMjEganVzdCBwcmludCB2YWx1ZSAobm90IE9JRCA9IHZhbHVlKQogICAgICAgLSBcI2RlZmluZSBORVRTTk1QX0RTX0xJQl9FWFRFTkRFRF9JTkRFWCAgICAgIDIyIHByaW50IGV4dGVuZGVkIGluZGV4IGZvcm1hdCBbeDFdW3gyXQogICAgICAgLSBcI2RlZmluZSBORVRTTk1QX0RTX0xJQl9QUklOVF9IRVhfVEVYVCAgICAgIDIzIHByaW50IEFTQ0lJIHRleHQgYWxvbmcgd2l0aCBoZXggc3RyaW5ncwogICAgICAgLSBcI2RlZmluZSBORVRTTk1QX0RTX0xJQl9QUklOVF9VQ0RfU1RZTEVfT0lEIDI0IHByaW50IE9JRCdzIHVzaW5nIHRoZSBVQ0Qtc3R5bGUgcHJlZml4IHN1cHByZXNzaW9uCiAgICAgICAtIFwjZGVmaW5lIE5FVFNOTVBfRFNfTElCX1JFQURfVUNEX1NUWUxFX09JRCAgMjUgcmVxdWlyZSB0b3AtbGV2ZWwgT0lEcyB0byBiZSBwcmVmaXhlZCB3aXRoIGEgZG90CiAgICAgICAtIFwjZGVmaW5lIE5FVFNOTVBfRFNfTElCX0hBVkVfUkVBRF9QUkVNSUJfQ09ORklHIDI2IGhhdmUgdGhlIHByZS1taWIgcGFyc2luZyBjb25maWcgdG9rZW5zIGJlZW4gcHJvY2Vzc2VkCiAgICAgICAtIFwjZGVmaW5lIE5FVFNOTVBfRFNfTElCX0hBVkVfUkVBRF9DT05GSUcgICAgMjcgaGF2ZSB0aGUgY29uZmlnIHRva2VucyBiZWVuIHByb2Nlc3NlZAogICAgICAgLSBcI2RlZmluZSBORVRTTk1QX0RTX0xJQl9RVUlDS0VfUFJJTlQgICAgICAgIDI4CiAgICAgICAtIFwjZGVmaW5lIE5FVFNOTVBfRFNfTElCX0RPTlRfUFJJTlRfVU5JVFMgICAgMjkgZG9uJ3QgcHJpbnQgVU5JVFMgc3VmZml4CiAgICAgICAtIFwjZGVmaW5lIE5FVFNOTVBfRFNfTElCX05PX0RJU1BMQVlfSElOVCAgICAgMzAgZG9uJ3QgYXBwbHkgRElTUExBWS1ISU5UcwogICAgICAgLSBcI2RlZmluZSBORVRTTk1QX0RTX0xJQl8xNkJJVF9JRFMgICAgICAgICAgIDMxIHJlc3RyaWN0IHJlcXVlc3RJRHMsIGV0YyB0byAxNi1iaXQgdmFsdWVzCiAgICAgICAtIFwjZGVmaW5lIE5FVFNOTVBfRFNfTElCX0RPTlRfUEVSU0lTVF9TVEFURSAgMzIgZG9uJ3Qgc2F2ZS9sb2FkIGFueSBwZXJzaXN0YW50IHN0YXRlCiAgICAgICAtIFwjZGVmaW5lIE5FVFNOTVBfRFNfTElCXzJESUdJVF9IRVhfT1VUUFVUICAgMzMgcHJpbnQgYSBsZWFkaW5nIDAgb24gaGV4IHZhbHVlcyA8PSAnZicKCgogICAgICAgbGlicmFyeSBpbnRlZ2VycwoKICAgICAgIC0gXCNkZWZpbmUgTkVUU05NUF9EU19MSUJfTUlCX1dBUk5JTkdTICAwCiAgICAgICAtIFwjZGVmaW5lIE5FVFNOTVBfRFNfTElCX1NFQ0xFVkVMICAgICAgMQogICAgICAgLSBcI2RlZmluZSBORVRTTk1QX0RTX0xJQl9TTk1QVkVSU0lPTiAgIDIKICAgICAgIC0gXCNkZWZpbmUgTkVUU05NUF9EU19MSUJfREVGQVVMVF9QT1JUICAzCiAgICAgICAtIFwjZGVmaW5lIE5FVFNOTVBfRFNfTElCX09JRF9PVVRQVVRfRk9STUFUICA0CiAgICAgICAtIFwjZGVmaW5lIE5FVFNOTVBfRFNfTElCX1NUUklOR19PVVRQVVRfRk9STUFUIDUKCiAgICAgICBsaWJyYXJ5IHN0cmluZ3MKCiAgICAgICAtIFwjZGVmaW5lIE5FVFNOTVBfRFNfTElCX1NFQ05BTUUgICAgICAgICAgIDAKICAgICAgIC0gXCNkZWZpbmUgTkVUU05NUF9EU19MSUJfQ09OVEVYVCAgICAgICAgICAgMQogICAgICAgLSBcI2RlZmluZSBORVRTTk1QX0RTX0xJQl9QQVNTUEhSQVNFICAgICAgICAyCiAgICAgICAtIFwjZGVmaW5lIE5FVFNOTVBfRFNfTElCX0FVVEhQQVNTUEhSQVNFICAgIDMKICAgICAgIC0gXCNkZWZpbmUgTkVUU05NUF9EU19MSUJfUFJJVlBBU1NQSFJBU0UgICAgNAogICAgICAgLSBcI2RlZmluZSBORVRTTk1QX0RTX0xJQl9PUFRJT05BTENPTkZJRyAgICA1CiAgICAgICAtIFwjZGVmaW5lIE5FVFNOTVBfRFNfTElCX0FQUFRZUEUgICAgICAgICAgIDYKICAgICAgIC0gXCNkZWZpbmUgTkVUU05NUF9EU19MSUJfQ09NTVVOSVRZICAgICAgICAgNwogICAgICAgLSBcI2RlZmluZSBORVRTTk1QX0RTX0xJQl9QRVJTSVNURU5UX0RJUiAgICA4CiAgICAgICAtIFwjZGVmaW5lIE5FVFNOTVBfRFNfTElCX0NPTkZJR1VSQVRJT05fRElSIDkKICAgICAgIC0gXCNkZWZpbmUgTkVUU05NUF9EU19MSUJfU0VDTU9ERUwgICAgICAgICAgMTAKICAgICAgIC0gXCNkZWZpbmUgTkVUU05NUF9EU19MSUJfTUlCRElSUyAgICAgICAgICAgMTEKICAgICAgIC0gXCNkZWZpbmUgTkVUU05NUF9EU19MSUJfT0lEU1VGRklYICAgICAgICAgMTIKICAgICAgIC0gXCNkZWZpbmUgTkVUU05NUF9EU19MSUJfT0lEUFJFRklYICAgICAgICAgMTMKICAgICAgIC0gXCNkZWZpbmUgTkVUU05NUF9EU19MSUJfQ0xJRU5UX0FERFIgICAgICAgMTQKICAgICAgIC0gXCNkZWZpbmUgTkVUU05NUF9EU19MSUJfVEVNUF9GSUxFX1BBVFRFUk4gMTUKICAgICAgIC0gXCNkZWZpbmUgTkVUU05NUF9EU19MSUJfQVVUSE1BU1RFUktFWSAgICAgMTYKICAgICAgIC0gXCNkZWZpbmUgTkVUU05NUF9EU19MSUJfUFJJVk1BU1RFUktFWSAgICAgMTcKICAgICAgIC0gXCNkZWZpbmUgTkVUU05NUF9EU19MSUJfQVVUSExPQ0FMSVpFREtFWSAgMTgKICAgICAgIC0gXCNkZWZpbmUgTkVUU05NUF9EU19MSUJfUFJJVkxPQ0FMSVpFREtFWSAgMTkKCiAqICBAewogKi8KI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWNvbmZpZy5oPgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtZmVhdHVyZXMuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaWYgSEFWRV9TVERMSUJfSAojaW5jbHVkZSA8c3RkbGliLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lOX0gKI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2VuZGlmCiNpZiBIQVZFX1NURExJQl9ICiNpbmNsdWRlIDxzdGRsaWIuaD4KI2VuZGlmCiNpZiBIQVZFX1NUUklOR19ICiNpbmNsdWRlIDxzdHJpbmcuaD4KI2Vsc2UKI2luY2x1ZGUgPHN0cmluZ3MuaD4KI2VuZGlmCgojaWYgSEFWRV9VTklTVERfSAojaW5jbHVkZSA8dW5pc3RkLmg+CiNlbmRpZgojaWYgSEFWRV9ETUFMTE9DX0gKI2luY2x1ZGUgPGRtYWxsb2MuaD4KI2VuZGlmCgojaW5jbHVkZSA8bmV0LXNubXAvdHlwZXMuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL291dHB1dF9hcGkuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2NvbmZpZ19hcGkuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvZGVmYXVsdF9zdG9yZS5oPiAgICAvKiBmb3IgImludGVybmFsIiBkZWZpbml0aW9ucyAqLwojaW5jbHVkZSA8bmV0LXNubXAvdXRpbGl0aWVzLmg+CgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9zbm1wX2FwaS5oPgoKbmV0c25tcF9mZWF0dXJlX2NoaWxkX29mKGRlZmF1bHRfc3RvcmVfYWxsLCBsaWJuZXRzbm1wKQoKbmV0c25tcF9mZWF0dXJlX2NoaWxkX29mKGRlZmF1bHRfc3RvcmVfdm9pZCwgZGVmYXVsdF9zdG9yZV9hbGwpCgojaWZuZGVmIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfREVGQVVMVF9TVE9SRV9WT0lECiNlbmRpZiAvKiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0RFRkFVTFRfU1RPUkVfVk9JRCAqLwoKCnN0YXRpYyBjb25zdCBjaGFyICogc3RvcmVzIFtORVRTTk1QX0RTX01BWF9JRFNdID0geyAiTElCIiwgIkFQUCIsICJUT0siIH07Cgp0eXBlZGVmIHN0cnVjdCBuZXRzbm1wX2RzX3JlYWRfY29uZmlnX3MgewogIHVfY2hhciAgICAgICAgICB0eXBlOwogIGNoYXIgICAgICAgICAgICp0b2tlbjsKICBjaGFyICAgICAgICAgICAqZnR5cGU7CiAgaW50ICAgICAgICAgICAgIHN0b3JlaWQ7CiAgaW50ICAgICAgICAgICAgIHdoaWNoOwogIHN0cnVjdCBuZXRzbm1wX2RzX3JlYWRfY29uZmlnX3MgKm5leHQ7Cn0gbmV0c25tcF9kc19yZWFkX2NvbmZpZzsKCnN0YXRpYyBuZXRzbm1wX2RzX3JlYWRfY29uZmlnICpuZXRzbm1wX2RzX2NvbmZpZ3MgPSBOVUxMOwoKc3RhdGljIGludCAgIG5ldHNubXBfZHNfaW50ZWdlcnNbTkVUU05NUF9EU19NQVhfSURTXVtORVRTTk1QX0RTX01BWF9TVUJJRFNdOwpzdGF0aWMgY2hhciAgbmV0c25tcF9kc19ib29sZWFuc1tORVRTTk1QX0RTX01BWF9JRFNdW05FVFNOTVBfRFNfTUFYX1NVQklEUy84XTsKc3RhdGljIGNoYXIgKm5ldHNubXBfZHNfc3RyaW5nc1tORVRTTk1QX0RTX01BWF9JRFNdW05FVFNOTVBfRFNfTUFYX1NVQklEU107CiNpZm5kZWYgTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9ERUZBVUxUX1NUT1JFX1ZPSUQKc3RhdGljIHZvaWQgKm5ldHNubXBfZHNfdm9pZHNbTkVUU05NUF9EU19NQVhfSURTXVtORVRTTk1QX0RTX01BWF9TVUJJRFNdOwojZW5kaWYgLyogTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9ERUZBVUxUX1NUT1JFX1ZPSUQgKi8KCi8qCiAqIFByb3RvdHlwZSBkZWZpbml0aW9ucyAKICovCnZvaWQgICAgICAgICAgICBuZXRzbm1wX2RzX2hhbmRsZV9jb25maWcoY29uc3QgY2hhciAqdG9rZW4sIGNoYXIgKmxpbmUpOwoKLyoqCiAqIFN0b3JlcyAidHJ1ZSIgb3IgImZhbHNlIiBnaXZlbiBhbiBpbnQgdmFsdWUgZm9yIHZhbHVlIGludG8KICogbmV0c25tcF9kc19ib29sZWFuc1tzdG9yZV1bd2hpY2hdIHNsb3QuICAKICoKICogQHBhcmFtIHN0b3JlaWQgYW4gaW5kZXggdG8gdGhlIGJvb2xlYW4gc3RvcmFnZSBjb250YWluZXIncyBmaXJzdCBpbmRleChzdG9yZSkKICoKICogQHBhcmFtIHdoaWNoIGFuIGluZGV4IHRvIHRoZSBib29sZWFuIHN0b3JhZ2UgY29udGFpbmVyJ3Mgc2Vjb25kIGluZGV4KHdoaWNoKQogKgogKiBAcGFyYW0gdmFsdWUgaWYgPiAwLCAidHJ1ZSIgaXMgc2V0IGludG8gdGhlIHNsb3Qgb3RoZXJ3aXNlICJmYWxzZSIKICoKICogQHJldHVybiBSZXR1cm5zIFNOTVBQRVJSX0dFTkVSUiBpZiB0aGUgc3RvcmVpZCBhbmQgd2hpY2ggcGFyYW1ldGVycyBkbyBub3QKICogY29ycmVzcG9uZCB0byBhIHZhbGlkIHNsb3QsIG9yICBTTk1QRVJSX1NVQ0NFU1Mgb3RoZXJ3aXNlLgogKi8KaW50Cm5ldHNubXBfZHNfc2V0X2Jvb2xlYW4oaW50IHN0b3JlaWQsIGludCB3aGljaCwgaW50IHZhbHVlKQp7CiAgICBpZiAoc3RvcmVpZCA8IDAgfHwgc3RvcmVpZCA+PSBORVRTTk1QX0RTX01BWF9JRFMgfHwgCgl3aGljaCAgIDwgMCB8fCB3aGljaCAgID49IE5FVFNOTVBfRFNfTUFYX1NVQklEUykgewogICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgIH0KCiAgICBERUJVR01TR1RMKCgibmV0c25tcF9kc19zZXRfYm9vbGVhbiIsICJTZXR0aW5nICVzOiVkID0gJWQvJXNcbiIsCiAgICAgICAgICAgICAgICBzdG9yZXNbc3RvcmVpZF0sIHdoaWNoLCB2YWx1ZSwgKCh2YWx1ZSkgPyAiVHJ1ZSIgOiAiRmFsc2UiKSkpOwoKICAgIGlmICh2YWx1ZSA+IDApIHsKICAgICAgICBuZXRzbm1wX2RzX2Jvb2xlYW5zW3N0b3JlaWRdW3doaWNoLzhdIHw9ICgxIDw8ICh3aGljaCAlIDgpKTsKICAgIH0gZWxzZSB7CiAgICAgICAgbmV0c25tcF9kc19ib29sZWFuc1tzdG9yZWlkXVt3aGljaC84XSAmPSAoMHhmZjdmID4+ICg3IC0gKHdoaWNoICUgOCkpKTsKICAgIH0KCiAgICByZXR1cm4gU05NUEVSUl9TVUNDRVNTOwp9CgppbnQKbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihpbnQgc3RvcmVpZCwgaW50IHdoaWNoKQp7CiAgICBpZiAoc3RvcmVpZCA8IDAgfHwgc3RvcmVpZCA+PSBORVRTTk1QX0RTX01BWF9JRFMgfHwgCgl3aGljaCAgIDwgMCB8fCB3aGljaCAgID49IE5FVFNOTVBfRFNfTUFYX1NVQklEUykgewogICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgIH0KCiAgICBpZiAoKG5ldHNubXBfZHNfYm9vbGVhbnNbc3RvcmVpZF1bd2hpY2gvOF0gJiAoMSA8PCAod2hpY2ggJSA4KSkpID09IDApIHsKICAgICAgICBuZXRzbm1wX2RzX2Jvb2xlYW5zW3N0b3JlaWRdW3doaWNoLzhdIHw9ICgxIDw8ICh3aGljaCAlIDgpKTsKICAgIH0gZWxzZSB7CiAgICAgICAgbmV0c25tcF9kc19ib29sZWFuc1tzdG9yZWlkXVt3aGljaC84XSAmPSAoMHhmZjdmID4+ICg3IC0gKHdoaWNoICUgOCkpKTsKICAgIH0KCiAgICBERUJVR01TR1RMKCgibmV0c25tcF9kc190b2dnbGVfYm9vbGVhbiIsICJTZXR0aW5nICVzOiVkID0gJWQvJXNcbiIsCiAgICAgICAgICAgICAgICBzdG9yZXNbc3RvcmVpZF0sIHdoaWNoLCBuZXRzbm1wX2RzX2Jvb2xlYW5zW3N0b3JlaWRdW3doaWNoLzhdLAogICAgICAgICAgICAgICAgKChuZXRzbm1wX2RzX2Jvb2xlYW5zW3N0b3JlaWRdW3doaWNoLzhdKSA/ICJUcnVlIiA6ICJGYWxzZSIpKSk7CgogICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKfQoKaW50Cm5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oaW50IHN0b3JlaWQsIGludCB3aGljaCkKewogICAgaWYgKHN0b3JlaWQgPCAwIHx8IHN0b3JlaWQgPj0gTkVUU05NUF9EU19NQVhfSURTIHx8IAoJd2hpY2ggICA8IDAgfHwgd2hpY2ggICA+PSBORVRTTk1QX0RTX01BWF9TVUJJRFMpIHsKICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICB9CgogICAgcmV0dXJuIChuZXRzbm1wX2RzX2Jvb2xlYW5zW3N0b3JlaWRdW3doaWNoLzhdICYgKDEgPDwgKHdoaWNoICUgOCkpKSA/IDE6MDsKfQoKaW50Cm5ldHNubXBfZHNfc2V0X2ludChpbnQgc3RvcmVpZCwgaW50IHdoaWNoLCBpbnQgdmFsdWUpCnsKICAgIGlmIChzdG9yZWlkIDwgMCB8fCBzdG9yZWlkID49IE5FVFNOTVBfRFNfTUFYX0lEUyB8fCAKCXdoaWNoICAgPCAwIHx8IHdoaWNoICAgPj0gTkVUU05NUF9EU19NQVhfU1VCSURTKSB7CiAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwogICAgfQoKICAgIERFQlVHTVNHVEwoKCJuZXRzbm1wX2RzX3NldF9pbnQiLCAiU2V0dGluZyAlczolZCA9ICVkXG4iLAogICAgICAgICAgICAgICAgc3RvcmVzW3N0b3JlaWRdLCB3aGljaCwgdmFsdWUpKTsKCiAgICBuZXRzbm1wX2RzX2ludGVnZXJzW3N0b3JlaWRdW3doaWNoXSA9IHZhbHVlOwogICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKfQoKaW50Cm5ldHNubXBfZHNfZ2V0X2ludChpbnQgc3RvcmVpZCwgaW50IHdoaWNoKQp7CiAgICBpZiAoc3RvcmVpZCA8IDAgfHwgc3RvcmVpZCA+PSBORVRTTk1QX0RTX01BWF9JRFMgfHwgCgl3aGljaCAgIDwgMCB8fCB3aGljaCAgID49IE5FVFNOTVBfRFNfTUFYX1NVQklEUykgewogICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgIH0KCiAgICByZXR1cm4gbmV0c25tcF9kc19pbnRlZ2Vyc1tzdG9yZWlkXVt3aGljaF07Cn0KCmludApuZXRzbm1wX2RzX3NldF9zdHJpbmcoaW50IHN0b3JlaWQsIGludCB3aGljaCwgY29uc3QgY2hhciAqdmFsdWUpCnsKICAgIGlmIChzdG9yZWlkIDwgMCB8fCBzdG9yZWlkID49IE5FVFNOTVBfRFNfTUFYX0lEUyB8fCAKCXdoaWNoICAgPCAwIHx8IHdoaWNoICAgPj0gTkVUU05NUF9EU19NQVhfU1VCSURTKSB7CiAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwogICAgfQoKICAgIERFQlVHTVNHVEwoKCJuZXRzbm1wX2RzX3NldF9zdHJpbmciLCAiU2V0dGluZyAlczolZCA9IFwiJXNcIlxuIiwKICAgICAgICAgICAgICAgIHN0b3Jlc1tzdG9yZWlkXSwgd2hpY2gsICh2YWx1ZSA/IHZhbHVlIDogIihudWxsKSIpKSk7CgogICAgLyoKICAgICAqIGlzIHNvbWUgc2lsbHkgcGVyc29uIGlzIGNhbGxpbmcgdXMgd2l0aCBvdXIgb3duIHBvaW50ZXI/CiAgICAgKi8KICAgIGlmIChuZXRzbm1wX2RzX3N0cmluZ3Nbc3RvcmVpZF1bd2hpY2hdID09IHZhbHVlKQogICAgICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7CiAgICAKICAgIGlmIChuZXRzbm1wX2RzX3N0cmluZ3Nbc3RvcmVpZF1bd2hpY2hdICE9IE5VTEwpIHsKICAgICAgICBmcmVlKG5ldHNubXBfZHNfc3RyaW5nc1tzdG9yZWlkXVt3aGljaF0pOwoJbmV0c25tcF9kc19zdHJpbmdzW3N0b3JlaWRdW3doaWNoXSA9IE5VTEw7CiAgICB9CgogICAgaWYgKHZhbHVlKSB7CiAgICAgICAgbmV0c25tcF9kc19zdHJpbmdzW3N0b3JlaWRdW3doaWNoXSA9IHN0cmR1cCh2YWx1ZSk7CiAgICB9IGVsc2UgewogICAgICAgIG5ldHNubXBfZHNfc3RyaW5nc1tzdG9yZWlkXVt3aGljaF0gPSBOVUxMOwogICAgfQoKICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7Cn0KCmNoYXIgKgpuZXRzbm1wX2RzX2dldF9zdHJpbmcoaW50IHN0b3JlaWQsIGludCB3aGljaCkKewogICAgaWYgKHN0b3JlaWQgPCAwIHx8IHN0b3JlaWQgPj0gTkVUU05NUF9EU19NQVhfSURTIHx8IAoJd2hpY2ggICA8IDAgfHwgd2hpY2ggICA+PSBORVRTTk1QX0RTX01BWF9TVUJJRFMpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICByZXR1cm4gbmV0c25tcF9kc19zdHJpbmdzW3N0b3JlaWRdW3doaWNoXTsKfQoKI2lmbmRlZiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0RFRkFVTFRfU1RPUkVfVk9JRAppbnQKbmV0c25tcF9kc19zZXRfdm9pZChpbnQgc3RvcmVpZCwgaW50IHdoaWNoLCB2b2lkICp2YWx1ZSkKewogICAgaWYgKHN0b3JlaWQgPCAwIHx8IHN0b3JlaWQgPj0gTkVUU05NUF9EU19NQVhfSURTIHx8IAoJd2hpY2ggICA8IDAgfHwgd2hpY2ggICA+PSBORVRTTk1QX0RTX01BWF9TVUJJRFMpIHsKICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICB9CgogICAgREVCVUdNU0dUTCgoIm5ldHNubXBfZHNfc2V0X3ZvaWQiLCAiU2V0dGluZyAlczolZCA9ICVwXG4iLAogICAgICAgICAgICAgICAgc3RvcmVzW3N0b3JlaWRdLCB3aGljaCwgdmFsdWUpKTsKCiAgICBuZXRzbm1wX2RzX3ZvaWRzW3N0b3JlaWRdW3doaWNoXSA9IHZhbHVlOwoKICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7Cn0KCnZvaWQgKgpuZXRzbm1wX2RzX2dldF92b2lkKGludCBzdG9yZWlkLCBpbnQgd2hpY2gpCnsKICAgIGlmIChzdG9yZWlkIDwgMCB8fCBzdG9yZWlkID49IE5FVFNOTVBfRFNfTUFYX0lEUyB8fCAKCXdoaWNoICAgPCAwIHx8IHdoaWNoICAgPj0gTkVUU05NUF9EU19NQVhfU1VCSURTKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgcmV0dXJuIG5ldHNubXBfZHNfdm9pZHNbc3RvcmVpZF1bd2hpY2hdOwp9CiNlbmRpZiAvKiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0RFRkFVTFRfU1RPUkVfVk9JRCAqLwoKaW50Cm5ldHNubXBfZHNfcGFyc2VfYm9vbGVhbihjaGFyICpsaW5lKQp7CiAgICBjaGFyICAgICAgICAgICAqdmFsdWUsICplbmRwdHI7CiAgICBpbnQgICAgICAgICAgICAgaXRtcDsKICAgIGNoYXIgICAgICAgICAgICpzdDsKCiAgICB2YWx1ZSA9IHN0cnRva19yKGxpbmUsICIgXHRcbiIsICZzdCk7CiAgICBpZiAoc3RyY2FzZWNtcCh2YWx1ZSwgInllcyIpID09IDAgfHwgCglzdHJjYXNlY21wKHZhbHVlLCAidHJ1ZSIpID09IDApIHsKICAgICAgICByZXR1cm4gMTsKICAgIH0gZWxzZSBpZiAoc3RyY2FzZWNtcCh2YWx1ZSwgIm5vIikgPT0gMCB8fAoJICAgICAgIHN0cmNhc2VjbXAodmFsdWUsICJmYWxzZSIpID09IDApIHsKICAgICAgICByZXR1cm4gMDsKICAgIH0gZWxzZSB7CiAgICAgICAgaXRtcCA9IHN0cnRvbCh2YWx1ZSwgJmVuZHB0ciwgMTApOwogICAgICAgIGlmICgqZW5kcHRyICE9IDAgfHwgaXRtcCA8IDAgfHwgaXRtcCA+IDEpIHsKICAgICAgICAgICAgY29uZmlnX3BlcnJvcigiU2hvdWxkIGJlIHllc3xub3x0cnVlfGZhbHNlfDB8MSIpOwogICAgICAgICAgICByZXR1cm4gLTE7Cgl9CiAgICAgICAgcmV0dXJuIGl0bXA7CiAgICB9Cn0KCnZvaWQKbmV0c25tcF9kc19oYW5kbGVfY29uZmlnKGNvbnN0IGNoYXIgKnRva2VuLCBjaGFyICpsaW5lKQp7CiAgICBuZXRzbm1wX2RzX3JlYWRfY29uZmlnICpkcnNwOwogICAgY2hhciAgICAgICAgICAgIGJ1ZltTTk1QX01BWEJVRl07CiAgICBjaGFyICAgICAgICAgICAqdmFsdWUsICplbmRwdHI7CiAgICBpbnQgICAgICAgICAgICAgaXRtcDsKICAgIGNoYXIgICAgICAgICAgICpzdDsKCiAgICBERUJVR01TR1RMKCgibmV0c25tcF9kc19oYW5kbGVfY29uZmlnIiwgImhhbmRsaW5nICVzXG4iLCB0b2tlbikpOwoKICAgIGZvciAoZHJzcCA9IG5ldHNubXBfZHNfY29uZmlnczsKICAgICAgICAgZHJzcCAhPSBOVUxMICYmIHN0cmNhc2VjbXAodG9rZW4sIGRyc3AtPnRva2VuKSAhPSAwOwogICAgICAgICBkcnNwID0gZHJzcC0+bmV4dCk7CgogICAgaWYgKGRyc3AgIT0gTlVMTCkgewogICAgICAgIERFQlVHTVNHVEwoKCJuZXRzbm1wX2RzX2hhbmRsZV9jb25maWciLAogICAgICAgICAgICAgICAgICAgICJzZXR0aW5nOiB0b2tlbj0lcywgdHlwZT0lZCwgaWQ9JXMsIHdoaWNoPSVkXG4iLAogICAgICAgICAgICAgICAgICAgIGRyc3AtPnRva2VuLCBkcnNwLT50eXBlLCBzdG9yZXNbZHJzcC0+c3RvcmVpZF0sCiAgICAgICAgICAgICAgICAgICAgZHJzcC0+d2hpY2gpKTsKCiAgICAgICAgc3dpdGNoIChkcnNwLT50eXBlKSB7CiAgICAgICAgY2FzZSBBU05fQk9PTEVBTjoKICAgICAgICAgICAgaXRtcCA9IG5ldHNubXBfZHNfcGFyc2VfYm9vbGVhbihsaW5lKTsKICAgICAgICAgICAgaWYgKCBpdG1wICE9IC0xICkKICAgICAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2Jvb2xlYW4oZHJzcC0+c3RvcmVpZCwgZHJzcC0+d2hpY2gsIGl0bXApOwogICAgICAgICAgICBERUJVR01TR1RMKCgibmV0c25tcF9kc19oYW5kbGVfY29uZmlnIiwgImJvb2w6ICVkXG4iLCBpdG1wKSk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEFTTl9JTlRFR0VSOgogICAgICAgICAgICB2YWx1ZSA9IHN0cnRva19yKGxpbmUsICIgXHRcbiIsICZzdCk7CiAgICAgICAgICAgIGl0bXAgPSBzdHJ0b2wodmFsdWUsICZlbmRwdHIsIDEwKTsKICAgICAgICAgICAgaWYgKCplbmRwdHIgIT0gMCkgewogICAgICAgICAgICAgICAgY29uZmlnX3BlcnJvcigiQmFkIGludGVnZXIgdmFsdWUiKTsKCSAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfaW50KGRyc3AtPnN0b3JlaWQsIGRyc3AtPndoaWNoLCBpdG1wKTsKCSAgICB9CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJuZXRzbm1wX2RzX2hhbmRsZV9jb25maWciLCAiaW50OiAlZFxuIiwgaXRtcCkpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBBU05fT0NURVRfU1RSOgogICAgICAgICAgICBpZiAoKmxpbmUgPT0gJyInKSB7CiAgICAgICAgICAgICAgICBjb3B5X253b3JkKGxpbmUsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwogICAgICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfc3RyaW5nKGRyc3AtPnN0b3JlaWQsIGRyc3AtPndoaWNoLCBidWYpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfc3RyaW5nKGRyc3AtPnN0b3JlaWQsIGRyc3AtPndoaWNoLCBsaW5lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBERUJVR01TR1RMKCgibmV0c25tcF9kc19oYW5kbGVfY29uZmlnIiwgInN0cmluZzogJXNcbiIsIGxpbmUpKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsICJuZXRzbm1wX2RzX2hhbmRsZV9jb25maWc6IHR5cGUgJWQgKDB4JTAyeClcbiIsCiAgICAgICAgICAgICAgICAgICAgIGRyc3AtPnR5cGUsIGRyc3AtPnR5cGUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIHNubXBfbG9nKExPR19FUlIsICJuZXRzbm1wX2RzX2hhbmRsZV9jb25maWc6IG5vIHJlZ2lzdHJhdGlvbiBmb3IgJXNcbiIsCiAgICAgICAgICAgICAgICAgdG9rZW4pOwogICAgfQp9CgoKaW50Cm5ldHNubXBfZHNfcmVnaXN0ZXJfY29uZmlnKHVfY2hhciB0eXBlLCBjb25zdCBjaGFyICpmdHlwZSwgY29uc3QgY2hhciAqdG9rZW4sCgkJCSAgIGludCBzdG9yZWlkLCBpbnQgd2hpY2gpCnsKICAgIG5ldHNubXBfZHNfcmVhZF9jb25maWcgKmRyc3A7CgogICAgaWYgKHN0b3JlaWQgPCAwIHx8IHN0b3JlaWQgPj0gTkVUU05NUF9EU19NQVhfSURTICAgIHx8IAoJd2hpY2ggICA8IDAgfHwgd2hpY2ggICA+PSBORVRTTk1QX0RTX01BWF9TVUJJRFMgfHwgdG9rZW4gPT0gTlVMTCkgewogICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgIH0KCiAgICBpZiAobmV0c25tcF9kc19jb25maWdzID09IE5VTEwpIHsKICAgICAgICBuZXRzbm1wX2RzX2NvbmZpZ3MgPSBTTk1QX01BTExPQ19UWVBFREVGKG5ldHNubXBfZHNfcmVhZF9jb25maWcpOwogICAgICAgIGlmIChuZXRzbm1wX2RzX2NvbmZpZ3MgPT0gTlVMTCkKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwogICAgICAgIGRyc3AgPSBuZXRzbm1wX2RzX2NvbmZpZ3M7CiAgICB9IGVsc2UgewogICAgICAgIGZvciAoZHJzcCA9IG5ldHNubXBfZHNfY29uZmlnczsgZHJzcC0+bmV4dCAhPSBOVUxMOyBkcnNwID0gZHJzcC0+bmV4dCk7CiAgICAgICAgZHJzcC0+bmV4dCA9IFNOTVBfTUFMTE9DX1RZUEVERUYobmV0c25tcF9kc19yZWFkX2NvbmZpZyk7CiAgICAgICAgaWYgKGRyc3AtPm5leHQgPT0gTlVMTCkKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwogICAgICAgIGRyc3AgPSBkcnNwLT5uZXh0OwogICAgfQoKICAgIGRyc3AtPnR5cGUgICAgPSB0eXBlOwogICAgZHJzcC0+ZnR5cGUgICA9IHN0cmR1cChmdHlwZSk7CiAgICBkcnNwLT50b2tlbiAgID0gc3RyZHVwKHRva2VuKTsKICAgIGRyc3AtPnN0b3JlaWQgPSBzdG9yZWlkOwogICAgZHJzcC0+d2hpY2ggICA9IHdoaWNoOwoKICAgIHN3aXRjaCAodHlwZSkgewogICAgY2FzZSBBU05fQk9PTEVBTjoKICAgICAgICByZWdpc3Rlcl9jb25maWdfaGFuZGxlcihmdHlwZSwgdG9rZW4sIG5ldHNubXBfZHNfaGFuZGxlX2NvbmZpZywgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDF8eWVzfHRydWV8MHxub3xmYWxzZSkiKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEFTTl9JTlRFR0VSOgogICAgICAgIHJlZ2lzdGVyX2NvbmZpZ19oYW5kbGVyKGZ0eXBlLCB0b2tlbiwgbmV0c25tcF9kc19oYW5kbGVfY29uZmlnLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlZ2VyVmFsdWUiKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEFTTl9PQ1RFVF9TVFI6CiAgICAgICAgcmVnaXN0ZXJfY29uZmlnX2hhbmRsZXIoZnR5cGUsIHRva2VuLCBuZXRzbm1wX2RzX2hhbmRsZV9jb25maWcsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZyIpOwogICAgICAgIGJyZWFrOwoKICAgIH0KICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7Cn0KCmludApuZXRzbm1wX2RzX3JlZ2lzdGVyX3ByZW1pYih1X2NoYXIgdHlwZSwgY29uc3QgY2hhciAqZnR5cGUsIGNvbnN0IGNoYXIgKnRva2VuLAoJCQkgICBpbnQgc3RvcmVpZCwgaW50IHdoaWNoKQp7CiAgICBuZXRzbm1wX2RzX3JlYWRfY29uZmlnICpkcnNwOwoKICAgIGlmIChzdG9yZWlkIDwgMCB8fCBzdG9yZWlkID49IE5FVFNOTVBfRFNfTUFYX0lEUyAgICB8fCAKCXdoaWNoICAgPCAwIHx8IHdoaWNoICAgPj0gTkVUU05NUF9EU19NQVhfU1VCSURTIHx8IHRva2VuID09IE5VTEwpIHsKICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICB9CgogICAgaWYgKG5ldHNubXBfZHNfY29uZmlncyA9PSBOVUxMKSB7CiAgICAgICAgbmV0c25tcF9kc19jb25maWdzID0gU05NUF9NQUxMT0NfVFlQRURFRihuZXRzbm1wX2RzX3JlYWRfY29uZmlnKTsKICAgICAgICBpZiAobmV0c25tcF9kc19jb25maWdzID09IE5VTEwpCiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgICAgICBkcnNwID0gbmV0c25tcF9kc19jb25maWdzOwogICAgfSBlbHNlIHsKICAgICAgICBmb3IgKGRyc3AgPSBuZXRzbm1wX2RzX2NvbmZpZ3M7IGRyc3AtPm5leHQgIT0gTlVMTDsgZHJzcCA9IGRyc3AtPm5leHQpOwogICAgICAgIGRyc3AtPm5leHQgPSBTTk1QX01BTExPQ19UWVBFREVGKG5ldHNubXBfZHNfcmVhZF9jb25maWcpOwogICAgICAgIGlmIChkcnNwLT5uZXh0ID09IE5VTEwpCiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgICAgICBkcnNwID0gZHJzcC0+bmV4dDsKICAgIH0KCiAgICBkcnNwLT50eXBlICAgID0gdHlwZTsKICAgIGRyc3AtPmZ0eXBlICAgPSBzdHJkdXAoZnR5cGUpOwogICAgZHJzcC0+dG9rZW4gICA9IHN0cmR1cCh0b2tlbik7CiAgICBkcnNwLT5zdG9yZWlkID0gc3RvcmVpZDsKICAgIGRyc3AtPndoaWNoICAgPSB3aGljaDsKCiAgICBzd2l0Y2ggKHR5cGUpIHsKICAgIGNhc2UgQVNOX0JPT0xFQU46CiAgICAgICAgcmVnaXN0ZXJfcHJlbmV0c25tcF9taWJfaGFuZGxlcihmdHlwZSwgdG9rZW4sIG5ldHNubXBfZHNfaGFuZGxlX2NvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICIoMXx5ZXN8dHJ1ZXwwfG5vfGZhbHNlKSIpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQVNOX0lOVEVHRVI6CiAgICAgICAgcmVnaXN0ZXJfcHJlbmV0c25tcF9taWJfaGFuZGxlcihmdHlwZSwgdG9rZW4sIG5ldHNubXBfZHNfaGFuZGxlX2NvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICJpbnRlZ2VyVmFsdWUiKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEFTTl9PQ1RFVF9TVFI6CiAgICAgICAgcmVnaXN0ZXJfcHJlbmV0c25tcF9taWJfaGFuZGxlcihmdHlwZSwgdG9rZW4sIG5ldHNubXBfZHNfaGFuZGxlX2NvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICJzdHJpbmciKTsKICAgICAgICBicmVhazsKCiAgICB9CiAgICByZXR1cm4gU05NUEVSUl9TVUNDRVNTOwp9Cgp2b2lkCm5ldHNubXBfZHNfc2h1dGRvd24odm9pZCkKewogICAgbmV0c25tcF9kc19yZWFkX2NvbmZpZyAqZHJzcDsKICAgIGludCAgICAgICAgICAgICBpLCBqOwoKICAgIGZvciAoZHJzcCA9IG5ldHNubXBfZHNfY29uZmlnczsgZHJzcDsgZHJzcCA9IG5ldHNubXBfZHNfY29uZmlncykgewogICAgICAgIG5ldHNubXBfZHNfY29uZmlncyA9IGRyc3AtPm5leHQ7CgogICAgICAgIGlmIChkcnNwLT5mdHlwZSAmJiBkcnNwLT50b2tlbikgewogICAgICAgICAgICB1bnJlZ2lzdGVyX2NvbmZpZ19oYW5kbGVyKGRyc3AtPmZ0eXBlLCBkcnNwLT50b2tlbik7CiAgICAgICAgfQoJaWYgKGRyc3AtPmZ0eXBlICE9IE5VTEwpIHsKCSAgICBmcmVlKGRyc3AtPmZ0eXBlKTsKCX0KCWlmIChkcnNwLT50b2tlbiAhPSBOVUxMKSB7CgkgICAgZnJlZShkcnNwLT50b2tlbik7Cgl9CiAgICAgICAgZnJlZShkcnNwKTsKICAgIH0KCiAgICBmb3IgKGkgPSAwOyBpIDwgTkVUU05NUF9EU19NQVhfSURTOyBpKyspIHsKICAgICAgICBmb3IgKGogPSAwOyBqIDwgTkVUU05NUF9EU19NQVhfU1VCSURTOyBqKyspIHsKICAgICAgICAgICAgaWYgKG5ldHNubXBfZHNfc3RyaW5nc1tpXVtqXSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICBmcmVlKG5ldHNubXBfZHNfc3RyaW5nc1tpXVtqXSk7CiAgICAgICAgICAgICAgICBuZXRzbm1wX2RzX3N0cmluZ3NbaV1bal0gPSBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9Ci8qKiAgQH0gKi8K