LyoKICogJFJDU0lkOiB4Yy9saWIvZm9udGNvbmZpZy9mYy1saXN0L2ZjLWxpc3QuYyx2IDEuNSAyMDAyLzA2LzMwIDIzOjQ1OjQwIGtlaXRocCBFeHAgJAogKgogKiBDb3B5cmlnaHQgqSAyMDAyIEtlaXRoIFBhY2thcmQKICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCiAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CiAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAogKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCiAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CiAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCiAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAogKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgogKgogKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAogKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCiAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCiAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKi8KCiNpbmNsdWRlIDxmb250Y29uZmlnL2ZvbnRjb25maWcuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaWZkZWYgSEFWRV9DT05GSUdfSAojaW5jbHVkZSA8Y29uZmlnLmg+CiNlbHNlCiNpZmRlZiBsaW51eAojZGVmaW5lIEhBVkVfR0VUT1BUX0xPTkcgMQojZW5kaWYKI2RlZmluZSBIQVZFX0dFVE9QVCAxCiNlbmRpZgoKI2lmbmRlZiBIQVZFX0dFVE9QVAojZGVmaW5lIEhBVkVfR0VUT1BUIDAKI2VuZGlmCiNpZm5kZWYgSEFWRV9HRVRPUFRfTE9ORwojZGVmaW5lIEhBVkVfR0VUT1BUX0xPTkcgMAojZW5kaWYKCiNpZiBIQVZFX0dFVE9QVF9MT05HCiN1bmRlZiAgX0dOVV9TT1VSQ0UKI2RlZmluZSBfR05VX1NPVVJDRQojaW5jbHVkZSA8Z2V0b3B0Lmg+CmNvbnN0IHN0cnVjdCBvcHRpb24gbG9uZ29wdHNbXSA9IHsKICAgIHsidmVyc2lvbiIsIDAsIDAsICdWJ30sCiAgICB7InZlcmJvc2UiLCAwLCAwLCAndid9LAogICAgeyJoZWxwIiwgMCwgMCwgJz8nfSwKICAgIHtOVUxMLDAsMCwwfSwKfTsKI2Vsc2UKI2lmIEhBVkVfR0VUT1BUCmV4dGVybiBjaGFyICpvcHRhcmc7CmV4dGVybiBpbnQgb3B0aW5kLCBvcHRlcnIsIG9wdG9wdDsKI2VuZGlmCiNlbmRpZgoKc3RhdGljIHZvaWQgdXNhZ2UgKGNoYXIgKnByb2dyYW0pCnsKI2lmIEhBVkVfR0VUT1BUX0xPTkcKICAgIGZwcmludGYgKHN0ZGVyciwgInVzYWdlOiAlcyBbLXZWP10gWy0tdmVyYm9zZV0gWy0tdmVyc2lvbl0gWy0taGVscF0gW3BhdHRlcm5dIHtlbGVtZW50IC4uLn0gXG4iLAoJICAgICBwcm9ncmFtKTsKI2Vsc2UKICAgIGZwcmludGYgKHN0ZGVyciwgInVzYWdlOiAlcyBbLXZWP10gW3BhdHRlcm5dIHtlbGVtZW50IC4uLn0gXG4iLAoJICAgICBwcm9ncmFtKTsKI2VuZGlmCiAgICBmcHJpbnRmIChzdGRlcnIsICJMaXN0IGZvbnRzIG1hdGNoaW5nIFtwYXR0ZXJuXVxuIik7CiAgICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwojaWYgSEFWRV9HRVRPUFRfTE9ORwogICAgZnByaW50ZiAoc3RkZXJyLCAiICAtdiwgLS12ZXJib3NlICAgICAgICBkaXNwbGF5IHN0YXR1cyBpbmZvcm1hdGlvbiB3aGlsZSBidXN5XG4iKTsKICAgIGZwcmludGYgKHN0ZGVyciwgIiAgLVYsIC0tdmVyc2lvbiAgICAgICAgZGlzcGxheSBmb250IGNvbmZpZyB2ZXJzaW9uIGFuZCBleGl0XG4iKTsKICAgIGZwcmludGYgKHN0ZGVyciwgIiAgLT8sIC0taGVscCAgICAgICAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXRcbiIpOwojZWxzZQogICAgZnByaW50ZiAoc3RkZXJyLCAiICAtdiAgICAgICAgICh2ZXJib3NlKSBkaXNwbGF5IHN0YXR1cyBpbmZvcm1hdGlvbiB3aGlsZSBidXN5XG4iKTsKICAgIGZwcmludGYgKHN0ZGVyciwgIiAgLVYgICAgICAgICAodmVyc2lvbikgZGlzcGxheSBmb250IGNvbmZpZyB2ZXJzaW9uIGFuZCBleGl0XG4iKTsKICAgIGZwcmludGYgKHN0ZGVyciwgIiAgLT8gICAgICAgICAoaGVscCkgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXRcbiIpOwojZW5kaWYKICAgIGV4aXQgKDEpOwp9CgppbnQKbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQp7CiAgICBpbnQJCXZlcmJvc2UgPSAwOwogICAgaW50CQlpOwogICAgRmNPYmplY3RTZXQgKm9zID0gMDsKICAgIEZjRm9udFNldAkqZnM7CiAgICBGY1BhdHRlcm4gICAqcGF0OwojaWYgSEFWRV9HRVRPUFRfTE9ORyB8fCBIQVZFX0dFVE9QVAogICAgaW50CQljOwoKI2lmIEhBVkVfR0VUT1BUX0xPTkcKICAgIHdoaWxlICgoYyA9IGdldG9wdF9sb25nIChhcmdjLCBhcmd2LCAiVnY/IiwgbG9uZ29wdHMsIE5VTEwpKSAhPSAtMSkKI2Vsc2UKICAgIHdoaWxlICgoYyA9IGdldG9wdCAoYXJnYywgYXJndiwgIlZ2PyIpKSAhPSAtMSkKI2VuZGlmCiAgICB7Cglzd2l0Y2ggKGMpIHsKCWNhc2UgJ1YnOgoJICAgIGZwcmludGYgKHN0ZGVyciwgImZvbnRjb25maWcgdmVyc2lvbiAlZC4lZC4lZFxuIiwgCgkJICAgICBGQ19NQUpPUiwgRkNfTUlOT1IsIEZDX1JFVklTSU9OKTsKCSAgICBleGl0ICgwKTsKCWNhc2UgJ3YnOgoJICAgIHZlcmJvc2UgPSAxOwoJICAgIGJyZWFrOwoJZGVmYXVsdDoKCSAgICB1c2FnZSAoYXJndlswXSk7Cgl9CiAgICB9CiAgICBpID0gb3B0aW5kOwojZWxzZQogICAgaSA9IDE7CiNlbmRpZgoKICAgIGlmICghRmNJbml0ICgpKQogICAgewoJZnByaW50ZiAoc3RkZXJyLCAiQ2FuJ3QgaW5pdCBmb250IGNvbmZpZyBsaWJyYXJ5XG4iKTsKCXJldHVybiAxOwogICAgfQogICAgaWYgKGFyZ3ZbaV0pCiAgICB7CglwYXQgPSBGY05hbWVQYXJzZSAoKEZjQ2hhcjggKikgYXJndltpXSk7Cgl3aGlsZSAoYXJndlsrK2ldKQoJewoJICAgIGlmICghb3MpCgkJb3MgPSBGY09iamVjdFNldENyZWF0ZSAoKTsKCSAgICBGY09iamVjdFNldEFkZCAob3MsIGFyZ3ZbaV0pOwoJfQogICAgfQogICAgZWxzZQoJcGF0ID0gRmNQYXR0ZXJuQ3JlYXRlICgpOwogICAgCiAgICBpZiAoIW9zKQoJb3MgPSBGY09iamVjdFNldEJ1aWxkIChGQ19GQU1JTFksIEZDX1NUWUxFLCAoY2hhciAqKSAwKTsKICAgIGZzID0gRmNGb250TGlzdCAoMCwgcGF0LCBvcyk7CiAgICBGY09iamVjdFNldERlc3Ryb3kgKG9zKTsKICAgIGlmIChwYXQpCglGY1BhdHRlcm5EZXN0cm95IChwYXQpOwoKICAgIGlmIChmcykKICAgIHsKCWludAlqOwoKCWZvciAoaiA9IDA7IGogPCBmcy0+bmZvbnQ7IGorKykKCXsKCSAgICBGY0NoYXI4ICpmb250OwoJICAgIEZjQ2hhcjggKmZpbGU7CgoJICAgIGZvbnQgPSBGY05hbWVVbnBhcnNlIChmcy0+Zm9udHNbal0pOwoJICAgIGlmIChGY1BhdHRlcm5HZXRTdHJpbmcgKGZzLT5mb250c1tqXSwgRkNfRklMRSwgMCwgJmZpbGUpID09IEZjUmVzdWx0TWF0Y2gpCgkJcHJpbnRmICgiJXM6ICIsIGZpbGUpOwoJICAgIHByaW50ZiAoIiVzXG4iLCBmb250KTsKCSAgICBmcmVlIChmb250KTsKCX0KCUZjRm9udFNldERlc3Ryb3kgKGZzKTsKICAgIH0KCiAgICBGY0ZpbmkgKCk7CgogICAgcmV0dXJuIDA7Cn0K