Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBQb2lzc29uIHNvbHZlciBiYXNlZCBvbiBhIGZ1bGwgbXVsdGlncmlkIGFsZ29yaXRobQovLwovLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5Ci8vIC0gSGVydukgRHJvbG9uIChkcm9sb25AaW5mb25pZS5mcikKLy8gUmVmZXJlbmNlOgovLyBQUkVTUywgVy4gSC4sIFRFVUtPTFNLWSwgUy4gQS4sIFZFVFRFUkxJTkcsIFcuIFQuLCBBTkQgRkxBTk5FUlksIEIuIFAuCi8vIDE5OTIuIE51bWVyaWNhbCBSZWNpcGVzIGluIEM6IFRoZSBBcnQgb2YgU2NpZW50aWZpYyBDb21wdXRpbmcsIDJuZCBlZC4gQ2FtYnJpZGdlIFVuaXZlcnNpdHkgUHJlc3MuCi8vCi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCi8vCi8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQovLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUwovLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAovLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQovLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCi8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKLy8gVEhJUyBESVNDTEFJTUVSLgovLwovLyBVc2UgYXQgeW91ciBvd24gcmlzayEKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKI2luY2x1ZGUgIkZyZWVJbWFnZS5oIgojaW5jbHVkZSAiVXRpbGl0aWVzLmgiCiNpbmNsdWRlICJUb25lTWFwcGluZy5oIgoKc3RhdGljIGNvbnN0IGludCBOUFJFCT0gMTsJCS8vIE51bWJlciBvZiByZWxheGF0aW9uIHN3ZWVwcyBiZWZvcmUgLi4uCnN0YXRpYyBjb25zdCBpbnQgTlBPU1QJPSAxOwkJLy8gLi4uIGFuZCBhZnRlciB0aGUgY29hcnNlLWdyaWQgY29ycmVjdGlvbiBpcyBjb21wdXRlZApzdGF0aWMgY29uc3QgaW50IE5HTUFYCT0gMTU7CQkvLyBNYXhpbXVtIG51bWJlciBvZiBncmlkcwoKLyoqCkNvcHkgc3JjIGludG8gZHN0CiovCnN0YXRpYyBpbmxpbmUgdm9pZCBmbWdfY29weUFycmF5KEZJQklUTUFQICpkc3QsIEZJQklUTUFQICpzcmMpIHsKCW1lbWNweShGcmVlSW1hZ2VfR2V0Qml0cyhkc3QpLCBGcmVlSW1hZ2VfR2V0Qml0cyhzcmMpLCBGcmVlSW1hZ2VfR2V0SGVpZ2h0KGRzdCkgKiBGcmVlSW1hZ2VfR2V0UGl0Y2goZHN0KSk7Cn0KCi8qKgpGaWxscyBzcmMgd2l0aCB6ZXJvcwoqLwpzdGF0aWMgaW5saW5lIHZvaWQgZm1nX2ZpbGxBcnJheVdpdGhaZXJvcyhGSUJJVE1BUCAqc3JjKSB7CgltZW1zZXQoRnJlZUltYWdlX0dldEJpdHMoc3JjKSwgMCwgRnJlZUltYWdlX0dldEhlaWdodChzcmMpICogRnJlZUltYWdlX0dldFBpdGNoKHNyYykpOwp9CgovKioKSGFsZi13ZWlnaHRpbmcgcmVzdHJpY3Rpb24uIG5jIGlzIHRoZSBjb2Fyc2UtZ3JpZCBkaW1lbnNpb24uIFRoZSBmaW5lLWdyaWQgc29sdXRpb24gaXMgaW5wdXQgaW4KdWZbMC4uMipuYy0yXVswLi4yKm5jLTJdLCB0aGUgY29hcnNlLWdyaWQgc29sdXRpb24gaXMgcmV0dXJuZWQgaW4gdWNbMC4ubmMtMV1bMC4ubmMtMV0uCiovCnN0YXRpYyB2b2lkIGZtZ19yZXN0cmljdChGSUJJVE1BUCAqVUMsIEZJQklUTUFQICpVRiwgaW50IG5jKSB7CglpbnQgcm93X3VjLCByb3dfdWYsIGNvbF91YywgY29sX3VmOwoKCWNvbnN0IGludCB1Y19waXRjaCAgPSBGcmVlSW1hZ2VfR2V0UGl0Y2goVUMpIC8gc2l6ZW9mKGZsb2F0KTsKCWNvbnN0IGludCB1Zl9waXRjaCAgPSBGcmVlSW1hZ2VfR2V0UGl0Y2goVUYpIC8gc2l6ZW9mKGZsb2F0KTsKCQoJZmxvYXQgKnVjX2JpdHMgPSAoZmxvYXQqKUZyZWVJbWFnZV9HZXRCaXRzKFVDKTsKCWNvbnN0IGZsb2F0ICp1Zl9iaXRzID0gKGZsb2F0KilGcmVlSW1hZ2VfR2V0Qml0cyhVRik7CgoJLy8gaW50ZXJpb3IgcG9pbnRzCgl7CgkJZmxvYXQgKnVjX3NjYW4gPSB1Y19iaXRzICsgdWNfcGl0Y2g7CgkJZm9yIChyb3dfdWMgPSAxLCByb3dfdWYgPSAyOyByb3dfdWMgPCBuYy0xOyByb3dfdWMrKywgcm93X3VmICs9IDIpIHsKCQkJY29uc3QgZmxvYXQgKnVmX3NjYW4gPSB1Zl9iaXRzICsgcm93X3VmICogdWZfcGl0Y2g7CgkJCWZvciAoY29sX3VjID0gMSwgY29sX3VmID0gMjsgY29sX3VjIDwgbmMtMTsgY29sX3VjKyssIGNvbF91ZiArPSAyKSB7IAoJCQkJLy8gY2FsY3VsYXRlIAoJCQkJLy8gVUMocm93X3VjLCBjb2xfdWMpID0gCgkJCQkvLyAwLjUgKiBVRihyb3dfdWYsIGNvbF91ZikgKyAwLjEyNSAqIFsgVUYocm93X3VmKzEsIGNvbF91ZikgKyBVRihyb3dfdWYtMSwgY29sX3VmKSArIFVGKHJvd191ZiwgY29sX3VmKzEpICsgVUYocm93X3VmLCBjb2xfdWYtMSkgXQoJCQkJZmxvYXQgKnVjX3BpeGVsID0gdWNfc2NhbiArIGNvbF91YzsKCQkJCWNvbnN0IGZsb2F0ICp1Zl9jZW50ZXIgPSB1Zl9zY2FuICsgY29sX3VmOwoJCQkJKnVjX3BpeGVsID0gMC41RiAqICp1Zl9jZW50ZXIgKyAwLjEyNUYgKiAoICoodWZfY2VudGVyICsgdWZfcGl0Y2gpICsgKih1Zl9jZW50ZXIgLSB1Zl9waXRjaCkgKyAqKHVmX2NlbnRlciArIDEpICsgKih1Zl9jZW50ZXIgLSAxKSApOwoJCQl9CgkJCXVjX3NjYW4gKz0gdWNfcGl0Y2g7CgkJfQoJfQoJLy8gYm91bmRhcnkgcG9pbnRzCgljb25zdCBpbnQgbmNjID0gMipuYy0xOwoJewoJCS8qCgkJY2FsY3VsYXRlIHRoZSBmb2xsb3dpbmc6IAoJCWZvciAocm93X3VjID0gMCwgcm93X3VmID0gMDsgcm93X3VjIDwgbmM7IHJvd191YysrLCByb3dfdWYgKz0gMikgeyAKCQkJVUMocm93X3VjLCAwKSA9IFVGKHJvd191ZiwgMCk7CQkKCQkJVUMocm93X3VjLCBuYy0xKSA9IFVGKHJvd191ZiwgbmNjLTEpOwoJCX0KCQkqLwoJCWZsb2F0ICp1Y19zY2FuID0gdWNfYml0czsKCQlmb3IgKHJvd191YyA9IDAsIHJvd191ZiA9IDA7IHJvd191YyA8IG5jOyByb3dfdWMrKywgcm93X3VmICs9IDIpIHsgCgkJCWNvbnN0IGZsb2F0ICp1Zl9zY2FuID0gdWZfYml0cyArIHJvd191ZiAqIHVmX3BpdGNoOwoJCQl1Y19zY2FuWzBdID0gdWZfc2NhblswXTsKCQkJdWNfc2NhbltuYy0xXSA9IHVmX3NjYW5bbmNjLTFdOwoJCQl1Y19zY2FuICs9IHVjX3BpdGNoOwoJCX0KCX0KCXsKCQkvKgoJCWNhbGN1bGF0ZSB0aGUgZm9sbG93aW5nOiAKCQlmb3IgKGNvbF91YyA9IDAsIGNvbF91ZiA9IDA7IGNvbF91YyA8IG5jOyBjb2xfdWMrKywgY29sX3VmICs9IDIpIHsKCQkJVUMoMCwgY29sX3VjKSA9IFVGKDAsIGNvbF91Zik7CgkJCVVDKG5jLTEsIGNvbF91YykgPSBVRihuY2MtMSwgY29sX3VmKTsKCQl9CgkJKi8KCQlmbG9hdCAqdWNfc2Nhbl90b3AgPSB1Y19iaXRzOwoJCWZsb2F0ICp1Y19zY2FuX2JvdHRvbSA9IHVjX2JpdHMgKyAobmMtMSkqdWNfcGl0Y2g7CgkJY29uc3QgZmxvYXQgKnVmX3NjYW5fdG9wID0gdWZfYml0cyArIChuY2MtMSkqdWZfcGl0Y2g7CgkJY29uc3QgZmxvYXQgKnVmX3NjYW5fYm90dG9tID0gdWZfYml0czsKCQlmb3IgKGNvbF91YyA9IDAsIGNvbF91ZiA9IDA7IGNvbF91YyA8IG5jOyBjb2xfdWMrKywgY29sX3VmICs9IDIpIHsKCQkJdWNfc2Nhbl90b3BbY29sX3VjXSA9IHVmX3NjYW5fdG9wW2NvbF91Zl07CgkJCXVjX3NjYW5fYm90dG9tW2NvbF91Y10gPSB1Zl9zY2FuX2JvdHRvbVtjb2xfdWZdOwoJCX0KCX0KfQoKLyoqClNvbHV0aW9uIG9mIHRoZSBtb2RlbCBwcm9ibGVtIG9uIHRoZSBjb2Fyc2VzdCBncmlkLCB3aGVyZSBoID0gMS8yIC4gClRoZSByaWdodC1oYW5kIHNpZGUgaXMgaW5wdXQKaW4gcmhzWzAuLjJdWzAuLjJdIGFuZCB0aGUgc29sdXRpb24gaXMgcmV0dXJuZWQgaW4gdVswLi4yXVswLi4yXS4KKi8Kc3RhdGljIHZvaWQgZm1nX3NvbHZlKEZJQklUTUFQICpVLCBGSUJJVE1BUCAqUkhTKSB7CgkvLyBmaWxsIFUgd2l0aCB6ZXJvcwoJZm1nX2ZpbGxBcnJheVdpdGhaZXJvcyhVKTsKCS8vIGNhbGN1bGF0ZSBVKDEsIDEpID0gLWgqaCpSSFMoMSwgMSkvNC4wIHdoZXJlIGggPSAxLzIKCWZsb2F0ICp1X3NjYW4gPSAoZmxvYXQqKUZyZWVJbWFnZV9HZXRTY2FuTGluZShVLCAxKTsKCWNvbnN0IGZsb2F0ICpyaHNfc2NhbiA9IChmbG9hdCopRnJlZUltYWdlX0dldFNjYW5MaW5lKFJIUywgMSk7Cgl1X3NjYW5bMV0gPSAtcmhzX3NjYW5bMV0gLyAxNjsKfQoKLyoqCkNvYXJzZS10by1maW5lIHByb2xvbmdhdGlvbiBieSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uLiBuZiBpcyB0aGUgZmluZS1ncmlkIGRpbWVuc2lvbi4gVGhlIGNvYXJzZWdyaWQKc29sdXRpb24gaXMgaW5wdXQgYXMgdWNbMC4ubmMtMV1bMC4ubmMtMV0sIHdoZXJlIG5jID0gbmYvMiArIDEuIFRoZSBmaW5lLWdyaWQgc29sdXRpb24gaXMKcmV0dXJuZWQgaW4gdWZbMC4ubmYtMV1bMC4ubmYtMV0uCiovCnN0YXRpYyB2b2lkIGZtZ19wcm9sb25nYXRlKEZJQklUTUFQICpVRiwgRklCSVRNQVAgKlVDLCBpbnQgbmYpIHsKCWludCByb3dfdWMsIHJvd191ZiwgY29sX3VjLCBjb2xfdWY7CgoJY29uc3QgaW50IHVmX3BpdGNoICA9IEZyZWVJbWFnZV9HZXRQaXRjaChVRikgLyBzaXplb2YoZmxvYXQpOwoJY29uc3QgaW50IHVjX3BpdGNoICA9IEZyZWVJbWFnZV9HZXRQaXRjaChVQykgLyBzaXplb2YoZmxvYXQpOwoJCglmbG9hdCAqdWZfYml0cyA9IChmbG9hdCopRnJlZUltYWdlX0dldEJpdHMoVUYpOwoJY29uc3QgZmxvYXQgKnVjX2JpdHMgPSAoZmxvYXQqKUZyZWVJbWFnZV9HZXRCaXRzKFVDKTsKCQoJLy8gZG8gZWxlbWVudHMgdGhhdCBhcmUgY29waWVzCgl7CgkJY29uc3QgaW50IG5jID0gbmYvMiArIDE7CgoJCWZsb2F0ICp1Zl9zY2FuID0gdWZfYml0czsKCQljb25zdCBmbG9hdCAqdWNfc2NhbiA9IHVjX2JpdHM7CQkKCQlmb3IgKHJvd191YyA9IDA7IHJvd191YyA8IG5jOyByb3dfdWMrKykgewoJCQlmb3IgKGNvbF91YyA9IDAsIGNvbF91ZiA9IDA7IGNvbF91YyA8IG5jOyBjb2xfdWMrKywgY29sX3VmICs9IDIpIHsKCQkJCS8vIGNhbGN1bGF0ZSBVRigyKnJvd191YywgY29sX3VmKSA9IFVDKHJvd191YywgY29sX3VjKTsKCQkJCXVmX3NjYW5bY29sX3VmXSA9IHVjX3NjYW5bY29sX3VjXTsKCQkJfQoJCQl1Y19zY2FuICs9IHVjX3BpdGNoOwoJCQl1Zl9zY2FuICs9IDIgKiB1Zl9waXRjaDsKCQl9Cgl9CgkvLyBkbyBvZGQtbnVtYmVyZWQgY29sdW1ucywgaW50ZXJwb2xhdGluZyB2ZXJ0aWNhbGx5Cgl7CQkKCQlmb3Iocm93X3VmID0gMTsgcm93X3VmIDwgbmYtMTsgcm93X3VmICs9IDIpIHsKCQkJZmxvYXQgKnVmX3NjYW4gPSB1Zl9iaXRzICsgcm93X3VmICogdWZfcGl0Y2g7CgkJCWZvciAoY29sX3VmID0gMDsgY29sX3VmIDwgbmY7IGNvbF91ZiArPSAyKSB7CgkJCQkvLyBjYWxjdWxhdGUgVUYocm93X3VmLCBjb2xfdWYpID0gMC41ICogKCBVRihyb3dfdWYrMSwgY29sX3VmKSArIFVGKHJvd191Zi0xLCBjb2xfdWYpICkKCQkJCXVmX3NjYW5bY29sX3VmXSA9IDAuNUYgKiAoICoodWZfc2NhbiArIHVmX3BpdGNoICsgY29sX3VmKSArICoodWZfc2NhbiAtIHVmX3BpdGNoICsgY29sX3VmKSApOwoJCQl9CgkJfQoJfQoJLy8gZG8gZXZlbi1udW1iZXJlZCBjb2x1bW5zLCBpbnRlcnBvbGF0aW5nIGhvcml6b250YWxseQoJewoJCWZsb2F0ICp1Zl9zY2FuID0gdWZfYml0czsKCQlmb3Iocm93X3VmID0gMDsgcm93X3VmIDwgbmY7IHJvd191ZisrKSB7CgkJCWZvciAoY29sX3VmID0gMTsgY29sX3VmIDwgbmYtMTsgY29sX3VmICs9IDIpIHsKCQkJCS8vIGNhbGN1bGF0ZSBVRihyb3dfdWYsIGNvbF91ZikgPSAwLjUgKiAoIFVGKHJvd191ZiwgY29sX3VmKzEpICsgVUYocm93X3VmLCBjb2xfdWYtMSkgKQoJCQkJdWZfc2Nhbltjb2xfdWZdID0gMC41RiAqICggdWZfc2Nhbltjb2xfdWYgKyAxXSArIHVmX3NjYW5bY29sX3VmIC0gMV0gKTsKCQkJfQoJCQl1Zl9zY2FuICs9IHVmX3BpdGNoOwoJCX0KCX0KfQoKLyoqClJlZC1ibGFjayBHYXVzcy1TZWlkZWwgcmVsYXhhdGlvbiBmb3IgbW9kZWwgcHJvYmxlbS4gVXBkYXRlcyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc29sdXRpb24KdVswLi5uLTFdWzAuLm4tMV0sIHVzaW5nIHRoZSByaWdodC1oYW5kIHNpZGUgZnVuY3Rpb24gcmhzWzAuLm4tMV1bMC4ubi0xXS4KKi8Kc3RhdGljIHZvaWQgZm1nX3JlbGF4YXRpb24oRklCSVRNQVAgKlUsIEZJQklUTUFQICpSSFMsIGludCBuKSB7CglpbnQgcm93LCBjb2wsIGlwYXNzLCBpc3csIGpzdzsKCWNvbnN0IGZsb2F0IGggPSAxLjBGIC8gKG4gLSAxKTsKCWNvbnN0IGZsb2F0IGgyID0gaCpoOwoKCWNvbnN0IGludCB1X3BpdGNoICA9IEZyZWVJbWFnZV9HZXRQaXRjaChVKSAvIHNpemVvZihmbG9hdCk7Cgljb25zdCBpbnQgcmhzX3BpdGNoICA9IEZyZWVJbWFnZV9HZXRQaXRjaChSSFMpIC8gc2l6ZW9mKGZsb2F0KTsKCQoJZmxvYXQgKnVfYml0cyA9IChmbG9hdCopRnJlZUltYWdlX0dldEJpdHMoVSk7Cgljb25zdCBmbG9hdCAqcmhzX2JpdHMgPSAoZmxvYXQqKUZyZWVJbWFnZV9HZXRCaXRzKFJIUyk7CgoJZm9yIChpcGFzcyA9IDAsIGpzdyA9IDE7IGlwYXNzIDwgMjsgaXBhc3MrKywganN3ID0gMy1qc3cpIHsgLy8gUmVkIGFuZCBibGFjayBzd2VlcHMKCQlmbG9hdCAqdV9zY2FuID0gdV9iaXRzICsgdV9waXRjaDsKCQljb25zdCBmbG9hdCAqcmhzX3NjYW4gPSByaHNfYml0cyArIHJoc19waXRjaDsKCQlmb3IgKHJvdyA9IDEsIGlzdyA9IGpzdzsgcm93IDwgbi0xOyByb3crKywgaXN3ID0gMy1pc3cpIHsKCQkJZm9yIChjb2wgPSBpc3c7IGNvbCA8IG4tMTsgY29sICs9IDIpIHsgCgkJCQkvLyBHYXVzcy1TZWlkZWwgZm9ybXVsYQoJCQkJLy8gY2FsY3VsYXRlIFUocm93LCBjb2wpID0gCgkJCQkvLyAwLjI1ICogWyBVKHJvdysxLCBjb2wpICsgVShyb3ctMSwgY29sKSArIFUocm93LCBjb2wrMSkgKyBVKHJvdywgY29sLTEpIC0gaDIgKiBSSFMocm93LCBjb2wpIF0JCSAKCQkJCWZsb2F0ICp1X2NlbnRlciA9IHVfc2NhbiArIGNvbDsKCQkJCWNvbnN0IGZsb2F0ICpyaHNfY2VudGVyID0gcmhzX3NjYW4gKyBjb2w7CgkJCQkqdV9jZW50ZXIgPSAqKHVfY2VudGVyICsgdV9waXRjaCkgKyAqKHVfY2VudGVyIC0gdV9waXRjaCkgKyAqKHVfY2VudGVyICsgMSkgKyAqKHVfY2VudGVyIC0gMSk7CgkJCQkqdV9jZW50ZXIgLT0gaDIgKiAqcmhzX2NlbnRlcjsKCQkJCSp1X2NlbnRlciAqPSAwLjI1RjsKCQkJfQoJCQl1X3NjYW4gKz0gdV9waXRjaDsKCQkJcmhzX3NjYW4gKz0gcmhzX3BpdGNoOwoJCX0KCX0KfQoKLyoqClJldHVybnMgbWludXMgdGhlIHJlc2lkdWFsIGZvciB0aGUgbW9kZWwgcHJvYmxlbS4gSW5wdXQgcXVhbnRpdGllcyBhcmUgdVswLi5uLTFdWzAuLm4tMV0gYW5kCnJoc1swLi5uLTFdWzAuLm4tMV0sIHdoaWxlIHJlc1swLi5uLTFdWzAuLm4tMV0gaXMgcmV0dXJuZWQuCiovCnN0YXRpYyB2b2lkIGZtZ19yZXNpZHVhbChGSUJJVE1BUCAqUkVTLCBGSUJJVE1BUCAqVSwgRklCSVRNQVAgKlJIUywgaW50IG4pIHsKCWludCByb3csIGNvbDsKCgljb25zdCBmbG9hdCBoID0gMS4wRiAvIChuLTEpOwkKCWNvbnN0IGZsb2F0IGgyaSA9IDEuMEYgLyAoaCpoKTsKCgljb25zdCBpbnQgcmVzX3BpdGNoICA9IEZyZWVJbWFnZV9HZXRQaXRjaChSRVMpIC8gc2l6ZW9mKGZsb2F0KTsKCWNvbnN0IGludCB1X3BpdGNoICA9IEZyZWVJbWFnZV9HZXRQaXRjaChVKSAvIHNpemVvZihmbG9hdCk7Cgljb25zdCBpbnQgcmhzX3BpdGNoICA9IEZyZWVJbWFnZV9HZXRQaXRjaChSSFMpIC8gc2l6ZW9mKGZsb2F0KTsKCQoJZmxvYXQgKnJlc19iaXRzID0gKGZsb2F0KilGcmVlSW1hZ2VfR2V0Qml0cyhSRVMpOwoJY29uc3QgZmxvYXQgKnVfYml0cyA9IChmbG9hdCopRnJlZUltYWdlX0dldEJpdHMoVSk7Cgljb25zdCBmbG9hdCAqcmhzX2JpdHMgPSAoZmxvYXQqKUZyZWVJbWFnZV9HZXRCaXRzKFJIUyk7CgoJLy8gaW50ZXJpb3IgcG9pbnRzCgl7CgkJZmxvYXQgKnJlc19zY2FuID0gcmVzX2JpdHMgKyByZXNfcGl0Y2g7CgkJY29uc3QgZmxvYXQgKnVfc2NhbiA9IHVfYml0cyArIHVfcGl0Y2g7CgkJY29uc3QgZmxvYXQgKnJoc19zY2FuID0gcmhzX2JpdHMgKyByaHNfcGl0Y2g7CgkJZm9yIChyb3cgPSAxOyByb3cgPCBuLTE7IHJvdysrKSB7CgkJCWZvciAoY29sID0gMTsgY29sIDwgbi0xOyBjb2wrKykgewoJCQkJLy8gY2FsY3VsYXRlIFJFUyhyb3csIGNvbCkgPSAKCQkJCS8vIC1oMmkgKiBbIFUocm93KzEsIGNvbCkgKyBVKHJvdy0xLCBjb2wpICsgVShyb3csIGNvbCsxKSArIFUocm93LCBjb2wtMSkgLSA0ICogVShyb3csIGNvbCkgXSArIFJIUyhyb3csIGNvbCk7CgkJCQlmbG9hdCAqcmVzX2NlbnRlciA9IHJlc19zY2FuICsgY29sOwoJCQkJY29uc3QgZmxvYXQgKnVfY2VudGVyID0gdV9zY2FuICsgY29sOwoJCQkJY29uc3QgZmxvYXQgKnJoc19jZW50ZXIgPSByaHNfc2NhbiArIGNvbDsKCQkJCSpyZXNfY2VudGVyID0gKih1X2NlbnRlciArIHVfcGl0Y2gpICsgKih1X2NlbnRlciAtIHVfcGl0Y2gpICsgKih1X2NlbnRlciArIDEpICsgKih1X2NlbnRlciAtIDEpIC0gNCAqICp1X2NlbnRlcjsKCQkJCSpyZXNfY2VudGVyICo9IC1oMmk7CgkJCQkqcmVzX2NlbnRlciArPSAqcmhzX2NlbnRlcjsKCQkJfQoJCQlyZXNfc2NhbiArPSByZXNfcGl0Y2g7CgkJCXVfc2NhbiArPSB1X3BpdGNoOwoJCQlyaHNfc2NhbiArPSByaHNfcGl0Y2g7CgkJfQoJfQoKCS8vIGJvdW5kYXJ5IHBvaW50cwoJewoJCW1lbXNldChGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoUkVTLCAwKSwgMCwgRnJlZUltYWdlX0dldFBpdGNoKFJFUykpOwoJCW1lbXNldChGcmVlSW1hZ2VfR2V0U2NhbkxpbmUoUkVTLCBuLTEpLCAwLCBGcmVlSW1hZ2VfR2V0UGl0Y2goUkVTKSk7CgkJZmxvYXQgKmxlZnQgPSByZXNfYml0czsKCQlmbG9hdCAqcmlnaHQgPSByZXNfYml0cyArIChuLTEpOwoJCWZvcihpbnQgayA9IDA7IGsgPCBuOyBrKyspIHsKCQkJKmxlZnQgPSAwOwoJCQkqcmlnaHQgPSAwOwoJCQlsZWZ0ICs9IHJlc19waXRjaDsKCQkJcmlnaHQgKz0gcmVzX3BpdGNoOwoJCX0KCX0KfQoKLyoqCkRvZXMgY29hcnNlLXRvLWZpbmUgaW50ZXJwb2xhdGlvbiBhbmQgYWRkcyByZXN1bHQgdG8gdWYuIG5mIGlzIHRoZSBmaW5lLWdyaWQgZGltZW5zaW9uLiBUaGUKY29hcnNlLWdyaWQgc29sdXRpb24gaXMgaW5wdXQgYXMgdWNbMC4ubmMtMV1bMC4ubmMtMV0sIHdoZXJlIG5jID0gbmYvMisxLiBUaGUgZmluZS1ncmlkIHNvbHV0aW9uCmlzIHJldHVybmVkIGluIHVmWzAuLm5mLTFdWzAuLm5mLTFdLiByZXNbMC4ubmYtMV1bMC4ubmYtMV0gaXMgdXNlZCBmb3IgdGVtcG9yYXJ5IHN0b3JhZ2UuCiovCnN0YXRpYyB2b2lkIGZtZ19hZGRpbnQoRklCSVRNQVAgKlVGLCBGSUJJVE1BUCAqVUMsIEZJQklUTUFQICpSRVMsIGludCBuZikgewoJZm1nX3Byb2xvbmdhdGUoUkVTLCBVQywgbmYpOwoKCWNvbnN0IGludCB1Zl9waXRjaCAgPSBGcmVlSW1hZ2VfR2V0UGl0Y2goVUYpIC8gc2l6ZW9mKGZsb2F0KTsKCWNvbnN0IGludCByZXNfcGl0Y2ggID0gRnJlZUltYWdlX0dldFBpdGNoKFJFUykgLyBzaXplb2YoZmxvYXQpOwkKCglmbG9hdCAqdWZfYml0cyA9IChmbG9hdCopRnJlZUltYWdlX0dldEJpdHMoVUYpOwoJY29uc3QgZmxvYXQgKnJlc19iaXRzID0gKGZsb2F0KilGcmVlSW1hZ2VfR2V0Qml0cyhSRVMpOwoKCWZvcihpbnQgcm93ID0gMDsgcm93IDwgbmY7IHJvdysrKSB7CgkJZm9yKGludCBjb2wgPSAwOyBjb2wgPCBuZjsgY29sKyspIHsKCQkJLy8gY2FsY3VsYXRlIFVGKHJvdywgY29sKSA9IFVGKHJvdywgY29sKSArIFJFUyhyb3csIGNvbCk7CgkJCXVmX2JpdHNbY29sXSArPSByZXNfYml0c1tjb2xdOwoJCX0KCQl1Zl9iaXRzICs9IHVmX3BpdGNoOwoJCXJlc19iaXRzICs9IHJlc19waXRjaDsKCX0KfQoKLyoqCkZ1bGwgTXVsdGlncmlkIEFsZ29yaXRobSBmb3Igc29sdXRpb24gb2YgbGluZWFyIGVsbGlwdGljIGVxdWF0aW9uLCBoZXJlIHRoZSBtb2RlbCBwcm9ibGVtICgxOS4wLjYpLgpPbiBpbnB1dCB1WzAuLm4tMV1bMC4ubi0xXSBjb250YWlucyB0aGUgcmlnaHQtaGFuZCBzaWRlIPEsIHdoaWxlIG9uIG91dHB1dCBpdCByZXR1cm5zIHRoZSBzb2x1dGlvbi4KVGhlIGRpbWVuc2lvbiBuIG11c3QgYmUgb2YgdGhlIGZvcm0gMl5qICsgMSBmb3Igc29tZSBpbnRlZ2VyIGouIChqIGlzIGFjdHVhbGx5IHRoZSBudW1iZXIgb2YKZ3JpZCBsZXZlbHMgdXNlZCBpbiB0aGUgc29sdXRpb24sIGNhbGxlZCBuZyBiZWxvdy4pIG5jeWNsZSBpcyB0aGUgbnVtYmVyIG9mIFYtY3ljbGVzIHRvIGJlCnVzZWQgYXQgZWFjaCBsZXZlbC4KKi8Kc3RhdGljIEJPT0wgZm1nX21nbGluKEZJQklUTUFQICpVLCBpbnQgbiwgaW50IG5jeWNsZSkgewoJaW50IGosIGpjeWNsZSwgamosIGpwb3N0LCBqcHJlLCBuZiwgbmdyaWQ7CgoJRklCSVRNQVAgKipJUkhPID0gTlVMTDsKCUZJQklUTUFQICoqSVUgICA9IE5VTEw7CglGSUJJVE1BUCAqKklSSFMgPSBOVUxMOwoJRklCSVRNQVAgKipJUkVTID0gTlVMTDsKCQoJaW50IG5nID0gMDsJCS8vIG51bWJlciBvZiBhbGxvY2F0ZWQgZ3JpZHMKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojZGVmaW5lIF9DUkVBVEVfQVJSQVlfR1JJRF8oYXJyYXksIGFycmF5X3NpemUpIFwKCWFycmF5ID0gKEZJQklUTUFQKiopbWFsbG9jKGFycmF5X3NpemUgKiBzaXplb2YoRklCSVRNQVAqKSk7XAoJaWYoIWFycmF5KSB0aHJvdygxKTtcCgltZW1zZXQoYXJyYXksIDAsIGFycmF5X3NpemUgKiBzaXplb2YoRklCSVRNQVAqKSkKCiNkZWZpbmUgX0ZSRUVfQVJSQVlfR1JJRF8oYXJyYXksIGFycmF5X3NpemUpIFwKCWlmKE5VTEwgIT0gYXJyYXkpIHtcCgkJZm9yKGludCBrID0gMDsgayA8IGFycmF5X3NpemU7IGsrKykge1wKCQkJaWYoTlVMTCAhPSBhcnJheVtrXSkge1wKCQkJCUZyZWVJbWFnZV9VbmxvYWQoYXJyYXlba10pOyBhcnJheVtrXSA9IE5VTEw7XAoJCQl9XAoJCX1cCgkJZnJlZShhcnJheSk7XAoJfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgl0cnkgewoJCWludCBubiA9IG47CgkJLy8gY2hlY2sgZ3JpZCBzaXplIGFuZCBncmlkIGxldmVscwoJCXdoaWxlIChubiA+Pj0gMSkgbmcrKzsKCQlpZiAobiAhPSAxICsgKDFMIDw8IG5nKSkgewoJCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2MoRklGX1VOS05PV04sICJNdWx0aWdyaWQgYWxnb3JpdGhtOiBuID0gJWQsIHdoaWxlIG4tMSBtdXN0IGJlIGEgcG93ZXIgb2YgMi4iLCBuKTsKCQkJdGhyb3coMSk7CgkJfQoJCWlmIChuZyA+IE5HTUFYKSB7CgkJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhGSUZfVU5LTk9XTiwgIk11bHRpZ3JpZCBhbGdvcml0aG06IG5nID0gJWQgd2hpbGUgTkdNQVggPSAlZCwgaW5jcmVhc2UgTkdNQVguIiwgbmcsIE5HTUFYKTsKCQkJdGhyb3coMSk7CgkJfQoJCS8vIGFsbG9jYXRlIGdyaWQgYXJyYXlzCgkJewoJCQlfQ1JFQVRFX0FSUkFZX0dSSURfKElSSE8sIG5nKTsKCQkJX0NSRUFURV9BUlJBWV9HUklEXyhJVSwgbmcpOwoJCQlfQ1JFQVRFX0FSUkFZX0dSSURfKElSSFMsIG5nKTsKCQkJX0NSRUFURV9BUlJBWV9HUklEXyhJUkVTLCBuZyk7CgkJfQoKCQlubiA9IG4vMiArIDE7CgkJbmdyaWQgPSBuZyAtIDI7CgoJCS8vIGFsbG9jYXRlIHN0b3JhZ2UgZm9yIHIuaC5zLiBvbiBncmlkIChuZyAtIDIpIC4uLgoJCUlSSE9bbmdyaWRdID0gRnJlZUltYWdlX0FsbG9jYXRlVChGSVRfRkxPQVQsIG5uLCBubik7CgkJaWYoIUlSSE9bbmdyaWRdKSB0aHJvdygxKTsKCgkJLy8gLi4uIGFuZCBmaWxsIGl0IGJ5IHJlc3RyaWN0aW5nIGZyb20gdGhlIGZpbmUgZ3JpZAoJCWZtZ19yZXN0cmljdChJUkhPW25ncmlkXSwgVSwgbm4pOwkKCgkJLy8gc2ltaWxhcmx5IGFsbG9jYXRlIHN0b3JhZ2UgYW5kIGZpbGwgci5oLnMuIG9uIGFsbCBjb2Fyc2UgZ3JpZHMuCgkJd2hpbGUgKG5uID4gMykgewoJCQlubiA9IG5uLzIgKyAxOyAKCQkJbmdyaWQtLTsKCQkJSVJIT1tuZ3JpZF0gPSBGcmVlSW1hZ2VfQWxsb2NhdGVUKEZJVF9GTE9BVCwgbm4sIG5uKTsKCQkJaWYoIUlSSE9bbmdyaWRdKSB0aHJvdygxKTsKCQkJZm1nX3Jlc3RyaWN0KElSSE9bbmdyaWRdLCBJUkhPW25ncmlkKzFdLCBubik7CgkJfQoKCQlubiA9IDM7CgoJCUlVWzBdID0gRnJlZUltYWdlX0FsbG9jYXRlVChGSVRfRkxPQVQsIG5uLCBubik7CgkJaWYoIUlVWzBdKSB0aHJvdygxKTsKCQlJUkhTWzBdID0gRnJlZUltYWdlX0FsbG9jYXRlVChGSVRfRkxPQVQsIG5uLCBubik7CgkJaWYoIUlSSFNbMF0pIHRocm93KDEpOwoKCQkvLyBpbml0aWFsIHNvbHV0aW9uIG9uIGNvYXJzZXN0IGdyaWQKCQlmbWdfc29sdmUoSVVbMF0sIElSSE9bMF0pOwoJCS8vIGlyaG9bMF0gbm8gbG9uZ2VyIG5lZWRlZCAuLi4KCQlGcmVlSW1hZ2VfVW5sb2FkKElSSE9bMF0pOyBJUkhPWzBdID0gTlVMTDsKCgkJbmdyaWQgPSBuZzsKCgkJLy8gbmVzdGVkIGl0ZXJhdGlvbiBsb29wCgkJZm9yIChqID0gMTsgaiA8IG5ncmlkOyBqKyspIHsKCQkJbm4gPSAyKm5uIC0gMTsKCgkJCUlVW2pdID0gRnJlZUltYWdlX0FsbG9jYXRlVChGSVRfRkxPQVQsIG5uLCBubik7CgkJCWlmKCFJVVtqXSkgdGhyb3coMSk7CgkJCUlSSFNbal0gPSBGcmVlSW1hZ2VfQWxsb2NhdGVUKEZJVF9GTE9BVCwgbm4sIG5uKTsKCQkJaWYoIUlSSFNbal0pIHRocm93KDEpOwoJCQlJUkVTW2pdID0gRnJlZUltYWdlX0FsbG9jYXRlVChGSVRfRkxPQVQsIG5uLCBubik7CgkJCWlmKCFJUkVTW2pdKSB0aHJvdygxKTsKCgkJCWZtZ19wcm9sb25nYXRlKElVW2pdLCBJVVtqLTFdLCBubik7CgkJCQoJCQkvLyBpbnRlcnBvbGF0ZSBmcm9tIGNvYXJzZSBncmlkIHRvIG5leHQgZmluZXIgZ3JpZAoKCQkJLy8gc2V0IHVwIHIuaC5zLgoJCQlmbWdfY29weUFycmF5KElSSFNbal0sIGogIT0gKG5ncmlkIC0gMSkgPyBJUkhPW2pdIDogVSk7CgkJCQoJCQkvLyBWLWN5Y2xlIGxvb3AKCQkJZm9yIChqY3ljbGUgPSAwOyBqY3ljbGUgPCBuY3ljbGU7IGpjeWNsZSsrKSB7CgkJCQluZiA9IG5uOwoJCQkJLy8gZG93bndhcmQgc3Rva2Ugb2YgdGhlIFYKCQkJCWZvciAoamogPSBqOyBqaiA+PSAxOyBqai0tKSB7CgkJCQkJLy8gcHJlLXNtb290aGluZwoJCQkJCWZvciAoanByZSA9IDA7IGpwcmUgPCBOUFJFOyBqcHJlKyspIHsKCQkJCQkJZm1nX3JlbGF4YXRpb24oSVVbampdLCBJUkhTW2pqXSwgbmYpOwoJCQkJCX0KCQkJCQlmbWdfcmVzaWR1YWwoSVJFU1tqal0sIElVW2pqXSwgSVJIU1tqal0sIG5mKTsKCQkJCQluZiA9IG5mLzIgKyAxOwoJCQkJCS8vIHJlc3RyaWN0aW9uIG9mIHRoZSByZXNpZHVhbCBpcyB0aGUgbmV4dCByLmgucy4KCQkJCQlmbWdfcmVzdHJpY3QoSVJIU1tqai0xXSwgSVJFU1tqal0sIG5mKTsJCQkJCgkJCQkJLy8gemVybyBmb3IgaW5pdGlhbCBndWVzcyBpbiBuZXh0IHJlbGF4YXRpb24KCQkJCQlmbWdfZmlsbEFycmF5V2l0aFplcm9zKElVW2pqLTFdKTsKCQkJCX0KCQkJCS8vIGJvdHRvbSBvZiBWOiBzb2x2ZSBvbiBjb2Fyc2VzdCBncmlkCgkJCQlmbWdfc29sdmUoSVVbMF0sIElSSFNbMF0pOyAKCQkJCW5mID0gMzsgCgkJCQkvLyB1cHdhcmQgc3Ryb2tlIG9mIFYuCgkJCQlmb3IgKGpqID0gMTsgamogPD0gajsgamorKykgeyAKCQkJCQluZiA9IDIqbmYgLSAxOwoJCQkJCS8vIHVzZSByZXMgZm9yIHRlbXBvcmFyeSBzdG9yYWdlIGluc2lkZSBhZGRpbnQKCQkJCQlmbWdfYWRkaW50KElVW2pqXSwgSVVbamotMV0sIElSRVNbampdLCBuZik7CQkJCQoJCQkJCS8vIHBvc3Qtc21vb3RoaW5nCgkJCQkJZm9yIChqcG9zdCA9IDA7IGpwb3N0IDwgTlBPU1Q7IGpwb3N0KyspIHsKCQkJCQkJZm1nX3JlbGF4YXRpb24oSVVbampdLCBJUkhTW2pqXSwgbmYpOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJLy8gcmV0dXJuIHNvbHV0aW9uIGluIFUKCQlmbWdfY29weUFycmF5KFUsIElVW25ncmlkLTFdKTsKCgkJLy8gZGVsZXRlIGFsbG9jYXRlZCBhcnJheXMKCQlfRlJFRV9BUlJBWV9HUklEXyhJUkVTLCBuZyk7CgkJX0ZSRUVfQVJSQVlfR1JJRF8oSVJIUywgbmcpOwoJCV9GUkVFX0FSUkFZX0dSSURfKElVLCBuZyk7CgkJX0ZSRUVfQVJSQVlfR1JJRF8oSVJITywgbmcpOwoKCQlyZXR1cm4gVFJVRTsKCgl9IGNhdGNoKGludCkgewoJCS8vIGRlbGV0ZSBhbGxvY2F0ZWQgYXJyYXlzCgkJX0ZSRUVfQVJSQVlfR1JJRF8oSVJFUywgbmcpOwoJCV9GUkVFX0FSUkFZX0dSSURfKElSSFMsIG5nKTsKCQlfRlJFRV9BUlJBWV9HUklEXyhJVSwgbmcpOwoJCV9GUkVFX0FSUkFZX0dSSURfKElSSE8sIG5nKTsKCgkJcmV0dXJuIEZBTFNFOwoJfQp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLyoqClBvaXNzb24gc29sdmVyIGJhc2VkIG9uIGEgbXVsdGlncmlkIGFsZ29yaXRobS4gClRoaXMgcm91dGluZSBzb2x2ZXMgYSBQb2lzc29uIGVxdWF0aW9uLCByZW1hcCByZXN1bHQgcGl4ZWxzIHRvIFswLi4xXSBhbmQgcmV0dXJucyB0aGUgc29sdXRpb24uIApOQjogVGhlIGlucHV0IGltYWdlIGlzIGZpcnN0IHN0b3JlZCBpbnNpZGUgYSBzcXVhcmUgaW1hZ2Ugd2hvc2Ugc2l6ZSBpcyAoMl5qICsgMSl4KDJeaiArIDEpIGZvciBzb21lIGludGVnZXIgaiwgCndoZXJlIGogaXMgc3VjaCB0aGF0IDJeaiBpcyB0aGUgbmVhcmVzdCBsYXJnZXIgZGltZW5zaW9uIGNvcnJlc3BvbmRpbmcgdG8gTUFYKGltYWdlIHdpZHRoLCBpbWFnZSBoZWlnaHQpLiAKQHBhcmFtIExhcGxhY2lhbiBMYXBsYWNpYW4gaW1hZ2UKQHBhcmFtIG5jeWNsZSBOdW1iZXIgb2YgY3ljbGVzIGluIHRoZSBtdWx0aWdyaWQgYWxnb3JpdGhtICh1c3VhbGx5IDIgb3IgMykKQHJldHVybiBSZXR1cm5zIHRoZSBzb2x2ZWQgUERFIGVxdWF0aW9ucyBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIE5VTEwgb3RoZXJ3aXNlCiovCkZJQklUTUFQKiBETExfQ0FMTENPTlYgCkZyZWVJbWFnZV9NdWx0aWdyaWRQb2lzc29uU29sdmVyKEZJQklUTUFQICpMYXBsYWNpYW4sIGludCBuY3ljbGUpIHsKCWlmKCFGcmVlSW1hZ2VfSGFzUGl4ZWxzKExhcGxhY2lhbikpIHJldHVybiBOVUxMOwoKCWludCB3aWR0aCA9IEZyZWVJbWFnZV9HZXRXaWR0aChMYXBsYWNpYW4pOwoJaW50IGhlaWdodCA9IEZyZWVJbWFnZV9HZXRIZWlnaHQoTGFwbGFjaWFuKTsKCgkvLyBnZXQgbmVhcmVzdCBsYXJnZXIgZGltZW5zaW9uIGxlbmd0aCB0aGF0IGlzIGFjY2VwdGFibGUgYnkgdGhlIGFsZ29yaXRobQoJaW50IG4gPSBNQVgod2lkdGgsIGhlaWdodCk7CglpbnQgc2l6ZSA9IDA7Cgl3aGlsZSgobiA+Pj0gMSkgPiAwKSBzaXplKys7CglpZigoMSA8PCBzaXplKSA8IE1BWCh3aWR0aCwgaGVpZ2h0KSkgewoJCXNpemUrKzsKCX0KCS8vIHNpemUgbXVzdCBiZSBvZiB0aGUgZm9ybSAyXmogKyAxIGZvciBzb21lIGludGVnZXIgagoJc2l6ZSA9IDEgKyAoMSA8PCBzaXplKTsKCgkvLyBhbGxvY2F0ZSBhIHRlbXBvcmFyeSBzcXVhcmUgaW1hZ2UgSQoJRklCSVRNQVAgKkkgPSBGcmVlSW1hZ2VfQWxsb2NhdGVUKEZJVF9GTE9BVCwgc2l6ZSwgc2l6ZSk7CglpZighSSkgcmV0dXJuIE5VTEw7CgoJLy8gY29weSBMYXBsYWNpYW4gaW50byBJIGFuZCBzaGlmdCBwaXhlbHMgdG8gY3JlYXRlIGEgYm91bmRhcnkKCUZyZWVJbWFnZV9QYXN0ZShJLCBMYXBsYWNpYW4sIDEsIDEsIDI1NSk7CgoJLy8gc29sdmUgdGhlIFBERSBlcXVhdGlvbgoJZm1nX21nbGluKEksIHNpemUsIG5jeWNsZSk7CgoJLy8gc2hpZnQgcGl4ZWxzIGJhY2sKCUZJQklUTUFQICpVID0gRnJlZUltYWdlX0NvcHkoSSwgMSwgMSwgd2lkdGggKyAxLCBoZWlnaHQgKyAxKTsKCUZyZWVJbWFnZV9VbmxvYWQoSSk7CgoJLy8gcmVtYXAgcGl4ZWxzIHRvIFswLi4xXQoJTm9ybWFsaXplWShVLCAwLCAxKTsKCgkvLyBjb3B5IG1ldGFkYXRhIGZyb20gc3JjIHRvIGRzdAoJRnJlZUltYWdlX0Nsb25lTWV0YWRhdGEoVSwgTGFwbGFjaWFuKTsKCgkvLyByZXR1cm4gdGhlIGludGVncmF0ZWQgaW1hZ2UKCXJldHVybiBVOwp9Cgo=