LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIENvcHlyaWdodCAyMDA2IFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBCaXNtYXJjaywgTkQuLCBVU0EuCiAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCiAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwogKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCiAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCiAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICoKICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKICogb2YgdGhlIFNvZnR3YXJlLgogKgogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgogKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCiAqIFRIRSBDT1BZUklHSFQgSE9MREVSUywgQVVUSE9SUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCiAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUKICogVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICoKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoKICogQXV0aG9yczoKICogICAgVGhvbWFzIEhlbGxzdHL2bSA8dGhvbWFzLWF0LXR1bmdzdGVuZ3JhcGhpY3MtZG90LWNvbT4KICovCgojaW5jbHVkZSAiZHJtUC5oIgojaW5jbHVkZSAic2lzX2RybS5oIgojaW5jbHVkZSAic2lzX2Rydi5oIgoKI2luY2x1ZGUgPHZpZGVvL3Npc2ZiLmg+CgojZGVmaW5lIFZJREVPX1RZUEUgMAojZGVmaW5lIEFHUF9UWVBFIDEKCgojaWYgZGVmaW5lZChDT05GSUdfRkJfU0lTKQovKiBmYiBtYW5hZ2VtZW50IHZpYSBmYiBkZXZpY2UgKi8KCiNkZWZpbmUgU0lTX01NX0FMSUdOX1NISUZUIDAKI2RlZmluZSBTSVNfTU1fQUxJR05fTUFTSyAwCgpzdGF0aWMgdm9pZCAqc2lzX3NtYW5fbW1fYWxsb2NhdGUodm9pZCAqcHJpdmF0ZSwgdW5zaWduZWQgbG9uZyBzaXplLAoJCQkJICB1bnNpZ25lZCBhbGlnbm1lbnQpCnsKCXN0cnVjdCBzaXNfbWVtcmVxIHJlcTsKCglyZXEuc2l6ZSA9IHNpemU7CglzaXNfbWFsbG9jKCZyZXEpOwoJaWYgKHJlcS5zaXplID09IDApCgkJcmV0dXJuIE5VTEw7CgllbHNlCgkJcmV0dXJuICh2b2lkICopfnJlcS5vZmZzZXQ7Cn0KCnN0YXRpYyB2b2lkIHNpc19zbWFuX21tX2ZyZWUodm9pZCAqcHJpdmF0ZSwgdm9pZCAqcmVmKQp7CglzaXNfZnJlZSh+KCh1bnNpZ25lZCBsb25nKXJlZikpOwp9CgpzdGF0aWMgdm9pZCBzaXNfc21hbl9tbV9kZXN0cm95KHZvaWQgKnByaXZhdGUpCnsKCTsKfQoKc3RhdGljIHVuc2lnbmVkIGxvbmcgc2lzX3NtYW5fbW1fb2Zmc2V0KHZvaWQgKnByaXZhdGUsIHZvaWQgKnJlZikKewoJcmV0dXJuIH4oKHVuc2lnbmVkIGxvbmcpcmVmKTsKfQoKI2Vsc2UgLyogQ09ORklHX0ZCX1NJUyAqLwoKI2RlZmluZSBTSVNfTU1fQUxJR05fU0hJRlQgNAojZGVmaW5lIFNJU19NTV9BTElHTl9NQVNLICggKDEgPDwgU0lTX01NX0FMSUdOX1NISUZUKSAtIDEpCgojZW5kaWYgLyogQ09ORklHX0ZCX1NJUyAqLwoKc3RhdGljIGludCBzaXNfZmJfaW5pdChEUk1fSU9DVExfQVJHUykKewoJRFJNX0RFVklDRTsKCWRybV9zaXNfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Cglkcm1fc2lzX2ZiX3QgZmI7CglpbnQgcmV0OwoKCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChmYiwgKGRybV9zaXNfZmJfdCBfX3VzZXIgKikgZGF0YSwgc2l6ZW9mKGZiKSk7CgoJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwojaWYgZGVmaW5lZChDT05GSUdfRkJfU0lTKQoJewoJCWRybV9zbWFuX21tX3Qgc21hbl9tbTsKCQlzbWFuX21tLnByaXZhdGUgPSAodm9pZCAqKTB4RkZGRkZGRkY7CgkJc21hbl9tbS5hbGxvY2F0ZSA9IHNpc19zbWFuX21tX2FsbG9jYXRlOwoJCXNtYW5fbW0uZnJlZSA9IHNpc19zbWFuX21tX2ZyZWU7CgkJc21hbl9tbS5kZXN0cm95ID0gc2lzX3NtYW5fbW1fZGVzdHJveTsKCQlzbWFuX21tLm9mZnNldCA9IHNpc19zbWFuX21tX29mZnNldDsKCQlyZXQgPQoJCSAgICBkcm1fc21hbl9zZXRfbWFuYWdlcigmZGV2X3ByaXYtPnNtYW4sIFZJREVPX1RZUEUsICZzbWFuX21tKTsKCX0KI2Vsc2UKCXJldCA9IGRybV9zbWFuX3NldF9yYW5nZSgmZGV2X3ByaXYtPnNtYW4sIFZJREVPX1RZUEUsIDAsCgkJCQkgZmIuc2l6ZSA+PiBTSVNfTU1fQUxJR05fU0hJRlQpOwojZW5kaWYKCglpZiAocmV0KSB7CgkJRFJNX0VSUk9SKCJWUkFNIG1lbW9yeSBtYW5hZ2VyIGluaXRpYWxpc2F0aW9uIGVycm9yXG4iKTsKCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKCQlyZXR1cm4gcmV0OwoJfQoKCWRldl9wcml2LT52cmFtX2luaXRpYWxpemVkID0gMTsKCWRldl9wcml2LT52cmFtX29mZnNldCA9IGZiLm9mZnNldDsKCgltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKCURSTV9ERUJVRygib2Zmc2V0ID0gJXUsIHNpemUgPSAldSIsIGZiLm9mZnNldCwgZmIuc2l6ZSk7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgc2lzX2RybV9hbGxvYyhkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9maWxlX3QgKiBwcml2LAoJCQkgdW5zaWduZWQgbG9uZyBkYXRhLCBpbnQgcG9vbCkKewoJZHJtX3Npc19wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCWRybV9zaXNfbWVtX3QgX191c2VyICphcmdwID0gKGRybV9zaXNfbWVtX3QgX191c2VyICopIGRhdGE7Cglkcm1fc2lzX21lbV90IG1lbTsKCWludCByZXR2YWwgPSAwOwoJZHJtX21lbWJsb2NrX2l0ZW1fdCAqaXRlbTsKCglEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwobWVtLCBhcmdwLCBzaXplb2YobWVtKSk7CgoJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwoKCWlmICgwID09ICgocG9vbCA9PSAwKSA/IGRldl9wcml2LT52cmFtX2luaXRpYWxpemVkIDoKCQkgICAgICBkZXZfcHJpdi0+YWdwX2luaXRpYWxpemVkKSkgewoJCURSTV9FUlJPUgoJCSAgICAoIkF0dGVtcHQgdG8gYWxsb2NhdGUgZnJvbSB1bmluaXRpYWxpemVkIG1lbW9yeSBtYW5hZ2VyLlxuIik7CgkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKCX0KCgltZW0uc2l6ZSA9IChtZW0uc2l6ZSArIFNJU19NTV9BTElHTl9NQVNLKSA+PiBTSVNfTU1fQUxJR05fU0hJRlQ7CglpdGVtID0gZHJtX3NtYW5fYWxsb2MoJmRldl9wcml2LT5zbWFuLCBwb29sLCBtZW0uc2l6ZSwgMCwKCQkJICAgICAgKHVuc2lnbmVkIGxvbmcpcHJpdik7CgoJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CglpZiAoaXRlbSkgewoJCW1lbS5vZmZzZXQgPSAoKHBvb2wgPT0gMCkgPwoJCQkgICAgICBkZXZfcHJpdi0+dnJhbV9vZmZzZXQgOiBkZXZfcHJpdi0+YWdwX29mZnNldCkgKwoJCSAgICAoaXRlbS0+bW0tPgoJCSAgICAgb2Zmc2V0KGl0ZW0tPm1tLCBpdGVtLT5tbV9pbmZvKSA8PCBTSVNfTU1fQUxJR05fU0hJRlQpOwoJCW1lbS5mcmVlID0gaXRlbS0+dXNlcl9oYXNoLmtleTsKCQltZW0uc2l6ZSA9IG1lbS5zaXplIDw8IFNJU19NTV9BTElHTl9TSElGVDsKCX0gZWxzZSB7CgkJbWVtLm9mZnNldCA9IDA7CgkJbWVtLnNpemUgPSAwOwoJCW1lbS5mcmVlID0gMDsKCQlyZXR2YWwgPSBEUk1fRVJSKEVOT01FTSk7Cgl9CgoJRFJNX0NPUFlfVE9fVVNFUl9JT0NUTChhcmdwLCBtZW0sIHNpemVvZihtZW0pKTsKCglEUk1fREVCVUcoImFsbG9jICVkLCBzaXplID0gJWQsIG9mZnNldCA9ICVkXG4iLCBwb29sLCBtZW0uc2l6ZSwKCQkgIG1lbS5vZmZzZXQpOwoKCXJldHVybiByZXR2YWw7Cn0KCnN0YXRpYyBpbnQgc2lzX2RybV9mcmVlKERSTV9JT0NUTF9BUkdTKQp7CglEUk1fREVWSUNFOwoJZHJtX3Npc19wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCWRybV9zaXNfbWVtX3QgbWVtOwoJaW50IHJldDsKCglEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwobWVtLCAoZHJtX3Npc19tZW1fdCBfX3VzZXIgKikgZGF0YSwKCQkJCSBzaXplb2YobWVtKSk7CgoJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwoJcmV0ID0gZHJtX3NtYW5fZnJlZV9rZXkoJmRldl9wcml2LT5zbWFuLCBtZW0uZnJlZSk7CgltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKCURSTV9ERUJVRygiZnJlZSA9IDB4JWx4XG4iLCBtZW0uZnJlZSk7CgoJcmV0dXJuIHJldDsKfQoKc3RhdGljIGludCBzaXNfZmJfYWxsb2MoRFJNX0lPQ1RMX0FSR1MpCnsKCURSTV9ERVZJQ0U7CglyZXR1cm4gc2lzX2RybV9hbGxvYyhkZXYsIHByaXYsIGRhdGEsIFZJREVPX1RZUEUpOwp9CgpzdGF0aWMgaW50IHNpc19pb2N0bF9hZ3BfaW5pdChEUk1fSU9DVExfQVJHUykKewoJRFJNX0RFVklDRTsKCWRybV9zaXNfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Cglkcm1fc2lzX2FncF90IGFncDsKCWludCByZXQ7CglkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CgoJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGFncCwgKGRybV9zaXNfYWdwX3QgX191c2VyICopIGRhdGEsCgkJCQkgc2l6ZW9mKGFncCkpOwoJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwoJcmV0ID0gZHJtX3NtYW5fc2V0X3JhbmdlKCZkZXZfcHJpdi0+c21hbiwgQUdQX1RZUEUsIDAsCgkJCQkgYWdwLnNpemUgPj4gU0lTX01NX0FMSUdOX1NISUZUKTsKCglpZiAocmV0KSB7CgkJRFJNX0VSUk9SKCJBR1AgbWVtb3J5IG1hbmFnZXIgaW5pdGlhbGlzYXRpb24gZXJyb3JcbiIpOwoJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwoJCXJldHVybiByZXQ7Cgl9CgoJZGV2X3ByaXYtPmFncF9pbml0aWFsaXplZCA9IDE7CglkZXZfcHJpdi0+YWdwX29mZnNldCA9IGFncC5vZmZzZXQ7CgltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKCglEUk1fREVCVUcoIm9mZnNldCA9ICV1LCBzaXplID0gJXUiLCBhZ3Aub2Zmc2V0LCBhZ3Auc2l6ZSk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzaXNfaW9jdGxfYWdwX2FsbG9jKERSTV9JT0NUTF9BUkdTKQp7CglEUk1fREVWSUNFOwoKCXJldHVybiBzaXNfZHJtX2FsbG9jKGRldiwgcHJpdiwgZGF0YSwgQUdQX1RZUEUpOwp9CgpzdGF0aWMgZHJtX2xvY2FsX21hcF90ICpzaXNfcmVnX2luaXQoZHJtX2RldmljZV90ICpkZXYpCnsKCWRybV9tYXBfbGlzdF90ICplbnRyeTsKCWRybV9sb2NhbF9tYXBfdCAqbWFwOwoKCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksICZkZXYtPm1hcGxpc3QsIGhlYWQpIHsKCQltYXAgPSBlbnRyeS0+bWFwOwoJCWlmICghbWFwKQoJCQljb250aW51ZTsKCQlpZiAobWFwLT50eXBlID09IF9EUk1fUkVHSVNURVJTKSB7CgkJCXJldHVybiBtYXA7CgkJfQoJfQoJcmV0dXJuIE5VTEw7Cn0KCmludCBzaXNfaWRsZShkcm1fZGV2aWNlX3QgKmRldikKewoJZHJtX3Npc19wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCXVpbnQzMl90IGlkbGVfcmVnOwoJdW5zaWduZWQgbG9uZyBlbmQ7CglpbnQgaTsKCglpZiAoZGV2X3ByaXYtPmlkbGVfZmF1bHQpCgkJcmV0dXJuIDA7CgoJaWYgKGRldl9wcml2LT5tbWlvID09IE5VTEwpIHsKCQlkZXZfcHJpdi0+bW1pbyA9IHNpc19yZWdfaW5pdChkZXYpOwoJCWlmIChkZXZfcHJpdi0+bW1pbyA9PSBOVUxMKSB7CgkJCURSTV9FUlJPUigiQ291bGQgbm90IGZpbmQgcmVnaXN0ZXIgbWFwLlxuIik7CgkJCXJldHVybiAwOwoJCX0KCX0KCQoJLyoKCSAqIEltcGxlbWVudCBhIGRldmljZSBzd2l0Y2ggaGVyZSBpZiBuZWVkZWQKCSAqLwoKCWlmIChkZXZfcHJpdi0+Y2hpcHNldCAhPSBTSVNfQ0hJUF8zMTUpCgkJcmV0dXJuIDA7CgoJLyoKCSAqIFRpbWVvdXQgYWZ0ZXIgMyBzZWNvbmRzLiBXZSBjYW5ub3QgdXNlIERSTV9XQUlUX09OIGhlcmUKCSAqIGJlY2F1c2UgaXRzIHBvbGxpbmcgZnJlcXVlbmN5IGlzIHRvbyBsb3cuCgkgKi8KCgllbmQgPSBqaWZmaWVzICsgKERSTV9IWiAqIDMpOwoKCWZvciAoaT0wOyBpPDQ7ICsraSkgewoJCWRvIHsKCQkJaWRsZV9yZWcgPSBTSVNfUkVBRCgweDg1Y2MpOwoJCX0gd2hpbGUgKCAhdGltZV9hZnRlcl9lcShqaWZmaWVzLCBlbmQpICYmCgkJCSAgKChpZGxlX3JlZyAmIDB4ODAwMDAwMDApICE9IDB4ODAwMDAwMDApKTsKCX0KCglpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCBlbmQpKSB7CgkJRFJNX0VSUk9SKCJHcmFwaGljcyBlbmdpbmUgaWRsZSB0aW1lb3V0LiAiCgkJCSAgIkRpc2FibGluZyBpZGxlIGNoZWNrXG4iKTsKCQlkZXZfcHJpdi0+aWRsZV9mYXVsdCA9IDE7Cgl9CgoJLyoKCSAqIFRoZSBjYWxsZXIgbmV2ZXIgc2VlcyBhbiBlcnJvciBjb2RlLiBJdCBnZXRzIHRyYXBwZWQKCSAqIGluIGxpYmRybS4KCSAqLwoKCXJldHVybiAwOwp9CgoKdm9pZCBzaXNfbGFzdGNsb3NlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCnsKCWRybV9zaXNfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CgoJaWYgKCFkZXZfcHJpdikKCQlyZXR1cm47CgoJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwoJZHJtX3NtYW5fY2xlYW51cCgmZGV2X3ByaXYtPnNtYW4pOwoJZGV2X3ByaXYtPnZyYW1faW5pdGlhbGl6ZWQgPSAwOwoJZGV2X3ByaXYtPmFncF9pbml0aWFsaXplZCA9IDA7CglkZXZfcHJpdi0+bW1pbyA9IE5VTEw7CgltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKfQoKdm9pZCBzaXNfcmVjbGFpbV9idWZmZXJzX2xvY2tlZChkcm1fZGV2aWNlX3QgKiBkZXYsIHN0cnVjdCBmaWxlICpmaWxwKQp7Cglkcm1fc2lzX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwoJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKCgltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CglpZiAoZHJtX3NtYW5fb3duZXJfY2xlYW4oJmRldl9wcml2LT5zbWFuLCAodW5zaWduZWQgbG9uZylwcml2KSkgewoJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwoJCXJldHVybjsKCX0KCglpZiAoZGV2LT5kcml2ZXItPmRtYV9xdWllc2NlbnQpIHsKCQlkZXYtPmRyaXZlci0+ZG1hX3F1aWVzY2VudChkZXYpOwoJfQoKCWRybV9zbWFuX293bmVyX2NsZWFudXAoJmRldl9wcml2LT5zbWFuLCAodW5zaWduZWQgbG9uZylwcml2KTsKCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwoJcmV0dXJuOwp9Cgpkcm1faW9jdGxfZGVzY190IHNpc19pb2N0bHNbXSA9IHsKCVtEUk1fSU9DVExfTlIoRFJNX1NJU19GQl9BTExPQyldID0ge3Npc19mYl9hbGxvYywgRFJNX0FVVEh9LAoJW0RSTV9JT0NUTF9OUihEUk1fU0lTX0ZCX0ZSRUUpXSA9IHtzaXNfZHJtX2ZyZWUsIERSTV9BVVRIfSwKCVtEUk1fSU9DVExfTlIoRFJNX1NJU19BR1BfSU5JVCldID0KCSAgICB7c2lzX2lvY3RsX2FncF9pbml0LCBEUk1fQVVUSCB8IERSTV9NQVNURVIgfCBEUk1fUk9PVF9PTkxZfSwKCVtEUk1fSU9DVExfTlIoRFJNX1NJU19BR1BfQUxMT0MpXSA9IHtzaXNfaW9jdGxfYWdwX2FsbG9jLCBEUk1fQVVUSH0sCglbRFJNX0lPQ1RMX05SKERSTV9TSVNfQUdQX0ZSRUUpXSA9IHtzaXNfZHJtX2ZyZWUsIERSTV9BVVRIfSwKCVtEUk1fSU9DVExfTlIoRFJNX1NJU19GQl9JTklUKV0gPQoJICAgIHtzaXNfZmJfaW5pdCwgRFJNX0FVVEggfCBEUk1fTUFTVEVSIHwgRFJNX1JPT1RfT05MWX0KfTsKCmludCBzaXNfbWF4X2lvY3RsID0gRFJNX0FSUkFZX1NJWkUoc2lzX2lvY3Rscyk7Cg==