LyoKICogbWtmcwkJQSBzaW1wbGUgZ2VuZXJpYyBmcm9udGVuZCBmb3IgdGhlIGZvciB0aGUgbWtmcyBwcm9ncmFtCiAqCQl1bmRlciBMaW51eC4gIFNlZSB0aGUgbWFudWFsIHBhZ2UgZm9yIGRldGFpbHMuCiAqCiAqIFVzYWdlOglta2ZzIFstVl0gWy10IGZzdHlwZV0gW2ZzLW9wdGlvbnNdIGRldmljZSBbc2l6ZV0KICoKICogQXV0aG9yczoJRGF2aWQgRW5nZWwsIDxkYXZpZEBvZHMuY29tPgogKgkJRnJlZCBOLiB2YW4gS2VtcGVuLCA8d2FsdGplQHVXYWx0Lk5MLk11Z25ldC5PUkc+CiAqCQlSb24gU29tbWVsaW5nLCA8c29tbWVsQHNjaS5rdW4ubmw+CiAqCiAqIE1vbiBKdWwgIDEgMTg6NTI6NTggMTk5NjogamFubEBtYXRoLnVpby5ubyAoTmljb2xhaSBMYW5nZmVsZHQpOgogKglJbmNvcnBvcmF0ZWQgZml4IGJ5IEpvbmF0aGFuIEthbWVucyA8amlrQGFubmV4LTEtc2xpcC1qaWsuY2FtLm92LmNvbT4KICogMTk5OS0wMi0yMiBBcmthZGl1c3ogTWm2a2lld2ljeiA8bWlzaWVrQHBsZC5PUkcuUEw+CiAqIC0gYWRkZWQgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKICoJCiAqLwoKCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Z2V0b3B0Lmg+CiNpbmNsdWRlIDxubHMuaD4KCiNpZm5kZWYgREVGQVVMVF9GU1RZUEUKIyBkZWZpbmUgREVGQVVMVF9GU1RZUEUJCSJleHQyIgojZW5kaWYKCiNkZWZpbmUgU0VBUkNIX1BBVEgJIlBBVEg9L3NiaW46L3NiaW4vZnM6L3NiaW4vZnMuZDovZXRjL2ZzOi9ldGMiCiNkZWZpbmUgUFJPR05BTUUJIm1rZnMuJXMiCgoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKewogIGNoYXIgKnByb2duYW1lOwkvKiBuYW1lIG9mIGV4ZWN1dGFibGUgdG8gYmUgY2FsbGVkICovCiAgY2hhciAqZnN0eXBlID0gTlVMTDsKICBpbnQgaSwgbW9yZSA9IDAsIHZlcmJvc2UgPSAwOwogIGNoYXIgKm9sZHBhdGgsICpuZXdwYXRoOwogIGNoYXIgKnByb2dyYW1fbmFtZSwgKnA7CgogIHByb2dyYW1fbmFtZSA9IGFyZ3ZbMF07CiAgaWYgKChwID0gc3RycmNocihwcm9ncmFtX25hbWUsICcvJykpICE9IE5VTEwpCgkgIHByb2dyYW1fbmFtZSA9IHArMTsKCiAgc2V0bG9jYWxlKExDX0FMTCwgIiIpOwogIGJpbmR0ZXh0ZG9tYWluKFBBQ0tBR0UsIExPQ0FMRURJUik7CiAgdGV4dGRvbWFpbihQQUNLQUdFKTsKCiAgaWYgKGFyZ2MgPT0gMiAmJgogICAgICAoIXN0cmNtcChhcmd2WzFdLCAiLVYiKSB8fCAhc3RyY21wKGFyZ3ZbMV0sICItLXZlcnNpb24iKSkpIHsKCSAgcHJpbnRmKF8oIiVzICglcylcbiIpLCBwcm9ncmFtX25hbWUsIFBBQ0tBR0VfU1RSSU5HKTsKCSAgZXhpdCgwKTsKICB9CgogIC8qIENoZWNrIGNvbW1hbmRsaW5lIG9wdGlvbnMuICovCiAgb3B0ZXJyID0gMDsKICB3aGlsZSAoKG1vcmUgPT0gMCkgJiYgKChpID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJWdDoiKSkgIT0gLTEpKQogICAgc3dpdGNoIChpKSB7CiAgICBjYXNlICdWJzoKICAgICAgdmVyYm9zZSsrOwogICAgICBicmVhazsKICAgIGNhc2UgJ3QnOgogICAgICBmc3R5cGUgPSBvcHRhcmc7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgb3B0aW5kLS07CiAgICAgIG1vcmUgPSAxOwogICAgICBicmVhazsJCS8qIHN0YXJ0IG9mIHNwZWNpZmljIGFyZ3VtZW50cyAqLwogICAgfQogIGlmIChvcHRpbmQgPT0gYXJnYykgewogICAgZnByaW50ZihzdGRlcnIsCiAgICAgIF8oIlVzYWdlOiBta2ZzIFstVl0gWy10IGZzdHlwZV0gW2ZzLW9wdGlvbnNdIGRldmljZSBbc2l6ZV1cbiIpKTsKICAgIHJldHVybiAtMTsKICB9CiAgCiAgLyogSWYgLXQgd2Fzbid0IHNwZWNpZmllZCwgdXNlIHRoZSBkZWZhdWx0ICovCiAgaWYgKGZzdHlwZSA9PSBOVUxMKQogICAgZnN0eXBlID0gREVGQVVMVF9GU1RZUEU7CgogIC8qIFNldCBQQVRIIGFuZCBwcm9ncmFtIG5hbWUgKi8KICBvbGRwYXRoID0gZ2V0ZW52KCJQQVRIIik7CiAgaWYgKCFvbGRwYXRoKQoJICBvbGRwYXRoID0gIi9iaW4iOwoKICBuZXdwYXRoID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbihvbGRwYXRoKSArIHNpemVvZihTRUFSQ0hfUEFUSCkgKyAzKTsKICBpZiAoIW5ld3BhdGgpIHsKICAgIGZwcmludGYoc3RkZXJyLCBfKCIlczogT3V0IG9mIG1lbW9yeSFcbiIpLCAibWtmcyIpOwogICAgZXhpdCgxKTsKICB9CiAgc3ByaW50ZihuZXdwYXRoLCAiJXM6JXNcbiIsIFNFQVJDSF9QQVRILCBvbGRwYXRoKTsKICBwdXRlbnYobmV3cGF0aCk7CgogIHByb2duYW1lID0gKGNoYXIgKikgbWFsbG9jKHNpemVvZihQUk9HTkFNRSkgKyBzdHJsZW4oZnN0eXBlKSArIDEpOwogIGlmICghcHJvZ25hbWUpIHsKICAgIGZwcmludGYoc3RkZXJyLCBfKCIlczogT3V0IG9mIG1lbW9yeSFcbiIpLCAibWtmcyIpOwogICAgZXhpdCgxKTsKICB9CiAgc3ByaW50Zihwcm9nbmFtZSwgUFJPR05BTUUsIGZzdHlwZSk7CiAgYXJndlstLW9wdGluZF0gPSBwcm9nbmFtZTsKCiAgaWYgKHZlcmJvc2UpIHsKICAgIHByaW50ZihfKCJta2ZzICglcylcbiIpLCBQQUNLQUdFX1NUUklORyk7CiAgICBpID0gb3B0aW5kOwogICAgd2hpbGUgKGFyZ3ZbaV0pCiAgICAgIHByaW50ZigiJXMgIiwgYXJndltpKytdKTsKICAgIHByaW50ZigiXG4iKTsKICAgIGlmICh2ZXJib3NlID4gMSkKICAgICAgcmV0dXJuIDA7CiAgfQoKICAvKiBFeGVjdXRlIHRoZSBwcm9ncmFtICovCiAgZXhlY3ZwKHByb2duYW1lLCBhcmd2K29wdGluZCk7CiAgcGVycm9yKHByb2duYW1lKTsKICByZXR1cm4gMTsKfQo=