LyoKICogJFhGcmVlODY6IHhjL2xpYi9mb250Y29uZmlnL2ZjLWxpc3QvZmMtbGlzdC5jLHYgMS41IDIwMDIvMDYvMzAgMjM6NDU6NDAga2VpdGhwIEV4cCAkCiAqCiAqIENvcHlyaWdodCCpIDIwMDIgS2VpdGggUGFja2FyZCwgbWVtYmVyIG9mIFRoZSBYRnJlZTg2IFByb2plY3QsIEluYy4KICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCiAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CiAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAogKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCiAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CiAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCiAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAogKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgogKgogKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAogKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCiAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCiAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKi8KCiNpbmNsdWRlIDxmb250Y29uZmlnL2ZvbnRjb25maWcuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaWZkZWYgSEFWRV9DT05GSUdfSAojaW5jbHVkZSA8Y29uZmlnLmg+CiNlbHNlCiNpZmRlZiBsaW51eAojZGVmaW5lIEhBVkVfR0VUT1BUX0xPTkcgMQojZW5kaWYKI2RlZmluZSBIQVZFX0dFVE9QVCAxCiNlbmRpZgoKI2lmbmRlZiBIQVZFX0dFVE9QVAojZGVmaW5lIEhBVkVfR0VUT1BUIDAKI2VuZGlmCiNpZm5kZWYgSEFWRV9HRVRPUFRfTE9ORwojZGVmaW5lIEhBVkVfR0VUT1BUX0xPTkcgMAojZW5kaWYKCiNpZiBIQVZFX0dFVE9QVF9MT05HCiN1bmRlZiAgX0dOVV9TT1VSQ0UKI2RlZmluZSBfR05VX1NPVVJDRQojaW5jbHVkZSA8Z2V0b3B0Lmg+CmNvbnN0IHN0cnVjdCBvcHRpb24gbG9uZ29wdHNbXSA9IHsKICAgIHsidmVyc2lvbiIsIDAsIDAsICdWJ30sCiAgICB7InZlcmJvc2UiLCAwLCAwLCAndid9LAogICAgeyJoZWxwIiwgMCwgMCwgJz8nfSwKICAgIHtOVUxMLDAsMCwwfSwKfTsKI2Vsc2UKI2lmIEhBVkVfR0VUT1BUCmV4dGVybiBjaGFyICpvcHRhcmc7CmV4dGVybiBpbnQgb3B0aW5kLCBvcHRlcnIsIG9wdG9wdDsKI2VuZGlmCiNlbmRpZgoKc3RhdGljIHZvaWQgdXNhZ2UgKGNoYXIgKnByb2dyYW0pCnsKICAgIGZwcmludGYgKHN0ZGVyciwgInVzYWdlOiAlcyBbLXZWP10gWy0tdmVyYm9zZV0gWy0tdmVyc2lvbl0gWy0taGVscF0gW3BhdHRlcm5dIHtlbGVtZW50IC4uLn0gXG4iLAoJICAgICBwcm9ncmFtKTsKICAgIGZwcmludGYgKHN0ZGVyciwgIkxpc3QgZm9udHMgbWF0Y2hpbmcgW3BhdHRlcm5dXG4iKTsKICAgIGZwcmludGYgKHN0ZGVyciwgIlxuIik7CiAgICBmcHJpbnRmIChzdGRlcnIsICIgIC12LCAtLXZlcmJvc2UgICAgICAgIGRpc3BsYXkgc3RhdHVzIGluZm9ybWF0aW9uIHdoaWxlIGJ1c3lcbiIpOwogICAgZnByaW50ZiAoc3RkZXJyLCAiICAtViwgLS12ZXJzaW9uICAgICAgICBkaXNwbGF5IGZvbnQgY29uZmlnIHZlcnNpb24gYW5kIGV4aXRcbiIpOwogICAgZnByaW50ZiAoc3RkZXJyLCAiICAtPywgLS1oZWxwICAgICAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdFxuIik7CiAgICBleGl0ICgxKTsKfQoKaW50Cm1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKewogICAgaW50CQl2ZXJib3NlID0gMDsKICAgIGludAkJaTsKICAgIEZjT2JqZWN0U2V0ICpvcyA9IDA7CiAgICBGY0ZvbnRTZXQJKmZzOwogICAgRmNQYXR0ZXJuICAgKnBhdDsKI2lmIEhBVkVfR0VUT1BUX0xPTkcgfHwgSEFWRV9HRVRPUFQKICAgIGludAkJYzsKCiNpZiBIQVZFX0dFVE9QVF9MT05HCiAgICB3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZyAoYXJnYywgYXJndiwgIlZ2PyIsIGxvbmdvcHRzLCBOVUxMKSkgIT0gLTEpCiNlbHNlCiAgICB3aGlsZSAoKGMgPSBnZXRvcHQgKGFyZ2MsIGFyZ3YsICJWdj8iKSkgIT0gLTEpCiNlbmRpZgogICAgewoJc3dpdGNoIChjKSB7CgljYXNlICdWJzoKCSAgICBmcHJpbnRmIChzdGRlcnIsICJmb250Y29uZmlnIHZlcnNpb24gJWQuJWQuJWRcbiIsIAoJCSAgICAgRkNfTUFKT1IsIEZDX01JTk9SLCBGQ19SRVZJU0lPTik7CgkgICAgZXhpdCAoMCk7CgljYXNlICd2JzoKCSAgICB2ZXJib3NlID0gMTsKCSAgICBicmVhazsKCWRlZmF1bHQ6CgkgICAgdXNhZ2UgKGFyZ3ZbMF0pOwoJfQogICAgfQogICAgaSA9IG9wdGluZDsKI2Vsc2UKICAgIGkgPSAxOwojZW5kaWYKCiAgICBpZiAoIUZjSW5pdCAoKSkKICAgIHsKCWZwcmludGYgKHN0ZGVyciwgIkNhbid0IGluaXQgZm9udCBjb25maWcgbGlicmFyeVxuIik7CglyZXR1cm4gMTsKICAgIH0KICAgIGlmIChhcmd2W2ldKQogICAgewoJcGF0ID0gRmNOYW1lUGFyc2UgKChGY0NoYXI4ICopIGFyZ3ZbaV0pOwoJd2hpbGUgKGFyZ3ZbKytpXSkKCXsKCSAgICBpZiAoIW9zKQoJCW9zID0gRmNPYmplY3RTZXRDcmVhdGUgKCk7CgkgICAgRmNPYmplY3RTZXRBZGQgKG9zLCBhcmd2W2ldKTsKCX0KICAgIH0KICAgIGVsc2UKCXBhdCA9IEZjUGF0dGVybkNyZWF0ZSAoKTsKICAgIAogICAgaWYgKCFvcykKCW9zID0gRmNPYmplY3RTZXRCdWlsZCAoRkNfRkFNSUxZLCBGQ19TVFlMRSwgMCk7CiAgICBmcyA9IEZjRm9udExpc3QgKDAsIHBhdCwgb3MpOwogICAgaWYgKHBhdCkKCUZjUGF0dGVybkRlc3Ryb3kgKHBhdCk7CgogICAgaWYgKGZzKQogICAgewoJaW50CWo7CgoJZm9yIChqID0gMDsgaiA8IGZzLT5uZm9udDsgaisrKQoJewoJICAgIEZjQ2hhcjggKmZvbnQ7CgkgICAgRmNDaGFyOCAqZmlsZTsKCgkgICAgZm9udCA9IEZjTmFtZVVucGFyc2UgKGZzLT5mb250c1tqXSk7CgkgICAgaWYgKEZjUGF0dGVybkdldFN0cmluZyAoZnMtPmZvbnRzW2pdLCBGQ19GSUxFLCAwLCAmZmlsZSkgPT0gRmNSZXN1bHRNYXRjaCkKCQlwcmludGYgKCIlczogIiwgZmlsZSk7CgkgICAgcHJpbnRmICgiJXNcbiIsIGZvbnQpOwoJICAgIGZyZWUgKGZvbnQpOwoJfQoJRmNGb250U2V0RGVzdHJveSAoZnMpOwogICAgfQogICAgcmV0dXJuIDA7Cn0K