LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIFN05HVibGkgRmF2ZXJnZXMgLSA8d3d3LnN0YXVibGkuY29tPgogKiBQaWVycmUgQVVCRVJUICBwLmF1YmVydEBzdGF1YmxpLmNvbQogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPGNvbmZpZy5oPgoKI2luY2x1ZGUgImRvcy5oIgojaW5jbHVkZSAiZmRvcy5oIgoKI2RlZmluZSBOQl9IRUFEUyAgICAgICAgMgojZGVmaW5lIE5CX1RSQUNLUyAgICAgICA4MAojZGVmaW5lIE5CX1NFQ1RPUlMgICAgICAxOAoKCnN0YXRpYyBpbnQgbGFzdHdoZXJlOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBkZXZfb3BlbiAtLQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwppbnQgZGV2X29wZW4gKHZvaWQpCnsKICAgIGxhc3R3aGVyZSA9IDA7CiAgICByZXR1cm4gKDApOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIGRldl9yZWFkIC0tIGxlbiBhbmQgd2hlcmUgYXJlIHNlY3RvcnMgbnVtYmVyCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCmludCBkZXZfcmVhZCAodm9pZCAqYnVmZmVyLCBpbnQgd2hlcmUsIGludCBsZW4pCnsKICAgIFBSSU5URiAoImRldl9yZWFkIChsZW4gPSAlZCwgd2hlcmUgPSAlZClcbiIsIGxlbiwgd2hlcmUpOwoKICAgIC8qIFNpIG9uIG5lIGRlc2lyZSBwYXMgbGlyZSBhIGxhIHBvc2l0aW9uIGNvdXJhbnRlLCBpbCBmYXV0IHVuIHNlZWsgICAgICAqLwogICAgaWYgKHdoZXJlICE9IGxhc3R3aGVyZSkgewoJaWYgKCFmZGNfZmRvc19zZWVrICh3aGVyZSkpIHsKCSAgICBQUklOVEYgKCJzZWVrIGVycm9yIGluIGRldl9yZWFkIik7CgkgICAgbGFzdHdoZXJlID0gLTE7CgkgICAgcmV0dXJuICgtMSk7Cgl9CiAgICB9CgogICAgaWYgKCFmZGNfZmRvc19yZWFkIChidWZmZXIsIGxlbikpIHsKCVBSSU5URiAoInJlYWQgZXJyb3JcbiIpOwoJbGFzdHdoZXJlID0gLTE7CglyZXR1cm4gKC0xKTsKICAgIH0KICAgIGxhc3R3aGVyZSA9IHdoZXJlICsgbGVuOwogICAgcmV0dXJuICgwKTsKfQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIGNoZWNrX2RldiAtLSB2ZXJpZnkgdGhlIGRpc2tldHRlIGZvcm1hdAogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwppbnQgY2hlY2tfZGV2IChCb290U2VjdG9yX3QgKmJvb3QsIEZzX3QgKmZzKQp7CiAgICB1bnNpZ25lZCBpbnQgaGVhZHMsIHNlY3RvcnMsIHRyYWNrczsKICAgIGludCBCb290UCwgSW5mcDAsIEluZnBYLCBJbmZUbTsKICAgIGludCBzZWN0X3Blcl90cmFjazsKCiAgICAvKiBEaXNwbGF5IEJvb3QgaGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIFBSSU5URiAoIkp1bXAgdG8gYm9vdCBjb2RlICAgICAgICAgICAgICAgICAgMHglMDJ4IDB4JTAyeCAweCUwMnhcbiIsCgkgICAgYm9vdCAtPiBqdW1wIFswXSwgYm9vdCAtPiBqdW1wIFsxXSwgYm9vdCAtPiBqdW1wWzJdKTsKICAgIFBSSU5URiAoIk9FTSBuYW1lICYgdmVyc2lvbiAgICAgICAgICAgICAgICAgJyUqLipzJ1xuIiwKCSAgICBCQU5ORVJfTEcsIEJBTk5FUl9MRywgYm9vdCAtPiBiYW5uZXIgKTsKICAgIFBSSU5URiAoIkJ5dGVzIHBlciBzZWN0b3IgaG9wZWZ1bGx5IDUxMiAgICAgJWRcbiIsCgkgICAgX19sZTE2X3RvX2NwdSAoYm9vdCAtPiBzZWNzaXopKTsKICAgIFBSSU5URiAoIkNsdXN0ZXIgc2l6ZSBpbiBzZWN0b3JzICAgICAgICAgICAgJWRcbiIsCgkgICAgYm9vdCAtPiBjbHNpeik7CiAgICBQUklOVEYgKCJOdW1iZXIgb2YgcmVzZXJ2ZWQgKGJvb3QpIHNlY3RvcnMgICVkXG4iLAoJICAgIF9fbGUxNl90b19jcHUgKGJvb3QgLT4gbnJzdnNlY3QpKTsKICAgIFBSSU5URiAoIk51bWJlciBvZiBGQVQgdGFibGVzIGhvcGVmdWxseSAyICAgJWRcbiIsCgkgICAgYm9vdCAtPiBuZmF0KTsKICAgIFBSSU5URiAoIk51bWJlciBvZiBkaXJlY3Rvcnkgc2xvdHMgICAgICAgICAgJWRcbiIsCgkgICAgX19sZTE2X3RvX2NwdSAoYm9vdCAtPiBkaXJlbnRzKSk7CiAgICBQUklOVEYgKCJUb3RhbCBzZWN0b3JzIG9uIGRpc2sgICAgICAgICAgICAgICVkXG4iLAoJICAgIF9fbGUxNl90b19jcHUgKGJvb3QgLT4gcHNlY3QpKTsKICAgIFBSSU5URiAoIk1lZGlhIGRlc2NyaXB0b3I9Zmlyc3QgYnl0ZSBvZiBGQVQgJWRcbiIsCgkgICAgYm9vdCAtPiBkZXNjcik7CiAgICBQUklOVEYgKCJTZWN0b3JzIGluIEZBVCAgICAgICAgICAgICAgICAgICAgICVkXG4iLAoJICAgIF9fbGUxNl90b19jcHUgKGJvb3QgLT4gZmF0bGVuKSk7CiAgICBQUklOVEYgKCJTZWN0b3JzL3RyYWNrICAgICAgICAgICAgICAgICAgICAgICVkXG4iLAoJICAgIF9fbGUxNl90b19jcHUgKGJvb3QgLT4gbnNlY3QpKTsKICAgIFBSSU5URiAoIkhlYWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJWRcbiIsCgkgICAgX19sZTE2X3RvX2NwdSAoYm9vdCAtPiBuaGVhZHMpKTsKICAgIFBSSU5URiAoIm51bWJlciBvZiBoaWRkZW4gc2VjdG9ycyAgICAgICAgICAgJWRcbiIsCgkgICAgX19sZTMyX3RvX2NwdSAoYm9vdCAtPiBuaHMpKTsKICAgIFBSSU5URiAoImJpZyB0b3RhbCBzZWN0b3JzICAgICAgICAgICAgICAgICAgJWRcbiIsCgkgICAgX19sZTMyX3RvX2NwdSAoYm9vdCAtPiBiaWdzZWN0KSk7CiAgICBQUklOVEYgKCJwaHlzaWNhbCBkcml2ZSA/ICAgICAgICAgICAgICAgICAgICVkXG4iLAoJICAgIGJvb3QgLT4gcGh5c2RyaXZlKTsKICAgIFBSSU5URiAoInJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgJWRcbiIsCgkgICAgYm9vdCAtPiByZXNlcnZlZCk7CiAgICBQUklOVEYgKCJkb3MgPiA0LjAgZGlza2V0dGUgICAgICAgICAgICAgICAgICVkXG4iLAoJICAgIGJvb3QgLT4gZG9zNCk7CiAgICBQUklOVEYgKCJzZXJpYWwgbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICVkXG4iLAoJICAgIF9fbGUzMl90b19jcHUgKGJvb3QgLT4gc2VyaWFsKSk7CiAgICBQUklOVEYgKCJkaXNrIGxhYmVsICAgICAgICAgICAgICAgICAgICAgICAgICUqLipzXG4iLAoJICAgIExBQkVMX0xHLCBMQUJFTF9MRywgYm9vdCAtPiBsYWJlbCk7CiAgICBQUklOVEYgKCJGQVQgdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICU4LjhzXG4iLAoJICAgIGJvb3QgLT4gZmF0X3R5cGUpOwogICAgUFJJTlRGICgicmVzZXJ2ZWQgYnkgMk0gICAgICAgICAgICAgICAgICAgICAlZFxuIiwKCSAgICBib290IC0+IHJlc18ybSk7CiAgICBQUklOVEYgKCIyTSBjaGVja3N1bSAobm90IHVzZWQpICAgICAgICAgICAgICVkXG4iLAoJICAgIGJvb3QgLT4gQ2hlY2tTdW0pOwogICAgUFJJTlRGICgiMk1GIGZvcm1hdCB2ZXJzaW9uICAgICAgICAgICAgICAgICAlZFxuIiwKCSAgICBib290IC0+IGZtdF8ybWYpOwogICAgUFJJTlRGICgiMSBpZiB3cml0ZSB0cmFjayBhZnRlciBmb3JtYXQgICAgICAlZFxuIiwKCSAgICBib290IC0+IHd0KTsKICAgIFBSSU5URiAoImRhdGEgdHJhbnNmZXIgcmF0ZSBvbiB0cmFjayAwICAgICAgJWRcbiIsCgkgICAgYm9vdCAtPiByYXRlXzApOwogICAgUFJJTlRGICgiZGF0YSB0cmFuc2ZlciByYXRlIG9uIHRyYWNrPD4wICAgICAlZFxuIiwKCSAgICBib290IC0+IHJhdGVfYW55KTsKICAgIFBSSU5URiAoIm9mZnNldCB0byBib290IHByb2dyYW0gICAgICAgICAgICAgJWRcbiIsCgkgICAgX19sZTE2X3RvX2NwdSAoYm9vdCAtPiBCb290UCkpOwogICAgUFJJTlRGICgiVDE6IGluZm9ybWF0aW9uIGZvciB0cmFjayAwICAgICAgICAlZFxuIiwKCSAgICBfX2xlMTZfdG9fY3B1IChib290IC0+IEluZnAwKSk7CiAgICBQUklOVEYgKCJUMjogaW5mb3JtYXRpb24gZm9yIHRyYWNrPD4wICAgICAgICVkXG4iLAoJICAgIF9fbGUxNl90b19jcHUgKGJvb3QgLT4gSW5mcFgpKTsKICAgIFBSSU5URiAoIlQzOiB0cmFjayBzZWN0b3JzIHNpemUgdGFibGUgICAgICAgJWRcbiIsCgkgICAgX19sZTE2X3RvX2NwdSAoYm9vdCAtPiBJbmZUbSkpOwogICAgUFJJTlRGICgiRm9ybWF0IGRhdGUgICAgICAgICAgICAgICAgICAgICAgICAweCUwNHhcbiIsCgkgICAgX19sZTE2X3RvX2NwdSAoYm9vdCAtPiBEYXRlRikpOwogICAgUFJJTlRGICgiRm9ybWF0IHRpbWUgICAgICAgICAgICAgICAgICAgICAgICAweCUwNHhcbiIsCgkgICAgX19sZTE2X3RvX2NwdSAoYm9vdCAtPiBUaW1lRikpOwoKCiAgICAvKiBpbmZvcm1hdGlvbiBpcyBleHRyYWN0ZWQgZnJvbSBib290IHNlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICBoZWFkcyA9IF9fbGUxNl90b19jcHUgKGJvb3QgLT4gbmhlYWRzKTsKICAgIHNlY3RvcnMgPSBfX2xlMTZfdG9fY3B1IChib290IC0+IG5zZWN0KTsKICAgIGZzIC0+IHRvdF9zZWN0b3JzID0gX19sZTMyX3RvX2NwdSAoYm9vdCAtPiBiaWdzZWN0KTsKICAgIGlmIChfX2xlMTZfdG9fY3B1IChib290IC0+IHBzZWN0KSAhPSAwKSB7CglmcyAtPiB0b3Rfc2VjdG9ycyA9IF9fbGUxNl90b19jcHUgKGJvb3QgLT4gcHNlY3QpOwogICAgfQoKICAgIHNlY3RfcGVyX3RyYWNrID0gaGVhZHMgKiBzZWN0b3JzOwogICAgdHJhY2tzID0gKGZzIC0+IHRvdF9zZWN0b3JzICsgc2VjdF9wZXJfdHJhY2sgLSAxKSAvIHNlY3RfcGVyX3RyYWNrOwoKICAgIEJvb3RQID0gX19sZTE2X3RvX2NwdSAoYm9vdCAtPiBCb290UCk7CiAgICBJbmZwMCA9IF9fbGUxNl90b19jcHUgKGJvb3QgLT4gSW5mcDApOwogICAgSW5mcFggPSBfX2xlMTZfdG9fY3B1IChib290IC0+IEluZnBYKTsKICAgIEluZlRtID0gX19sZTE2X3RvX2NwdSAoYm9vdCAtPiBJbmZUbSk7CgogICAgaWYgKGJvb3QgLT4gZG9zNCA9PSBFWFRFTkRFRF9CT09UICYmCglzdHJuY21wKCBib290LT5iYW5uZXIsIjJNIiwgMiApID09IDAgJiYKCUJvb3RQIDwgU1pfU1REX1NFQ1RPUiAmJgoJSW5mcDAgPCBTWl9TVERfU0VDVE9SICYmCglJbmZwWCA8IFNaX1NURF9TRUNUT1IgJiYKCUluZlRtIDwgU1pfU1REX1NFQ1RPUiAmJgoJQm9vdFAgPj0gSW5mVG0gKyAyICYmCglJbmZUbSA+PSBJbmZwWCAmJgoJSW5mcFggPj0gSW5mcDAgJiYKCUluZnAwID49IDc2ICkgewoKCXJldHVybiAoLTEpOwogICAgfQoKICAgIGlmIChoZWFkcyAhPSBOQl9IRUFEUyB8fAoJdHJhY2tzICE9IE5CX1RSQUNLUyB8fAoJc2VjdG9ycyAhPSBOQl9TRUNUT1JTIHx8CglfX2xlMTZfdG9fY3B1IChib290IC0+IHNlY3NpeikgIT0gU1pfU1REX1NFQ1RPUiB8fAoJZnMgLT4gdG90X3NlY3RvcnMgPT0gMCB8fAoJKGZzIC0+IHRvdF9zZWN0b3JzICUgc2VjdG9ycykgIT0gMCkgewoJcmV0dXJuICgtMSk7CiAgICB9CgogICAgcmV0dXJuICgwKTsKfQo=