LyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0cy4gIFNlZQogKiB0aGUgTmV0LVNOTVAncyBDT1BZSU5HIGZpbGUgZm9yIG1vcmUgZGV0YWlscyBhbmQgb3RoZXIgY29weXJpZ2h0cwogKiB0aGF0IG1heSBhcHBseToKICovCi8qCiAqIENvcHlyaWdodCCpIDIwMDMgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiBVc2UgaXMgc3ViamVjdCB0byBsaWNlbnNlIHRlcm1zIHNwZWNpZmllZCBpbiB0aGUgQ09QWUlORyBmaWxlCiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhlIE5ldC1TTk1QIHBhY2thZ2UuCiAqLwojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtY29uZmlnLmg+CgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzeXMvc3RhdC5oPgojaWYgVElNRV9XSVRIX1NZU19USU1FCiMgaWZkZWYgV0lOMzIKIyAgaW5jbHVkZSA8c3lzL3RpbWViLmg+CiMgZWxzZQojICBpbmNsdWRlIDxzeXMvdGltZS5oPgojIGVuZGlmCiMgaW5jbHVkZSA8dGltZS5oPgojZWxzZQojIGlmIEhBVkVfU1lTX1RJTUVfSAojICBpbmNsdWRlIDxzeXMvdGltZS5oPgojIGVsc2UKIyAgaW5jbHVkZSA8dGltZS5oPgojIGVuZGlmCiNlbmRpZgojaWYgSEFWRV9XSU5TT0NLX0gKI2luY2x1ZGUgPHdpbnNvY2suaD4KI2VuZGlmCiNpZiBIQVZFX1NUUklOR19ICiNpbmNsdWRlIDxzdHJpbmcuaD4KI2VuZGlmCgojaWYgSEFWRV9TVFJJTkdfSAojaW5jbHVkZSA8c3RyaW5nLmg+CiNlbmRpZgoKI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWluY2x1ZGVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9uZXQtc25tcC1hZ2VudC1pbmNsdWRlcy5oPgoKI2luY2x1ZGUgInN0cnVjdC5oIgojaW5jbHVkZSAiZmlsZS5oIgojaW5jbHVkZSAidXRpbF9mdW5jcy5oIgoKI2RlZmluZSBNQVhGSUxFICAgMjAKCnN0cnVjdCBmaWxlc3RhdCBmaWxlVGFibGVbTUFYRklMRV07CmludCAgICAgICAgICAgICBmaWxlQ291bnQ7Cgp2b2lkCmluaXRfZmlsZSh2b2lkKQp7CiAgICBzdHJ1Y3QgdmFyaWFibGUyIGZpbGVfdGFibGVbXSA9IHsKICAgICAgICB7RklMRV9JTkRFWCwgQVNOX0lOVEVHRVIsIFJPTkxZLCB2YXJfZmlsZV90YWJsZSwgMSwgezF9fSwKICAgICAgICB7RklMRV9OQU1FLCBBU05fT0NURVRfU1RSLCBST05MWSwgdmFyX2ZpbGVfdGFibGUsIDEsIHsyfX0sCiAgICAgICAge0ZJTEVfU0laRSwgQVNOX0lOVEVHRVIsIFJPTkxZLCB2YXJfZmlsZV90YWJsZSwgMSwgezN9fSwKICAgICAgICB7RklMRV9NQVgsIEFTTl9JTlRFR0VSLCBST05MWSwgdmFyX2ZpbGVfdGFibGUsIDEsIHs0fX0sCiAgICAgICAge0ZJTEVfRVJST1IsIEFTTl9JTlRFR0VSLCBST05MWSwgdmFyX2ZpbGVfdGFibGUsIDEsIHsxMDB9fSwKICAgICAgICB7RklMRV9NU0csIEFTTl9PQ1RFVF9TVFIsIFJPTkxZLCB2YXJfZmlsZV90YWJsZSwgMSwgezEwMX19CiAgICB9OwoKICAgIC8qCiAgICAgKiBEZWZpbmUgdGhlIE9JRCBwb2ludGVyIHRvIHRoZSB0b3Agb2YgdGhlIG1pYiB0cmVlIHRoYXQgd2UncmUKICAgICAqIHJlZ2lzdGVyaW5nIHVuZGVybmVhdGggCiAgICAgKi8KICAgIG9pZCAgICAgICAgICAgICBmaWxlX3ZhcmlhYmxlc19vaWRbXSA9IHsgTkVUU05NUF9VQ0RBVklTX01JQiwgMTUsIDEgfTsKCiAgICAvKgogICAgICogcmVnaXN0ZXIgb3Vyc2VsdmVzIHdpdGggdGhlIGFnZW50IHRvIGhhbmRsZSBvdXIgbWliIHRyZWUgCiAgICAgKi8KICAgIFJFR0lTVEVSX01JQigidWNkLXNubXAvZmlsZSIsIGZpbGVfdGFibGUsIHZhcmlhYmxlMiwKICAgICAgICAgICAgICAgICBmaWxlX3ZhcmlhYmxlc19vaWQpOwoKICAgIHNubXBkX3JlZ2lzdGVyX2NvbmZpZ19oYW5kbGVyKCJmaWxlIiwgZmlsZV9wYXJzZV9jb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX2ZyZWVfY29uZmlnLCAiZmlsZSBbbWF4c2l6ZV0iKTsKCn0KCnZvaWQKZmlsZV9mcmVlX2NvbmZpZyh2b2lkKQp7CiAgICBmaWxlQ291bnQgPSAwOwp9Cgp2b2lkCmZpbGVfcGFyc2VfY29uZmlnKGNvbnN0IGNoYXIgKnRva2VuLCBjaGFyICpjcHRyKQp7CiAgICBjaGFyICpjcDsKCQogICAgaWYgKGZpbGVDb3VudCA8IE1BWEZJTEUpIHsKICAgICAgICBmaWxlVGFibGVbZmlsZUNvdW50XS5tYXggPSAtMTsKCiAgICAgICAgY3AgPSBjb3B5X253b3JkKGNwdHIsIGZpbGVUYWJsZVtmaWxlQ291bnRdLm5hbWUsIEZJTEVfTkFNRV9NQVgpOwoKCWlmIChzdHJsZW4oZmlsZVRhYmxlW2ZpbGVDb3VudF0ubmFtZSkgPj0gRklMRV9OQU1FX01BWCAtIDEpIHsKICAgICAgICAgICAgY29uZmlnX3BlcnJvcigiZmlsZSBuYW1lIHRvbyBsb25nIik7CiAgICAgICAgICAgIHJldHVybjsKCX0KCiAgICAgICAgaWYgKGNwKQogICAgICAgICAgICBmaWxlVGFibGVbZmlsZUNvdW50XS5tYXggPSBzdHJ0b3VsKGNwLCBOVUxMLCAxMCk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBmaWxlVGFibGVbZmlsZUNvdW50XS5tYXggPSAtMTsKCiAgICAgICAgZmlsZUNvdW50Kys7CiAgICB9Cn0KCnZvaWQKdXBkYXRlRmlsZShpbnQgaWluZGV4KQp7CiAgICBzdHJ1Y3Qgc3RhdCAgICAgc2I7CgogICAgaWYgKHN0YXQoZmlsZVRhYmxlW2lpbmRleF0ubmFtZSwgJnNiKSA9PSAwKQogICAgICAgIGZpbGVUYWJsZVtpaW5kZXhdLnNpemUgPSBzYi5zdF9zaXplID4+IDEwOwp9CgovKgogKiBPSUQgZnVuY3Rpb25zIAogKi8KCnVfY2hhciAgICAgICAgICoKdmFyX2ZpbGVfdGFibGUoc3RydWN0IHZhcmlhYmxlICp2cCwKICAgICAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICAgICAgc2l6ZV90ICogbGVuZ3RoLAogICAgICAgICAgICAgICBpbnQgZXhhY3QsIHNpemVfdCAqIHZhcl9sZW4sIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCkKewogICAgc3RhdGljIGxvbmcgICAgIGxvbmdfcmV0OwogICAgc3RhdGljIGNoYXIgICAgIGVycm9yWzI1Nl07CiAgICBpbnQgICAgICAgICAgICAgaWluZGV4OwogICAgc3RydWN0IGZpbGVzdGF0ICpmaWxlOwoKICAgIGlmIChoZWFkZXJfc2ltcGxlX3RhYmxlCiAgICAgICAgKHZwLCBuYW1lLCBsZW5ndGgsIGV4YWN0LCB2YXJfbGVuLCB3cml0ZV9tZXRob2QsIGZpbGVDb3VudCkpCiAgICAgICAgcmV0dXJuIChOVUxMKTsKCiAgICBpaW5kZXggPSBuYW1lWypsZW5ndGggLSAxXSAtIDE7CgogICAgdXBkYXRlRmlsZShpaW5kZXgpOwoKICAgIGZpbGUgPSAmZmlsZVRhYmxlW2lpbmRleF07CgogICAgc3dpdGNoICh2cC0+bWFnaWMpIHsKICAgIGNhc2UgRklMRV9JTkRFWDoKICAgICAgICBsb25nX3JldCA9IGlpbmRleCArIDE7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldDsKCiAgICBjYXNlIEZJTEVfTkFNRToKICAgICAgICAqdmFyX2xlbiA9IHN0cmxlbihmaWxlLT5uYW1lKTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBmaWxlLT5uYW1lOwoKICAgIGNhc2UgRklMRV9TSVpFOgogICAgICAgIGxvbmdfcmV0ID0gZmlsZS0+c2l6ZTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0OwoKICAgIGNhc2UgRklMRV9NQVg6CiAgICAgICAgbG9uZ19yZXQgPSBmaWxlLT5tYXg7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldDsKCiAgICBjYXNlIEZJTEVfRVJST1I6CiAgICAgICAgaWYgKGZpbGUtPm1heCA+PSAwICYmIGZpbGUtPnNpemUgPiBmaWxlLT5tYXgpCiAgICAgICAgICAgIGxvbmdfcmV0ID0gMTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGxvbmdfcmV0ID0gMDsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldDsKCiAgICBjYXNlIEZJTEVfTVNHOgogICAgICAgIGlmIChmaWxlLT5tYXggPj0gMCAmJiBmaWxlLT5zaXplID4gZmlsZS0+bWF4KQogICAgICAgICAgICBzbnByaW50ZihlcnJvciwgc2l6ZW9mKGVycm9yKSwgRklMRV9FUlJPUl9NU0csIGZpbGUtPm5hbWUsCgkJZmlsZS0+bWF4LCBmaWxlLT5zaXplKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHN0cmNweShlcnJvciwgIiIpOwoKICAgICAgICAqdmFyX2xlbiA9IHN0cmxlbihlcnJvcik7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgZXJyb3I7CgogICAgZGVmYXVsdDoKICAgICAgICBERUJVR01TR1RMKCgic25tcGQiLCAidW5rbm93biBzdWItaWQgJWQgaW4gdmFyX2ZpbGVfdGFibGVcbiIsCiAgICAgICAgICAgICAgICAgICAgdnAtPm1hZ2ljKSk7CiAgICB9CgogICAgcmV0dXJuIE5VTEw7Cn0K